diff options
Diffstat (limited to 'guix/build')
-rw-r--r-- | guix/build/cmake-build-system.scm | 63 | ||||
-rw-r--r-- | guix/build/gnu-build-system.scm | 38 | ||||
-rw-r--r-- | guix/build/perl-build-system.scm | 4 | ||||
-rw-r--r-- | guix/build/utils.scm | 68 |
4 files changed, 143 insertions, 30 deletions
diff --git a/guix/build/cmake-build-system.scm b/guix/build/cmake-build-system.scm new file mode 100644 index 0000000000..877d8110d7 --- /dev/null +++ b/guix/build/cmake-build-system.scm @@ -0,0 +1,63 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2013 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2013 Cyril Roelandt <tipecaml@gmail.com> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (guix build cmake-build-system) + #:use-module ((guix build gnu-build-system) + #:renamer (symbol-prefix-proc 'gnu:)) + #:use-module (guix build utils) + #:use-module (ice-9 match) + #:export (%standard-phases + cmake-build)) + +;; Commentary: +;; +;; Builder-side code of the standard cmake build procedure. +;; +;; Code: + +(define* (configure #:key outputs (configure-flags '()) + #:allow-other-keys) + "Configure the given package." + (let ((out (assoc-ref outputs "out"))) + (if (file-exists? "CMakeLists.txt") + (let ((args `(,(string-append "-DCMAKE_INSTALL_PREFIX=" out) + ,@configure-flags))) + (format #t "running 'cmake' with arguments ~s~%" args) + (zero? (apply system* "cmake" args))) + (error "no CMakeLists.txt found")))) + +(define* (check #:key (tests? #t) (parallel-tests? #t) (test-target "test") + #:allow-other-keys) + (let ((gnu-check (assoc-ref gnu:%standard-phases 'check))) + (gnu-check #:tests? tests? #:test-target test-target + #:parallel-tests? parallel-tests?))) + +(define %standard-phases + ;; Everything is as with the GNU Build System except for the `configure' + ;; and 'check' phases. + (alist-replace 'configure configure + (alist-replace 'check check + gnu:%standard-phases))) + +(define* (cmake-build #:key inputs (phases %standard-phases) + #:allow-other-keys #:rest args) + "Build the given package, applying all of PHASES in order." + (apply gnu:gnu-build #:inputs inputs #:phases phases args)) + +;;; cmake-build-system.scm ends here diff --git a/guix/build/gnu-build-system.scm b/guix/build/gnu-build-system.scm index 8fc6f86507..94a7d6bca8 100644 --- a/guix/build/gnu-build-system.scm +++ b/guix/build/gnu-build-system.scm @@ -48,34 +48,22 @@ #f dir)) -(define* (set-paths #:key inputs (path-exclusions '()) +(define* (set-paths #:key inputs (search-paths '()) #:allow-other-keys) - (define (relevant-input-directories env-var) - ;; Return the subset of INPUTS that should be considered when setting - ;; ENV-VAR. - (match (assoc-ref path-exclusions env-var) - (#f - (map cdr inputs)) - ((excluded ...) - (filter-map (match-lambda - ((name . dir) - (and (not (member name excluded)) - dir))) - inputs)))) + (define input-directories + (match inputs + (((_ . dir) ...) + dir))) - (set-path-environment-variable "PATH" '("bin") - (relevant-input-directories "PATH")) - (set-path-environment-variable "CPATH" '("include") - (relevant-input-directories "CPATH")) - (set-path-environment-variable "LIBRARY_PATH" '("lib" "lib64") - (relevant-input-directories "LIBRARY_PATH")) + (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") - (relevant-input-directories "PKG_CONFIG_PATH")) + (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/build/utils.scm b/guix/build/utils.scm index ef215e60bb..356dd46b52 100644 --- a/guix/build/utils.scm +++ b/guix/build/utils.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2012, 2013 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2013 Andreas Enge <andreas@enge.fr> +;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -51,7 +52,8 @@ patch-shebang patch-makefile-SHELL fold-port-matches - remove-store-references)) + remove-store-references + wrap-program)) ;;; @@ -652,6 +654,70 @@ known as `nuke-refs' in Nixpkgs." (put-u8 out (char->integer char)) result)))))) +(define* (wrap-program prog #:rest vars) + "Rename PROG to .PROG-real and make PROG a wrapper. VARS should look like +this: + + '(VARIABLE DELIMITER POSITION LIST-OF-DIRECTORIES) + +where DELIMITER is optional. ':' will be used if DELIMITER is not given. + +For example, this command: + + (wrap-program \"foo\" + '(\"PATH\" \":\" = (\"/nix/.../bar/bin\")) + '(\"CERT_PATH\" suffix (\"/nix/.../baz/certs\" + \"/qux/certs\"))) + +will copy 'foo' to '.foo-real' and create the file 'foo' with the following +contents: + + #!location/of/bin/bash + export PATH=\"/nix/.../bar/bin\" + export CERT_PATH=\"$CERT_PATH${CERT_PATH:+:}/nix/.../baz/certs:/qux/certs\" + exec location/of/.foo-real + +This is useful for scripts that expect particular programs to be in $PATH, for +programs that expect particular shared libraries to be in $LD_LIBRARY_PATH, or +modules in $GUILE_LOAD_PATH, etc." + (let ((prog-real (string-append "." prog "-real")) + (prog-tmp (string-append "." prog "-tmp"))) + (define (export-variable lst) + ;; Return a string that exports an environment variable. + (match lst + ((var sep '= rest) + (format #f "export ~a=\"~a\"" + var (string-join rest sep))) + ((var sep 'prefix rest) + (format #f "export ~a=\"~a${~a~a+~a}$~a\"" + var (string-join rest sep) var sep sep var)) + ((var sep 'suffix rest) + (format #f "export ~a=\"$~a${~a~a+~a}~a\"" + var var var sep sep (string-join rest sep))) + ((var '= rest) + (format #f "export ~a=\"~a\"" + var (string-join rest ":"))) + ((var 'prefix rest) + (format #f "export ~a=\"~a${~a:+:}$~a\"" + var (string-join rest ":") var var)) + ((var 'suffix rest) + (format #f "export ~a=\"$~a${~a:+:}~a\"" + var var var (string-join rest ":"))))) + + (copy-file prog prog-real) + + (with-output-to-file prog-tmp + (lambda () + (format #t + "#!~a~%~a~%exec ~a~%" + (which "bash") + (string-join (map export-variable vars) + "\n") + (canonicalize-path prog-real)))) + + (chmod prog-tmp #o755) + (rename-file prog-tmp prog))) + ;;; Local Variables: ;;; eval: (put 'call-with-output-file/atomic 'scheme-indent-function 1) ;;; eval: (put 'with-throw-handler 'scheme-indent-function 1) |