build-tools.scm 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547
  1. ;;; GNU Guix --- Functional package management for GNU
  2. ;;; Copyright © 2017, 2018 Ricardo Wurmus <rekado@elephly.net>
  3. ;;; Copyright © 2017 Corentin Bocquillon <corentin@nybble.fr>
  4. ;;; Copyright © 2017, 2018, 2019, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
  5. ;;; Copyright © 2018 Fis Trivial <ybbs.daans@hotmail.com>
  6. ;;; Copyright © 2018 Tomáš Čech <sleep_walker@gnu.org>
  7. ;;; Copyright © 2018, 2020 Marius Bakke <mbakke@fastmail.com>
  8. ;;; Copyright © 2018 Alex Vong <alexvong1995@gmail.com>
  9. ;;; Copyright © 2019, 2020 Brett Gilio <brettg@gnu.org>
  10. ;;; Copyright © 2019 Jonathan Brielmaier <jonathan.brielmaier@web.de>
  11. ;;; Copyright © 2020 Leo Prikler <leo.prikler@student.tugraz.at>
  12. ;;; Copyright © 2020 Yuval Kogman <nothingmuch@woobling.org>
  13. ;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net>
  14. ;;; Copyright © 2020 Efraim Flashner <efraim@flashner.co.il>
  15. ;;; Copyright © 2021 qblade <qblade@protonmail.com>
  16. ;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
  17. ;;;
  18. ;;; This file is part of GNU Guix.
  19. ;;;
  20. ;;; GNU Guix is free software; you can redistribute it and/or modify it
  21. ;;; under the terms of the GNU General Public License as published by
  22. ;;; the Free Software Foundation; either version 3 of the License, or (at
  23. ;;; your option) any later version.
  24. ;;;
  25. ;;; GNU Guix is distributed in the hope that it will be useful, but
  26. ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
  27. ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  28. ;;; GNU General Public License for more details.
  29. ;;;
  30. ;;; You should have received a copy of the GNU General Public License
  31. ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
  32. (define-module (gnu packages build-tools)
  33. #:use-module ((guix licenses) #:prefix license:)
  34. #:use-module (guix utils)
  35. #:use-module (guix packages)
  36. #:use-module (guix download)
  37. #:use-module (guix git-download)
  38. #:use-module (guix build-system cmake)
  39. #:use-module (gnu packages)
  40. #:use-module (gnu packages adns)
  41. #:use-module (gnu packages base)
  42. #:use-module (gnu packages bash)
  43. #:use-module (gnu packages check)
  44. #:use-module (gnu packages compression)
  45. #:use-module (gnu packages cpp)
  46. #:use-module (gnu packages gcc)
  47. #:use-module (gnu packages linux)
  48. #:use-module (gnu packages logging)
  49. #:use-module (gnu packages lua)
  50. #:use-module (gnu packages package-management)
  51. #:use-module (gnu packages pcre)
  52. #:use-module (gnu packages pkg-config)
  53. #:use-module (gnu packages pretty-print)
  54. #:use-module (gnu packages protobuf)
  55. #:use-module (gnu packages python)
  56. #:use-module (gnu packages python-crypto)
  57. #:use-module (gnu packages python-web)
  58. #:use-module (gnu packages python-xyz)
  59. #:use-module (gnu packages regex)
  60. #:use-module (gnu packages rpc)
  61. #:use-module (gnu packages sqlite)
  62. #:use-module (gnu packages tls)
  63. #:use-module (gnu packages ninja)
  64. #:use-module (guix build-system gnu)
  65. #:use-module (guix build-system python))
  66. (define-public bam
  67. (package
  68. (name "bam")
  69. (version "0.5.1")
  70. (source (origin
  71. ;; do not use auto-generated tarballs
  72. (method git-fetch)
  73. (uri (git-reference
  74. (url "https://github.com/matricks/bam")
  75. (commit (string-append "v" version))))
  76. (file-name (git-file-name name version))
  77. (sha256
  78. (base32
  79. "13br735ig7lygvzyfd15fc2rdygrqm503j6xj5xkrl1r7w2wipq6"))))
  80. (build-system gnu-build-system)
  81. (arguments
  82. `(#:make-flags `(,(string-append "CC=" ,(cc-for-target))
  83. ,(string-append "INSTALL_PREFIX="
  84. (assoc-ref %outputs "out")))
  85. #:test-target "test"
  86. #:phases
  87. (modify-phases %standard-phases
  88. (delete 'configure))))
  89. (native-inputs
  90. `(("python" ,python-2)))
  91. (inputs
  92. `(("lua" ,lua)))
  93. (home-page "https://matricks.github.io/bam/")
  94. (synopsis "Fast and flexible build system")
  95. (description "Bam is a fast and flexible build system. Bam uses Lua to
  96. describe the build process. It takes its inspiration for the script files
  97. from scons. While scons focuses on being 100% correct when building, bam
  98. makes a few sacrifices to acquire fast full and incremental build times.")
  99. (license license:bsd-3)))
  100. (define-public bear
  101. (package
  102. (name "bear")
  103. (version "3.0.4")
  104. (source (origin
  105. (method git-fetch)
  106. (uri (git-reference
  107. (url "https://github.com/rizsotto/Bear")
  108. (commit version)))
  109. (file-name (git-file-name name version))
  110. (patches (search-patches
  111. "bear-disable-preinstall-tests.patch"))
  112. (sha256
  113. (base32
  114. "15r22sbk5bibrhf54lf0shiqw1gnsik24fr5as96w3hnj6iahgwn"))))
  115. (build-system cmake-build-system)
  116. (arguments
  117. `(#:phases (modify-phases %standard-phases
  118. (add-before 'check 'set-build-environment
  119. (lambda _
  120. (setenv "CC" "gcc")
  121. #t))
  122. ;; TODO: Test Configuration is Incomplete
  123. (replace 'check
  124. (lambda _
  125. (invoke "ctest"))))))
  126. (inputs
  127. `(("c-ares" ,c-ares)
  128. ("fmt" ,fmt)
  129. ("grpc" ,grpc)
  130. ("json-modern-cxx" ,json-modern-cxx)
  131. ("protobuf" ,protobuf)
  132. ("python" ,python-wrapper)
  133. ("re2" ,re2)
  134. ("spdlog" ,spdlog)))
  135. (native-inputs
  136. `(("abseil-cpp" ,abseil-cpp)
  137. ("gcc-9" ,gcc-9) ; for <filesystem>, #44896
  138. ("googletest" ,googletest)
  139. ("openssl" ,openssl)
  140. ("pkg-config" ,pkg-config)
  141. ("python-lit" ,python-lit)
  142. ("zlib" ,zlib)))
  143. (home-page "https://github.com/rizsotto/Bear")
  144. (synopsis "Tool for generating a compilation database")
  145. (description "A JSON compilation database is used in the Clang project to
  146. provide information on how a given compilation unit is processed. With this,
  147. it is easy to re-run the compilation with alternate programs. Bear is used to
  148. generate such a compilation database.")
  149. (license license:gpl3+)))
  150. (define-public bmake
  151. (package
  152. (name "bmake")
  153. (version "20210206")
  154. (source
  155. (origin
  156. (method url-fetch)
  157. (uri (string-append
  158. "http://www.crufty.net/ftp/pub/sjg/bmake-" version ".tar.gz"))
  159. (sha256
  160. (base32 "07n9avzdg6gifrzyddnyzada5s5rzklvbqfpv5drljpxcgpqpvwg"))))
  161. (build-system gnu-build-system)
  162. (inputs
  163. `(("bash" ,bash-minimal)))
  164. (native-inputs
  165. `(("coreutils" ,coreutils)))
  166. (arguments
  167. `(#:tests? #f ; test during build
  168. #:phases
  169. (modify-phases %standard-phases
  170. (add-after 'configure 'fix-test ; fix from nixpkgs
  171. (lambda _
  172. (substitute* "unit-tests/unexport-env.mk"
  173. (("PATH=\t/bin:/usr/bin:/sbin:/usr/sbin")
  174. "PATH := ${PATH}"))))
  175. (add-after 'configure 'remove-fail-tests
  176. (lambda _
  177. (substitute* "unit-tests/Makefile"
  178. (("cmd-interrupt") "")
  179. (("varmod-localtime") ""))
  180. #t)))
  181. #:configure-flags
  182. (list
  183. (string-append
  184. "--with-defshell=" (assoc-ref %build-inputs "bash") "/bin/bash")
  185. (string-append
  186. "--with-default-sys-path=" (assoc-ref %outputs "out") "/share/mk"))
  187. #:make-flags
  188. (list "INSTALL=install"))) ;; use coreutils install
  189. (home-page "http://www.crufty.net/help/sjg/bmake.htm")
  190. (synopsis "BSD's make")
  191. (description
  192. "bmake is a program designed to simplify the maintenance of other
  193. programs. Its input is a list of specifications as to the files upon which
  194. programs and other files depend.")
  195. (license license:bsd-3)))
  196. (define-public gn
  197. (let ((commit "e327ffdc503815916db2543ec000226a8df45163")
  198. (revision "1819")) ;as returned by `git describe`, used below
  199. (package
  200. (name "gn")
  201. (version (git-version "0.0" revision commit))
  202. (home-page "https://gn.googlesource.com/gn")
  203. (source (origin
  204. (method git-fetch)
  205. (uri (git-reference (url home-page) (commit commit)))
  206. (sha256
  207. (base32
  208. "0kvlfj3www84zp1vmxh76x8fdjm9hyk8lkh2vdsidafpmm75fphr"))
  209. (file-name (git-file-name name version))))
  210. (build-system gnu-build-system)
  211. (arguments
  212. `(#:phases (modify-phases %standard-phases
  213. (add-before 'configure 'set-build-environment
  214. (lambda _
  215. (setenv "CC" "gcc") (setenv "CXX" "g++")
  216. (setenv "AR" "ar")))
  217. (replace 'configure
  218. (lambda _
  219. (invoke "python" "build/gen.py"
  220. "--no-last-commit-position")))
  221. (add-after 'configure 'create-last-commit-position
  222. (lambda _
  223. ;; Create "last_commit_position.h" to avoid a dependency
  224. ;; on 'git' (and the checkout..).
  225. (call-with-output-file "out/last_commit_position.h"
  226. (lambda (port)
  227. (format port
  228. (string-append
  229. "#define LAST_COMMIT_POSITION_NUM ~a\n"
  230. "#define LAST_COMMIT_POSITION \"~a (~a)\"\n")
  231. ,revision ,revision ,(string-take commit 8))))))
  232. (replace 'build
  233. (lambda _
  234. (invoke "ninja" "-C" "out" "gn"
  235. "-j" (number->string (parallel-job-count)))))
  236. (replace 'check
  237. (lambda* (#:key tests? #:allow-other-keys)
  238. (if tests?
  239. (begin
  240. (invoke "ninja" "-C" "out" "gn_unittests"
  241. "-j" (number->string (parallel-job-count)))
  242. (invoke "./out/gn_unittests"))
  243. (format #t "test suite not run~%"))))
  244. (replace 'install
  245. (lambda* (#:key outputs #:allow-other-keys)
  246. (let ((out (assoc-ref outputs "out")))
  247. (install-file "out/gn" (string-append out "/bin"))))))))
  248. (native-inputs
  249. `(("ninja" ,ninja)
  250. ("python" ,python-wrapper)))
  251. (synopsis "Generate Ninja build files")
  252. (description
  253. "GN is a tool that collects information about a project from @file{.gn}
  254. files and generates build instructions for the Ninja build system.")
  255. ;; GN is distributed as BSD-3, but bundles some files from ICU using the
  256. ;; X11 license.
  257. (license (list license:bsd-3 license:x11)))))
  258. (define-public meson
  259. (package
  260. (name "meson")
  261. (version "0.59.1")
  262. (source (origin
  263. (method url-fetch)
  264. (uri (string-append "https://github.com/mesonbuild/meson/"
  265. "releases/download/" version "/meson-"
  266. version ".tar.gz"))
  267. (sha256
  268. (base32
  269. "0v9m0bazhj48kwc8x3gkxg5c3kcvknvqfjlq22z6pm2h2r2nln6v"))))
  270. (build-system python-build-system)
  271. (arguments
  272. `(;; FIXME: Tests require many additional inputs and patching many
  273. ;; hard-coded file system locations in "run_unittests.py".
  274. #:tests? #f
  275. #:phases (modify-phases %standard-phases
  276. ;; Meson calls the various executables in out/bin through the
  277. ;; Python interpreter, so we cannot use the shell wrapper.
  278. (delete 'wrap))))
  279. (inputs `(("ninja" ,ninja)))
  280. (propagated-inputs `(("python" ,python)))
  281. (home-page "https://mesonbuild.com/")
  282. (synopsis "Build system designed to be fast and user-friendly")
  283. (description
  284. "The Meson build system is focused on user-friendliness and speed.
  285. It can compile code written in C, C++, Fortran, Java, Rust, and other
  286. languages. Meson provides features comparable to those of the
  287. Autoconf/Automake/make combo. Build specifications, also known as @dfn{Meson
  288. files}, are written in a custom domain-specific language (@dfn{DSL}) that
  289. resembles Python.")
  290. (license license:asl2.0)))
  291. (define-public premake4
  292. (package
  293. (name "premake")
  294. (version "4.3")
  295. (source (origin
  296. (method url-fetch)
  297. (uri (string-append "mirror://sourceforge/premake/Premake/"
  298. version "/premake-" version "-src.zip"))
  299. (sha256
  300. (base32
  301. "1017rd0wsjfyq2jvpjjhpszaa7kmig6q1nimw76qx3cjz2868lrn"))))
  302. (build-system gnu-build-system)
  303. (native-inputs
  304. `(("unzip" ,unzip))) ; for unpacking the source
  305. (arguments
  306. `(#:make-flags (list (string-append "CC=" ,(cc-for-target)))
  307. #:tests? #f ; No test suite
  308. #:phases
  309. (modify-phases %standard-phases
  310. (delete 'configure)
  311. (add-after 'unpack 'enter-source
  312. (lambda _ (chdir "build/gmake.unix") #t))
  313. (replace 'install
  314. (lambda* (#:key outputs #:allow-other-keys)
  315. (install-file "../../bin/release/premake4"
  316. (string-append (assoc-ref outputs "out") "/bin"))
  317. #t)))))
  318. (synopsis "Portable software build tool")
  319. (description "@code{premake4} is a command line utility that reads a
  320. scripted definition of a software project and outputs @file{Makefile}s or
  321. other lower-level build files.")
  322. (home-page "https://premake.github.io")
  323. (license license:bsd-3)))
  324. (define-public premake5
  325. (package
  326. (inherit premake4)
  327. (version "5.0.0-alpha15")
  328. (source (origin
  329. (method url-fetch)
  330. (uri (string-append "https://github.com/premake/premake-core/"
  331. "releases/download/v" version
  332. "/premake-" version "-src.zip"))
  333. (sha256
  334. (base32
  335. "0lyxfyqxyhjqsb3kmx1fyrxinb26i68hb7w7rg8lajczrgkmc3w8"))))
  336. (arguments
  337. (substitute-keyword-arguments (package-arguments premake4)
  338. ((#:phases phases)
  339. `(modify-phases ,phases
  340. (replace 'enter-source
  341. (lambda _ (chdir "build/gmake2.unix") #t))
  342. (replace 'install
  343. (lambda* (#:key outputs #:allow-other-keys)
  344. (install-file "../../bin/release/premake5"
  345. (string-append (assoc-ref outputs "out") "/bin"))
  346. #t))))))
  347. (description "@code{premake5} is a command line utility that reads a
  348. scripted definition of a software project and outputs @file{Makefile}s or
  349. other lower-level build files.")))
  350. (define-public tup
  351. (package
  352. (name "tup")
  353. (version "0.7.9")
  354. (source (origin
  355. (method url-fetch)
  356. (uri (string-append "http://gittup.org/tup/releases/tup-v"
  357. version ".tar.gz"))
  358. (sha256
  359. (base32
  360. "0gnd2598xqgwihdkfkx7qn0q6p4n7npam1fy83mp7s04zwj99syc"))
  361. (patches (search-patches "tup-unbundle-dependencies.patch"))
  362. (modules '((guix build utils)))
  363. (snippet
  364. '(begin
  365. ;; NOTE: Tup uses a slightly modified Lua, so it cannot be
  366. ;; unbundled. See: src/lula/tup-lua.patch
  367. (delete-file-recursively "src/pcre")
  368. (delete-file-recursively "src/sqlite3")
  369. #t))))
  370. (build-system gnu-build-system)
  371. (arguments
  372. `(#:phases
  373. (modify-phases %standard-phases
  374. ;; There is a bootstrap script, but it doesn't do what you think - it
  375. ;; builds tup.
  376. (delete 'bootstrap)
  377. (replace 'configure
  378. (lambda _
  379. (substitute* "src/tup/link.sh"
  380. (("`git describe`") ,version))
  381. (with-output-to-file "tup.config"
  382. (lambda _
  383. (format #t "CONFIG_TUP_USE_SYSTEM_SQLITE=y~%")))
  384. #t))
  385. (delete 'check)
  386. (replace 'build
  387. (lambda _
  388. ;; Based on bootstrap-nofuse.sh, but with a detour to patch-shebang.
  389. (invoke "./build.sh")
  390. (invoke "./build/tup" "init")
  391. (invoke "./build/tup" "generate" "--verbose" "build-nofuse.sh")
  392. (patch-shebang "build-nofuse.sh")
  393. (invoke "./build-nofuse.sh")))
  394. (replace 'install
  395. (lambda* (#:key outputs #:allow-other-keys)
  396. (let* ((outdir (assoc-ref outputs "out"))
  397. (ftdetect (string-append outdir
  398. "/share/vim/vimfiles/ftdetect")))
  399. (install-file "tup" (string-append outdir "/bin"))
  400. (install-file "tup.1" (string-append outdir "/share/man/man1"))
  401. (install-file "contrib/syntax/tup.vim"
  402. (string-append outdir "/share/vim/vimfiles/syntax"))
  403. (mkdir-p ftdetect)
  404. (with-output-to-file (string-append ftdetect "/tup.vim")
  405. (lambda _
  406. (display "au BufNewFile,BufRead Tupfile,*.tup setf tup")))
  407. #t))))))
  408. (inputs
  409. `(("fuse" ,fuse)
  410. ("pcre" ,pcre)
  411. ("pcre" ,pcre "bin") ; pcre-config
  412. ("sqlite" ,sqlite)))
  413. (native-inputs
  414. `(("pkg-config" ,pkg-config)))
  415. (home-page "http://gittup.org/tup/")
  416. (synopsis "Fast build system that's hard to get wrong")
  417. (description "Tup is a generic build system based on a directed acyclic
  418. graphs of commands to be executed. Tup instruments your build to detect the
  419. exact dependencies of the commands, allowing you to take advantage of ideal
  420. parallelism during incremental builds, and detecting any situations where
  421. a build worked by accident.")
  422. (license license:gpl2)))
  423. (define-public osc
  424. (package
  425. (name "osc")
  426. (version "0.172.0")
  427. (source
  428. (origin
  429. (method git-fetch)
  430. (uri (git-reference
  431. (url "https://github.com/openSUSE/osc")
  432. (commit version)))
  433. (file-name (git-file-name name version))
  434. (sha256
  435. (base32 "1sqdnkka3c6b6hwnrmlwrgy7w62cp8raq8mph9pgd2lydzzbvwlp"))))
  436. (build-system python-build-system)
  437. (arguments
  438. `(#:phases
  439. (modify-phases %standard-phases
  440. (add-after 'install 'fix-filename
  441. (lambda* (#:key outputs #:allow-other-keys)
  442. (let ((bin (string-append (assoc-ref outputs "out") "/bin/")))
  443. ;; Main osc tool is renamed in spec file, not setup.py, let's
  444. ;; do that too.
  445. (rename-file
  446. (string-append bin "osc-wrapper.py")
  447. (string-append bin "osc"))
  448. #t))))))
  449. (native-inputs
  450. `(("python-chardet" ,python-chardet)))
  451. (inputs
  452. `(("python-m2crypto" ,python-m2crypto)
  453. ("python-pycurl" ,python-pycurl)
  454. ("rpm" ,rpm))) ; for python-rpm
  455. (home-page "https://github.com/openSUSE/osc")
  456. (synopsis "Open Build Service command line tool")
  457. (description "@command{osc} is a command line interface to the Open Build
  458. Service. It allows you to checkout, commit, perform reviews etc. The vast
  459. majority of the OBS functionality is available via commands and the rest can
  460. be reached via direct API calls.")
  461. (license license:gpl2+)))
  462. (define-public compiledb
  463. (package
  464. (name "compiledb")
  465. (version "0.10.1")
  466. (source
  467. (origin
  468. (method url-fetch)
  469. (uri (pypi-uri "compiledb" version))
  470. (sha256
  471. (base32 "0vlngsdxfakyl8b7rnvn8h3l216lhbrrydr04yhy6kd03zflgfq6"))))
  472. (build-system python-build-system)
  473. (arguments
  474. `(#:phases
  475. (modify-phases %standard-phases
  476. (add-after 'unpack 'no-compat-shim-dependency
  477. ;; shutilwhich is only needed for python 3.3 and earlier
  478. (lambda _
  479. (substitute* "setup.py" (("^ *'shutilwhich'\n") ""))
  480. (substitute* "compiledb/compiler.py" (("shutilwhich") "shutil")))))))
  481. (propagated-inputs
  482. `(("python-bashlex" ,python-bashlex)
  483. ("python-click" ,python-click)))
  484. (native-inputs
  485. `(("python-pytest" ,python-pytest)))
  486. (home-page
  487. "https://github.com/nickdiego/compiledb")
  488. (synopsis
  489. "Generate Clang JSON Compilation Database files for make-based build systems")
  490. (description
  491. "@code{compiledb} provides a @code{make} python wrapper script which,
  492. besides executing the make build command, updates the JSON compilation
  493. database file corresponding to that build, resulting in a command-line
  494. interface similar to Bear.")
  495. (license license:gpl3)))
  496. (define-public build
  497. (package
  498. (name "build")
  499. (version "0.3.10")
  500. (source
  501. (origin
  502. (method url-fetch)
  503. (uri (string-append "https://www.codesynthesis.com/download/"
  504. "build/" (version-major+minor version)
  505. "/build-" version ".tar.bz2"))
  506. (sha256
  507. (base32 "1lx5rpnmsbip43zpp0a57sl5rm7pjb0y6i2si6rfglfp4p9d3z76"))))
  508. (build-system gnu-build-system)
  509. (arguments
  510. `(#:make-flags (list (string-append "install_prefix=" %output))
  511. #:tests? #f
  512. #:phases (modify-phases %standard-phases
  513. (delete 'build)
  514. (delete 'configure))))
  515. (home-page "https://www.codesynthesis.com/projects/build/")
  516. (synopsis "Massively-parallel build system implemented on top of GNU make")
  517. (description "Build is a massively-parallel software build system
  518. implemented on top of GNU Make, designed with the following tasks in mind:
  519. @itemize
  520. @item configuration
  521. @item building
  522. @item testing
  523. @item installation
  524. @end itemize
  525. Build has features such as:
  526. @itemize
  527. @item Position-independent makefiles.
  528. @item Non-recursive multi-makefile include-based structure.
  529. @item Leaf makefiles are full-fledged GNU makefiles, not just variable definitions.
  530. @item Complete dependency graph.
  531. @item Inter-project dependency tracking.
  532. @item Extensible language/compiler framework.
  533. @end itemize")
  534. (license license:gpl2+)))