From: Thilo Fromm <thilo.alexan...@gmail.com> This change adds a helper function to explicitly set CC, CXX, and GOARCH, and carrying over CFLAGS, LDFLAGS and friends to CGO equivalents, to provide a minimal sane compile environment for Go. It enables Go builds to play nice with crossdev's wrappers for emerge/ebuild etc. Previously, Go ebuilds emitted binaries for the host architecture.
For example, when running on an x86_64 host: emerge-aarch64-cross-linux-gnu foo will now correctly emerge Go package "foo" for aarch64 instead of x86_64. The eclass provides a single helper function go-env_set_compile_environment() intended to be called by other Go eclasses in an early build stage. Ebuilds may also explicitly call this function. Calls to this function from _src_prepare in go-module.eclass, golang-vcs-snapshot.eclass, and golang-vcs.eclass have also been added to un-break cross-compilation of existing Go packages. Signed-off-by: Thilo Fromm <thilo.alexan...@gmail.com> Closes: https://github.com/gentoo/gentoo/pull/33539 Signed-off-by: James Le Cuirot <ch...@gentoo.org> --- eclass/go-env.eclass | 48 +++++++++++++++++++++++++++++++ eclass/go-module.eclass | 5 +++- eclass/golang-vcs-snapshot.eclass | 5 +++- eclass/golang-vcs.eclass | 5 +++- 4 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 eclass/go-env.eclass See the GitHub link for earlier discussion. This still doesn't work for cross-prefix builds, unless you set CGO_ENABLED=1, but fixing that involves different code and can be done later. diff --git a/eclass/go-env.eclass b/eclass/go-env.eclass new file mode 100644 index 000000000000..0b4d44658a07 --- /dev/null +++ b/eclass/go-env.eclass @@ -0,0 +1,48 @@ +# Copyright 2023 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +# @ECLASS: go-env.eclass +# @MAINTAINER: +# Flatcar Maintainers <in...@flatcar.org> +# @AUTHOR: +# Flatcar Maintainers <in...@flatcar.org> +# @BLURB: Helper eclass for setting the Go compile environment. Required for cross-compiling. +# @DESCRIPTION: +# This eclass includes a helper function for setting the compile environment for Go ebuilds. +# Intended to be called by other Go eclasses in an early build stage, e.g. src_unpack. + +if [[ -z ${_GO_ENV_ECLASS} ]]; then +_GO_ENV_ECLASS=1 + +inherit toolchain-funcs + +# @FUNCTION: go-env_set_compile_environment +# @DESCRIPTION: +# Set up basic compile environment: CC, CXX, and GOARCH. +# Also carry over CFLAGS, LDFLAGS and friends. +# Required for cross-compiling with crossdev. +# If not set, host defaults will be used and the resulting binaries are host arch. +# (e.g. "emerge-aarch64-cross-linux-gnu foo" run on x86_64 will emerge "foo" for x86_64 +# instead of aarch64) +go-env_set_compile_environment() { + local arch=$(tc-arch "${CHOST}}") + case "${arch}" in + x86) GOARCH="386" ;; + x64-*) GOARCH="amd64" ;; + ppc64) if [[ "$(tc-endian "${${CHOST}}")" = "big" ]] ; then + GOARCH="ppc64" + else + GOARCH="ppc64le" + fi ;; + *) GOARCH="${arch}" ;; + esac + + tc-export CC CXX + export GOARCH + export CGO_CFLAGS="${CGO_CFLAGS:-$CFLAGS}" + export CGO_CPPFLAGS="${CGO_CPPFLAGS:-$CPPFLAGS}" + export CGO_CXXFLAGS="${CGO_CXXFLAGS:-$CXXFLAGS}" + export CGO_LDFLAGS="${CGO_LDFLAGS:-$LDFLAGS}" +} + +fi diff --git a/eclass/go-module.eclass b/eclass/go-module.eclass index 6c58d7f26f07..701d36e012e2 100644 --- a/eclass/go-module.eclass +++ b/eclass/go-module.eclass @@ -68,7 +68,7 @@ esac if [[ -z ${_GO_MODULE_ECLASS} ]]; then _GO_MODULE_ECLASS=1 -inherit multiprocessing toolchain-funcs +inherit multiprocessing toolchain-funcs go-env if [[ ! ${GO_OPTIONAL} ]]; then BDEPEND=">=dev-lang/go-1.18" @@ -363,6 +363,7 @@ go-module_setup_proxy() { # local go proxy. This mode is deprecated. # 2. Otherwise, if EGO_VENDOR is set, bail out, as this functionality was removed. # 3. Otherwise, call 'ego mod verify' and then do a normal unpack. +# Set compile env via go-env. go-module_src_unpack() { if use amd64 || use arm || use arm64 || ( use ppc64 && [[ $(tc-endian) == "little" ]] ) || use s390 || use x86; then @@ -386,6 +387,8 @@ go-module_src_unpack() { ${nf} ego mod verify fi fi + + go-env_set_compile_environment } # @FUNCTION: _go-module_src_unpack_gosum diff --git a/eclass/golang-vcs-snapshot.eclass b/eclass/golang-vcs-snapshot.eclass index 9c199bbbd8c5..d34b8a6e913d 100644 --- a/eclass/golang-vcs-snapshot.eclass +++ b/eclass/golang-vcs-snapshot.eclass @@ -52,7 +52,7 @@ esac if [[ -z ${_GOLANG_VCS_SNAPSHOT_ECLASS} ]]; then _GOLANG_VCS_SNAPSHOT_ECLASS=1 -inherit golang-base +inherit golang-base go-env # @ECLASS_VARIABLE: EGO_VENDOR # @DESCRIPTION: @@ -92,6 +92,7 @@ _golang-vcs-snapshot_dovendor() { # @FUNCTION: golang-vcs-snapshot_src_unpack # @DESCRIPTION: # Extract the first archive from ${A} to the appropriate location for GOPATH. +# Set compile env via go-env. golang-vcs-snapshot_src_unpack() { local lib vendor_path x ego_pn_check @@ -117,6 +118,8 @@ golang-vcs-snapshot_src_unpack() { fi done fi + + go-env_set_compile_environment } fi diff --git a/eclass/golang-vcs.eclass b/eclass/golang-vcs.eclass index 7558db4776cb..6f7a837bc15f 100644 --- a/eclass/golang-vcs.eclass +++ b/eclass/golang-vcs.eclass @@ -20,7 +20,7 @@ esac if [[ -z ${_GOLANG_VCS_ECLASS} ]]; then _GOLANG_VCS_ECLASS=1 -inherit estack golang-base +inherit estack golang-base go-env PROPERTIES+=" live" @@ -63,6 +63,7 @@ PROPERTIES+=" live" # @INTERNAL # @DESCRIPTION: # Create EGO_STORE_DIR if necessary. +# Set compile env via go-env. _golang-vcs_env_setup() { debug-print-function ${FUNCNAME} "$@" @@ -84,6 +85,8 @@ _golang-vcs_env_setup() { mkdir -p "${WORKDIR}/${P}/src" || die "${ECLASS}: unable to create ${WORKDIR}/${P}" return 0 + + go-env_set_compile_environment } # @FUNCTION: _golang-vcs_fetch -- 2.41.0