| # Copyright 2023 Gentoo Authors |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| # @ECLASS: go-env.eclass |
| # @MAINTAINER: |
| # Flatcar Linux Maintainers <infra@flatcar-linux.org> |
| # @AUTHOR: |
| # Flatcar Linux Maintainers <infra@flatcar-linux.org> |
| # @BLURB: Helper eclass for setting the Go compile environment. Required for cross-compiling. |
| # @DESCRIPTION: |
| # This eclass includes helper functions 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. |
| # Necessary platform-specific settings such as GOARM or GO386 are also set |
| # according to the Portage configuration when building for those architectures. |
| # 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() { |
| tc-export CC CXX |
| |
| export GOARCH="$(go-env_goarch)" |
| use arm && export GOARM=$(go-env_goarm) |
| use x86 && export GO386=$(go-env_go386) |
| |
| export CGO_CFLAGS="${CGO_CFLAGS:-$CFLAGS}" |
| export CGO_CPPFLAGS="${CGO_CPPFLAGS:-$CPPFLAGS}" |
| export CGO_CXXFLAGS="${CGO_CXXFLAGS:-$CXXFLAGS}" |
| export CGO_LDFLAGS="${CGO_LDFLAGS:-$LDFLAGS}" |
| } |
| |
| # @FUNCTION: go-env_goarch |
| # @USAGE: [toolchain prefix] |
| # @DESCRIPTION: |
| # Returns the appropriate GOARCH setting for the target architecture. |
| go-env_goarch() { |
| # By chance most portage arch names match Go |
| local tc_arch=$(tc-arch $@) |
| case "${tc_arch}" in |
| x86) echo 386;; |
| x64-*) echo amd64;; |
| loong) echo loong64;; |
| mips) if use abi_mips_o32; then |
| [[ $(tc-endian $@) = big ]] && echo mips || echo mipsle |
| elif use abi_mips_n64; then |
| [[ $(tc-endian $@) = big ]] && echo mips64 || echo mips64le |
| fi ;; |
| ppc64) [[ $(tc-endian $@) = big ]] && echo ppc64 || echo ppc64le ;; |
| riscv) echo riscv64 ;; |
| s390) echo s390x ;; |
| *) echo "${tc_arch}";; |
| esac |
| } |
| |
| # @FUNCTION: go-env_go386 |
| # @DESCRIPTION: |
| # Returns the appropriate GO386 setting for the CFLAGS in use. |
| go-env_go386() { |
| # Piggy-back off any existing CPU_FLAGS_X86 usage in the ebuild if |
| # it's there. |
| if in_iuse cpu_flags_x86_sse2 && use cpu_flags_x86_sse2 ; then |
| echo 'sse2' |
| return |
| fi |
| |
| if tc-cpp-is-true "defined(__SSE2__)" ${CFLAGS} ${CXXFLAGS} ; then |
| echo 'sse2' |
| return |
| fi |
| |
| # Go 1.16 dropped explicit support for 386 FP and relies on software |
| # emulation instead in the absence of SSE2. |
| echo 'softfloat' |
| } |
| |
| # @FUNCTION: go-env_goarm |
| # @USAGE: [CHOST-value] |
| # @DESCRIPTION: |
| # Returns the appropriate GOARM setting for the CHOST given, or the default |
| # CHOST. |
| go-env_goarm() { |
| case "${1:-${CHOST}}" in |
| armv5*) echo 5;; |
| armv6*) echo 6;; |
| armv7*) echo 7;; |
| *) |
| die "unknown GOARM for ${1:-${CHOST}}" |
| ;; |
| esac |
| } |
| |
| fi |