diff options
Diffstat (limited to 'guix/build')
-rw-r--r-- | guix/build/font-build-system.scm | 8 | ||||
-rw-r--r-- | guix/build/glib-or-gtk-build-system.scm | 2 | ||||
-rw-r--r-- | guix/build/gnu-bootstrap.scm | 32 | ||||
-rw-r--r-- | guix/build/gnu-build-system.scm | 10 | ||||
-rw-r--r-- | guix/build/graft.scm | 5 | ||||
-rw-r--r-- | guix/build/meson-build-system.scm | 22 | ||||
-rw-r--r-- | guix/build/minetest-build-system.scm | 9 | ||||
-rw-r--r-- | guix/build/python-build-system.scm | 6 | ||||
-rw-r--r-- | guix/build/qt-utils.scm | 10 | ||||
-rw-r--r-- | guix/build/union.scm | 25 | ||||
-rw-r--r-- | guix/build/utils.scm | 58 |
11 files changed, 130 insertions, 57 deletions
diff --git a/guix/build/font-build-system.scm b/guix/build/font-build-system.scm index 6726595fe1..e4784bc17d 100644 --- a/guix/build/font-build-system.scm +++ b/guix/build/font-build-system.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2017 Arun Isaac <arunisaac@systemreboot.net> +;;; Copyright © 2017, 2022 Arun Isaac <arunisaac@systemreboot.net> ;;; Copyright © 2017 Alex Griffin <a@ajgrf.com> ;;; ;;; This file is part of GNU Guix. @@ -41,8 +41,7 @@ archive, or a font file." (begin (mkdir "source") (chdir "source") - (copy-file source (strip-store-file-name source)) - #t) + (copy-file source (strip-store-file-name source))) (gnu:unpack #:source source))) (define* (install #:key outputs #:allow-other-keys) @@ -54,7 +53,8 @@ archive, or a font file." (find-files source "\\.(ttf|ttc)$")) (for-each (cut install-file <> (string-append fonts "/opentype")) (find-files source "\\.(otf|otc)$")) - #t)) + (for-each (cut install-file <> (string-append fonts "/web")) + (find-files source "\\.(woff|woff2)$")))) (define %standard-phases (modify-phases gnu:%standard-phases diff --git a/guix/build/glib-or-gtk-build-system.scm b/guix/build/glib-or-gtk-build-system.scm index 475a94ae4f..67a52ddad3 100644 --- a/guix/build/glib-or-gtk-build-system.scm +++ b/guix/build/glib-or-gtk-build-system.scm @@ -213,7 +213,7 @@ variable. The cache file is installed under OUTPUTS. Return the first cache file name if one was created else #f." (let* ((loaders (append-map (cut find-files <> "^libpixbufloader-.*\\.so$") - directories)) + (delete-duplicates directories))) (outputs* (map (cut string-append <> "/" %gdk-pixbuf-loaders-cache-file) outputs)) diff --git a/guix/build/gnu-bootstrap.scm b/guix/build/gnu-bootstrap.scm index 1cb9dc5512..b4257a3717 100644 --- a/guix/build/gnu-bootstrap.scm +++ b/guix/build/gnu-bootstrap.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2020 Timothy Sample <samplet@ngyro.com> +;;; Copyright © 2020, 2022 Timothy Sample <samplet@ngyro.com> ;;; ;;; This file is part of GNU Guix. ;;; @@ -25,17 +25,18 @@ (define-module (guix build gnu-bootstrap) #:use-module (guix build utils) + #:use-module (srfi srfi-1) #:use-module (system base compile) #:export (bootstrap-configure bootstrap-build bootstrap-install)) -(define (bootstrap-configure version modules scripts) +(define (bootstrap-configure name version modules scripts) "Create a procedure that configures an early bootstrap package. The -procedure will search the MODULES directory and configure all of the -'.in' files with VERSION. It will then search the SCRIPTS directory and -configure all of the '.in' files with the bootstrap Guile and its module -and object directories." +procedure will search each directory in MODULES and configure all of the +'.in' files with NAME and VERSION. It will then search the SCRIPTS +directory and configure all of the '.in' files with the bootstrap +Guile and its module and object directories." (lambda* (#:key inputs outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) (guile-dir (assoc-ref inputs "guile")) @@ -50,10 +51,10 @@ and object directories." (let ((target (string-drop-right template 3))) (copy-file template target) (substitute* target + (("@PACKAGE_NAME@") name) (("@VERSION@") version)))) - (find-files modules - (lambda (fn st) - (string-suffix? ".in" fn)))) + (append-map (lambda (dir) (find-files dir "\\.in$")) + modules)) (for-each (lambda (template) (format #t "Configuring ~a~%" template) (let ((target (string-drop-right template 3))) @@ -70,7 +71,7 @@ and object directories." (define (bootstrap-build modules) "Create a procedure that builds an early bootstrap package. The -procedure will search the MODULES directory and compile all of the +procedure will search each directory in MODULES and compile all of the '.scm' files." (lambda _ (add-to-load-path (getcwd)) @@ -80,13 +81,15 @@ procedure will search the MODULES directory and compile all of the (dir (dirname scm))) (format #t "Compiling ~a~%" scm) (compile-file scm #:output-file go))) - (find-files modules "\\.scm$")) + (append-map (lambda (dir) (find-files dir "\\.scm$")) + modules)) #t)) (define (bootstrap-install modules scripts) "Create a procedure that installs an early bootstrap package. The -procedure will install all of the '.scm' and '.go' files in the MODULES -directory, and all the executable files in the SCRIPTS directory." +procedure will install all of the '.scm' and '.go' files in each of the +directories in MODULES, and all the executable files in the SCRIPTS +directory." (lambda* (#:key inputs outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) (guile-dir (assoc-ref inputs "guile")) @@ -104,7 +107,8 @@ directory, and all the executable files in the SCRIPTS directory." (install-file scm (string-append moddir "/" dir)) (format #t "Installing ~a~%" go) (install-file go (string-append godir "/" dir)))) - (find-files modules "\\.scm$")) + (append-map (lambda (dir) (find-files dir "\\.scm$")) + modules)) (for-each (lambda (script) (format #t "Installing ~a~%" script) (install-file script (string-append out "/bin"))) diff --git a/guix/build/gnu-build-system.scm b/guix/build/gnu-build-system.scm index d84411c090..ef5873d793 100644 --- a/guix/build/gnu-build-system.scm +++ b/guix/build/gnu-build-system.scm @@ -83,10 +83,12 @@ there are none." dir))) (define native-input-directories - (match native-inputs + ;; When cross-compiling, the source appears in native-inputs rather than + ;; inputs. + (match (and=> native-inputs (cut alist-delete "source" <>)) (((_ . dir) ...) dir) - (#f ; not cross compiling + (#f ;not cross-compiling '()))) ;; Tell 'ld-wrapper' to disallow non-store libraries. @@ -727,9 +729,9 @@ which cannot be found~%" ;; UTF-8-encoded. (with-fluids ((%default-port-encoding "UTF-8")) (substitute* files - (("^Exec=([^/[:blank:]\r\n]*)(.*)$" _ binary rest) + (("^Exec=([^/[:blank:]\r\n]+)(.*)$" _ binary rest) (string-append "Exec=" (which binary) rest)) - (("^TryExec=([^/[:blank:]\r\n]*)(.*)$" _ binary rest) + (("^TryExec=([^/[:blank:]\r\n]+)(.*)$" _ binary rest) (string-append "TryExec=" (which binary) rest))))))))) outputs)) diff --git a/guix/build/graft.scm b/guix/build/graft.scm index f04c35fa74..281dbaba6f 100644 --- a/guix/build/graft.scm +++ b/guix/build/graft.scm @@ -44,10 +44,7 @@ ;;; ;;; Code: -(define-syntax-rule (define-inline name val) - (define-syntax name (identifier-syntax val))) - -(define-inline hash-length 32) +(define-constant hash-length %store-hash-string-length) (define nix-base32-char? (cute char-set-contains? diff --git a/guix/build/meson-build-system.scm b/guix/build/meson-build-system.scm index 61ce45367d..d11a5d8e18 100644 --- a/guix/build/meson-build-system.scm +++ b/guix/build/meson-build-system.scm @@ -2,7 +2,7 @@ ;;; Copyright © 2017 Peter Mikkelsen <petermikkelsen10@gmail.com> ;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net> ;;; Copyright © 2018 Marius Bakke <mbakke@fastmail.com> -;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com> +;;; Copyright © 2021, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com> ;;; ;;; This file is part of GNU Guix. ;;; @@ -41,10 +41,28 @@ #:allow-other-keys) "Configure the given package." (let* ((out (assoc-ref outputs "out")) + (bindir (assoc-ref outputs "bin")) + (libdir (assoc-ref outputs "lib")) + (includedir (assoc-ref outputs "include")) (source-dir (getcwd)) (build-dir "../build") (prefix (assoc-ref outputs "out")) (args `(,(string-append "--prefix=" prefix) + ,@(if bindir + (list (string-append "--bindir=" bindir "/bin")) + '()) + ,@(if libdir + (cons (string-append "--libdir=" libdir "/lib") + (if includedir + '() + (list + (string-append "--includedir=" + libdir "/include")))) + '()) + ,@(if includedir + (list (string-append "--includedir=" + includedir "/include")) + '()) ,(string-append "--buildtype=" build-type) ,(string-append "-Dc_link_args=-Wl,-rpath=" (assoc-ref outputs "out") "/lib") @@ -55,7 +73,7 @@ (mkdir build-dir) (chdir build-dir) - (apply invoke "meson" args))) + (apply invoke "meson" "setup" args))) (define* (build #:key parallel-build? #:allow-other-keys) diff --git a/guix/build/minetest-build-system.scm b/guix/build/minetest-build-system.scm index 5f68686067..4a7a87ab83 100644 --- a/guix/build/minetest-build-system.scm +++ b/guix/build/minetest-build-system.scm @@ -91,15 +91,6 @@ If it is unknown, make an educated guess." #:install-plan (mod-install-plan (apply guess-mod-name arguments)) arguments)) -(define %png-magic-bytes - ;; Magic bytes of PNG images, see ‘5.2 PNG signatures’ in - ;; ‘Portable Network Graphics (PNG) Specification (Second Edition)’ - ;; on <https://www.w3.org/TR/PNG/>. - #vu8(137 80 78 71 13 10 26 10)) - -(define png-file? - ((@@ (guix build utils) file-header-match) %png-magic-bytes)) - (define* (minimise-png #:key inputs native-inputs #:allow-other-keys) "Minimise PNG images found in the working directory." (define optipng (which "optipng")) diff --git a/guix/build/python-build-system.scm b/guix/build/python-build-system.scm index 08871f60cd..aa04664b25 100644 --- a/guix/build/python-build-system.scm +++ b/guix/build/python-build-system.scm @@ -68,7 +68,7 @@ ;; downloading the package source from PyPI (the Python Package Index). Both ;; of them import setuptools and execute the "setup.py" file under their ;; control. Thus the "setup.py" behaves as if the developer had imported -;; setuptools within setup.py - even is still using only distutils. +;; setuptools within setup.py - even if it is still using only distutils. ;; ;; Setuptools' "install" command (to be more precise: the "easy_install" ;; command which is called by "install") will put the path of the currently @@ -176,8 +176,8 @@ without errors." (define (site-packages inputs outputs) "Return the path of the current output's Python site-package." - (let* ((out (python-output outputs)) - (python (assoc-ref inputs "python"))) + (let ((out (python-output outputs)) + (python (assoc-ref inputs "python"))) (string-append out "/lib/python" (python-version python) "/site-packages"))) (define (add-installed-pythonpath inputs outputs) diff --git a/guix/build/qt-utils.scm b/guix/build/qt-utils.scm index 7f503320d2..f52e3f7af5 100644 --- a/guix/build/qt-utils.scm +++ b/guix/build/qt-utils.scm @@ -97,7 +97,7 @@ `("QTWEBENGINEPROCESS_PATH" = regular ,(format #f "/lib/qt~a/libexec/QtWebEngineProcess" qt-major-version))))) -(define* (wrap-qt-program* program #:key inputs output-dir +(define* (wrap-qt-program* program #:key sh inputs output-dir qt-wrap-excluded-inputs (qt-major-version %default-qt-major-version)) @@ -114,9 +114,9 @@ output-dir #:qt-major-version qt-major-version))) (when (not (null? vars-to-wrap)) - (apply wrap-program program vars-to-wrap)))) + (apply wrap-program program #:sh sh vars-to-wrap)))) -(define* (wrap-qt-program program-name #:key inputs output +(define* (wrap-qt-program program-name #:key (sh (which "bash")) inputs output (qt-wrap-excluded-inputs %qt-wrap-excluded-inputs) (qt-major-version %default-qt-major-version)) "Wrap the specified program (which must reside in the OUTPUT's \"/bin\" @@ -125,11 +125,12 @@ directory) with suitably set environment variables. This is like qt-build-systems's phase \"qt-wrap\", but only the named program is wrapped." (wrap-qt-program* (string-append output "/bin/" program-name) + #:sh sh #:output-dir output #:inputs inputs #:qt-wrap-excluded-inputs qt-wrap-excluded-inputs #:qt-major-version qt-major-version)) -(define* (wrap-all-qt-programs #:key inputs outputs +(define* (wrap-all-qt-programs #:key (sh (which "bash")) inputs outputs qtbase (qt-wrap-excluded-outputs '()) (qt-wrap-excluded-inputs %qt-wrap-excluded-inputs) @@ -168,6 +169,7 @@ add a dependency of that output on Qt." ((output . output-dir) (unless (member output qt-wrap-excluded-outputs) (for-each (cut wrap-qt-program* <> + #:sh sh #:output-dir output-dir #:inputs inputs #:qt-wrap-excluded-inputs qt-wrap-excluded-inputs #:qt-major-version qt-major-version) diff --git a/guix/build/union.scm b/guix/build/union.scm index bf75c67c52..ce6d030109 100644 --- a/guix/build/union.scm +++ b/guix/build/union.scm @@ -27,7 +27,7 @@ #:use-module (rnrs io ports) #:export (union-build - warn-about-collision + resolve-collision/default relative-file-name symlink-relative)) @@ -103,22 +103,31 @@ identical, #f otherwise." ;; for most packages. '("icon-theme.cache" "gschemas.compiled" "ld.so.cache")) -(define (warn-about-collision files) - "Handle the collision among FILES by emitting a warning and choosing the -first one of THEM." - (let ((file (first files))) - (unless (member (basename file) %harmless-collisions) +(define (resolve+warn-if-harmful resolve files) + "Same as (resolve files), but print a warning if the resolved file is not +considered harmless. Also warn if the resolver doesn't pick any file." + (let ((file (resolve files))) + (cond + ((not file) (format (current-error-port) "~%warning: collision encountered:~%~{ ~a~%~}" files) - (format (current-error-port) "warning: choosing ~a~%" file)) + (format (current-error-port) "warning: not choosing any file~%")) + (((negate member) (basename file) %harmless-collisions) + (format (current-error-port) + "~%warning: collision encountered:~%~{ ~a~%~}" + files) + (format (current-error-port) "warning: choosing ~a~%" file))) file)) +(define (resolve-collision/default files) + (resolve+warn-if-harmful first files)) + (define* (union-build output inputs #:key (log-port (current-error-port)) (create-all-directories? #f) (symlink symlink) - (resolve-collision warn-about-collision)) + (resolve-collision resolve-collision/default)) "Build in the OUTPUT directory a symlink tree that is the union of all the INPUTS, using SYMLINK to create symlinks. As a special case, if CREATE-ALL-DIRECTORIES?, creates the subdirectories in the output directory to diff --git a/guix/build/utils.scm b/guix/build/utils.scm index dd5a91f52f..2352a627e9 100644 --- a/guix/build/utils.scm +++ b/guix/build/utils.scm @@ -3,11 +3,11 @@ ;;; Copyright © 2013 Andreas Enge <andreas@enge.fr> ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org> ;;; Copyright © 2015, 2018, 2021 Mark H Weaver <mhw@netris.org> -;;; Copyright © 2018 Arun Isaac <arunisaac@systemreboot.net> +;;; Copyright © 2018, 2022 Arun Isaac <arunisaac@systemreboot.net> ;;; Copyright © 2018, 2019 Ricardo Wurmus <rekado@elephly.net> ;;; Copyright © 2020 Efraim Flashner <efraim@flashner.co.il> ;;; Copyright © 2020, 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com> -;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be> +;;; Copyright © 2021, 2022 Maxime Devos <maximedevos@telenet.be> ;;; Copyright © 2021 Brendan Tildesley <mail@brendan.scot> ;;; ;;; This file is part of GNU Guix. @@ -48,6 +48,7 @@ ;; <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=26805#16>. delete) #:export (%store-directory + %store-hash-string-length store-file-name? strip-store-file-name package-name->name+version @@ -60,8 +61,11 @@ directory-exists? executable-file? symbolic-link? + switch-symlinks call-with-temporary-output-file call-with-ascii-input-file + file-header-match + png-file? elf-file? ar-file? gzip-file? @@ -87,6 +91,8 @@ search-error-path search-error-file + define-constant + every* alist-cons-before alist-cons-after @@ -128,6 +134,16 @@ ;;; +;;; Syntax +;;; + +;; Note that in its current form VAL doesn't get evaluated, just simply +;; inlined. TODO? +(define-syntax-rule (define-constant name val) + (define-syntax name (identifier-syntax val))) + + +;;; ;;; Guile 2.0 compatibility later. ;;; @@ -183,15 +199,21 @@ compression." (getenv "NIX_STORE") ;inside builder, set by the daemon "/gnu/store")) +(define-constant %store-hash-string-length 32) + (define (store-file-name? file) "Return true if FILE is in the store." (string-prefix? (%store-directory) file)) +(define (store-path-prefix-length) + (+ 2 ; the slash after %store-directory, and the dash after the hash + (string-length (%store-directory)) + %store-hash-string-length)) + (define (strip-store-file-name file) "Strip the '/gnu/store' and hash from FILE, a store file name. The result is typically a \"PACKAGE-VERSION\" string." - (string-drop file - (+ 34 (string-length (%store-directory))))) + (string-drop file (store-path-prefix-length))) (define (package-name->name+version name) "Given NAME, a package name like \"foo-0.9.1b\", return two values: @@ -238,6 +260,25 @@ introduce the version part." "Return #t if FILE is a symbolic link (aka. \"symlink\".)" (eq? (stat:type (lstat file)) 'symlink)) +(define (switch-symlinks link target) + "Atomically switch LINK, a symbolic link, to point to TARGET. Works +both when LINK already exists and when it does not." + (let ((pivot (string-append link ".new"))) + ;; Create pivot link, deleting it if it already exists. This can + ;; happen if a previous switch-symlinks was interrupted. + (let symlink/remove-old () + (catch 'system-error + (lambda () + (symlink target pivot)) + (lambda args + (if (= (system-error-errno args) EEXIST) + (begin + ;; Remove old link and retry. + (delete-file pivot) + (symlink/remove-old)) + (apply throw args))))) + (rename-file pivot link))) + (define (call-with-temporary-output-file proc) "Call PROC with a name of a temporary file and open output port to that file; close the file and delete it when leaving the dynamic extent of this @@ -291,6 +332,15 @@ with the bytes in HEADER, a bytevector." #f ;FILE is a directory (apply throw args)))))) +(define %png-magic-bytes + ;; Magic bytes of PNG images, see ‘5.2 PNG signatures’ in + ;; ‘Portable Network Graphics (PNG) Specification (Second Edition)’ + ;; on <https://www.w3.org/TR/PNG/>. + #vu8(137 80 78 71 13 10 26 10)) + +(define png-file? + (file-header-match %png-magic-bytes)) + (define %elf-magic-bytes ;; Magic bytes of ELF files. See <elf.h>. (u8-list->bytevector (map char->integer (string->list "\x7FELF")))) |