From debbugs-submit-bounces@debbugs.gnu.org Mon Apr 26 14:33:55 2021 Received: (at submit) by debbugs.gnu.org; 26 Apr 2021 18:33:55 +0000 Received: from localhost ([127.0.0.1]:47146 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lb63K-0004Ye-TJ for submit@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 ) id 1lb63H-0004YT-DV for submit@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 ) id 1lb63H-0008RF-77 for guix-patches@gnu.org; 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 ) id 1lb63C-00040o-BT for guix-patches@gnu.org; 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 To: guix-patches@gnu.org Subject: [PATCH] build/go: Support cross compiling. Date: Mon, 26 Apr 2021 21:32:35 +0300 Message-Id: <20210426183235.3856-1-efraim@flashner.co.il> 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@flashner.co.il; 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 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" 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 ;;; Copyright © 2017 Leo Famulari ;;; Copyright © 2020 Jakub Kądziołka +;;; Copyright © 2021 Efraim Flashner ;;; ;;; 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 ;;; Copyright © 2020 Jack Hill ;;; Copyright © 2020 Jakub Kądziołka -;;; Copyright © 2020 Efraim Flashner +;;; Copyright © 2020, 2021 Efraim Flashner ;;; ;;; 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 From debbugs-submit-bounces@debbugs.gnu.org Mon Apr 26 15:40:35 2021 Received: (at 48044) by debbugs.gnu.org; 26 Apr 2021 19:40:36 +0000 Received: from localhost ([127.0.0.1]:47244 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lb75v-00028h-HE for submit@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 ) id 1lb75s-00028X-Fg for 48044@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@telenet.be> Subject: Re: [bug#48044] [PATCH] build/go: Support cross compiling. From: Maxime Devos To: Efraim Flashner , 48044@debbugs.gnu.org Date: Mon, 26 Apr 2021 21:39:32 +0200 In-Reply-To: <20210426183235.3856-1-efraim@flashner.co.il> References: <20210426183235.3856-1-efraim@flashner.co.il> 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@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" 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-- From debbugs-submit-bounces@debbugs.gnu.org Sun Aug 22 06:22:43 2021 Received: (at 48044) by debbugs.gnu.org; 22 Aug 2021 10:22:43 +0000 Received: from localhost ([127.0.0.1]:38220 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mHkcg-0002rH-A5 for submit@debbugs.gnu.org; Sun, 22 Aug 2021 06:22:42 -0400 Received: from flashner.co.il ([178.62.234.194]:41350) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mHkca-0002qw-O9 for 48044@debbugs.gnu.org; Sun, 22 Aug 2021 06:22:37 -0400 Received: from localhost (unknown [141.226.169.107]) by flashner.co.il (Postfix) with ESMTPSA id DF3FF40160; Sun, 22 Aug 2021 10:22:26 +0000 (UTC) From: Efraim Flashner To: 48044@debbugs.gnu.org, iskarian@mgsn.dev, leo@famulari.name Subject: [PATCH v3] build/go: Support cross compiling. Date: Sun, 22 Aug 2021 13:20:14 +0300 Message-Id: X-Mailer: git-send-email 2.33.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 48044 Cc: Efraim Flashner X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * 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-build-system-modules): Use source-module-closure, add (guix utils). (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. --- Third version of this patch. I think I'm ready to push it. I don't love using source-module-closure to include (guix utils), but I need it for gnu-triplet->nix-system in setup-go-environment instead of the custom parsing I was doing before. --- guix/build-system/go.scm | 146 ++++++++++++++++++++++++++++----- guix/build/go-build-system.scm | 37 ++++++++- 2 files changed, 162 insertions(+), 21 deletions(-) diff --git a/guix/build-system/go.scm b/guix/build-system/go.scm index 8f55796e86..fe0c884b62 100644 --- a/guix/build-system/go.scm +++ b/guix/build-system/go.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2016 Petter ;;; Copyright © 2017 Leo Famulari ;;; Copyright © 2020 Jakub Kądziołka +;;; Copyright © 2021 Efraim Flashner ;;; ;;; This file is part of GNU Guix. ;;; @@ -20,6 +21,7 @@ (define-module (guix build-system go) #:use-module (guix utils) + #:use-module (guix modules) #:use-module (guix derivations) #:use-module (guix search-paths) #:use-module (guix build-system) @@ -80,9 +82,11 @@ commit hash and its date rather than a proper release tag." (define %go-build-system-modules ;; Build-side modules imported and used by default. - `((guix build go-build-system) - (guix build union) - ,@%gnu-build-system-modules)) + (source-module-closure + `((guix build go-build-system) + (guix utils) + (guix build union) + ,@%gnu-build-system-modules))) (define (default-go) ;; Lazily resolve the binding to avoid a circular dependency. @@ -96,24 +100,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 +194,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..701ccf0011 100644 --- a/guix/build/go-build-system.scm +++ b/guix/build/go-build-system.scm @@ -4,7 +4,7 @@ ;;; Copyright © 2019 Maxim Cournoyer ;;; Copyright © 2020 Jack Hill ;;; Copyright © 2020 Jakub Kądziołka -;;; Copyright © 2020 Efraim Flashner +;;; Copyright © 2020, 2021 Efraim Flashner ;;; ;;; This file is part of GNU Guix. ;;; @@ -25,6 +25,7 @@ #:use-module ((guix build gnu-build-system) #:prefix gnu:) #:use-module (guix build union) #:use-module (guix build utils) + #:use-module ((guix utils) #:hide (package-name->name+version)) #:use-module (ice-9 match) #:use-module (ice-9 ftw) #:use-module (srfi srfi-1) @@ -131,7 +132,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 +150,38 @@ 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 + ;; Parse the nix-system equivalent of the target and set the + ;; target for compilation accordingly. + (let* ((system (gnu-triplet->nix-system target)) + (dash (string-index system #\-)) + (arch (substring system 0 dash)) + (os (substring system (+ 1 dash)))) + (setenv "GOARCH" (match arch + ("aarch64" "arm64") + ("armhf" "arm") + ("powerpc64le" "ppc64le") + ("powerpc64" "ppc64") + ("i686" "386") + ("x86_64" "amd64") + ("mips64el" "mips64le") + (_ arch))) + (setenv "GOOS" (match os + ((or "mingw" "cygwin") "windows") + (_ os))) + (match arch + ((or "arm" "armhf") + (setenv "GOARM" "7")) + ((or "mips" "mipsel") + (setenv "GOMIPS" "hardfloat")) + ((or "mips64" "mips64el") + (setenv "GOMIPS64" "hardfloat")) + ((or "powerpc64" "powerpc64le") + (setenv "GOPPC64" "power8")) + (_ #t)))) + (let ((tmpdir (tmpnam))) (match (go-inputs inputs) (((names . directories) ...) base-commit: 9e3b68203cba2b1bd96e524d3ae9dfc3336a72f7 -- 2.33.0 From debbugs-submit-bounces@debbugs.gnu.org Sun Aug 22 14:52:38 2021 Received: (at 48044) by debbugs.gnu.org; 22 Aug 2021 18:52:38 +0000 Received: from localhost ([127.0.0.1]:39796 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mHsaE-0007Uo-3Z for submit@debbugs.gnu.org; Sun, 22 Aug 2021 14:52:38 -0400 Received: from out0.migadu.com ([94.23.1.103]:24690) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mHsaA-0007Ue-Ey for 48044@debbugs.gnu.org; Sun, 22 Aug 2021 14:52:37 -0400 X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mgsn.dev; s=key1; t=1629658352; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to; bh=wj8JLohI/pi2FOe8kyq7G+X7wWTPMCVEvO7yFh/OkkA=; b=RJE67rp+cC4buZGg5NnYrapIY7GJyIYZQWmRJQuXVrJv4VgrtiJzVIsFmZULtybNJ8qKDs DwKtTdv/6J55oQ63DjF1KG3cTq9ovtukzq4HoFWb1/bIsFiWmYVrRq9NH6m70j5A0gn/M5 daJQ0oHS8u6vMvBI1RPbPRik3JUVpQI= From: Sarah Morgensen To: Efraim Flashner Subject: Re: [bug#48044] [PATCH v3] build/go: Support cross compiling. Date: Sun, 22 Aug 2021 11:52:29 -0700 In-Reply-To: Efraim Flashner's message of "Sun, 22 Aug 2021 13:20:14 +0300 (8 hours, 12 minutes, 33 seconds ago)" Message-ID: <86r1el48ia.fsf@mgsn.dev> MIME-Version: 1.0 Content-Type: text/plain X-Migadu-Flow: FLOW_OUT X-Migadu-Auth-User: iskarian@mgsn.dev X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 48044 Cc: 48044@debbugs.gnu.org, leo@famulari.name X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Hi Efraim, Thanks for doing this work! I'm excited to see it in action. Efraim Flashner writes: > * 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-build-system-modules): Use source-module-closure, add (guix utils). > (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. > --- > > Third version of this patch. I think I'm ready to push it. I don't love > using source-module-closure to include (guix utils), but I need it for > gnu-triplet->nix-system in setup-go-environment instead of the custom > parsing I was doing before. Can you do the parsing host-side and pass e.g. TARGET-GOOS/TARGET-GOARCH keyword arguments to the build-side? > -(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 +150,38 @@ 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 > + ;; Parse the nix-system equivalent of the target and set the > + ;; target for compilation accordingly. > + (let* ((system (gnu-triplet->nix-system target)) > + (dash (string-index system #\-)) > + (arch (substring system 0 dash)) > + (os (substring system (+ 1 dash)))) And then, if this parsing is host-side, you can probably just do something like --8<---------------cut here---------------start------------->8--- (match (string-split (gnu-triplet->nix-system target) #\-) ((arch os) [...] --8<---------------cut here---------------end--------------->8--- > + (match arch > + ((or "arm" "armhf") > + (setenv "GOARM" "7")) > + ((or "mips" "mipsel") > + (setenv "GOMIPS" "hardfloat")) > + ((or "mips64" "mips64el") > + (setenv "GOMIPS64" "hardfloat")) > + ((or "powerpc64" "powerpc64le") > + (setenv "GOPPC64" "power8")) > + (_ #t)))) Are these choices obvious for those compiling for those architectures? If not, this could probably do with some documentation on why these were chosen. (I note that these are all Go's defaults with the exception of GOARM). -- Sarah From debbugs-submit-bounces@debbugs.gnu.org Mon Aug 23 05:04:21 2021 Received: (at 48044) by debbugs.gnu.org; 23 Aug 2021 09:04:21 +0000 Received: from localhost ([127.0.0.1]:40473 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mI5sO-0005Vh-DE for submit@debbugs.gnu.org; Mon, 23 Aug 2021 05:04:21 -0400 Received: from flashner.co.il ([178.62.234.194]:46796) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mI5sJ-0005VQ-CI for 48044@debbugs.gnu.org; Mon, 23 Aug 2021 05:04:16 -0400 Received: from localhost (unknown [141.226.169.107]) by flashner.co.il (Postfix) with ESMTPSA id 8F17A401A4; Mon, 23 Aug 2021 09:04:04 +0000 (UTC) Date: Mon, 23 Aug 2021 12:02:10 +0300 From: Efraim Flashner To: Sarah Morgensen Subject: Re: [bug#48044] [PATCH v3] build/go: Support cross compiling. Message-ID: Mail-Followup-To: Efraim Flashner , Sarah Morgensen , 48044@debbugs.gnu.org, leo@famulari.name References: <86r1el48ia.fsf@mgsn.dev> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="mxipbSKtO9uJZS4r" Content-Disposition: inline In-Reply-To: <86r1el48ia.fsf@mgsn.dev> X-PGP-Key-ID: 0x41AAE7DCCA3D8351 X-PGP-Key: https://flashner.co.il/~efraim/efraim_flashner.asc X-PGP-Fingerprint: A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351 X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 48044 Cc: 48044@debbugs.gnu.org, leo@famulari.name X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --mxipbSKtO9uJZS4r Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Sun, Aug 22, 2021 at 11:52:29AM -0700, Sarah Morgensen wrote: > Hi Efraim, >=20 > Thanks for doing this work! I'm excited to see it in action. >=20 > Efraim Flashner writes: >=20 > > * 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-build-system-modules): Use source-module-closure, add (guix utils). > > (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. > > --- > > > > Third version of this patch. I think I'm ready to push it. I don't love > > using source-module-closure to include (guix utils), but I need it for > > gnu-triplet->nix-system in setup-go-environment instead of the custom > > parsing I was doing before. >=20 > Can you do the parsing host-side and pass e.g. TARGET-GOOS/TARGET-GOARCH > keyword arguments to the build-side? I'll have to see if there's somewhere I can slot that in. We already have target, but that's what we're parsing now. I guess if I add them as a keywords then we can build for targets that go supports but which Guix doesn't. > > -(define* (setup-go-environment #:key inputs outputs #:allow-other-keys) > > +(define* (setup-go-environment #:key inputs outputs target #:allow-oth= er-keys) > > "Prepare a Go build environment for INPUTS and OUTPUTS. Build a fil= e system > > union of INPUTS. Export GOPATH, which helps the compiler find the sou= rce code > > of the package being built and its dependencies, and GOBIN, which dete= rmines > > @@ -149,6 +150,38 @@ 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 > > + ;; Parse the nix-system equivalent of the target and set the > > + ;; target for compilation accordingly. > > + (let* ((system (gnu-triplet->nix-system target)) > > + (dash (string-index system #\-)) > > + (arch (substring system 0 dash)) > > + (os (substring system (+ 1 dash)))) >=20 > And then, if this parsing is host-side, you can probably just do > something like >=20 > --8<---------------cut here---------------start------------->8--- > (match (string-split (gnu-triplet->nix-system target) #\-) > ((arch os) > [...] > --8<---------------cut here---------------end--------------->8--- I like the way this looks much better. Even if we did just parse the gnu-triplet we'd have our special case for arm-linux-gnueabihf (unless we ignored it, as I did below).=20 > > + (match arch > > + ((or "arm" "armhf") > > + (setenv "GOARM" "7")) > > + ((or "mips" "mipsel") > > + (setenv "GOMIPS" "hardfloat")) > > + ((or "mips64" "mips64el") > > + (setenv "GOMIPS64" "hardfloat")) > > + ((or "powerpc64" "powerpc64le") > > + (setenv "GOPPC64" "power8")) > > + (_ #t)))) >=20 > Are these choices obvious for those compiling for those architectures? > If not, this could probably do with some documentation on why these were > chosen. (I note that these are all Go's defaults with the exception of > GOARM). For the mips I did just copy from the Go documentation, but for arm and ppc64 I wanted to make sure we targeted the same systems that Guix already supports. >=20 > -- > Sarah Thanks for taking a look at it. --=20 Efraim Flashner =D7=A8=D7=A0=D7=A9=D7=9C=D7=A4 = =D7=9D=D7=99=D7=A8=D7=A4=D7=90 GPG key =3D A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351 Confidentiality cannot be guaranteed on emails sent or received unencrypted --mxipbSKtO9uJZS4r Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEoov0DD5VE3JmLRT3Qarn3Mo9g1EFAmEjZA8ACgkQQarn3Mo9 g1HkMw//WaIwzgi7u5BQTx6LGRi8lzm/0VlVM9jpB05WtfdEvFCkcWTOYITCU8MM TmyMKNmsUdgU4i4ycp3QvKqouiJdxxTNQiTG1YnaVi1kI9hWpeo9bGYibE6Z8r9G ICb6ai8ubIfRHBPz89LzlJPMlfPgvTbWPsM0zu6IdEhTpKWwGe/e7D91BOVkpq85 Z3T6B1Xpc4sAo2V6z+Ghs/k7zzdP+aH56+NfCx5UsVe08akMqoAJg5EmuLn5J6o+ H0pL8/tPvfROEPn6Bn76U8m04VkILg3X7h422RmtEUimFTnwW/NWi2EzXj2AZ9lU 5a6C4SEkc03DAPqh1Ovpzrzf6nvG20K9sOQALyanpr6OIUZq0AHFa+UtRMyP/SoN DfXsT4WgX0IEnBmlltpWiLo1Yh8AC3+JGsywdY7TQmWCEAMebPNsk8N9jAXH8iZ/ y6PnWj3sRP3GvFNyajcd5BspmHioh8jQrrwWVvfJdKz5mikuZCKWI9f2QW13JuV/ 9BXnOibMxijxs2iYha33aIrNRDl00tyVDveI9HE+xVVRVAwAS8Wo4LkV4cq0DUrz 5zltmk2Yw+HXo19TYaE53p5oAAHAUBGcAsBZFite2gAZUQEg7/L6nEjw1OBuaz4N NA/3wDpQFME7MixCy73bda8p11d4skpclYjBXI9KFFw3NbdLnog= =RJOO -----END PGP SIGNATURE----- --mxipbSKtO9uJZS4r-- From debbugs-submit-bounces@debbugs.gnu.org Mon Aug 23 05:28:42 2021 Received: (at 48044) by debbugs.gnu.org; 23 Aug 2021 09:28:42 +0000 Received: from localhost ([127.0.0.1]:40490 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mI6Fx-00064K-D9 for submit@debbugs.gnu.org; Mon, 23 Aug 2021 05:28:42 -0400 Received: from flashner.co.il ([178.62.234.194]:46874) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mI6Fq-000645-GN for 48044@debbugs.gnu.org; Mon, 23 Aug 2021 05:28:36 -0400 Received: from localhost (unknown [141.226.169.107]) by flashner.co.il (Postfix) with ESMTPSA id 07CE040895; Mon, 23 Aug 2021 09:28:22 +0000 (UTC) Date: Mon, 23 Aug 2021 12:26:29 +0300 From: Efraim Flashner To: Sarah Morgensen Subject: Re: [bug#48044] [PATCH v3] build/go: Support cross compiling. Message-ID: Mail-Followup-To: Efraim Flashner , Sarah Morgensen , 48044@debbugs.gnu.org, leo@famulari.name References: <86r1el48ia.fsf@mgsn.dev> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="T2l5CyILXQLl7pf6" Content-Disposition: inline In-Reply-To: <86r1el48ia.fsf@mgsn.dev> X-PGP-Key-ID: 0x41AAE7DCCA3D8351 X-PGP-Key: https://flashner.co.il/~efraim/efraim_flashner.asc X-PGP-Fingerprint: A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351 X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 48044 Cc: 48044@debbugs.gnu.org, leo@famulari.name X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --T2l5CyILXQLl7pf6 Content-Type: multipart/mixed; boundary="PNH2A/PE//rW2eY+" Content-Disposition: inline --PNH2A/PE//rW2eY+ Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable New version of the patch. I moved the logic to figure out GOOS/GOARCH to the host side and added keywords to pass the information along to the build side. With a properly configured go package and perhaps some additional qemu-binfmt targets packages like this should work: (use-modules (guix packages) (gnu packages syncthing)) (package (inherit syncthing) (arguments `(,@(package-arguments syncthing) #:goos "plan9" #:goarch "amd64"))) --=20 Efraim Flashner =D7=A8=D7=A0=D7=A9=D7=9C=D7=A4 = =D7=9D=D7=99=D7=A8=D7=A4=D7=90 GPG key =3D A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351 Confidentiality cannot be guaranteed on emails sent or received unencrypted --PNH2A/PE//rW2eY+ Content-Type: text/plain; charset=utf-8 Content-Disposition: attachment; filename="v4-0001-build-go-Support-cross-compiling.patch" Content-Transfer-Encoding: quoted-printable =46rom c4f25c1759b5d8cff1f3198144b2495b502db99c Mon Sep 17 00:00:00 2001 Message-Id: =46rom: Efraim Flashner Date: Mon, 26 Apr 2021 21:13:06 +0300 Subject: [PATCH v4] build/go: Support cross compiling. * guix/build-system/go.scm (go-target): New procedure. (go-build): Add goarch, goos keywords. (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 goarch, goos keywords. Set go environment variables based on target architecture. --- guix/build-system/go.scm | 164 +++++++++++++++++++++++++++++---- guix/build/go-build-system.scm | 19 +++- 2 files changed, 165 insertions(+), 18 deletions(-) diff --git a/guix/build-system/go.scm b/guix/build-system/go.scm index 8f55796e86..55db449cdf 100644 --- a/guix/build-system/go.scm +++ b/guix/build-system/go.scm @@ -2,6 +2,7 @@ ;;; Copyright =C2=A9 2016 Petter ;;; Copyright =C2=A9 2017 Leo Famulari ;;; Copyright =C2=A9 2020 Jakub K=C4=85dzio=C5=82ka +;;; Copyright =C2=A9 2021 Efraim Flashner ;;; ;;; This file is part of GNU Guix. ;;; @@ -27,6 +28,7 @@ #:use-module (guix packages) #:use-module (ice-9 match) #:use-module (ice-9 regex) + #:use-module (srfi srfi-1) #:export (%go-build-system-modules go-build go-build-system @@ -78,6 +80,24 @@ present) if a pseudo-version pattern is not recognized." commit hash and its date rather than a proper release tag." (regexp-exec %go-pseudo-version-rx version)) =20 +(define (go-target target) + ;; Parse the nix-system equivalent of the target and set the + ;; target for compilation accordingly. + (match (string-split (gnu-triplet->nix-system target) #\-) + ((arch os) + (list (match arch + ("aarch64" "arm64") + ("armhf" "arm") + ("powerpc64le" "ppc64le") + ("powerpc64" "ppc64") + ("i686" "386") + ("x86_64" "amd64") + ("mips64el" "mips64le") + (_ arch)) + (match os + ((or "mingw32" "cygwin") "windows") + (_ os)))))) + (define %go-build-system-modules ;; Build-side modules imported and used by default. `((guix build go-build-system) @@ -96,24 +116,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)))) =20 - (and (not target) ;XXX: no cross-compilati= on - (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 '())) =20 - ;; 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 packag= es + ;; 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)))) =20 (define* (go-build store name inputs #:key @@ -128,6 +164,8 @@ commit hash and its date rather than a proper release t= ag." (tests? #t) (allow-go-reference? #f) (system (%current-system)) + (goarch (first (go-target (%current-system)))) + (goos (last (go-target (%current-system)))) (guile #f) (imported-modules %go-build-system-modules) (modules '((guix build go-build-system) @@ -147,6 +185,8 @@ commit hash and its date rather than a proper release t= ag." #:system ,system #:phases ,phases #:outputs %outputs + #:goarch ,goarch + #:goos ,goos #:search-paths ',(map search-path-specification->sexp search-paths) #:install-source? ,install-source? @@ -174,6 +214,98 @@ commit hash and its date rather than a proper release = tag." #:outputs outputs #:guile-for-build guile-for-build)) =20 +(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)) + (goarch (first (go-target target))) + (goos (last (go-target target))) + (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 INPUT= S." + (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 + #:goarch ,goarch + #:goos ,goos + #: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->se= xp + 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 commencemen= t))) + (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..918ce074ad 100644 --- a/guix/build/go-build-system.scm +++ b/guix/build/go-build-system.scm @@ -4,7 +4,7 @@ ;;; Copyright =C2=A9 2019 Maxim Cournoyer ;;; Copyright =C2=A9 2020 Jack Hill ;;; Copyright =C2=A9 2020 Jakub K=C4=85dzio=C5=82ka -;;; Copyright =C2=A9 2020 Efraim Flashner +;;; Copyright =C2=A9 2020, 2021 Efraim Flashner ;;; ;;; This file is part of GNU Guix. ;;; @@ -131,7 +131,7 @@ ;; ;; Code: =20 -(define* (setup-go-environment #:key inputs outputs #:allow-other-keys) +(define* (setup-go-environment #:key inputs outputs goos goarch #:allow-ot= her-keys) "Prepare a Go build environment for INPUTS and OUTPUTS. Build a file sy= stem union of INPUTS. Export GOPATH, which helps the compiler find the source = code of the package being built and its dependencies, and GOBIN, which determin= es @@ -149,6 +149,21 @@ dependencies, so it should be self-contained." ;; GOPATH behavior. (setenv "GO111MODULE" "off") (setenv "GOBIN" (string-append (assoc-ref outputs "out") "/bin")) + + ;; Make sure we're building for the correct architecture and OS. + (setenv "GOARCH" goarch) + (setenv "GOOS" goos) + (match goarch + ("arm" + (setenv "GOARM" "7")) + ((or "mips" "mipsel") + (setenv "GOMIPS" "hardfloat")) + ((or "mips64" "mips64le") + (setenv "GOMIPS64" "hardfloat")) + ((or "ppc64" "ppc64le") + (setenv "GOPPC64" "power8")) + (_ #t)) + (let ((tmpdir (tmpnam))) (match (go-inputs inputs) (((names . directories) ...) base-commit: bb5f395a08deacb799ef1e085863ba01a5f05e70 --=20 2.33.0 --PNH2A/PE//rW2eY+-- --T2l5CyILXQLl7pf6 Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEoov0DD5VE3JmLRT3Qarn3Mo9g1EFAmEjacUACgkQQarn3Mo9 g1Hn6hAApBaE7FwCh79hpuhBbT6MyJD9vecJBdxgD0l6W7K+fhl4E3rH3iSd9Ot7 xpY0lh+gwUs6nXek9SpK2IgjGNvm6csQmkHsVHkzRkkkdnkYrVt9edMh+feSIS1C iNDbKhxX5ZZak7KJd0u+cjnMx3oqZdvZIPZDu0ArQHTSUiKJlDIAzWx/ApzZZy6d 2iaWGjx6vHK2itHnmvwGN+ilVy/1oy/QiKVAfFau4uIrux/J1S/OhNwVn2Na1y6e GLTVnwW+ilxGv3TERXSR/9M9B64v/XSqusMF6IRoy9CcUdo16jQYWOJGq/mzi/BL 2ZlTV8ZQ5vdxs5UKTaaNofweM99TU/1zfn+nl0lHXHp2Mx2LhT1e1X9gaZeoKjkl DM2JqqQawA6hWNOXFxa3P7tn1rhX+fP6cjG2CrD/Zhq5MEyiXrdsj4GJfkeQteFm rhl0CsuFp4T9nCsaJaVHl814Pbv6Zq6Q+hnjDF7/p/ja9w2h9ti53zqmcsOiQGtK vfVQYYHqB3tJTyMLcoquLku0nS5H85BpFz6vkRzIlmUoOUQ2IVJKRZeuPLptBPMC uK86vuhzgowNC0c1CwoTrOdqcXXo+oOKXFf27YYTCxN7y3GlBIF7PIIBogmj9482 TAzWSGiUuqW0Yat7kThruIdPnXnu+l6FTlH2Nru6RUDLQmU9Dps= =X52V -----END PGP SIGNATURE----- --T2l5CyILXQLl7pf6-- From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 14 04:40:28 2021 Received: (at 48044-done) by debbugs.gnu.org; 14 Sep 2021 08:40:28 +0000 Received: from localhost ([127.0.0.1]:47456 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mQ3zQ-0003k9-I7 for submit@debbugs.gnu.org; Tue, 14 Sep 2021 04:40:28 -0400 Received: from flashner.co.il ([178.62.234.194]:36518) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mQ3zL-0003jq-6i for 48044-done@debbugs.gnu.org; Tue, 14 Sep 2021 04:40:26 -0400 Received: from localhost (unknown [141.226.169.107]) by flashner.co.il (Postfix) with ESMTPSA id D13464018D for <48044-done@debbugs.gnu.org>; Tue, 14 Sep 2021 08:40:16 +0000 (UTC) Date: Tue, 14 Sep 2021 11:38:20 +0300 From: Efraim Flashner To: 48044-done@debbugs.gnu.org Subject: Re: [PATCH v3] build/go: Support cross compiling. Message-ID: Mail-Followup-To: Efraim Flashner , 48044-done@debbugs.gnu.org References: <20210426183235.3856-1-efraim@flashner.co.il> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="F9zJBfkenehT5gAW" Content-Disposition: inline In-Reply-To: X-PGP-Key-ID: 0x41AAE7DCCA3D8351 X-PGP-Key: https://flashner.co.il/~efraim/efraim_flashner.asc X-PGP-Fingerprint: A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351 X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 48044-done X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --F9zJBfkenehT5gAW Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable v4 pushed in the end. --=20 Efraim Flashner =D7=A8=D7=A0=D7=A9=D7=9C=D7=A4 = =D7=9D=D7=99=D7=A8=D7=A4=D7=90 GPG key =3D A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351 Confidentiality cannot be guaranteed on emails sent or received unencrypted --F9zJBfkenehT5gAW Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEoov0DD5VE3JmLRT3Qarn3Mo9g1EFAmFAX3oACgkQQarn3Mo9 g1FYiBAApccsiFP96daToeFP00I5hiTfmaxd3qag1skcLNQuBMId5kKTBAK4PCCy fV3k0YvvoRh/l0wiKgHCFk2X0oty9W2a75MizxyNMQBx5ViX96Ixjop45c3vl08S KWLlAkCiorRJEvtnGqkI9g7x9P/VlGl/Yla3mkjK2J/SdWjWMM5WeVmPH6v3cM+I P2gih+pqfxUhmYwLKWKVSmpKO9JoWMxEu38PXOtB16HP3LlKv43eGaz7YIyXxDSc q3Qr8BpYP384HnrPipRH+kZhbrjt3WHIYZNdgDtcnijDKpHejW/8FxRl566wjzmf BOlbGQ3qlxg3dVQTNyUAHIZkgYDGdWGzIlpgtC8ZbrNlYKc8WNQEVQYO+nJJlnPN 2g8gZgEpyocafXSuMu+ST0Bpa1aIMg6JjKnsOaK6jMjZ1biiOT+wABE4p+xLi7HE GNXIcpp9EZB3Jz1zdat/sEVoON/rdGp831xPuPlKCHwueGCYuMqNnZ37AllkaE9v Y6s5JtK6irndli9PZh3bUe7SY2g5DbPXRRJcnqktbDjDlcBISo1SsoYMg06IrZQg YT5f7R83D8WSNa9Zw0bQcZl5vr3Pi1LK4C3SYqoFSUGNIO8q/gYLT7j700zhIq3B dbQspmZimy97LfTBATEuV7EyiJVG12dOuBkzWbJqKdh6E4nTNkw= =5zRe -----END PGP SIGNATURE----- --F9zJBfkenehT5gAW-- From unknown Wed Jun 18 23:10:29 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Tue, 12 Oct 2021 11:24:08 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator