From a18eda2747fa2eb962e3288066d2b1a679589ed3 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Sat, 30 Mar 2013 22:56:38 +0100 Subject: packages: Add `native-search-paths' field and honor it. * guix/packages.scm (): New record type. (search-path-specification->sexp): New procedure. ()[native-search-paths]: New field. (package-derivation): Accumulate the search paths, and pass them as #:search-paths toe BUILDER. * guix/build-system/gnu.scm (gnu-build): Add #:search-paths. Compute `implicit-search-paths'. Pass #:search-paths in BUILDER. * guix/build-system/perl.scm (perl-build): Add #:search-paths, pass it to BUILDER with the search paths of PERL. * guix/build-system/cmake.scm (cmake-build): Add #:search-paths, pass it to BUILDER. * guix/build-system/trivial.scm (trivial-build): Add #:search-paths, ignore it. * guix/build/gnu-build-system.scm (set-paths): Add #:search-paths. Remove explicit settings of CPATH, LIBRARY_PATH, and PKG_CONFIG_PATH. Instead, walk SEARCH-PATHS and call `set-path-environment-variable' for them. * guix/build/perl-build-system.scm (perl-build): Remove PERL5LIB setting. * tests/packages.scm ("search paths"): New test. * gnu/packages/bootstrap.scm (%bootstrap-guile)[raw]: Add #:search-paths. (%bootstrap-gcc): Add `native-search-paths' field. * gnu/packages/perl.scm (perl): Likewise. * gnu/packages/pkg-config.scm (pkg-config): Likewise. * gnu/packages/glib.scm (intltool): Remove `arguments'. * gnu/packages/avahi.scm (avahi): Remove #:phases. --- gnu/packages/avahi.scm | 14 +----------- gnu/packages/bootstrap.scm | 10 +++++++- gnu/packages/gcc.scm | 8 +++++++ gnu/packages/glib.scm | 12 ---------- gnu/packages/perl.scm | 3 +++ gnu/packages/pkg-config.scm | 5 ++++ guix/build-system/cmake.scm | 3 +++ guix/build-system/gnu.scm | 25 +++++++++++++++++--- guix/build-system/perl.scm | 7 ++++++ guix/build-system/trivial.scm | 6 +++-- guix/build/gnu-build-system.scm | 20 +++++++--------- guix/build/perl-build-system.scm | 4 ---- guix/packages.scm | 49 ++++++++++++++++++++++++++++++++-------- tests/packages.scm | 36 +++++++++++++++++++++++++++++ 14 files changed, 145 insertions(+), 57 deletions(-) diff --git a/gnu/packages/avahi.scm b/gnu/packages/avahi.scm index f7ce908351..fbdc0e2834 100644 --- a/gnu/packages/avahi.scm +++ b/gnu/packages/avahi.scm @@ -48,19 +48,7 @@ "--disable-xmltoman" "--enable-tests" "--disable-qt3" "--disable-qt4" - "--disable-gtk" "--disable-gtk3") - #:phases (alist-cons-before - 'configure 'set-perl-path - (lambda* (#:key inputs #:allow-other-keys) - ;; FIXME: Remove this phase when proper support for search - ;; paths is available. - (let ((xml-parser (assoc-ref inputs - "intltool/perl-xml-parser"))) - (setenv "PERL5LIB" - (string-append xml-parser - "/lib/perl5/site_perl")) - #t)) - %standard-phases))) + "--disable-gtk" "--disable-gtk3"))) (inputs `(("expat" ,expat) ("glib" ,glib) diff --git a/gnu/packages/bootstrap.scm b/gnu/packages/bootstrap.scm index 82a8db614f..eaad45a741 100644 --- a/gnu/packages/bootstrap.scm +++ b/gnu/packages/bootstrap.scm @@ -154,7 +154,8 @@ check whether everything is alright." (let ((raw (build-system (name "raw") (description "Raw build system with direct store access") - (build (lambda* (store name source inputs #:key outputs system) + (build (lambda* (store name source inputs + #:key outputs system search-paths) (define (->store file) (add-to-store store file #t "sha256" (or (search-bootstrap-binary file @@ -352,6 +353,13 @@ exec ~a/bin/.gcc-wrapped -B~a/lib \ ("i686-linux" (base32 "06wqs0xxnpw3hn0xjb4c9cs0899p1xwkcysa2rvzhvpra0c5vsg2"))))))))) + (native-search-paths + (list (search-path-specification + (variable "CPATH") + (directories '("include"))) + (search-path-specification + (variable "LIBRARY_PATH") + (directories '("lib" "lib64"))))) (synopsis "Bootstrap binaries of the GNU Compiler Collection") (description #f) (home-page #f) diff --git a/gnu/packages/gcc.scm b/gnu/packages/gcc.scm index a26dc24a4f..878d246c36 100644 --- a/gnu/packages/gcc.scm +++ b/gnu/packages/gcc.scm @@ -131,6 +131,14 @@ "install")))) %standard-phases))))) + (native-search-paths + (list (search-path-specification + (variable "CPATH") + (directories '("include"))) + (search-path-specification + (variable "LIBRARY_PATH") + (directories '("lib" "lib64"))))) + (properties `((gcc-libc . ,(assoc-ref inputs "libc")))) (synopsis "The GNU Compiler Collection") (description diff --git a/gnu/packages/glib.scm b/gnu/packages/glib.scm index fdcc9bdc31..7ff9ede22b 100644 --- a/gnu/packages/glib.scm +++ b/gnu/packages/glib.scm @@ -142,18 +142,6 @@ dynamic loading, and an object system.") (base32 "0r1vkvy5xzqk01yl6a0xlrry39bra24alkrx6279b77hc62my7jd")))) (build-system gnu-build-system) - (arguments - '(#:phases (alist-cons-before - 'configure 'set-perl-path - (lambda* (#:key inputs #:allow-other-keys) - ;; FIXME: Remove this phase when proper support for search - ;; paths is available. - (let ((xml-parser (assoc-ref inputs "perl-xml-parser"))) - (setenv "PERL5LIB" - (string-append xml-parser - "/lib/perl5/site_perl")) - #t)) - %standard-phases))) (native-inputs `(("pkg-config" ,pkg-config))) (propagated-inputs `(("gettext" ,guix:gettext) diff --git a/gnu/packages/perl.scm b/gnu/packages/perl.scm index 624d228059..c677a1b7e2 100644 --- a/gnu/packages/perl.scm +++ b/gnu/packages/perl.scm @@ -63,6 +63,9 @@ (string-append "-Dloclibpth=" libc "/lib"))))) %standard-phases))) (inputs `(("patch/no-sys-dirs" ,(search-patch "perl-no-sys-dirs.patch")))) + (native-search-paths (list (search-path-specification + (variable "PERL5LIB") + (directories '("lib/perl5/site_perl"))))) (synopsis "Implementation of the Perl programming language") (description "Perl 5 is a highly capable, feature-rich programming language with over diff --git a/gnu/packages/pkg-config.scm b/gnu/packages/pkg-config.scm index 0910a410ee..294163b474 100644 --- a/gnu/packages/pkg-config.scm +++ b/gnu/packages/pkg-config.scm @@ -36,6 +36,11 @@ "05wc5nwkqz7saj2v33ydmz1y6jdg659dll4jjh91n41m63gx0qsg")))) (build-system gnu-build-system) (arguments `(#:configure-flags '("--with-internal-glib"))) + (native-search-paths + (list (search-path-specification + (variable "PKG_CONFIG_PATH") + (directories '("lib/pkgconfig" "lib64/pkgconfig" + "share/pkgconfig"))))) (home-page "http://www.freedesktop.org/wiki/Software/pkg-config") (license gpl2+) (synopsis "a helper tool used when compiling applications and diff --git a/guix/build-system/cmake.scm b/guix/build-system/cmake.scm index 9794f4d057..4e993f3961 100644 --- a/guix/build-system/cmake.scm +++ b/guix/build-system/cmake.scm @@ -38,6 +38,7 @@ (define* (cmake-build store name source inputs #:key (guile #f) (outputs '("out")) (configure-flags ''()) + (search-paths '()) (make-flags ''()) (patches ''()) (patch-flags ''("--batch" "-p1")) (cmake (@ (gnu packages cmake) cmake)) @@ -70,6 +71,8 @@ provides a 'CMakeLists.txt' file as its build system." #:system ,system #:outputs %outputs #:inputs %build-inputs + #:search-paths ',(map search-path-specification->sexp + search-paths) #:patches ,patches #:patch-flags ,patch-flags #:phases ,phases diff --git a/guix/build-system/gnu.scm b/guix/build-system/gnu.scm index f4d0fa4f7c..d5ad1e3e01 100644 --- a/guix/build-system/gnu.scm +++ b/guix/build-system/gnu.scm @@ -159,7 +159,9 @@ System: GCC, GNU Make, Bash, Coreutils, etc." (define* (gnu-build store name source inputs #:key (guile #f) - (outputs '("out")) (configure-flags ''()) + (outputs '("out")) + (search-paths '()) + (configure-flags ''()) (make-flags ''()) (patches ''()) (patch-flags ''("--batch" "-p1")) (out-of-source? #f) @@ -189,6 +191,21 @@ the builder's environment, from the host. Note that we distinguish between both, because for Guile's own modules like (ice-9 foo), we want to use GUILE's own version of it, rather than import the user's one, which could lead to gratuitous input divergence." + (define implicit-inputs + (and implicit-inputs? + (parameterize ((%store store)) + (standard-inputs system)))) + + (define implicit-search-paths + (if implicit-inputs? + (append-map (match-lambda + ((_ (? package? p) _ ...) + (package-native-search-paths p)) + (_ + '())) + implicit-inputs) + '())) + (define builder `(begin (use-modules ,@modules) @@ -198,6 +215,9 @@ which could lead to gratuitous input divergence." #:system ,system #:outputs %outputs #:inputs %build-inputs + #:search-paths ',(map search-path-specification->sexp + (append implicit-search-paths + search-paths)) #:patches ,patches #:patch-flags ,patch-flags #:phases ,phases @@ -231,8 +251,7 @@ which could lead to gratuitous input divergence." '()) ,@inputs ,@(if implicit-inputs? - (parameterize ((%store store)) - (standard-inputs system)) + implicit-inputs '())) #:outputs outputs #:modules imported-modules diff --git a/guix/build-system/perl.scm b/guix/build-system/perl.scm index 537c29e799..c97698e225 100644 --- a/guix/build-system/perl.scm +++ b/guix/build-system/perl.scm @@ -38,6 +38,7 @@ (define* (perl-build store name source inputs #:key (perl (@ (gnu packages perl) perl)) + (search-paths '()) (tests? #t) (make-maker-flags ''()) (phases '(@ (guix build perl-build-system) @@ -53,6 +54,9 @@ (guix build utils)))) "Build SOURCE using PERL, and with INPUTS. This assumes that SOURCE provides a `Makefile.PL' file as its build system." + (define perl-search-paths + (package-native-search-paths perl)) + (define builder `(begin (use-modules ,@modules) @@ -60,6 +64,9 @@ provides a `Makefile.PL' file as its build system." #:source ,(if (and source (derivation-path? source)) (derivation-path->output-path source) source) + #:search-paths ',(map search-path-specification->sexp + (append perl-search-paths + search-paths)) #:make-maker-flags ,make-maker-flags #:system ,system #:test-target "test" diff --git a/guix/build-system/trivial.scm b/guix/build-system/trivial.scm index e5bbeaa91d..2eb15aa2e0 100644 --- a/guix/build-system/trivial.scm +++ b/guix/build-system/trivial.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2012 Ludovic Courtès +;;; Copyright © 2012, 2013 Ludovic Courtès ;;; ;;; This file is part of GNU Guix. ;;; @@ -26,7 +26,9 @@ #:export (trivial-build-system)) (define* (trivial-build store name source inputs - #:key outputs guile system builder (modules '())) + #:key + outputs guile system builder (modules '()) + search-paths) "Run build expression BUILDER, an expression, for SYSTEM. SOURCE is ignored." (define guile-for-build diff --git a/guix/build/gnu-build-system.scm b/guix/build/gnu-build-system.scm index 891c30df8f..94a7d6bca8 100644 --- a/guix/build/gnu-build-system.scm +++ b/guix/build/gnu-build-system.scm @@ -48,26 +48,22 @@ #f dir)) -(define* (set-paths #:key inputs +(define* (set-paths #:key inputs (search-paths '()) #:allow-other-keys) (define input-directories (match inputs (((_ . dir) ...) dir))) - (set-path-environment-variable "PATH" '("bin") - input-directories) - (set-path-environment-variable "CPATH" '("include") - input-directories) - (set-path-environment-variable "LIBRARY_PATH" '("lib" "lib64") + (set-path-environment-variable "PATH" '("bin" "sbin") input-directories) - ;; FIXME: Eventually move this to the `search-paths' field of the - ;; `pkg-config' package. - (set-path-environment-variable "PKG_CONFIG_PATH" - '("lib/pkgconfig" "lib64/pkgconfig" - "share/pkgconfig") - input-directories) + (for-each (match-lambda + ((env-var (directories ...) separator) + (set-path-environment-variable env-var directories + input-directories + #:separator separator))) + search-paths) ;; Dump the environment variables as a shell script, for handy debugging. (system "export > environment-variables")) diff --git a/guix/build/perl-build-system.scm b/guix/build/perl-build-system.scm index d625ef3ed6..793b6aacb5 100644 --- a/guix/build/perl-build-system.scm +++ b/guix/build/perl-build-system.scm @@ -50,10 +50,6 @@ (define* (perl-build #:key inputs (phases %standard-phases) #:allow-other-keys #:rest args) "Build the given Perl package, applying all of PHASES in order." - (set-path-environment-variable "PERL5LIB" '("lib/perl5/site_perl") - (match inputs - (((_ . path) ...) - path))) (apply gnu:gnu-build #:inputs inputs #:phases phases args)) diff --git a/guix/packages.scm b/guix/packages.scm index 81f09d638e..3a6a07bbcc 100644 --- a/guix/packages.scm +++ b/guix/packages.scm @@ -37,6 +37,11 @@ origin-file-name base32 + + search-path-specification + search-path-specification? + search-path-specification->sexp + package package? package-name @@ -49,6 +54,7 @@ package-native-inputs package-propagated-inputs package-outputs + package-native-search-paths package-search-paths package-synopsis package-description @@ -104,8 +110,22 @@ representation." ((_ str) #'(nix-base32-string->bytevector str))))) -;; A package. +;; The specification of a search path. +(define-record-type* + search-path-specification make-search-path-specification + search-path-specification? + (variable search-path-specification-variable) + (directories search-path-specification-directories) + (separator search-path-specification-separator (default ":"))) + +(define (search-path-specification->sexp spec) + "Return an sexp representing SPEC, a . The sexp +corresponds to the arguments expected by `set-path-environment-variable'." + (match spec + (($ variable directories separator) + `(,variable ,directories ,separator)))) +;; A package. (define-record-type* package make-package package? @@ -128,10 +148,13 @@ representation." (outputs package-outputs ; list of strings (default '("out"))) - (search-paths package-search-paths ; list of (ENV-VAR (DIRS ...)) - (default '())) ; tuples; see - ; `set-path-environment-variable' - ; (aka. "setup-hook") + + ; lists of + ; , + ; for native and cross + ; inputs + (native-search-paths package-native-search-paths (default '())) + (search-paths package-search-paths (default '())) (synopsis package-synopsis) ; one-line description (description package-description) ; one or two paragraphs @@ -292,16 +315,22 @@ PACKAGE for SYSTEM." (($ name version source (= build-system-builder builder) args inputs propagated-inputs native-inputs self-native-input? outputs) - ;; TODO: For `search-paths', add a builder prologue that calls - ;; `set-path-environment-variable'. - (let ((inputs (map expand-input - (package-transitive-inputs package)))) + (let* ((inputs (package-transitive-inputs package)) + (input-drvs (map expand-input inputs)) + (paths (delete-duplicates + (append-map (match-lambda + ((_ (? package? p) _ ...) + (package-native-search-paths + p)) + (_ '())) + inputs)))) (apply builder store (package-full-name package) (and source (package-source-derivation store source system)) - inputs + input-drvs + #:search-paths paths #:outputs outputs #:system system (args)))))))) diff --git a/tests/packages.scm b/tests/packages.scm index c5d9d280ed..2d16f8a03f 100644 --- a/tests/packages.scm +++ b/tests/packages.scm @@ -22,6 +22,7 @@ #:use-module (guix utils) #:use-module (guix derivations) #:use-module (guix packages) + #:use-module (guix build-system) #:use-module (guix build-system trivial) #:use-module (guix build-system gnu) #:use-module (gnu packages) @@ -138,6 +139,41 @@ (let ((p (pk 'drv d (derivation-path->output-path d)))) (eq? 'hello (call-with-input-file p read)))))) +(test-assert "search paths" + (let* ((p (make-prompt-tag "return-search-paths")) + (s (build-system + (name "raw") + (description "Raw build system with direct store access") + (build (lambda* (store name source inputs + #:key outputs system search-paths) + search-paths)))) + (x (list (search-path-specification + (variable "GUILE_LOAD_PATH") + (directories '("share/guile/site/2.0"))) + (search-path-specification + (variable "GUILE_LOAD_COMPILED_PATH") + (directories '("share/guile/site/2.0"))))) + (a (package (inherit (dummy-package "guile")) + (build-system s) + (native-search-paths x))) + (b (package (inherit (dummy-package "guile-foo")) + (build-system s) + (inputs `(("guile" ,a))))) + (c (package (inherit (dummy-package "guile-bar")) + (build-system s) + (inputs `(("guile" ,a) + ("guile-foo" ,b)))))) + (let-syntax ((collect (syntax-rules () + ((_ body ...) + (call-with-prompt p + (lambda () + body ...) + (lambda (k search-paths) + search-paths)))))) + (and (null? (collect (package-derivation %store a))) + (equal? x (collect (package-derivation %store b))) + (equal? x (collect (package-derivation %store c))))))) + (unless (false-if-exception (getaddrinfo "www.gnu.org" "80" AI_NUMERICSERV)) (test-skip 1)) (test-assert "GNU Make, bootstrap" -- cgit v1.2.3