public inbox for gentoo-dev@lists.gentoo.org
 help / color / mirror / Atom feed
From: Sam James <sam@gentoo.org>
To: gentoo-dev@lists.gentoo.org
Cc: Thilo Fromm <thilo.alexander@gmail.com>,
	James Le Cuirot <chewi@gentoo.org>,
	William Hubbs <williamh@gentoo.org>
Subject: Re: [gentoo-dev] [PATCH] eclass/go-env.eclass: add helper to set compile env
Date: Wed, 08 Nov 2023 06:45:42 +0000	[thread overview]
Message-ID: <877cmsn3li.fsf@gentoo.org> (raw)
In-Reply-To: <20231101130443.31796-1-chewi@gentoo.org>


James Le Cuirot <chewi@gentoo.org> writes:

> From: Thilo Fromm <thilo.alexander@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.

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 <thilo.alexander@gmail.com>
> Closes: https://github.com/gentoo/gentoo/pull/33539
> Signed-off-by: James Le Cuirot <chewi@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 <infra@flatcar.org>
> +# @AUTHOR:
> +# Flatcar Maintainers <infra@flatcar.org>

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	other threads:[~2023-11-08  6:47 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-01 13:02 [gentoo-dev] [PATCH] eclass/go-env.eclass: add helper to set compile env James Le Cuirot
2023-11-08  6:45 ` Sam James [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=877cmsn3li.fsf@gentoo.org \
    --to=sam@gentoo.org \
    --cc=chewi@gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    --cc=thilo.alexander@gmail.com \
    --cc=williamh@gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox