dev-lang/go: support installing multiple Go versions in parallel

This commit is contained in:
Michael Marineau 2016-08-31 10:46:35 -07:00
parent bf0b8b13d4
commit 2dfc02f485
11 changed files with 149 additions and 460 deletions

View File

@ -43,7 +43,7 @@ RDEPEND="${RDEPEND}
dev-lang/nasm dev-lang/nasm
dev-lang/swig dev-lang/swig
dev-lang/yasm dev-lang/yasm
dev-lang/go dev-lang/go:1.6
dev-lang/go-bootstrap dev-lang/go-bootstrap
dev-libs/dbus-glib dev-libs/dbus-glib
>=dev-libs/glib-2.26.1 >=dev-libs/glib-2.26.1

View File

@ -1,227 +0,0 @@
# Copyright 1999-2015 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$
EAPI=5
export CBUILD=${CBUILD:-${CHOST}}
export CTARGET=${CTARGET:-${CHOST}}
inherit eutils toolchain-funcs
if [[ ${PV} = 9999 ]]; then
EGIT_REPO_URI="git://github.com/golang/go.git"
inherit git-r3
else
SRC_URI="https://storage.googleapis.com/golang/go${PV}.src.tar.gz"
# arm64 only works when cross-compiling in the SDK
KEYWORDS="-* amd64 ~arm arm64 ~x86 ~amd64-fbsd ~x86-fbsd ~x64-macos ~x86-macos"
fi
DESCRIPTION="A concurrent garbage collected and typesafe programming language"
HOMEPAGE="http://www.golang.org"
LICENSE="BSD"
SLOT="0/${PV}"
IUSE="cros_host arm64-extras"
# can't build go without go
DEPEND=">=dev-lang/go-bootstrap-1.5.3"
RDEPEND=""
# These test data objects have writable/executable stacks.
QA_EXECSTACK="usr/lib/go/src/debug/elf/testdata/*.obj"
# The tools in /usr/lib/go should not cause the multilib-strict check to fail.
QA_MULTILIB_PATHS="usr/lib/go/pkg/tool/.*/.*"
# The go language uses *.a files which are _NOT_ libraries and should not be
# stripped. The test data objects should also be left alone and unstripped.
STRIP_MASK="/usr/lib/go/pkg/*.a
/usr/lib/go/src/debug/elf/testdata/*
/usr/lib/go/src/debug/dwarf/testdata/*
/usr/lib/go/src/runtime/race/*.syso"
if use cros_host && use arm64-extras; then
STRIP_MASK+="/usr/lib/go/pkg/tool/linux_arm64/*"
fi
if [[ ${PV} != 9999 ]]; then
S="${WORKDIR}"/go
fi
go_arch()
{
# By chance most portage arch names match Go
local portage_arch=$(tc-arch $@)
case "${portage_arch}" in
x86) echo 386;;
x64-*) echo amd64;;
*) echo "${portage_arch}";;
esac
}
go_arm()
{
case "${1:-${CHOST}}" in
armv5*) echo 5;;
armv6*) echo 6;;
armv7*) echo 7;;
*)
die "unknown GOARM for ${1:-${CHOST}}"
;;
esac
}
go_os()
{
case "${1:-${CHOST}}" in
*-linux*) echo linux;;
*-darwin*) echo darwin;;
*-freebsd*) echo freebsd;;
*-netbsd*) echo netbsd;;
*-openbsd*) echo openbsd;;
*-solaris*) echo solaris;;
*-cygwin*|*-interix*|*-winnt*)
echo windows
;;
*)
die "unknown GOOS for ${1:-${CHOST}}"
;;
esac
}
go_tuple()
{
echo "$(go_os $@)_$(go_arch $@)"
}
go_cross_compile()
{
[[ $(go_tuple ${CBUILD}) != $(go_tuple) ]]
}
pkg_pretend()
{
# make.bash does not understand cross-compiling a cross-compiler
if [[ $(go_tuple) != $(go_tuple ${CTARGET}) ]]; then
die "CHOST CTARGET pair unsupported: CHOST=${CHOST} CTARGET=${CTARGET}"
fi
}
src_prepare()
{
epatch_user
}
src_compile()
{
export GOROOT_BOOTSTRAP="${EPREFIX}"/usr/lib/go-bootstrap
export GOROOT_FINAL="${EPREFIX}"/usr/lib/go
export GOROOT="$(pwd)"
export GOBIN="${GOROOT}/bin"
# Go's build script does not use BUILD/HOST/TARGET consistently. :(
export GOHOSTARCH=$(go_arch ${CBUILD})
export GOHOSTOS=$(go_os ${CBUILD})
export CC=$(tc-getBUILD_CC)
export GOOS=$(go_os)
cd src
# Build the target support first.
if use cros_host && use arm64-extras; then
export GOARCH="arm64"
export CC_FOR_TARGET="aarch64-cros-linux-gnu-gcc"
export CXX_FOR_TARGET="aarch64-cros-linux-gnu-g++"
ebegin "Building for GOARCH=${GOARCH}..."
./make.bash --no-clean --no-test
eend $? "Build for GOARCH=${GOARCH} failed." || die
fi
# Build the host last to get the correct settings in the go environment.
export GOARCH=$(go_arch)
export CC_FOR_TARGET=$(tc-getCC)
export CXX_FOR_TARGET=$(tc-getCXX)
if [[ ${ARCH} == arm ]]; then
export GOARM=$(go_arm)
fi
ebegin "Building for GOARCH=${GOARCH}..."
./make.bash --no-clean --no-test
eend $? "Build for GOARCH=${GOARCH} failed." || die
}
src_test()
{
go_cross_compile && return 0
cd src
PATH="${GOBIN}:${PATH}" \
./run.bash -no-rebuild || die "tests failed"
}
src_install()
{
local bin_path="${GOBIN}"
if go_cross_compile; then
bin_path="${GOBIN}/$(go_tuple)"
fi
dobin "${bin_path}"/go "${bin_path}"/gofmt
dodoc AUTHORS CONTRIBUTORS PATENTS README.md
dodir /usr/lib/go /usr/lib/go/pkg /usr/lib/go/pkg/tool
insinto /usr/lib/go
# There is a known issue which requires the source tree to be installed [1].
# Once this is fixed, we can consider using the doc use flag to control
# installing the doc and src directories.
# [1] https://golang.org/issue/2775
doins -r doc lib src
# Selectively install pkg directory to exclude the bootstrap build
insinto /usr/lib/go/pkg
doins -r pkg/include "pkg/$(go_tuple)"
insinto /usr/lib/go/pkg/tool
doins -r "pkg/tool/$(go_tuple)"
fperms -R +x /usr/lib/go/pkg/tool
if use cros_host && use arm64-extras; then
insinto /usr/lib/go/pkg
doins -r pkg/linux_arm64
fi
}
pkg_preinst()
{
has_version '<dev-lang/go-1.4' &&
export had_support_files=true ||
export had_support_files=false
}
pkg_postinst()
{
# If the go tool sees a package file timestamped older than a dependancy it
# will rebuild that file. So, in order to stop go from rebuilding lots of
# packages for every build we need to fix the timestamps. The compiler and
# linker are also checked - so we need to fix them too.
ebegin "fixing timestamps to avoid unnecessary rebuilds"
tref="usr/lib/go/pkg/*/runtime.a"
find "${EROOT}"usr/lib/go -type f \
-exec touch -r "${EROOT}"${tref} {} \;
eend $?
if [[ ${PV} != 9999 && -n ${REPLACING_VERSIONS} &&
${REPLACING_VERSIONS} != ${PV} ]]; then
elog "Release notes are located at http://golang.org/doc/go${PV}"
fi
if $had_support_files; then
ewarn
ewarn "All editor support, IDE support, shell completion"
ewarn "support, etc has been removed from the go package"
ewarn "upstream."
ewarn "For more information on which support is available, see"
ewarn "the following URL:"
ewarn "https://github.com/golang/go/wiki/IDEsAndTextEditorPlugins"
fi
}

View File

@ -0,0 +1,9 @@
# Copyright 2016 CoreOS, Inc.
# Distributed under the terms of the GNU General Public License v2
# $Id$
EAPI=6
inherit coreos-go-lang
KEYWORDS="-* amd64 arm64"

View File

@ -0,0 +1,9 @@
# Copyright 2016 CoreOS, Inc.
# Distributed under the terms of the GNU General Public License v2
# $Id$
EAPI=6
inherit coreos-go-lang
KEYWORDS="-* amd64 arm64"

View File

@ -1 +0,0 @@
go-9999.ebuild

View File

@ -1,227 +0,0 @@
# Copyright 1999-2015 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$
EAPI=5
export CBUILD=${CBUILD:-${CHOST}}
export CTARGET=${CTARGET:-${CHOST}}
inherit eutils toolchain-funcs
if [[ ${PV} = 9999 ]]; then
EGIT_REPO_URI="git://github.com/golang/go.git"
inherit git-r3
else
SRC_URI="https://storage.googleapis.com/golang/go${PV}.src.tar.gz"
# arm64 only works when cross-compiling in the SDK
KEYWORDS="-* amd64 ~arm arm64 ~x86 ~amd64-fbsd ~x86-fbsd ~x64-macos ~x86-macos"
fi
DESCRIPTION="A concurrent garbage collected and typesafe programming language"
HOMEPAGE="http://www.golang.org"
LICENSE="BSD"
SLOT="0/${PV}"
IUSE="cros_host arm64-extras"
# can't build go without go
DEPEND=">=dev-lang/go-bootstrap-1.5.3"
RDEPEND=""
# These test data objects have writable/executable stacks.
QA_EXECSTACK="usr/lib/go/src/debug/elf/testdata/*.obj"
# The tools in /usr/lib/go should not cause the multilib-strict check to fail.
QA_MULTILIB_PATHS="usr/lib/go/pkg/tool/.*/.*"
# The go language uses *.a files which are _NOT_ libraries and should not be
# stripped. The test data objects should also be left alone and unstripped.
STRIP_MASK="/usr/lib/go/pkg/*.a
/usr/lib/go/src/debug/elf/testdata/*
/usr/lib/go/src/debug/dwarf/testdata/*
/usr/lib/go/src/runtime/race/*.syso"
if use cros_host && use arm64-extras; then
STRIP_MASK+="/usr/lib/go/pkg/tool/linux_arm64/*"
fi
if [[ ${PV} != 9999 ]]; then
S="${WORKDIR}"/go
fi
go_arch()
{
# By chance most portage arch names match Go
local portage_arch=$(tc-arch $@)
case "${portage_arch}" in
x86) echo 386;;
x64-*) echo amd64;;
*) echo "${portage_arch}";;
esac
}
go_arm()
{
case "${1:-${CHOST}}" in
armv5*) echo 5;;
armv6*) echo 6;;
armv7*) echo 7;;
*)
die "unknown GOARM for ${1:-${CHOST}}"
;;
esac
}
go_os()
{
case "${1:-${CHOST}}" in
*-linux*) echo linux;;
*-darwin*) echo darwin;;
*-freebsd*) echo freebsd;;
*-netbsd*) echo netbsd;;
*-openbsd*) echo openbsd;;
*-solaris*) echo solaris;;
*-cygwin*|*-interix*|*-winnt*)
echo windows
;;
*)
die "unknown GOOS for ${1:-${CHOST}}"
;;
esac
}
go_tuple()
{
echo "$(go_os $@)_$(go_arch $@)"
}
go_cross_compile()
{
[[ $(go_tuple ${CBUILD}) != $(go_tuple) ]]
}
pkg_pretend()
{
# make.bash does not understand cross-compiling a cross-compiler
if [[ $(go_tuple) != $(go_tuple ${CTARGET}) ]]; then
die "CHOST CTARGET pair unsupported: CHOST=${CHOST} CTARGET=${CTARGET}"
fi
}
src_prepare()
{
epatch_user
}
src_compile()
{
export GOROOT_BOOTSTRAP="${EPREFIX}"/usr/lib/go-bootstrap
export GOROOT_FINAL="${EPREFIX}"/usr/lib/go
export GOROOT="$(pwd)"
export GOBIN="${GOROOT}/bin"
# Go's build script does not use BUILD/HOST/TARGET consistently. :(
export GOHOSTARCH=$(go_arch ${CBUILD})
export GOHOSTOS=$(go_os ${CBUILD})
export CC=$(tc-getBUILD_CC)
export GOOS=$(go_os)
cd src
# Build the target support first.
if use cros_host && use arm64-extras; then
export GOARCH="arm64"
export CC_FOR_TARGET="aarch64-cros-linux-gnu-gcc"
export CXX_FOR_TARGET="aarch64-cros-linux-gnu-g++"
ebegin "Building for GOARCH=${GOARCH}..."
./make.bash --no-clean --no-test
eend $? "Build for GOARCH=${GOARCH} failed." || die
fi
# Build the host last to get the correct settings in the go environment.
export GOARCH=$(go_arch)
export CC_FOR_TARGET=$(tc-getCC)
export CXX_FOR_TARGET=$(tc-getCXX)
if [[ ${ARCH} == arm ]]; then
export GOARM=$(go_arm)
fi
ebegin "Building for GOARCH=${GOARCH}..."
./make.bash --no-clean --no-test
eend $? "Build for GOARCH=${GOARCH} failed." || die
}
src_test()
{
go_cross_compile && return 0
cd src
PATH="${GOBIN}:${PATH}" \
./run.bash -no-rebuild || die "tests failed"
}
src_install()
{
local bin_path="${GOBIN}"
if go_cross_compile; then
bin_path="${GOBIN}/$(go_tuple)"
fi
dobin "${bin_path}"/go "${bin_path}"/gofmt
dodoc AUTHORS CONTRIBUTORS PATENTS README.md
dodir /usr/lib/go /usr/lib/go/pkg /usr/lib/go/pkg/tool
insinto /usr/lib/go
# There is a known issue which requires the source tree to be installed [1].
# Once this is fixed, we can consider using the doc use flag to control
# installing the doc and src directories.
# [1] https://golang.org/issue/2775
doins -r doc lib src
# Selectively install pkg directory to exclude the bootstrap build
insinto /usr/lib/go/pkg
doins -r pkg/include "pkg/$(go_tuple)"
insinto /usr/lib/go/pkg/tool
doins -r "pkg/tool/$(go_tuple)"
fperms -R +x /usr/lib/go/pkg/tool
if use cros_host && use arm64-extras; then
insinto /usr/lib/go/pkg
doins -r pkg/linux_arm64
fi
}
pkg_preinst()
{
has_version '<dev-lang/go-1.4' &&
export had_support_files=true ||
export had_support_files=false
}
pkg_postinst()
{
# If the go tool sees a package file timestamped older than a dependancy it
# will rebuild that file. So, in order to stop go from rebuilding lots of
# packages for every build we need to fix the timestamps. The compiler and
# linker are also checked - so we need to fix them too.
ebegin "fixing timestamps to avoid unnecessary rebuilds"
tref="usr/lib/go/pkg/*/runtime.a"
find "${EROOT}"usr/lib/go -type f \
-exec touch -r "${EROOT}"${tref} {} \;
eend $?
if [[ ${PV} != 9999 && -n ${REPLACING_VERSIONS} &&
${REPLACING_VERSIONS} != ${PV} ]]; then
elog "Release notes are located at http://golang.org/doc/go${PV}"
fi
if $had_support_files; then
ewarn
ewarn "All editor support, IDE support, shell completion"
ewarn "support, etc has been removed from the go package"
ewarn "upstream."
ewarn "For more information on which support is available, see"
ewarn "the following URL:"
ewarn "https://github.com/golang/go/wiki/IDEsAndTextEditorPlugins"
fi
}

View File

@ -27,4 +27,4 @@ inherit coreos-go-utils
# the package gets rebuilt when the version changes. # the package gets rebuilt when the version changes.
IUSE="+go_version_${COREOS_GO_VERSION//./_}" IUSE="+go_version_${COREOS_GO_VERSION//./_}"
REQUIRED_USE="go_version_${COREOS_GO_VERSION//./_}" REQUIRED_USE="go_version_${COREOS_GO_VERSION//./_}"
DEPEND="dev-lang/go-${COREOS_GO_VERSION#go}*:=" DEPEND="dev-lang/go:${COREOS_GO_VERSION#go}="

View File

@ -0,0 +1,123 @@
# Copyright 2016 CoreOS, Inc.
# Distributed under the terms of the GNU General Public License v2
# $Header: $
# @ECLASS: coreos-go-lang.eclass
# @BLURB: Common functionality for building Go itself
# @DESCRIPTION:
# Only dev-lang/go ebuilds should inherit this eclass.
#
# Native (${CHOST} == ${CTARGET}):
#
case "${EAPI:-0}" in
6) ;;
*) die "Unsupported EAPI=${EAPI} for ${ECLASS}"
esac
inherit coreos-go-utils toolchain-funcs versionator
export CBUILD=${CBUILD:-${CHOST}}
export CTARGET=${CTARGET:-${CHOST}}
# Determine the main SLOT we will be using, e.g.: PV=1.5.3 SLOT=1.5
GOSLOT="$(get_version_component_range 1-2)"
DESCRIPTION="A concurrent garbage collected and typesafe programming language"
HOMEPAGE="http://www.golang.org"
SRC_URI="https://storage.googleapis.com/golang/go${PV}.src.tar.gz"
LICENSE="BSD"
SLOT="${GOSLOT}/${PV}"
IUSE=""
RDEPEND="app-eselect/eselect-go"
DEPEND="${RDEPEND}
>=dev-lang/go-bootstrap-1.5.3"
# These test data objects have writable/executable stacks.
QA_EXECSTACK="usr/lib/go${GOSLOT}/src/debug/elf/testdata/*.obj"
# Similarly, test data is never executed so don't check link dependencies.
REQUIRES_EXCLUDE="/usr/lib/go/src/debug/elf/testdata/*"
# The tools in /usr/lib/go should not cause the multilib-strict check to fail.
QA_MULTILIB_PATHS="usr/lib/go${GOSLOT}/pkg/tool/.*/.*"
# The go language uses *.a files which are _NOT_ libraries and should not be
# stripped. The test data objects should also be left alone and unstripped.
STRIP_MASK="*.a /usr/lib/go${GOSLOT}/src/*"
S="${WORKDIR}/go"
coreos-go-lang_pkg_pretend() {
# make.bash does not understand cross-compiling a cross-compiler
if [[ $(go_tuple) != $(go_tuple ${CTARGET}) ]]; then
die "CHOST CTARGET pair unsupported: CHOST=${CHOST} CTARGET=${CTARGET}"
fi
}
coreos-go-lang_src_compile() {
export GOROOT_BOOTSTRAP="${EPREFIX}/usr/lib/go-bootstrap"
export GOROOT_FINAL="${EPREFIX}/usr/lib/go${GOSLOT}"
export GOROOT="${S}"
export GOBIN="${GOROOT}/bin"
# Go's build script does not use BUILD/HOST/TARGET consistently. :(
go_export
export GOHOSTARCH=$(go_arch ${CBUILD})
export GOHOSTOS=$(go_os ${CBUILD})
export CC_FOR_TARGET=$(tc-getCC)
export CXX_FOR_TARGET=$(tc-getCXX)
# Must be set *after* calling tc-getCC
export CC=$(tc-getBUILD_CC)
cd src
./make.bash || die "build failed"
}
coreos-go-lang_src_test() {
go_cross_compile && return 0
cd src
PATH="${GOBIN}:${PATH}" \
./run.bash -no-rebuild || die "tests failed"
}
coreos-go-lang_src_install() {
exeinto "/usr/lib/go${GOSLOT}/bin"
if go_cross_compile; then
doexe "${GOBIN}/$(go_tuple)/"{go,gofmt}
else
doexe "${GOBIN}/"{go,gofmt}
fi
dosym "../lib/go${GOSLOT}/bin/go" "/usr/bin/go${GOSLOT}"
dosym "../lib/go${GOSLOT}/bin/gofmt" "/usr/bin/gofmt${GOSLOT}"
exeinto "/usr/lib/go${GOSLOT}/pkg/tool/$(go_tuple)"
doexe "pkg/tool/$(go_tuple)/"*
insopts -m0644 -p # preserve timestamps
insinto "/usr/lib/go${GOSLOT}"
doins -r doc lib src
insinto "/usr/lib/go${GOSLOT}/pkg"
doins -r "pkg/include" "pkg/$(go_tuple)"
dodoc AUTHORS CONTRIBUTORS PATENTS README.md
}
eselect_go_update() {
if [[ -z "$(eselect go show)" || ! -f "${EROOT}usr/bin/$(eselect go show)" ]]; then
eselect go update
fi
}
coreos-go-lang_pkg_postinst() {
eselect_go_update
}
coreos-go-lang_pkg_postrm() {
eselect_go_update
}
EXPORT_FUNCTIONS pkg_pretend src_compile src_test src_install pkg_postinst pkg_postrm

View File

@ -92,6 +92,9 @@ go_export() {
export CGO_CPPFLAGS="${CPPFLAGS}" export CGO_CPPFLAGS="${CPPFLAGS}"
export CGO_CXXFLAGS="${CXXFLAGS}" export CGO_CXXFLAGS="${CXXFLAGS}"
export CGO_LDFLAGS="${LDFLAGS}" export CGO_LDFLAGS="${LDFLAGS}"
# Ensure the `go` wrapper calls the version we expect
export EGO="${COREOS_GO_VERSION}"
} }
# @FUNCTION: go_tuple # @FUNCTION: go_tuple

View File

@ -41,10 +41,10 @@ go_build() {
local package_name="$1" local package_name="$1"
local binary_name="${package_name##*/}" local binary_name="${package_name##*/}"
ebegin "go build ${package_name}" ebegin "${EGO} build ${package_name}"
debug-print $(go env) debug-print EGO=${EGO} $(${EGO} env)
go build -v \ ${EGO} build -v \
-p "$(makeopts_jobs)" \ -p "$(makeopts_jobs)" \
-ldflags "${GO_LDFLAGS} -extldflags '${LDFLAGS}'" \ -ldflags "${GO_LDFLAGS} -extldflags '${LDFLAGS}'" \
-o "${GOBIN}/${binary_name}" \ -o "${GOBIN}/${binary_name}" \