From 4b8f919bd14af87ace1a23dcf769f3786984d92d Mon Sep 17 00:00:00 2001 From: Thilo Fromm Date: Thu, 26 Oct 2023 16:04:03 +0200 Subject: [PATCH] portage-stable/eclass: add Go cross-comile helper eclass This change allows cross-compiling of Go packages and will be upstreamed. Signed-off-by: Thilo Fromm --- .../portage-stable/eclass/go-env.eclass | 46 +++++++ .../portage-stable/eclass/go-module.eclass | 116 ++++++++++-------- .../portage-stable/eclass/golang-base.eclass | 6 +- .../eclass/golang-vcs-snapshot.eclass | 28 +++-- .../portage-stable/eclass/golang-vcs.eclass | 37 +++--- 5 files changed, 148 insertions(+), 85 deletions(-) create mode 100644 sdk_container/src/third_party/portage-stable/eclass/go-env.eclass diff --git a/sdk_container/src/third_party/portage-stable/eclass/go-env.eclass b/sdk_container/src/third_party/portage-stable/eclass/go-env.eclass new file mode 100644 index 0000000000..eae95b9409 --- /dev/null +++ b/sdk_container/src/third_party/portage-stable/eclass/go-env.eclass @@ -0,0 +1,46 @@ +# Copyright 2023 Flatcar Maintainers +# Distributed under the terms of the GNU General Public License v2 + +# @ECLASS: go-env.eclass +# @MAINTAINER: +# Flatcar Maintainers +# @AUTHOR: +# Flatcar Maintainers +# @SUPPORTED_EAPIS: 7 8 +# @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 + +# Set up basic compile environment: CC, CXX, and GOARCH. +# 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() { + _arch() { + local arch=$(tc-arch "${CHOST}}") + case "${arch}" in + x86) echo "386" ;; + x64-*) echo "amd64" ;; + ppc64) if [[ "$(tc-endian "${${CHOST}}")" = "big" ]] then + echo "ppc64" + else + echo "ppc64le" + fi ;; + *) echo "${arch}" ;; + esac + } + + CC="$(tc-getCC)" + CXX="$(tc-getCXX)" + # Needs explicit export to arrive in go environment. + export GOARCH="$(_arch)" +} + +fi diff --git a/sdk_container/src/third_party/portage-stable/eclass/go-module.eclass b/sdk_container/src/third_party/portage-stable/eclass/go-module.eclass index 817f8a9fd3..4908d85fb2 100644 --- a/sdk_container/src/third_party/portage-stable/eclass/go-module.eclass +++ b/sdk_container/src/third_party/portage-stable/eclass/go-module.eclass @@ -1,4 +1,4 @@ -# Copyright 2019-2022 Gentoo Authors +# Copyright 2019-2023 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 # @ECLASS: go-module.eclass @@ -26,7 +26,9 @@ # If the software has a directory named vendor in its # top level directory, the only thing you need to do is inherit the # eclass. If it doesn't, you need to also create a dependency tarball and -# host it somewhere, for example in your dev space. +# host it somewhere, for example in your dev space. It's recommended that +# a format supporting parallel decompression is used and developers should +# use higher levels of compression like '-9' for xz. # # Here is an example of how to create a dependency tarball. # The base directory in the GOMODCACHE setting must be go-mod in order @@ -36,7 +38,7 @@ # # $ cd /path/to/project # $ GOMODCACHE="${PWD}"/go-mod go mod download -modcacherw -# $ tar -acf project-1.0-deps.tar.xz go-mod +# $ XZ_OPT='-T0 -9' tar -acf project-1.0-deps.tar.xz go-mod # # @CODE # @@ -63,20 +65,19 @@ case ${EAPI} in *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;; esac -if [[ -z ${_GO_MODULE} ]]; then +if [[ -z ${_GO_MODULE_ECLASS} ]]; then +_GO_MODULE_ECLASS=1 -_GO_MODULE=1 +inherit multiprocessing toolchain-funcs go-env if [[ ! ${GO_OPTIONAL} ]]; then - BDEPEND=">=dev-lang/go-1.16" + BDEPEND=">=dev-lang/go-1.18" # Workaround for pkgcheck false positive: https://github.com/pkgcore/pkgcheck/issues/214 # MissingUnpackerDep: version ...: missing BDEPEND="app-arch/unzip" # Added here rather than to each affected package, so it can be cleaned up just # once when pkgcheck is improved. BDEPEND+=" app-arch/unzip" - - EXPORT_FUNCTIONS src_unpack fi # Force go to build in module mode. @@ -93,10 +94,12 @@ export GOCACHE="${T}/go-build" export GOMODCACHE="${WORKDIR}/go-mod" # The following go flags should be used for all builds. +# -buildmode=pie builds position independent executables +# -buildvcs=false omits version control information # -modcacherw makes the build cache read/write # -v prints the names of packages as they are compiled # -x prints commands as they are executed -export GOFLAGS="-modcacherw -v -x" +export GOFLAGS="-buildvcs=false -modcacherw -v -x" # Do not complain about CFLAGS etc since go projects do not use them. QA_FLAGS_IGNORED='.*' @@ -104,8 +107,8 @@ QA_FLAGS_IGNORED='.*' # Go packages should not be stripped with strip(1). RESTRICT+=" strip" -# @ECLASS-VARIABLE: EGO_SUM -# @DEPRECATED: +# @ECLASS_VARIABLE: EGO_SUM +# @DEPRECATED: none # @DESCRIPTION: # This is replaced by a dependency tarball, see above for how to create # one. @@ -152,8 +155,8 @@ RESTRICT+=" strip" # This decision does NOT weaken Go module security, as Go will verify the # go.sum copy of the Hash1 values during building of the package. -# @ECLASS-VARIABLE: _GOMODULE_GOPROXY_BASEURI -# @DEPRECATED: +# @ECLASS_VARIABLE: _GOMODULE_GOPROXY_BASEURI +# @DEPRECATED: none # @DESCRIPTION: # Golang module proxy service to fetch module files from. Note that the module # proxy generally verifies modules via the Hash1 code. @@ -175,15 +178,15 @@ RESTRICT+=" strip" # below, so please do not rely on it. : "${_GOMODULE_GOPROXY_BASEURI:=mirror://goproxy/}" -# @ECLASS-VARIABLE: _GOMODULE_GOSUM_REVERSE_MAP -# @DEPRECATED: +# @ECLASS_VARIABLE: _GOMODULE_GOSUM_REVERSE_MAP +# @DEPRECATED: none # @DESCRIPTION: # Mapping back from Gentoo distfile name to upstream distfile path. # Associative array to avoid O(N*M) performance when populating the GOPROXY # directory structure. declare -A -g _GOMODULE_GOSUM_REVERSE_MAP -# @ECLASS-VARIABLE: GO_OPTIONAL +# @ECLASS_VARIABLE: GO_OPTIONAL # @DEFAULT_UNSET # @PRE_INHERIT # @DESCRIPTION: @@ -206,7 +209,7 @@ ego() { } # @FUNCTION: go-module_set_globals -# @DEPRECATED: +# @DEPRECATED: none # @DESCRIPTION: # Convert the information in EGO_SUM for other usage in the ebuild. # - Populates EGO_SUM_SRC_URI that can be added to SRC_URI @@ -259,7 +262,22 @@ go-module_set_globals() { continue fi - _dir=$(_go-module_gomod_encode "${module}") + # Encode the name(path) of a Golang module in the format expected by Goproxy. + # Upper letters are replaced by their lowercase version with a '!' prefix. + # The transformed result of 'module' is stored in the '_dir' variable. + # + ## Python: + # return re.sub('([A-Z]{1})', r'!\1', s).lower() + ## Sed: + ## This uses GNU Sed extension \l to downcase the match + # echo "${module}" |sed 's,[A-Z],!\l&,g' + local re _dir lower + _dir="${module}" + re='(.*)([A-Z])(.*)' + while [[ ${_dir} =~ ${re} ]]; do + lower='!'"${BASH_REMATCH[2],}" + _dir="${BASH_REMATCH[1]}${lower}${BASH_REMATCH[3]}" + done for _ext in "${exts[@]}" ; do # Relative URI within a GOPROXY for a file @@ -297,7 +315,7 @@ go-module_set_globals() { } # @FUNCTION: go-module_setup_proxy -# @DEPRECATED: +# @DEPRECATED: none # @DESCRIPTION: # If your ebuild redefines src_unpack and uses EGO_SUM you need to call # this function in src_unpack. @@ -340,11 +358,18 @@ go-module_setup_proxy() { # @FUNCTION: go-module_src_unpack # @DESCRIPTION: -# If EGO_SUM is set, unpack the base tarball(s) and set up the -# local go proxy. Also warn that this usage is deprecated. -# - Otherwise, if EGO_VENDOR is set, bail out. -# - Otherwise do a normal unpack. +# Sets up GOFLAGS for the system and then unpacks based on the following rules: +# 1. If EGO_SUM is set, unpack the base tarball(s) and set up the +# 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 + GOFLAGS="-buildmode=pie ${GOFLAGS}" + fi + GOFLAGS="${GOFLAGS} -p=$(makeopts_jobs)" if [[ "${#EGO_SUM[@]}" -gt 0 ]]; then eqawarn "This ebuild uses EGO_SUM which is deprecated" eqawarn "Please migrate to a dependency tarball" @@ -355,11 +380,19 @@ go-module_src_unpack() { die "Please update this ebuild" else default + if [[ ! -d "${S}"/vendor ]]; then + cd "${S}" + local nf + [[ -n ${NONFATAL_VERIFY} ]] && nf=nonfatal + ${nf} ego mod verify + fi fi + + go-env_set_compile_environment } # @FUNCTION: _go-module_src_unpack_gosum -# @DEPRECATED: +# @DEPRECATED: none # @DESCRIPTION: # Populate a GOPROXY directory hierarchy with distfiles from EGO_SUM and # unpack the base distfiles. @@ -405,7 +438,7 @@ _go-module_src_unpack_gosum() { } # @FUNCTION: _go-module_gosum_synthesize_files -# @DEPRECATED: +# @DEPRECATED: none # @DESCRIPTION: # Given a path & version, populate all Goproxy metadata files which aren't # needed to be downloaded directly. @@ -433,7 +466,7 @@ _go-module_gosum_synthesize_files() { } # @FUNCTION: _go-module_src_unpack_verify_gosum -# @DEPRECATED: +# @DEPRECATED: none # @DESCRIPTION: # Validate the Go modules declared by EGO_SUM are sufficient to cover building # the package, without actually building it yet. @@ -481,31 +514,8 @@ go-module_live_vendor() { popd >& /dev/null || die } -# @FUNCTION: _go-module_gomod_encode -# @DEPRECATED: -# @DESCRIPTION: -# Encode the name(path) of a Golang module in the format expected by Goproxy. -# -# Upper letters are replaced by their lowercase version with a '!' prefix. -# -_go-module_gomod_encode() { - ## Python: - # return re.sub('([A-Z]{1})', r'!\1', s).lower() - - ## Sed: - ## This uses GNU Sed extension \l to downcase the match - #echo "${module}" |sed 's,[A-Z],!\l&,g' - # - # Bash variant: - debug-print-function "${FUNCNAME}" "$@" - #local re input lower - re='(.*)([A-Z])(.*)' - input="${1}" - while [[ ${input} =~ ${re} ]]; do - lower='!'"${BASH_REMATCH[2],}" - input="${BASH_REMATCH[1]}${lower}${BASH_REMATCH[3]}" - done - echo "${input}" -} - +fi + +if [[ ! ${GO_OPTIONAL} ]]; then + EXPORT_FUNCTIONS src_unpack fi diff --git a/sdk_container/src/third_party/portage-stable/eclass/golang-base.eclass b/sdk_container/src/third_party/portage-stable/eclass/golang-base.eclass index bcb37d432c..4bba00200c 100644 --- a/sdk_container/src/third_party/portage-stable/eclass/golang-base.eclass +++ b/sdk_container/src/third_party/portage-stable/eclass/golang-base.eclass @@ -1,12 +1,12 @@ -# Copyright 1999-2021 Gentoo Authors +# Copyright 1999-2022 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 # @ECLASS: golang-base.eclass # @MAINTAINER: # William Hubbs # @SUPPORTED_EAPIS: 5 6 7 -# @DEPRECATED: go-module.eclass # @BLURB: Eclass that provides base functions for Go packages. +# @DEPRECATED: go-module.eclass # @DESCRIPTION: # This eclass provides base functions for software written in the Go # programming language; it also provides the build-time dependency on @@ -40,7 +40,7 @@ RESTRICT="strip" # force GO111MODULE to be auto for bug https://bugs.gentoo.org/771129 export GO111MODULE=auto -# @ECLASS-VARIABLE: EGO_PN +# @ECLASS_VARIABLE: EGO_PN # @REQUIRED # @DESCRIPTION: # This is the import path for the go package to build. Please emerge diff --git a/sdk_container/src/third_party/portage-stable/eclass/golang-vcs-snapshot.eclass b/sdk_container/src/third_party/portage-stable/eclass/golang-vcs-snapshot.eclass index fb1e3c4a1e..ef4d31360f 100644 --- a/sdk_container/src/third_party/portage-stable/eclass/golang-vcs-snapshot.eclass +++ b/sdk_container/src/third_party/portage-stable/eclass/golang-vcs-snapshot.eclass @@ -1,10 +1,10 @@ -# Copyright 1999-2021 Gentoo Authors +# Copyright 1999-2023 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 # @ECLASS: golang-vcs-snapshot.eclass # @MAINTAINER: # William Hubbs -# @SUPPORTED_EAPIS: 5 6 7 +# @SUPPORTED_EAPIS: 6 7 # @PROVIDES: golang-base # @BLURB: eclass to unpack VCS snapshot tarballs for Go software # @DEPRECATED: go-module.eclass @@ -44,16 +44,17 @@ # ${WORKDIR}/${P}/src/github.com/user/package # and add the vendored tarballs to ${WORKDIR}/src/${EGO_PN}/vendor -inherit golang-base - -case ${EAPI:-0} in - 5|6|7) ;; - *) die "${ECLASS} API in EAPI ${EAPI} not yet established." +case ${EAPI} in + 6|7) ;; + *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;; esac -EXPORT_FUNCTIONS src_unpack +if [[ -z ${_GOLANG_VCS_SNAPSHOT_ECLASS} ]]; then +_GOLANG_VCS_SNAPSHOT_ECLASS=1 -# @ECLASS-VARIABLE: EGO_VENDOR +inherit golang-base go-env + +# @ECLASS_VARIABLE: EGO_VENDOR # @DESCRIPTION: # This variable contains a list of vendored packages. # The items of this array are strings that contain the @@ -82,7 +83,7 @@ unset -f _golang-vcs-snapshot_set_vendor_uri _golang-vcs-snapshot_dovendor() { local VENDOR_PATH=$1 VENDORPN=$2 TARBALL=$3 - rm -fr "${VENDOR_PATH}/${VENDORPN}" || die + rm -rf "${VENDOR_PATH}/${VENDORPN}" || die mkdir -p "${VENDOR_PATH}/${VENDORPN}" || die tar -C "${VENDOR_PATH}/${VENDORPN}" -x --strip-components 1\ -f "${DISTDIR}"/${TARBALL} || die @@ -91,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 @@ -116,4 +118,10 @@ golang-vcs-snapshot_src_unpack() { fi done fi + + go-env_set_compile_environment } + +fi + +EXPORT_FUNCTIONS src_unpack diff --git a/sdk_container/src/third_party/portage-stable/eclass/golang-vcs.eclass b/sdk_container/src/third_party/portage-stable/eclass/golang-vcs.eclass index 6492fe4378..b31d24cc98 100644 --- a/sdk_container/src/third_party/portage-stable/eclass/golang-vcs.eclass +++ b/sdk_container/src/third_party/portage-stable/eclass/golang-vcs.eclass @@ -1,10 +1,10 @@ -# Copyright 1999-2021 Gentoo Authors +# Copyright 1999-2023 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 # @ECLASS: golang-vcs.eclass # @MAINTAINER: # William Hubbs -# @SUPPORTED_EAPIS: 5 6 7 +# @SUPPORTED_EAPIS: 6 7 # @PROVIDES: golang-base # @BLURB: Eclass for fetching and unpacking go repositories. # @DEPRECATED: go-module.eclass @@ -12,25 +12,19 @@ # This eclass is written to ease the maintenance of live ebuilds # of software written in the Go programming language. -inherit estack eutils golang-base - -case "${EAPI:-0}" in - 5|6|7) - ;; - *) - die "${ECLASS}: Unsupported eapi (EAPI=${EAPI})" - ;; +case ${EAPI} in + 6|7) ;; + *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;; esac -EXPORT_FUNCTIONS src_unpack +if [[ -z ${_GOLANG_VCS_ECLASS} ]]; then +_GOLANG_VCS_ECLASS=1 -if [[ -z ${_GOLANG_VCS} ]]; then - -_GOLANG_VCS=1 +inherit estack golang-base go-env PROPERTIES+=" live" -# @ECLASS-VARIABLE: EGO_PN +# @ECLASS_VARIABLE: EGO_PN # @REQUIRED # @DESCRIPTION: # This is the import path for the go package(s). Please emerge dev-lang/go @@ -42,7 +36,7 @@ PROPERTIES+=" live" # EGO_PN="github.com/user1/package1 github.com/user2/package2" # @CODE -# @ECLASS-VARIABLE: EGO_STORE_DIR +# @ECLASS_VARIABLE: EGO_STORE_DIR # @USER_VARIABLE # @DESCRIPTION: # Storage directory for Go sources. @@ -52,12 +46,12 @@ PROPERTIES+=" live" # # EGO_STORE_DIR=${DISTDIR}/go-src -# @ECLASS-VARIABLE: EVCS_OFFLINE +# @ECLASS_VARIABLE: EVCS_OFFLINE # @DEFAULT_UNSET # @DESCRIPTION: # If non-empty, this variable prevents any online operations. -# @ECLASS-VARIABLE: EVCS_UMASK +# @ECLASS_VARIABLE: EVCS_UMASK # @DEFAULT_UNSET # @DESCRIPTION: # Set this variable to a custom umask. This is intended to be set by @@ -69,11 +63,12 @@ PROPERTIES+=" live" # @INTERNAL # @DESCRIPTION: # Create EGO_STORE_DIR if necessary. +# Set compile env via go-env. _golang-vcs_env_setup() { debug-print-function ${FUNCNAME} "$@" local distdir=${PORTAGE_ACTUAL_DISTDIR:-${DISTDIR}} - : ${EGO_STORE_DIR:=${distdir}/go-src} + : "${EGO_STORE_DIR:=${distdir}/go-src}" [[ -n ${EVCS_UMASK} ]] && eumask_push $EVCS_UMASK @@ -90,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 @@ -139,3 +136,5 @@ golang-vcs_src_unpack() { } fi + +EXPORT_FUNCTIONS src_unpack