From e55ec43d8b98fed6c51d536c000f4fba72641c53 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Fri, 24 May 2013 22:52:52 +0200 Subject: build: Add `--target' option. * guix/scripts/build.scm (derivations-from-package-expressions): Add `package-derivation' parameter. (show-help, %options): Add `--target'. (guix-build): Use `package-cross-derivation' when `--target' is passed. * tests/guix-build.sh: Add dry-run test with `--target'. * doc/guix.texi (Invoking guix build): Document `--target'. --- doc/guix.texi | 6 ++++++ guix/scripts/build.scm | 24 +++++++++++++++++++----- tests/guix-build.sh | 3 +++ 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index 1cf5849dd3..cf54fe4215 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -1198,6 +1198,12 @@ different personalities. For instance, passing @code{--system=i686-linux} on an @code{x86_64-linux} system allows users to build packages in a complete 32-bit environment. +@item --target=@var{triplet} +@cindex cross-compilation +Cross-build for @var{triplet}, which must be a valid GNU triplet, such +as @code{"mips64el-linux-gnu"} (@pxref{Configuration Names, GNU +configuration triplets,, configure, GNU Configure and Build System}). + @item --derivations @itemx -d Return the derivation paths, not the output paths, of the given diff --git a/guix/scripts/build.scm b/guix/scripts/build.scm index ca2fe46e98..995d96362b 100644 --- a/guix/scripts/build.scm +++ b/guix/scripts/build.scm @@ -38,9 +38,11 @@ (define %store (make-parameter #f)) -(define (derivations-from-package-expressions str system source?) +(define (derivations-from-package-expressions str package-derivation + system source?) "Read/eval STR and return the corresponding derivation path for SYSTEM. -When SOURCE? is true, return the derivations of the package sources." +When SOURCE? is true, return the derivations of the package sources; +otherwise, use PACKAGE-DERIVATION to compute the derivation of a package." (let ((p (read/eval-package-expression str))) (if source? (let ((source (package-source p))) @@ -71,6 +73,8 @@ Build the given PACKAGE-OR-DERIVATION and return their output paths.\n")) -S, --source build the packages' source derivations")) (display (_ " -s, --system=SYSTEM attempt to build for SYSTEM--e.g., \"i686-linux\"")) + (display (_ " + --target=TRIPLET cross-build for TRIPLET--e.g., \"armel-linux-gnu\"")) (display (_ " -d, --derivations return the derivation paths of the given packages")) (display (_ " @@ -114,6 +118,10 @@ Build the given PACKAGE-OR-DERIVATION and return their output paths.\n")) (lambda (opt name arg result) (alist-cons 'system arg (alist-delete 'system result eq?)))) + (option '("target") #t #f + (lambda (opt name arg result) + (alist-cons 'target arg + (alist-delete 'target result eq?)))) (option '(#\d "derivations") #f #f (lambda (opt name arg result) (alist-cons 'derivations-only? #t result))) @@ -222,13 +230,19 @@ Build the given PACKAGE-OR-DERIVATION and return their output paths.\n")) (with-error-handling (let ((opts (parse-options))) + (define package->derivation + (match (assoc-ref opts 'target) + (#f package-derivation) + (triplet + (cut package-cross-derivation <> <> triplet <>)))) + (parameterize ((%store (open-connection))) (let* ((src? (assoc-ref opts 'source?)) (sys (assoc-ref opts 'system)) (drv (filter-map (match-lambda (('expression . str) - (derivations-from-package-expressions str sys - src?)) + (derivations-from-package-expressions + str package->derivation sys src?)) (('argument . (? derivation-path? drv)) drv) (('argument . (? string? x)) @@ -237,7 +251,7 @@ Build the given PACKAGE-OR-DERIVATION and return their output paths.\n")) (let ((s (package-source p))) (package-source-derivation (%store) s)) - (package-derivation (%store) p sys)))) + (package->derivation (%store) p sys)))) (_ #f)) opts)) (roots (filter-map (match-lambda diff --git a/tests/guix-build.sh b/tests/guix-build.sh index 721a7c6769..83de9f5285 100644 --- a/tests/guix-build.sh +++ b/tests/guix-build.sh @@ -51,6 +51,9 @@ then false; else true; fi rm -f "$result" +# Cross building. +guix build coreutils --target=mips64el-linux-gnu --dry-run --no-substitutes + # Parsing package names and versions. guix build -n time # PASS guix build -n time-1.7 # PASS, version found -- cgit v1.2.3