nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
1{ lib
2, stdenv
3, callPackage
4, overrideCC
5, wrapCCWith
6, wrapBintoolsWith
7, runCommand
8, lit
9, glibc
10, spirv-llvm-translator
11, xz
12, swig
13, lua5_3
14, gtest
15, hip
16, rocm-comgr
17, vulkan-loader
18, vulkan-headers
19, glslang
20, shaderc
21, perl
22, rocm-device-libs
23, rocm-runtime
24, elfutils
25, python3Packages
26}:
27
28let
29 # Stage 1
30 # Base
31 llvm = callPackage ./llvm.nix {
32 requiredSystemFeatures = [ "big-parallel" ];
33 isBroken = stdenv.isAarch64; # https://github.com/RadeonOpenCompute/ROCm/issues/1831#issuecomment-1278205344
34 };
35
36 # Projects
37 clang-unwrapped = callPackage ./llvm.nix rec {
38 targetName = "clang";
39 targetDir = targetName;
40 extraBuildInputs = [ llvm ];
41
42 extraCMakeFlags = [
43 "-DCMAKE_POLICY_DEFAULT_CMP0116=NEW"
44 "-DCLANG_INCLUDE_DOCS=ON"
45 "-DCLANG_INCLUDE_TESTS=ON"
46 ];
47
48 extraPostPatch = ''
49 # Looks like they forgot to add finding libedit to the standalone build
50 ln -s ../cmake/Modules/FindLibEdit.cmake cmake/modules
51
52 substituteInPlace CMakeLists.txt \
53 --replace "include(CheckIncludeFile)" "include(CheckIncludeFile)''\nfind_package(LibEdit)"
54
55 # `No such file or directory: '/build/source/clang/tools/scan-build/bin/scan-build'`
56 rm test/Analysis/scan-build/*.test
57 rm test/Analysis/scan-build/rebuild_index/rebuild_index.test
58
59 # `does not depend on a module exporting 'baz.h'`
60 rm test/Modules/header-attribs.cpp
61
62 # `fatal error: 'stdio.h' file not found`
63 rm test/OpenMP/amdgcn_emit_llvm.c
64 '';
65
66 extraPostInstall = ''
67 mv bin/clang-tblgen $out/bin
68 '';
69 };
70
71 lld = callPackage ./llvm.nix rec {
72 buildMan = false; # No man pages to build
73 targetName = "lld";
74 targetDir = targetName;
75 extraBuildInputs = [ llvm ];
76 extraCMakeFlags = [ "-DCMAKE_POLICY_DEFAULT_CMP0116=NEW" ];
77 checkTargets = [ "check-lld" ];
78 };
79
80 # Runtimes
81 runtimes = callPackage ./llvm.nix {
82 buildDocs = false;
83 buildMan = false;
84 buildTests = false;
85 targetDir = "runtimes";
86
87 targetRuntimes = [
88 # "libc" https://github.com/llvm/llvm-project/issues/57719
89 "libunwind"
90 "libcxxabi"
91 "libcxx"
92 "compiler-rt"
93 ];
94
95 extraBuildInputs = [ llvm ];
96
97 extraCMakeFlags = [
98 "-DCMAKE_POLICY_DEFAULT_CMP0114=NEW"
99 "-DLIBCXX_INCLUDE_BENCHMARKS=OFF"
100 "-DLIBCXX_CXX_ABI=libcxxabi"
101 ];
102
103 extraLicenses = [ lib.licenses.mit ];
104 };
105
106 # Stage 2
107 # Helpers
108 rStdenv = overrideCC stdenv (wrapCCWith rec {
109 inherit bintools;
110 libcxx = runtimes;
111 cc = clang-unwrapped;
112
113 extraPackages = [
114 llvm
115 lld
116 ];
117
118 nixSupport.cc-cflags = [
119 "-resource-dir=$out/resource-root"
120 "-fuse-ld=lld"
121 "-rtlib=compiler-rt"
122 "-unwindlib=libunwind"
123 "-Wno-unused-command-line-argument"
124 ];
125
126 extraBuildCommands = ''
127 clang_version=`${cc}/bin/clang -v 2>&1 | grep "clang version " | grep -E -o "[0-9.-]+"`
128 mkdir -p $out/resource-root
129 ln -s ${cc}/lib/clang/$clang_version/include $out/resource-root
130 ln -s ${runtimes}/lib $out/resource-root
131 '';
132 });
133
134 bintools = wrapBintoolsWith { bintools = bintools-unwrapped; };
135
136 bintools-unwrapped = runCommand "rocm-llvm-binutils-${llvm.version}" { preferLocalBuild = true; } ''
137 mkdir -p $out/bin
138
139 for prog in ${lld}/bin/*; do
140 ln -s $prog $out/bin/$(basename $prog)
141 done
142
143 for prog in ${llvm}/bin/*; do
144 ln -sf $prog $out/bin/$(basename $prog)
145 done
146
147 ln -s ${llvm}/bin/llvm-ar $out/bin/ar
148 ln -s ${llvm}/bin/llvm-as $out/bin/as
149 ln -s ${llvm}/bin/llvm-dwp $out/bin/dwp
150 ln -s ${llvm}/bin/llvm-nm $out/bin/nm
151 ln -s ${llvm}/bin/llvm-objcopy $out/bin/objcopy
152 ln -s ${llvm}/bin/llvm-objdump $out/bin/objdump
153 ln -s ${llvm}/bin/llvm-ranlib $out/bin/ranlib
154 ln -s ${llvm}/bin/llvm-readelf $out/bin/readelf
155 ln -s ${llvm}/bin/llvm-size $out/bin/size
156 ln -s ${llvm}/bin/llvm-strip $out/bin/strip
157 ln -s ${lld}/bin/lld $out/bin/ld
158 '';
159in rec {
160 inherit
161 llvm
162 clang-unwrapped
163 lld
164 bintools
165 bintools-unwrapped;
166
167 # Runtimes
168 libc = callPackage ./llvm.nix rec {
169 stdenv = rStdenv;
170 targetName = "libc";
171 targetDir = "runtimes";
172 targetRuntimes = [ targetName ];
173 isBroken = true; # https://github.com/llvm/llvm-project/issues/57719
174 };
175
176 libunwind = callPackage ./llvm.nix rec {
177 stdenv = rStdenv;
178 buildMan = false; # No man pages to build
179 targetName = "libunwind";
180 targetDir = "runtimes";
181 targetRuntimes = [ targetName ];
182
183 extraCMakeFlags = [
184 "-DLIBUNWIND_INCLUDE_DOCS=ON"
185 "-DLIBUNWIND_INCLUDE_TESTS=ON"
186 "-DLIBUNWIND_USE_COMPILER_RT=ON"
187 ];
188 };
189
190 libcxxabi = callPackage ./llvm.nix rec {
191 stdenv = rStdenv;
192 buildDocs = false; # No documentation to build
193 buildMan = false; # No man pages to build
194 targetName = "libcxxabi";
195 targetDir = "runtimes";
196
197 targetRuntimes = [
198 "libunwind"
199 targetName
200 "libcxx"
201 ];
202
203 extraCMakeFlags = [
204 "-DLIBCXXABI_INCLUDE_TESTS=ON"
205 "-DLIBCXXABI_USE_LLVM_UNWINDER=ON"
206 "-DLIBCXXABI_USE_COMPILER_RT=ON"
207
208 # Workaround having to build combined
209 "-DLIBUNWIND_INCLUDE_DOCS=OFF"
210 "-DLIBUNWIND_INCLUDE_TESTS=OFF"
211 "-DLIBUNWIND_USE_COMPILER_RT=ON"
212 "-DLIBUNWIND_INSTALL_LIBRARY=OFF"
213 "-DLIBUNWIND_INSTALL_HEADERS=OFF"
214 "-DLIBCXX_INCLUDE_DOCS=OFF"
215 "-DLIBCXX_INCLUDE_TESTS=OFF"
216 "-DLIBCXX_USE_COMPILER_RT=ON"
217 "-DLIBCXX_CXX_ABI=libcxxabi"
218 "-DLIBCXX_INSTALL_LIBRARY=OFF"
219 "-DLIBCXX_INSTALL_HEADERS=OFF"
220 ];
221 };
222
223 libcxx = callPackage ./llvm.nix rec {
224 stdenv = rStdenv;
225 buildMan = false; # No man pages to build
226 targetName = "libcxx";
227 targetDir = "runtimes";
228
229 targetRuntimes = [
230 "libunwind"
231 "libcxxabi"
232 targetName
233 ];
234
235 extraCMakeFlags = [
236 "-DLIBCXX_INCLUDE_DOCS=ON"
237 "-DLIBCXX_INCLUDE_TESTS=ON"
238 "-DLIBCXX_USE_COMPILER_RT=ON"
239 "-DLIBCXX_CXX_ABI=libcxxabi"
240
241 # Workaround having to build combined
242 "-DLIBUNWIND_INCLUDE_DOCS=OFF"
243 "-DLIBUNWIND_INCLUDE_TESTS=OFF"
244 "-DLIBUNWIND_USE_COMPILER_RT=ON"
245 "-DLIBUNWIND_INSTALL_LIBRARY=OFF"
246 "-DLIBUNWIND_INSTALL_HEADERS=OFF"
247 "-DLIBCXXABI_INCLUDE_TESTS=OFF"
248 "-DLIBCXXABI_USE_LLVM_UNWINDER=ON"
249 "-DLIBCXXABI_USE_COMPILER_RT=ON"
250 "-DLIBCXXABI_INSTALL_LIBRARY=OFF"
251 "-DLIBCXXABI_INSTALL_HEADERS=OFF"
252 ];
253
254 # Most of these can't find `bash` or `mkdir`, might just be hard-coded paths, or PATH is altered
255 extraPostPatch = ''
256 chmod +w -R ../libcxx/test/{libcxx,std}
257 rm -rf ../libcxx/test/libcxx/input.output/filesystems
258 rm ../libcxx/test/libcxx/selftest/remote-substitutions.sh.cpp
259 rm ../libcxx/test/std/input.output/file.streams/fstreams/filebuf.virtuals/pbackfail.pass.cpp
260 rm ../libcxx/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/pbackfail.pass.cpp
261 rm ../libcxx/test/std/utilities/optional/optional.object/optional.object.assign/emplace_initializer_list.pass.cpp
262 rm ../libcxx/test/std/utilities/optional/optional.object/optional.object.assign/nullopt_t.pass.cpp
263 rm -rf ../libcxx/test/std/utilities/optional/optional.object/optional.object.ctor
264 rm -rf ../libcxx/test/std/input.output/filesystems/{class.directory_entry,class.directory_iterator,class.rec.dir.itr,fs.op.funcs}
265 '';
266 };
267
268 compiler-rt = callPackage ./llvm.nix rec {
269 stdenv = rStdenv;
270 buildDocs = false; # No documentation to build
271 buildMan = false; # No man pages to build
272 targetName = "compiler-rt";
273 targetDir = "runtimes";
274
275 targetRuntimes = [
276 "libunwind"
277 "libcxxabi"
278 "libcxx"
279 targetName
280 ];
281
282 extraCMakeFlags = [
283 "-DCMAKE_POLICY_DEFAULT_CMP0114=NEW"
284 "-DCOMPILER_RT_INCLUDE_TESTS=ON"
285 "-DCOMPILER_RT_USE_LLVM_UNWINDER=ON"
286 "-DCOMPILER_RT_CXX_LIBRARY=libcxx"
287 "-DCOMPILER_RT_CAN_EXECUTE_TESTS=OFF" # We can't run most of these
288
289 # Workaround having to build combined
290 "-DLIBUNWIND_INCLUDE_DOCS=OFF"
291 "-DLIBUNWIND_INCLUDE_TESTS=OFF"
292 "-DLIBUNWIND_USE_COMPILER_RT=ON"
293 "-DLIBUNWIND_INSTALL_LIBRARY=OFF"
294 "-DLIBUNWIND_INSTALL_HEADERS=OFF"
295 "-DLIBCXXABI_INCLUDE_TESTS=OFF"
296 "-DLIBCXXABI_USE_LLVM_UNWINDER=ON"
297 "-DLIBCXXABI_USE_COMPILER_RT=ON"
298 "-DLIBCXXABI_INSTALL_LIBRARY=OFF"
299 "-DLIBCXXABI_INSTALL_HEADERS=OFF"
300 "-DLIBCXX_INCLUDE_DOCS=OFF"
301 "-DLIBCXX_INCLUDE_TESTS=OFF"
302 "-DLIBCXX_USE_COMPILER_RT=ON"
303 "-DLIBCXX_CXX_ABI=libcxxabi"
304 "-DLIBCXX_INSTALL_LIBRARY=OFF"
305 "-DLIBCXX_INSTALL_HEADERS=OFF"
306 ];
307
308 extraPostPatch = ''
309 # `No such file or directory: 'ldd'`
310 substituteInPlace ../compiler-rt/test/lit.common.cfg.py \
311 --replace "'ldd'," "'${glibc.bin}/bin/ldd',"
312
313 # We can run these
314 substituteInPlace ../compiler-rt/test/CMakeLists.txt \
315 --replace "endfunction()" "endfunction()''\nadd_subdirectory(builtins)''\nadd_subdirectory(shadowcallstack)"
316 '';
317
318 extraLicenses = [ lib.licenses.mit ];
319 };
320
321 # Stage 3
322 # Helpers
323 rocmClangStdenv = overrideCC stdenv clang;
324
325 clang = wrapCCWith rec {
326 # inherit libc libcxx bintools;
327 inherit libcxx bintools;
328
329 # We do this to avoid HIP pathing problems, and mimic a monolithic install
330 cc = stdenv.mkDerivation (finalAttrs: {
331 inherit (clang-unwrapped) pname version;
332 dontUnpack = true;
333
334 installPhase = ''
335 runHook preInstall
336
337 clang_version=`${clang-unwrapped}/bin/clang -v 2>&1 | grep "clang version " | grep -E -o "[0-9.-]+"`
338 mkdir -p $out/{bin,include/c++/v1,lib/{cmake,clang/$clang_version/{include,lib}},libexec,share}
339
340 for path in ${llvm} ${clang-unwrapped} ${lld} ${libunwind} ${libcxxabi} ${libcxx} ${compiler-rt}; do
341 cp -as $path/* $out
342 chmod +w $out/{*,include/c++/v1,lib/{clang/$clang_version/include,cmake}}
343 rm -f $out/lib/libc++.so
344 done
345
346 ln -s $out/lib/* $out/lib/clang/$clang_version/lib
347 ln -s $out/include/* $out/lib/clang/$clang_version/include
348
349 runHook postInstall
350 '';
351
352 passthru.isClang = true;
353 });
354
355 extraPackages = [
356 llvm
357 lld
358 libunwind
359 libcxxabi
360 compiler-rt
361 ];
362
363 nixSupport.cc-cflags = [
364 "-resource-dir=$out/resource-root"
365 "-fuse-ld=lld"
366 "-rtlib=compiler-rt"
367 "-unwindlib=libunwind"
368 "-Wno-unused-command-line-argument"
369 ];
370
371 extraBuildCommands = ''
372 clang_version=`${cc}/bin/clang -v 2>&1 | grep "clang version " | grep -E -o "[0-9.-]+"`
373 mkdir -p $out/resource-root
374 ln -s ${cc}/lib/clang/$clang_version/{include,lib} $out/resource-root
375
376 # Not sure why, but hardening seems to make things break
377 rm $out/nix-support/add-hardening.sh
378 touch $out/nix-support/add-hardening.sh
379
380 # GPU compilation uses builtin `lld`
381 substituteInPlace $out/bin/{clang,clang++} \
382 --replace "-MM) dontLink=1 ;;" "-MM | --cuda-device-only) dontLink=1 ;;''\n--cuda-host-only | --cuda-compile-host-device) dontLink=0 ;;"
383 '';
384 };
385
386 # Base
387 # Unfortunately, we cannot build `clang-tools-extra` separately.
388 clang-tools-extra = callPackage ./llvm.nix {
389 stdenv = rocmClangStdenv;
390 buildTests = false; # `invalid operands to binary expression ('std::basic_stringstream<char>' and 'const llvm::StringRef')`
391 targetName = "clang-tools-extra";
392
393 targetProjects = [
394 "clang"
395 "clang-tools-extra"
396 ];
397
398 extraBuildInputs = [ gtest ];
399
400 extraCMakeFlags = [
401 "-DLLVM_INCLUDE_DOCS=OFF"
402 "-DLLVM_INCLUDE_TESTS=OFF"
403 "-DCLANG_INCLUDE_DOCS=OFF"
404 "-DCLANG_INCLUDE_TESTS=ON"
405 "-DCLANG_TOOLS_EXTRA_INCLUDE_DOCS=ON"
406 ];
407
408 extraPostInstall = ''
409 # Remove LLVM and Clang
410 for path in `find ${llvm} ${clang-unwrapped}`; do
411 if [ $path != ${llvm} ] && [ $path != ${clang-unwrapped} ]; then
412 rm -f $out''${path#${llvm}} $out''${path#${clang-unwrapped}} || true
413 fi
414 done
415
416 # Cleanup empty directories
417 find $out -type d -empty -delete
418 '';
419 };
420
421 # Projects
422 libclc = let
423 spirv = (spirv-llvm-translator.override { inherit llvm; });
424 in callPackage ./llvm.nix rec {
425 stdenv = rocmClangStdenv;
426 buildDocs = false; # No documentation to build
427 buildMan = false; # No man pages to build
428 targetName = "libclc";
429 targetDir = targetName;
430 extraBuildInputs = [ spirv ];
431
432 # `spirv-mesa3d` isn't compiling with LLVM 15.0.0, it does with LLVM 14.0.0
433 # Try removing the `spirv-mesa3d` and `clspv` patches next update
434 # `clspv` tests fail, unresolved calls
435 extraPostPatch = ''
436 substituteInPlace CMakeLists.txt \
437 --replace "find_program( LLVM_CLANG clang PATHS \''${LLVM_BINDIR} NO_DEFAULT_PATH )" \
438 "find_program( LLVM_CLANG clang PATHS \"${clang}/bin\" NO_DEFAULT_PATH )" \
439 --replace "find_program( LLVM_SPIRV llvm-spirv PATHS \''${LLVM_BINDIR} NO_DEFAULT_PATH )" \
440 "find_program( LLVM_SPIRV llvm-spirv PATHS \"${spirv}/bin\" NO_DEFAULT_PATH )" \
441 --replace " spirv-mesa3d-" "" \
442 --replace " spirv64-mesa3d-" "" \
443 --replace "NOT \''${t} MATCHES" \
444 "NOT \''${ARCH} STREQUAL \"clspv\" AND NOT \''${ARCH} STREQUAL \"clspv64\" AND NOT \''${t} MATCHES"
445 '';
446
447 checkTargets = [ ];
448 };
449
450 lldb = callPackage ./llvm.nix rec {
451 stdenv = rocmClangStdenv;
452 buildTests = false; # ld.lld: error: unable to find library -lllvm_gtest_main
453 targetName = "lldb";
454 targetDir = targetName;
455 extraNativeBuildInputs = [ python3Packages.sphinx-automodapi ];
456
457 extraBuildInputs = [
458 xz
459 swig
460 lua5_3
461 gtest
462 ];
463
464 extraCMakeFlags = [
465 "-DLLVM_EXTERNAL_LIT=${lit}/bin/.lit-wrapped"
466 "-DLLDB_INCLUDE_TESTS=ON"
467 "-DLLDB_INCLUDE_UNITTESTS=ON"
468 ];
469 };
470
471 mlir = callPackage ./llvm.nix rec {
472 stdenv = rocmClangStdenv;
473 buildDocs = false; # No decent way to hack this to work
474 buildMan = false; # No man pages to build
475 targetName = "mlir";
476 targetDir = targetName;
477 extraNativeBuildInputs = [ hip ];
478
479 extraBuildInputs = [
480 rocm-comgr
481 vulkan-headers
482 vulkan-loader
483 glslang
484 shaderc
485 ];
486
487 extraCMakeFlags = [
488 "-DCMAKE_POLICY_DEFAULT_CMP0116=NEW"
489 "-DMLIR_INCLUDE_DOCS=ON"
490 "-DMLIR_INCLUDE_TESTS=ON"
491 "-DMLIR_ENABLE_ROCM_RUNNER=ON"
492 "-DMLIR_ENABLE_SPIRV_CPU_RUNNER=ON"
493 "-DMLIR_ENABLE_VULKAN_RUNNER=ON"
494 "-DROCM_TEST_CHIPSET=gfx000" # CPU runner
495 ];
496
497 extraPostPatch = ''
498 chmod +w ../llvm
499 mkdir -p ../llvm/build/bin
500 ln -s ${lit}/bin/lit ../llvm/build/bin/llvm-lit
501
502 substituteInPlace test/CMakeLists.txt \
503 --replace "FileCheck count not" "" \
504 --replace "list(APPEND MLIR_TEST_DEPENDS mlir_rocm_runtime)" ""
505
506 substituteInPlace lib/ExecutionEngine/CMakeLists.txt \
507 --replace "return()" ""
508
509 # Remove problematic tests
510 rm test/CAPI/execution_engine.c
511 rm test/Target/LLVMIR/llvmir-intrinsics.mlir
512 rm test/Target/LLVMIR/llvmir.mlir
513 rm test/Target/LLVMIR/openmp-llvm.mlir
514 rm test/mlir-cpu-runner/*.mlir
515 rm test/mlir-vulkan-runner/*.mlir
516 '';
517
518 extraPostInstall = ''
519 mkdir -p $out/bin
520 mv bin/mlir-tblgen $out/bin
521 '';
522
523 checkTargets = [ "check-${targetName}" ];
524 };
525
526 polly = callPackage ./llvm.nix rec {
527 stdenv = rocmClangStdenv;
528 targetName = "polly";
529 targetDir = targetName;
530 checkTargets = [ "check-${targetName}" ];
531 };
532
533 flang = callPackage ./llvm.nix rec {
534 stdenv = rocmClangStdenv;
535 buildTests = false; # `Executable "flang1" doesn't exist!`
536 targetName = "flang";
537 targetDir = targetName;
538 extraNativeBuildInputs = [ python3Packages.sphinx-markdown-tables ];
539 extraBuildInputs = [ mlir ];
540
541 extraCMakeFlags = [
542 "-DCMAKE_POLICY_DEFAULT_CMP0116=NEW"
543 "-DCLANG_DIR=${clang-unwrapped}/lib/cmake/clang"
544 "-DFLANG_INCLUDE_TESTS=OFF"
545 "-DMLIR_TABLEGEN_EXE=${mlir}/bin/mlir-tblgen"
546 ];
547
548 extraPostPatch = ''
549 substituteInPlace test/CMakeLists.txt \
550 --replace "FileCheck" "" \
551 --replace "count" "" \
552 --replace "not" ""
553
554 substituteInPlace docs/CMakeLists.txt \
555 --replace "CLANG_TABLEGEN_EXE clang-tblgen" "CLANG_TABLEGEN_EXE ${clang-unwrapped}/bin/clang-tblgen"
556 '';
557 };
558
559 openmp = callPackage ./llvm.nix rec {
560 stdenv = rocmClangStdenv;
561 buildTests = false; # Too many failures, most pass
562 targetName = "openmp";
563 targetDir = targetName;
564 extraPatches = [ ./0000-fix-openmp.patch ];
565 extraNativeBuildInputs = [ perl ];
566
567 extraBuildInputs = [
568 rocm-device-libs
569 rocm-runtime
570 elfutils
571 ];
572
573 extraCMakeFlags = [
574 "-DCMAKE_MODULE_PATH=/build/source/llvm/cmake/modules" # For docs
575 "-DCLANG_TOOL=${clang}/bin/clang"
576 "-DCLANG_OFFLOAD_BUNDLER_TOOL=${clang-unwrapped}/bin/clang-offload-bundler"
577 "-DOPENMP_LLVM_TOOLS_DIR=${llvm}/bin"
578 "-DOPENMP_LLVM_LIT_EXECUTABLE=${lit}/bin/.lit-wrapped"
579 "-DDEVICELIBS_ROOT=${rocm-device-libs.src}"
580 ];
581
582 extraPostPatch = ''
583 # We can't build this target at the moment
584 substituteInPlace libomptarget/DeviceRTL/CMakeLists.txt \
585 --replace "gfx1010" ""
586 '';
587
588 checkTargets = [ "check-${targetName}" ];
589 extraLicenses = [ lib.licenses.mit ];
590 };
591
592 # Runtimes
593 pstl = callPackage ./llvm.nix rec {
594 stdenv = rocmClangStdenv;
595 buildDocs = false; # No documentation to build
596 buildMan = false; # No man pages to build
597 buildTests = false; # Too many errors
598 targetName = "pstl";
599 targetDir = "runtimes";
600 targetRuntimes = [ targetName ];
601 checkTargets = [ "check-${targetName}" ];
602 };
603}