build: Add `--target' option.
authorLudovic Courtès <ludo@gnu.org>
Fri, 24 May 2013 20:52:52 +0000 (22:52 +0200)
committerLudovic Courtès <ludo@gnu.org>
Fri, 24 May 2013 20:52:52 +0000 (22:52 +0200)
* 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
guix/scripts/build.scm
tests/guix-build.sh

index 1cf5849..cf54fe4 100644 (file)
@@ -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
index ca2fe46..995d963 100644 (file)
 (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
index 721a7c6..83de9f5 100644 (file)
@@ -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