GNU bug report logs - #48044
[PATCH] build/go: Support cross compiling.

Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.

Package: guix-patches; Reported by: Efraim Flashner <efraim@HIDDEN>; Keywords: patch; dated Mon, 26 Apr 2021 18:34:02 UTC; Maintainer for guix-patches is guix-patches@HIDDEN.

Message received at 48044 <at> debbugs.gnu.org:


Received: (at 48044) by debbugs.gnu.org; 26 Apr 2021 19:40:36 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Mon Apr 26 15:40:35 2021
Received: from localhost ([127.0.0.1]:47244 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1lb75v-00028h-HE
	for submit <at> debbugs.gnu.org; Mon, 26 Apr 2021 15:40:35 -0400
Received: from michel.telenet-ops.be ([195.130.137.88]:34648)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <maximedevos@HIDDEN>) id 1lb75s-00028X-Fg
 for 48044 <at> debbugs.gnu.org; Mon, 26 Apr 2021 15:40:33 -0400
Received: from ptr-bvsjgyjmffd7q9timvx.18120a2.ip6.access.telenet.be
 ([IPv6:2a02:1811:8c09:9d00:aaf1:9810:a0b8:a55d])
 by michel.telenet-ops.be with bizsmtp
 id xXgW2400F0mfAB406XgWjz; Mon, 26 Apr 2021 21:40:30 +0200
Message-ID: <88494b19720f78a81b0eff53b46f134f302247e9.camel@HIDDEN>
Subject: Re: [bug#48044] [PATCH] build/go: Support cross compiling.
From: Maxime Devos <maximedevos@HIDDEN>
To: Efraim Flashner <efraim@HIDDEN>, 48044 <at> debbugs.gnu.org
Date: Mon, 26 Apr 2021 21:39:32 +0200
In-Reply-To: <20210426183235.3856-1-efraim@HIDDEN>
References: <20210426183235.3856-1-efraim@HIDDEN>
Content-Type: multipart/signed; micalg="pgp-sha512";
 protocol="application/pgp-signature"; boundary="=-dZYxJwmhYpmCD3t7K6ua"
User-Agent: Evolution 3.34.2 
MIME-Version: 1.0
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=telenet.be; s=r21;
 t=1619466030; bh=Nt7DAMWKT8A2WUtxTUQnzT1Fzfz3ZGluqpkXjEpAhUI=;
 h=Subject:From:To:Date:In-Reply-To:References;
 b=eE333VhUQZrgfoGLdu3ZTGWyVihpBfPORhg80rco5kD0jR/T9uOvK7Seu+0v1YkTO
 2akgIBSJMAXZghmu15l1eukUOhDqE9bJ8T/qZSqFPkZdT6qQYIoyp24W9IxR/vdGrr
 O6T5UKPdm/t4E4JFKZQ95CFl/0xmaZlCG6J8Q9NdohA0SACfvr+IIR0mNAAf7JTbyW
 ntv0jaE51K1z6gBzoolvSme0jnylM2oRNQQmJEJzokrLmHLMrV6S50O/oz7IBTJQRc
 DOyHBYEEXdjiF/nrYic8GpMaDSUQfHTqevkGewgCZcSC1PGxuNDxxzPo9JvUsBTbCP
 86z9M3ZWCKbMQ==
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 48044
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)


--=-dZYxJwmhYpmCD3t7K6ua
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

> +      ;; We really only support targeting Linux and mingw.
> +      (setenv "GOOS" (if (string-contains target "mingw")
> +                       "windows"
> +                       "linux"))

If only Linux and mingw is supported, perhaps some kind of error
could be thrown if 'target' does not contain either "mingw" or "linux",
to avoid silently compiling for the wrong operating system?  There is
the Hurd as well for example.

I would recommend throwing the error (or returning #f?) from lower,
to notify the user cross-compilation is not possible as early as possible.

> +      (setenv "GOARM" "7")  ; Default is 6, target our armhf-linux archi=
tecture.

Would it be possible to only set that variable when targetting armhf-linux?
Setting this when targetting other architectures seems unlikely to cause is=
sues,
but still seems subtly wrong to me, for some value of subtle.

Note: I do not know much about go and did not test this.

Greetings,
Maxime.

--=-dZYxJwmhYpmCD3t7K6ua
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part
Content-Transfer-Encoding: 7bit

-----BEGIN PGP SIGNATURE-----

iI0EABYKADUWIQTB8z7iDFKP233XAR9J4+4iGRcl7gUCYIcW+RccbWF4aW1lZGV2
b3NAdGVsZW5ldC5iZQAKCRBJ4+4iGRcl7sOBAQCtuK3GMvSwVHnCx9kEYMe5oepc
M6X/hiTLNlZDx+CDoAD+PCbKiPVnCQ7BddbxH3RFYt2CYB6u1aiZbCsg7qHTvQs=
=l2nz
-----END PGP SIGNATURE-----

--=-dZYxJwmhYpmCD3t7K6ua--





Information forwarded to guix-patches@HIDDEN:
bug#48044; Package guix-patches. Full text available.

Message received at submit <at> debbugs.gnu.org:


Received: (at submit) by debbugs.gnu.org; 26 Apr 2021 18:33:55 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Mon Apr 26 14:33:55 2021
Received: from localhost ([127.0.0.1]:47146 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1lb63K-0004Ye-TJ
	for submit <at> debbugs.gnu.org; Mon, 26 Apr 2021 14:33:55 -0400
Received: from lists.gnu.org ([209.51.188.17]:39858)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <efraim@HIDDEN>) id 1lb63H-0004YT-DV
 for submit <at> debbugs.gnu.org; Mon, 26 Apr 2021 14:33:49 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10]:42096)
 by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <efraim@HIDDEN>)
 id 1lb63H-0008RF-77
 for guix-patches@HIDDEN; Mon, 26 Apr 2021 14:33:47 -0400
Received: from flashner.co.il ([178.62.234.194]:33338)
 by eggs.gnu.org with esmtp (Exim 4.90_1)
 (envelope-from <efraim@HIDDEN>) id 1lb63C-00040o-BT
 for guix-patches@HIDDEN; Mon, 26 Apr 2021 14:33:46 -0400
Received: from localhost (unknown [31.210.177.125])
 by flashner.co.il (Postfix) with ESMTPSA id B683D40BC8;
 Mon, 26 Apr 2021 18:33:09 +0000 (UTC)
From: Efraim Flashner <efraim@HIDDEN>
To: guix-patches@HIDDEN
Subject: [PATCH] build/go: Support cross compiling.
Date: Mon, 26 Apr 2021 21:32:35 +0300
Message-Id: <20210426183235.3856-1-efraim@HIDDEN>
X-Mailer: git-send-email 2.31.1
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Received-SPF: pass client-ip=178.62.234.194;
 envelope-from=efraim@HIDDEN; helo=flashner.co.il
X-Spam_score_int: -18
X-Spam_score: -1.9
X-Spam_bar: -
X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_PASS=-0.001,
 SPF_PASS=-0.001 autolearn=ham autolearn_force=no
X-Spam_action: no action
X-Spam-Score: -1.3 (-)
X-Debbugs-Envelope-To: submit
Cc: Efraim Flashner <efraim@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -2.3 (--)

* guix/build-system/go.scm (lower): Only add target to private-keywords
when not cross compiling. Adjust bag depending if doing a native or
cross compile.
(go-cross-build): New procedure.
* guix/build/go-build-system.scm (setup-go-environment): Accept target
keyword. Add logic to choose correct target architecture when cross
compiling.
---
 guix/build-system/go.scm       | 137 +++++++++++++++++++++++++++++----
 guix/build/go-build-system.scm |  29 ++++++-
 2 files changed, 148 insertions(+), 18 deletions(-)

diff --git a/guix/build-system/go.scm b/guix/build-system/go.scm
index 8f55796e86..c9c8f5ba15 100644
--- a/guix/build-system/go.scm
+++ b/guix/build-system/go.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2016 Petter <petter@HIDDEN>
 ;;; Copyright © 2017 Leo Famulari <leo@HIDDEN>
 ;;; Copyright © 2020 Jakub Kądziołka <kuba@HIDDEN>
+;;; Copyright © 2021 Efraim Flashner <efraim@HIDDEN>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -96,24 +97,40 @@ commit hash and its date rather than a proper release tag."
                 #:rest arguments)
   "Return a bag for NAME."
   (define private-keywords
-    '(#:source #:target #:go #:inputs #:native-inputs))
+    `(#:source #:go #:inputs #:native-inputs
+      ,@(if target '() '(#:target))))
 
-  (and (not target)                               ;XXX: no cross-compilation
-       (bag
-         (name name)
-         (system system)
-         (host-inputs `(,@(if source
-                              `(("source" ,source))
-                              '())
-                        ,@inputs
+  (bag
+    (name name)
+    (system system)
+    (target target)
+    (build-inputs `(,@(if source
+                        `(("source" ,source))
+                        '())
+                     ,@`(("go" ,go))
+                     ,@native-inputs
+                     ,@(if target '() inputs)
+                     ,@(if target
+                         ;; Use the standard cross inputs of
+                         ;; 'gnu-build-system'.
+                         (standard-cross-packages target 'host)
+                         '())
+                     ;; Keep the standard inputs of 'gnu-build-system'.
+                     ,@(standard-packages)))
+    (host-inputs (if target inputs '()))
 
-                        ;; Keep the standard inputs of 'gnu-build-system'.
-                        ,@(standard-packages)))
-         (build-inputs `(("go" ,go)
-                         ,@native-inputs))
-         (outputs outputs)
-         (build go-build)
-         (arguments (strip-keyword-arguments private-keywords arguments)))))
+    ;; The cross-libc is really a target package, but for bootstrapping
+    ;; reasons, we can't put it in 'host-inputs'.  Namely, 'cross-gcc' is a
+    ;; native package, so it would end up using a "native" variant of
+    ;; 'cross-libc' (built with 'gnu-build'), whereas all the other packages
+    ;; would use a target variant (built with 'gnu-cross-build'.)
+    (target-inputs (if target
+                     (standard-cross-packages target 'target)
+                     '()))
+
+    (outputs outputs)
+    (build (if target go-cross-build go-build))
+    (arguments (strip-keyword-arguments private-keywords arguments))))
 
 (define* (go-build store name inputs
                    #:key
@@ -174,6 +191,94 @@ commit hash and its date rather than a proper release tag."
                                 #:outputs outputs
                                 #:guile-for-build guile-for-build))
 
+(define* (go-cross-build store name
+                         #:key
+                         target native-drvs target-drvs
+                         (phases '(@ (guix build go-build-system)
+                                     %standard-phases))
+                         (outputs '("out"))
+                         (search-paths '())
+                         (native-search-paths '())
+                         (install-source? #t)
+                         (import-path "")
+                         (unpack-path "")
+                         (build-flags ''())
+                         (tests? #f) ; nothing can be done
+                         (allow-go-reference? #f)
+                         (system (%current-system))
+                         (guile #f)
+                         (imported-modules %go-build-system-modules)
+                         (modules '((guix build go-build-system)
+                                    (guix build union)
+                                    (guix build utils))))
+  "Cross-build NAME using GO, where TARGET is a GNU triplet and with INPUTS."
+  (define builder
+    `(begin
+       (use-modules ,@modules)
+       (let ()
+         (define %build-host-inputs
+           ',(map (match-lambda
+                    ((name (? derivation? drv) sub ...)
+                     `(,name . ,(apply derivation->output-path drv sub)))
+                    ((name path)
+                     `(,name . ,path)))
+                  native-drvs))
+
+         (define %build-target-inputs
+           ',(map (match-lambda
+                    ((name (? derivation? drv) sub ...)
+                     `(,name . ,(apply derivation->output-path drv sub)))
+                    ((name (? package? pkg) sub ...)
+                     (let ((drv (package-cross-derivation store pkg
+                                                          target system)))
+                       `(,name . ,(apply derivation->output-path drv sub))))
+                    ((name path)
+                     `(,name . ,path)))
+                  target-drvs))
+
+         (go-build #:name ,name
+                   #:source ,(match (assoc-ref native-drvs "source")
+                                    (((? derivation? source))
+                                     (derivation->output-path source))
+                                    ((source)
+                                     source)
+                                    (source
+                                      source))
+                   #:system ,system
+                   #:phases ,phases
+                   #:outputs %outputs
+                   #:target ,target
+                   #:inputs %build-target-inputs
+                   #:native-inputs %build-host-inputs
+                   #:search-paths ',(map search-path-specification->sexp
+                                         search-paths)
+                   #:native-search-paths ',(map
+                                             search-path-specification->sexp
+                                             native-search-paths)
+                   #:install-source? ,install-source?
+                   #:import-path ,import-path
+                   #:unpack-path ,unpack-path
+                   #:build-flags ,build-flags
+                   #:tests? ,tests?
+                   #:allow-go-reference? ,allow-go-reference?
+                   #:inputs %build-inputs))))
+
+    (define guile-for-build
+      (match guile
+             ((? package?)
+              (package-derivation store guile system #:graft? #f))
+             (#f                               ; the default
+              (let* ((distro (resolve-interface '(gnu packages commencement)))
+                     (guile  (module-ref distro 'guile-final)))
+                (package-derivation store guile system #:graft? #f)))))
+
+    (build-expression->derivation store name builder
+                                  #:system system
+                                  #:inputs (append native-drvs target-drvs)
+                                  #:outputs outputs
+                                  #:modules imported-modules
+                                  #:guile-for-build guile-for-build))
+
 (define go-build-system
   (build-system
     (name 'go)
diff --git a/guix/build/go-build-system.scm b/guix/build/go-build-system.scm
index 227df820db..5436e19854 100644
--- a/guix/build/go-build-system.scm
+++ b/guix/build/go-build-system.scm
@@ -4,7 +4,7 @@
 ;;; Copyright © 2019 Maxim Cournoyer <maxim.cournoyer@HIDDEN>
 ;;; Copyright © 2020 Jack Hill <jackhill@HIDDEN>
 ;;; Copyright © 2020 Jakub Kądziołka <kuba@HIDDEN>
-;;; Copyright © 2020 Efraim Flashner <efraim@HIDDEN>
+;;; Copyright © 2020, 2021 Efraim Flashner <efraim@HIDDEN>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -131,7 +131,7 @@
 ;;
 ;; Code:
 
-(define* (setup-go-environment #:key inputs outputs #:allow-other-keys)
+(define* (setup-go-environment #:key inputs outputs target #:allow-other-keys)
   "Prepare a Go build environment for INPUTS and OUTPUTS.  Build a file system
 union of INPUTS.  Export GOPATH, which helps the compiler find the source code
 of the package being built and its dependencies, and GOBIN, which determines
@@ -149,6 +149,31 @@ dependencies, so it should be self-contained."
   ;; GOPATH behavior.
   (setenv "GO111MODULE" "off")
   (setenv "GOBIN" (string-append (assoc-ref outputs "out") "/bin"))
+
+  ;; Cross-build
+  (when target
+    ;; Separate the 3 parts of the target-triplet
+    (let* ((first-dash (string-index target #\-))
+           (second-dash (string-index target #\- (1+ first-dash)))
+           (machine (string-take target first-dash)))
+      (setenv "GOARCH" (match machine
+                         ("aarch64" "arm64")
+                         ("powerpc64le" "ppc64le")
+                         ("powerpc64" "ppc64")
+                         ("i686" "386")
+                         ("x86_64" "amd64")
+                         ("mips64el" "mips64le")
+                         (_ machine)))
+      ;; We really only support targeting Linux and mingw.
+      (setenv "GOOS" (if (string-contains target "mingw")
+                       "windows"
+                       "linux"))
+      (setenv "GOARM" "7")  ; Default is 6, target our armhf-linux architecture.
+      ;; (setenv "GOMIPS" "hardfloat")      ; The default.
+      ;; (setenv "GOMIPS64" "hardfloat")    ; The default.
+      ;; (setenv "GOPPC64" "power8")        ; The default.
+      ))
+
   (let ((tmpdir (tmpnam)))
     (match (go-inputs inputs)
       (((names . directories) ...)

base-commit: f365d48909156ad754a2ade45375f45b54b06bbc
-- 
2.31.1





Acknowledgement sent to Efraim Flashner <efraim@HIDDEN>:
New bug report received and forwarded. Copy sent to guix-patches@HIDDEN. Full text available.
Report forwarded to guix-patches@HIDDEN:
bug#48044; Package guix-patches. Full text available.
Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.
Last modified: Mon, 26 Apr 2021 19:45:01 UTC

GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997 nCipher Corporation Ltd, 1994-97 Ian Jackson.