summaryrefslogtreecommitdiff
path: root/guix/build
diff options
context:
space:
mode:
Diffstat (limited to 'guix/build')
-rw-r--r--guix/build/cmake-build-system.scm63
-rw-r--r--guix/build/gnu-build-system.scm38
-rw-r--r--guix/build/perl-build-system.scm4
-rw-r--r--guix/build/utils.scm68
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)