jolt 0.9.123__py3-none-any.whl → 0.9.435__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. jolt/__init__.py +80 -7
  2. jolt/__main__.py +9 -1
  3. jolt/bin/fstree-darwin-x86_64 +0 -0
  4. jolt/bin/fstree-linux-x86_64 +0 -0
  5. jolt/cache.py +832 -362
  6. jolt/chroot.py +156 -0
  7. jolt/cli.py +281 -162
  8. jolt/common_pb2.py +63 -0
  9. jolt/common_pb2_grpc.py +4 -0
  10. jolt/config.py +98 -41
  11. jolt/error.py +19 -4
  12. jolt/filesystem.py +2 -6
  13. jolt/graph.py +705 -117
  14. jolt/hooks.py +43 -0
  15. jolt/influence.py +122 -3
  16. jolt/loader.py +369 -121
  17. jolt/log.py +225 -63
  18. jolt/manifest.py +28 -38
  19. jolt/options.py +35 -10
  20. jolt/pkgs/abseil.py +42 -0
  21. jolt/pkgs/asio.py +25 -0
  22. jolt/pkgs/autoconf.py +41 -0
  23. jolt/pkgs/automake.py +41 -0
  24. jolt/pkgs/b2.py +31 -0
  25. jolt/pkgs/boost.py +111 -0
  26. jolt/pkgs/boringssl.py +32 -0
  27. jolt/pkgs/busybox.py +39 -0
  28. jolt/pkgs/bzip2.py +43 -0
  29. jolt/pkgs/cares.py +29 -0
  30. jolt/pkgs/catch2.py +36 -0
  31. jolt/pkgs/cbindgen.py +17 -0
  32. jolt/pkgs/cista.py +19 -0
  33. jolt/pkgs/clang.py +44 -0
  34. jolt/pkgs/cli11.py +24 -0
  35. jolt/pkgs/cmake.py +48 -0
  36. jolt/pkgs/cpython.py +196 -0
  37. jolt/pkgs/crun.py +29 -0
  38. jolt/pkgs/curl.py +38 -0
  39. jolt/pkgs/dbus.py +18 -0
  40. jolt/pkgs/double_conversion.py +24 -0
  41. jolt/pkgs/fastfloat.py +21 -0
  42. jolt/pkgs/ffmpeg.py +28 -0
  43. jolt/pkgs/flatbuffers.py +29 -0
  44. jolt/pkgs/fmt.py +27 -0
  45. jolt/pkgs/fstree.py +20 -0
  46. jolt/pkgs/gflags.py +18 -0
  47. jolt/pkgs/glib.py +18 -0
  48. jolt/pkgs/glog.py +25 -0
  49. jolt/pkgs/glslang.py +21 -0
  50. jolt/pkgs/golang.py +16 -11
  51. jolt/pkgs/googlebenchmark.py +18 -0
  52. jolt/pkgs/googletest.py +46 -0
  53. jolt/pkgs/gperf.py +15 -0
  54. jolt/pkgs/grpc.py +73 -0
  55. jolt/pkgs/hdf5.py +19 -0
  56. jolt/pkgs/help2man.py +14 -0
  57. jolt/pkgs/inja.py +28 -0
  58. jolt/pkgs/jsoncpp.py +31 -0
  59. jolt/pkgs/libarchive.py +43 -0
  60. jolt/pkgs/libcap.py +44 -0
  61. jolt/pkgs/libdrm.py +44 -0
  62. jolt/pkgs/libedit.py +42 -0
  63. jolt/pkgs/libevent.py +31 -0
  64. jolt/pkgs/libexpat.py +27 -0
  65. jolt/pkgs/libfastjson.py +21 -0
  66. jolt/pkgs/libffi.py +16 -0
  67. jolt/pkgs/libglvnd.py +30 -0
  68. jolt/pkgs/libogg.py +28 -0
  69. jolt/pkgs/libpciaccess.py +18 -0
  70. jolt/pkgs/libseccomp.py +21 -0
  71. jolt/pkgs/libtirpc.py +24 -0
  72. jolt/pkgs/libtool.py +42 -0
  73. jolt/pkgs/libunwind.py +35 -0
  74. jolt/pkgs/libva.py +18 -0
  75. jolt/pkgs/libvorbis.py +33 -0
  76. jolt/pkgs/libxml2.py +35 -0
  77. jolt/pkgs/libxslt.py +17 -0
  78. jolt/pkgs/libyajl.py +16 -0
  79. jolt/pkgs/llvm.py +81 -0
  80. jolt/pkgs/lua.py +54 -0
  81. jolt/pkgs/lz4.py +26 -0
  82. jolt/pkgs/m4.py +14 -0
  83. jolt/pkgs/make.py +17 -0
  84. jolt/pkgs/mesa.py +81 -0
  85. jolt/pkgs/meson.py +17 -0
  86. jolt/pkgs/mstch.py +28 -0
  87. jolt/pkgs/mysql.py +60 -0
  88. jolt/pkgs/nasm.py +49 -0
  89. jolt/pkgs/ncurses.py +30 -0
  90. jolt/pkgs/ng_log.py +25 -0
  91. jolt/pkgs/ninja.py +45 -0
  92. jolt/pkgs/nlohmann_json.py +25 -0
  93. jolt/pkgs/nodejs.py +19 -11
  94. jolt/pkgs/opencv.py +24 -0
  95. jolt/pkgs/openjdk.py +26 -0
  96. jolt/pkgs/openssl.py +103 -0
  97. jolt/pkgs/paho.py +76 -0
  98. jolt/pkgs/patchelf.py +16 -0
  99. jolt/pkgs/perl.py +42 -0
  100. jolt/pkgs/pkgconfig.py +64 -0
  101. jolt/pkgs/poco.py +39 -0
  102. jolt/pkgs/protobuf.py +77 -0
  103. jolt/pkgs/pugixml.py +27 -0
  104. jolt/pkgs/python.py +19 -0
  105. jolt/pkgs/qt.py +35 -0
  106. jolt/pkgs/rapidjson.py +26 -0
  107. jolt/pkgs/rapidyaml.py +28 -0
  108. jolt/pkgs/re2.py +30 -0
  109. jolt/pkgs/re2c.py +17 -0
  110. jolt/pkgs/readline.py +15 -0
  111. jolt/pkgs/rust.py +41 -0
  112. jolt/pkgs/sdl.py +28 -0
  113. jolt/pkgs/simdjson.py +27 -0
  114. jolt/pkgs/soci.py +46 -0
  115. jolt/pkgs/spdlog.py +29 -0
  116. jolt/pkgs/spirv_llvm.py +21 -0
  117. jolt/pkgs/spirv_tools.py +24 -0
  118. jolt/pkgs/sqlite.py +83 -0
  119. jolt/pkgs/ssl.py +12 -0
  120. jolt/pkgs/texinfo.py +15 -0
  121. jolt/pkgs/tomlplusplus.py +22 -0
  122. jolt/pkgs/wayland.py +26 -0
  123. jolt/pkgs/x11.py +58 -0
  124. jolt/pkgs/xerces_c.py +20 -0
  125. jolt/pkgs/xorg.py +360 -0
  126. jolt/pkgs/xz.py +29 -0
  127. jolt/pkgs/yamlcpp.py +30 -0
  128. jolt/pkgs/zeromq.py +47 -0
  129. jolt/pkgs/zlib.py +87 -0
  130. jolt/pkgs/zstd.py +33 -0
  131. jolt/plugins/alias.py +3 -0
  132. jolt/plugins/allure.py +5 -2
  133. jolt/plugins/autotools.py +66 -0
  134. jolt/plugins/cache.py +133 -0
  135. jolt/plugins/cmake.py +74 -6
  136. jolt/plugins/conan.py +238 -0
  137. jolt/plugins/cxx.py +698 -0
  138. jolt/plugins/cxxinfo.py +7 -0
  139. jolt/plugins/dashboard.py +1 -1
  140. jolt/plugins/docker.py +80 -23
  141. jolt/plugins/email.py +2 -2
  142. jolt/plugins/email.xslt +144 -101
  143. jolt/plugins/environ.py +11 -0
  144. jolt/plugins/fetch.py +141 -0
  145. jolt/plugins/gdb.py +39 -19
  146. jolt/plugins/gerrit.py +1 -14
  147. jolt/plugins/git.py +283 -85
  148. jolt/plugins/googletest.py +2 -1
  149. jolt/plugins/http.py +36 -38
  150. jolt/plugins/libtool.py +63 -0
  151. jolt/plugins/linux.py +990 -0
  152. jolt/plugins/logstash.py +4 -4
  153. jolt/plugins/meson.py +61 -0
  154. jolt/plugins/ninja-compdb.py +99 -30
  155. jolt/plugins/ninja.py +468 -166
  156. jolt/plugins/paths.py +11 -1
  157. jolt/plugins/pkgconfig.py +219 -0
  158. jolt/plugins/podman.py +136 -92
  159. jolt/plugins/python.py +137 -0
  160. jolt/plugins/remote_execution/__init__.py +0 -0
  161. jolt/plugins/remote_execution/administration_pb2.py +46 -0
  162. jolt/plugins/remote_execution/administration_pb2_grpc.py +170 -0
  163. jolt/plugins/remote_execution/log_pb2.py +32 -0
  164. jolt/plugins/remote_execution/log_pb2_grpc.py +68 -0
  165. jolt/plugins/remote_execution/scheduler_pb2.py +41 -0
  166. jolt/plugins/remote_execution/scheduler_pb2_grpc.py +141 -0
  167. jolt/plugins/remote_execution/worker_pb2.py +38 -0
  168. jolt/plugins/remote_execution/worker_pb2_grpc.py +112 -0
  169. jolt/plugins/report.py +12 -2
  170. jolt/plugins/rust.py +25 -0
  171. jolt/plugins/scheduler.py +710 -0
  172. jolt/plugins/selfdeploy/setup.py +8 -4
  173. jolt/plugins/selfdeploy.py +138 -88
  174. jolt/plugins/strings.py +35 -22
  175. jolt/plugins/symlinks.py +26 -11
  176. jolt/plugins/telemetry.py +5 -2
  177. jolt/plugins/timeline.py +13 -3
  178. jolt/plugins/volume.py +46 -48
  179. jolt/scheduler.py +589 -192
  180. jolt/tasks.py +625 -121
  181. jolt/templates/timeline.html.template +44 -47
  182. jolt/timer.py +22 -0
  183. jolt/tools.py +638 -282
  184. jolt/utils.py +211 -7
  185. jolt/version.py +1 -1
  186. jolt/xmldom.py +12 -2
  187. {jolt-0.9.123.dist-info → jolt-0.9.435.dist-info}/METADATA +97 -38
  188. jolt-0.9.435.dist-info/RECORD +207 -0
  189. {jolt-0.9.123.dist-info → jolt-0.9.435.dist-info}/WHEEL +1 -1
  190. jolt/plugins/amqp.py +0 -834
  191. jolt/plugins/debian.py +0 -338
  192. jolt/plugins/ftp.py +0 -181
  193. jolt/plugins/repo.py +0 -253
  194. jolt-0.9.123.dist-info/RECORD +0 -77
  195. {jolt-0.9.123.dist-info → jolt-0.9.435.dist-info}/entry_points.txt +0 -0
  196. {jolt-0.9.123.dist-info → jolt-0.9.435.dist-info}/top_level.txt +0 -0
jolt/plugins/logstash.py CHANGED
@@ -13,9 +13,9 @@ log.verbose("[LogStash] Loaded")
13
13
 
14
14
  class LogStashHooks(TaskHook):
15
15
  def __init__(self):
16
- self._uri = config.get("logstash", "http.uri")
16
+ self._uri = config.get("logstash", "http.uri", "http://logstash")
17
17
  self._failed_enabled = config.getboolean("logstash", "failed", False)
18
- self._finished_enabled = config.getboolean("logstash", "finished", False)
18
+ self._finished_enabled = config.getboolean("logstash", "passed", config.getboolean("logstash", "finished", False))
19
19
  raise_error_if(not self._uri, "logstash.http.uri not configured")
20
20
 
21
21
  def _get_uri(self, task):
@@ -25,8 +25,8 @@ class LogStashHooks(TaskHook):
25
25
  task.canonical_name)
26
26
 
27
27
  def _stash_log(self, task, logbuffer):
28
- with task.tools.tmpdir("logstash") as t:
29
- filepath = fs.path.join(t.path, "log")
28
+ with task.tools.tmpdir("logstash") as tmp:
29
+ filepath = fs.path.join(tmp, "log")
30
30
  with open(filepath, "w") as f:
31
31
  f.write(logbuffer)
32
32
  task.logstash = self._get_uri(task)
jolt/plugins/meson.py ADDED
@@ -0,0 +1,61 @@
1
+ from jolt import Task, attributes
2
+
3
+
4
+ @attributes.common_metadata()
5
+ class Meson(Task):
6
+ """ Base class for Meson-based build tasks. """
7
+
8
+ abstract = True
9
+ """ This is an abstract base class that should be inherited by concrete tasks. """
10
+
11
+ incremental = True
12
+ """
13
+ Whether to use incremental builds.
14
+ If True, the build directories are preserved between runs.
15
+ """
16
+
17
+ options = []
18
+ """
19
+ Additional options to pass to the `meson` command.
20
+ """
21
+
22
+ srcdir = None
23
+ """
24
+ Source directory for the Meson project.
25
+
26
+ If None, defaults to the task work directory (joltdir).
27
+ """
28
+
29
+ def clean(self, tools):
30
+ at = tools.meson(incremental=self.incremental)
31
+ at.clean()
32
+
33
+ def run(self, deps, tools):
34
+ self.deps = deps
35
+ options = tools.expand(self.options)
36
+ at = tools.meson(deps, incremental=self.incremental)
37
+ at.configure(self.srcdir or self.joltdir, *options)
38
+ at.build()
39
+ at.install()
40
+
41
+ def publish(self, artifact, tools):
42
+ at = tools.meson(incremental=self.incremental)
43
+ at.publish(artifact)
44
+
45
+
46
+ def requires(meson=True, ninja=True):
47
+ """ Decorator to add Meson and Ninja requirements to a task. """
48
+
49
+ import jolt.pkgs.meson
50
+ import jolt.pkgs.ninja
51
+
52
+ def decorate(cls):
53
+ if meson:
54
+ cls = attributes.requires("requires_meson")(cls)
55
+ cls.requires_meson = ["meson"]
56
+ if ninja:
57
+ cls = attributes.requires("requires_ninja")(cls)
58
+ cls.requires_ninja = ["ninja"]
59
+ return cls
60
+
61
+ return decorate
@@ -30,7 +30,7 @@ def patch(command, attrib, search, replace):
30
30
 
31
31
 
32
32
  class CompDB(object):
33
- def __init__(self, path="compile_commands.json", artifact=None):
33
+ def __init__(self, path="compdb/compile_commands.json", artifact=None):
34
34
  self.commands = []
35
35
  self.attribs = {}
36
36
  if artifact:
@@ -89,29 +89,66 @@ def has_incpaths(artifact):
89
89
 
90
90
  def stage_artifacts(artifacts, tools):
91
91
  for artifact in filter(has_incpaths, artifacts):
92
- tools.sandbox(artifact, incremental=True, reflect=fs.has_symlinks())
92
+ tools.sandbox(artifact, incremental=True)
93
+ if fs.has_symlinks:
94
+ tools.sandbox(artifact, incremental=True, reflect=True)
93
95
 
94
96
 
95
- def get_task_artifacts(task, artifact=None):
96
- acache = cache.ArtifactCache.get()
97
- artifact = artifact or acache.get_artifact(task)
98
- return artifact, [acache.get_artifact(dep) for dep in task.children]
97
+ def get_compdb_artifacts(task):
98
+ artifacts = []
99
+
100
+ def select_compdb(artifacts):
101
+ return list(filter(lambda a: a.name == "compdb", artifacts))
102
+
103
+ for dep in task.children:
104
+ artifacts.extend(dep.artifacts)
105
+ return select_compdb(task.artifacts)[0], select_compdb(artifacts)
106
+
107
+
108
+ def get_task_artifacts(task):
109
+ compdb_artifact = task.get_artifact("compdb")
110
+ artifacts = [a for a in task.artifacts]
111
+ for dep in task.children:
112
+ artifacts.extend(dep.artifacts)
113
+ return compdb_artifact, artifacts
99
114
 
100
115
 
101
116
  class CompDBHooks(TaskHook):
117
+ def __init__(self):
118
+ self._depfiles = config.getboolean("ninja-compdb", "depfiles", False)
119
+
120
+ def publish_compdb(self, artifact, tools):
121
+ with tools.cwd(self.outdir):
122
+ artifact.collect("**/*compile_commands.json", "compdb/")
123
+
124
+ def publish_depfiles(self, artifact, tools):
125
+ with tools.cwd(self.outdir):
126
+ artifact.collect("**/*.d", "depfiles/")
127
+
102
128
  def task_created(self, task):
103
129
  task.task.influence.append(StringInfluence("NinjaCompDB: v3"))
130
+ if isinstance(task.task, ninja.CXXProject):
131
+ compdb_artifact = task.cache.get_artifact(task, "compdb")
132
+ task.add_artifact(compdb_artifact)
133
+ publish_compdb = getattr(task.task, "publish_compdb", None)
134
+ if not publish_compdb:
135
+ setattr(task.task, "publish_compdb", CompDBHooks.publish_compdb.__get__(task.task, task.task.__class__))
136
+ if self._depfiles:
137
+ depfile_artifact = task.cache.get_artifact(task, "depfiles")
138
+ task.add_artifact(depfile_artifact)
139
+ publish_depfiles = getattr(task.task, "publish_depfiles", None)
140
+ if not publish_depfiles:
141
+ setattr(task.task, "publish_depfiles", CompDBHooks.publish_depfiles.__get__(task.task, task.task.__class__))
104
142
 
105
143
  def task_postrun(self, task, deps, tools):
106
144
  if not isinstance(task.task, ninja.CXXProject):
107
145
  return
108
- with tools.cwd(task.task.outdir):
109
- utils.call_and_catch(tools.run, "ninja -f build.ninja -t compdb > compile_commands.json")
146
+ with tools.cwd(tools.wsroot):
147
+ utils.call_and_catch(tools.run, "ninja -f {outdir}/build.ninja -t compdb > {outdir}/compile_commands.json")
110
148
 
111
149
  def task_postpublish(self, task, artifact, tools):
112
- if isinstance(task.task, ninja.CXXProject):
113
- with tools.cwd(task.task.outdir):
114
- artifact.collect("*compile_commands.json")
150
+ if artifact.name != "compdb":
151
+ return
115
152
 
116
153
  # Add information about the workspace and cachedir roots
117
154
  db = CompDB(artifact=artifact)
@@ -122,30 +159,40 @@ class CompDBHooks(TaskHook):
122
159
 
123
160
  if isinstance(task.task, ninja.CXXProject):
124
161
  dbpath = fs.path.join(task.task.outdir, "all_compile_commands.json")
125
- _, deps = get_task_artifacts(task, artifact)
162
+ _, deps = get_compdb_artifacts(task)
126
163
  db = CompDB(dbpath)
127
164
  for dep in [artifact] + deps:
128
165
  depdb = CompDB(artifact=dep)
129
166
  depdb.read()
130
- depdb.relocate(task)
167
+ depdb.relocate(task, sandboxes=fs.has_symlinks())
131
168
  db.merge(depdb)
132
169
  db.write()
133
- artifact.collect(dbpath, flatten=True)
170
+ artifact.collect(dbpath, "compdb/", flatten=True)
134
171
 
135
- def task_finished_execution(self, task):
172
+ def task_finished_execution(self, task: graph.TaskProxy):
136
173
  if task.options.network or task.options.worker:
137
174
  return
138
175
  if not task.is_goal():
139
176
  return
140
177
  if isinstance(task.task, ninja.CXXProject):
141
- artifact, deps = get_task_artifacts(task)
142
- db = CompDB("all_compile_commands.json", artifact)
178
+ artifact, deps = get_compdb_artifacts(task)
179
+ db = CompDB("compdb/all_compile_commands.json", artifact)
143
180
  db.read()
144
- db.relocate(task)
181
+ db.relocate(task, sandboxes=fs.has_symlinks())
145
182
  outdir = task.tools.builddir("compdb", incremental=True)
146
183
  dbpath = fs.path.join(outdir, "all_compile_commands.json")
147
184
  db.write(dbpath, force=True)
148
- stage_artifacts(deps + [artifact], task.tools)
185
+
186
+ # Save the compilation database to the configured path
187
+ if task.is_goal():
188
+ last_path = config.get("ninja-compdb", "path")
189
+ if last_path:
190
+ last_path = os.path.join(task.tools.wsroot, last_path)
191
+ task.tools.mkdirname(last_path)
192
+ db.write(last_path, force=True)
193
+
194
+ artifact, deps = get_task_artifacts(task)
195
+ stage_artifacts(deps, task.tools)
149
196
 
150
197
  def task_finished_download(self, task):
151
198
  self.task_finished_execution(task)
@@ -179,54 +226,76 @@ def compdb(ctx, task, default):
179
226
 
180
227
  """
181
228
 
182
- manifest = ctx.obj["manifest"]
183
229
  options = JoltOptions(default=default)
184
230
  acache = cache.ArtifactCache.get(options)
185
231
  TaskHookRegistry.get(options)
186
232
  executors = scheduler.ExecutorRegistry.get(options)
187
233
  registry = TaskRegistry.get()
188
234
  strategy = scheduler.DownloadStrategy(executors, acache)
189
- queue = scheduler.TaskQueue(strategy)
235
+ queue = scheduler.TaskQueue()
190
236
 
191
237
  for params in default:
192
238
  registry.set_default_parameters(params)
193
239
 
194
- gb = graph.GraphBuilder(registry, manifest, options, progress=True)
240
+ gb = graph.GraphBuilder(registry, acache, options, progress=True)
195
241
  dag = gb.build(task)
196
242
 
197
243
  try:
198
- with log.progress("Progress", dag.number_of_tasks(), " tasks", estimates=False, debug=False) as p:
244
+ with log.progress("Progress", dag.number_of_tasks(), " tasks", estimates=False, debug=False) as progress:
245
+ in_progress = set()
246
+
199
247
  while dag.has_tasks() or not queue.empty():
200
- leafs = dag.select(lambda graph, task: task.is_ready())
248
+ leafs = dag.select(lambda graph, task: task.is_ready() and task not in in_progress)
201
249
 
202
250
  # Order the tasks by their weights to improve build times
203
251
  leafs.sort(key=lambda x: x.weight)
204
252
 
205
253
  while leafs:
206
254
  task = leafs.pop()
207
- queue.submit(acache, task)
255
+ executor = strategy.create_executor({}, task)
256
+ queue.submit(executor)
257
+ in_progress.add(task)
208
258
 
209
- task, error = queue.wait()
210
- p.update(1)
259
+ task, _ = queue.wait()
260
+
261
+ # Materialize workspace resources so that
262
+ # source code is available to the debugger.
263
+ if task.is_workspace_resource():
264
+ task.task.acquire_ws(force=True)
265
+
266
+ # Unpack the task if it is not a resource task and has a custom unpack method
267
+ if not task.is_resource():
268
+ if task.is_unpackable():
269
+ task.unpack()
270
+
271
+ progress.update(1)
211
272
 
212
273
  except KeyboardInterrupt:
213
274
  print()
214
275
  log.warning("Interrupted by user")
215
276
  try:
216
277
  queue.abort()
278
+ executors.shutdown()
217
279
  sys.exit(1)
218
280
  except KeyboardInterrupt:
219
281
  print()
220
282
  log.warning("Interrupted again, exiting")
221
283
  os._exit(1)
222
284
 
285
+ finally:
286
+ queue.shutdown()
287
+
223
288
  for goal in dag.goals:
224
- artifact, deps = get_task_artifacts(goal)
225
- db = CompDB("all_compile_commands.json", artifact)
289
+ if goal.is_resource():
290
+ continue
291
+ if goal.is_alias():
292
+ continue
293
+ compdb_artifact, artifacts = get_task_artifacts(goal)
294
+ db = CompDB("compdb/all_compile_commands.json", compdb_artifact)
226
295
  db.read()
227
296
  db.relocate(goal, sandboxes=fs.has_symlinks())
228
297
  outdir = goal.tools.builddir("compdb", incremental=True)
229
298
  dbpath = fs.path.join(outdir, "all_compile_commands.json")
230
299
  db.write(dbpath, force=True)
231
- stage_artifacts(deps + [artifact], goal.tools)
300
+ stage_artifacts(artifacts, goal.tools)
232
301
  log.info("Compilation DB: {}", dbpath)