James Le Cuirot <[email protected]> writes:

> From: Thilo Fromm <[email protected]>
>
> 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.

Overall looks good. Please split into several commits (one for the new
eclass, then one per eclass to wire it up).

Respecting flags properly for CGO stuff has been overdue anyway.

CCing William too.

>
> Signed-off-by: Thilo Fromm <[email protected]>
> Closes: https://github.com/gentoo/gentoo/pull/33539
> Signed-off-by: James Le Cuirot <[email protected]>
> ---
>  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 <[email protected]>
> +# @AUTHOR:
> +# Flatcar Maintainers <[email protected]>

Does this have a Bugzilla account we can CC on bugs? If not, let's pick
a different @MAINTAINER entry. @AUTHOR doesn't need to change.

> +# @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

== please, as we're in bash

> +                                     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


Reply via email to