From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id BE98D158089 for ; Wed, 8 Nov 2023 06:47:45 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 44ECF2BC023; Wed, 8 Nov 2023 06:47:42 +0000 (UTC) Received: from smtp.gentoo.org (woodpecker.gentoo.org [140.211.166.183]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id E493D2BC018 for ; Wed, 8 Nov 2023 06:47:41 +0000 (UTC) References: <20231101130443.31796-1-chewi@gentoo.org> User-agent: mu4e 1.10.7; emacs 30.0.50 From: Sam James To: gentoo-dev@lists.gentoo.org Cc: Thilo Fromm , James Le Cuirot , William Hubbs Subject: Re: [gentoo-dev] [PATCH] eclass/go-env.eclass: add helper to set compile env Date: Wed, 08 Nov 2023 06:45:42 +0000 Organization: Gentoo In-reply-to: <20231101130443.31796-1-chewi@gentoo.org> Message-ID: <877cmsn3li.fsf@gentoo.org> Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-dev@lists.gentoo.org Reply-to: gentoo-dev@lists.gentoo.org X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply MIME-Version: 1.0 Content-Type: text/plain X-Archives-Salt: caf436bd-aead-425c-bba2-4752db122330 X-Archives-Hash: bfd3960ce16becd40ceeef900ab74d1e James Le Cuirot writes: > From: Thilo Fromm > > 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 > Closes: https://github.com/gentoo/gentoo/pull/33539 > Signed-off-by: James Le Cuirot > --- > 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 > +# @AUTHOR: > +# Flatcar Maintainers 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