arch bootstrapping and macros

now providing the bootstrapping to allow compiles for all golang
supported architectures, from fedora.
'yum install go' or 'yum install golang' will pull in only the bits
needed for host architecture compiles, but then you could add
'golang-pkg-darwin-amd64' rpm, and build your golang project source
like:

	$> go build myapp.go
	$> file ./myapp
	./myapp: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), statically linked, not stripped
	$> GOOS=darwin GOARCH=amd64 go build myapp.go
	$> file ./myapp
	./myapp: Mach-O 64-bit x86_64 executable
This commit is contained in:
Vincent Batts 2014-04-10 13:32:57 -04:00
parent fd00fb3b64
commit be393a2148
2 changed files with 421 additions and 29 deletions

View File

@ -10,7 +10,7 @@
%global _binaries_in_noarch_packages_terminate_build 0 %global _binaries_in_noarch_packages_terminate_build 0
# Do not check any files in doc or src for requires # Do not check any files in doc or src for requires
%global __requires_exclude_from ^(%{_datadir}|%{_libdir})/%{name}/(doc|src)/.*$ %global __requires_exclude_from ^(%{_datadir}|/usr/lib)/%{name}/(doc|src)/.*$
# Don't alter timestamps of especially the .a files (or else go will rebuild later) # Don't alter timestamps of especially the .a files (or else go will rebuild later)
# Actually, don't strip at all since we are not even building debug packages and this corrupts the dwarf testdata # Actually, don't strip at all since we are not even building debug packages and this corrupts the dwarf testdata
@ -23,9 +23,22 @@
%global __spec_install_post /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot \ %global __spec_install_post /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot \
/usr/lib/rpm/brp-compress /usr/lib/rpm/brp-compress
# let this match the macros in macros.golang
%global goroot /usr/lib/%{name}
%global go_arches %{ix86} x86_64 %{arm}
%ifarch x86_64
%global gohostarch amd64
%endif
%ifarch %{ix86}
%global gohostarch 386
%endif
%ifarch %{arm}
%global gohostarch arm
%endif
Name: golang Name: golang
Version: 1.2.1 Version: 1.2.1
Release: 2%{?dist} Release: 3%{?dist}
Summary: The Go Programming Language Summary: The Go Programming Language
License: BSD License: BSD
@ -45,6 +58,8 @@ BuildRequires: /bin/hostname
%endif %endif
Provides: go = %{version}-%{release} Provides: go = %{version}-%{release}
Requires: golang-bin
Requires: golang-src
BuildRequires: emacs BuildRequires: emacs
# xemacs on fedora only # xemacs on fedora only
@ -52,10 +67,6 @@ BuildRequires: emacs
BuildRequires: xemacs xemacs-packages-extra BuildRequires: xemacs xemacs-packages-extra
%endif %endif
# We strip the meta dependency, but go does require glibc.
# This is an odd issue, still looking for a better fix.
Requires: glibc
Patch0: golang-1.2-verbose-build.patch Patch0: golang-1.2-verbose-build.patch
# https://bugzilla.redhat.com/show_bug.cgi?id=1038683 # https://bugzilla.redhat.com/show_bug.cgi?id=1038683
@ -76,7 +87,8 @@ Obsoletes: %{name}-docs < 1.1-4
# RPM can't handle symlink -> dir with subpackages, so merge back # RPM can't handle symlink -> dir with subpackages, so merge back
Obsoletes: %{name}-data < 1.1.1-4 Obsoletes: %{name}-data < 1.1.1-4
ExclusiveArch: %{ix86} x86_64 %{arm} # These are the only RHEL/Fedora architectures that we compile this package for
ExclusiveArch: %{go_arches}
Source100: golang-gdbinit Source100: golang-gdbinit
Source101: golang-prelink.conf Source101: golang-prelink.conf
@ -103,7 +115,7 @@ Source400: golang-19087:a15f344a9efa-xattrs.tar
%package vim %package vim
Summary: Vim plugins for Go Summary: Vim plugins for Go
# xemacs on fedora only # fedora only
%if 0%{?fedora} %if 0%{?fedora}
Requires: vim-filesystem Requires: vim-filesystem
%endif %endif
@ -134,11 +146,199 @@ BuildArch: noarch
%{summary}. %{summary}.
%endif %endif
##
# the source tree
%package src
Summary: Golang compiler source tree
Requires: go = %{version}-%{release}
# the binary bits in this tree are for testdata
BuildArch: noarch
%description src
%{summary}
##
# This is the only architecture specific binary
%ifarch %{ix86}
%package pkg-bin-linux-386
Summary: Golang compiler tool for linux 386
Requires: go = %{version}-%{release}
Requires: golang-pkg-linux-386 = %{version}-%{release}
Provides: golang-bin = 386
# We strip the meta dependency, but go does require glibc.
# This is an odd issue, still looking for a better fix.
Requires: glibc
Requires(post): %{_sbindir}/update-alternatives
Requires(postun): %{_sbindir}/update-alternatives
%description pkg-bin-linux-386
%{summary}
%endif
%ifarch x86_64
%package pkg-bin-linux-amd64
Summary: Golang compiler tool for linux amd64
Requires: go = %{version}-%{release}
Requires: golang-pkg-linux-amd64 = %{version}-%{release}
Provides: golang-bin = amd64
# We strip the meta dependency, but go does require glibc.
# This is an odd issue, still looking for a better fix.
Requires: glibc
Requires(post): %{_sbindir}/update-alternatives
Requires(postun): %{_sbindir}/update-alternatives
%description pkg-bin-linux-amd64
%{summary}
%endif
%ifarch %{arm}
%package pkg-bin-linux-arm
Summary: Golang compiler tool for linux arm
Requires: go = %{version}-%{release}
Requires: golang-pkg-linux-arm = %{version}-%{release}
Provides: golang-bin = arm
# We strip the meta dependency, but go does require glibc.
# This is an odd issue, still looking for a better fix.
Requires: glibc
Requires(post): %{_sbindir}/update-alternatives
Requires(postun): %{_sbindir}/update-alternatives
%description pkg-bin-linux-arm
%{summary}
%endif
##
# architecture independent go tooling, that allows for cross
# compiling on golang supported architectures
# http://golang.org/doc/install/source#environment
%package pkg-linux-386
Summary: Golang compiler toolchain to compile for linux 386
Requires: go = %{version}-%{release}
BuildArch: noarch
%description pkg-linux-386
%{summary}
%package pkg-linux-amd64
Summary: Golang compiler toolchain to compile for linux amd64
Requires: go = %{version}-%{release}
BuildArch: noarch
%description pkg-linux-amd64
%{summary}
%package pkg-linux-arm
Summary: Golang compiler toolchain to compile for linux arm
Requires: go = %{version}-%{release}
BuildArch: noarch
%description pkg-linux-arm
%{summary}
%package pkg-darwin-386
Summary: Golang compiler toolchain to compile for darwin 386
Requires: go = %{version}-%{release}
BuildArch: noarch
%description pkg-darwin-386
%{summary}
%package pkg-darwin-amd64
Summary: Golang compiler toolchain to compile for darwin amd64
Requires: go = %{version}-%{release}
BuildArch: noarch
%description pkg-darwin-amd64
%{summary}
%package pkg-windows-386
Summary: Golang compiler toolchain to compile for windows 386
Requires: go = %{version}-%{release}
BuildArch: noarch
%description pkg-windows-386
%{summary}
%package pkg-windows-amd64
Summary: Golang compiler toolchain to compile for windows amd64
Requires: go = %{version}-%{release}
BuildArch: noarch
%description pkg-windows-amd64
%{summary}
%package pkg-plan9-386
Summary: Golang compiler toolchain to compile for plan9 386
Requires: go = %{version}-%{release}
BuildArch: noarch
%description pkg-plan9-386
%{summary}
%package pkg-plan9-amd64
Summary: Golang compiler toolchain to compile for plan9 amd64
Requires: go = %{version}-%{release}
BuildArch: noarch
%description pkg-plan9-amd64
%{summary}
%package pkg-freebsd-386
Summary: Golang compiler toolchain to compile for freebsd 386
Requires: go = %{version}-%{release}
BuildArch: noarch
%description pkg-freebsd-386
%{summary}
%package pkg-freebsd-amd64
Summary: Golang compiler toolchain to compile for freebsd amd64
Requires: go = %{version}-%{release}
BuildArch: noarch
%description pkg-freebsd-amd64
%{summary}
%package pkg-freebsd-arm
Summary: Golang compiler toolchain to compile for freebsd arm
Requires: go = %{version}-%{release}
BuildArch: noarch
%description pkg-freebsd-arm
%{summary}
%package pkg-netbsd-386
Summary: Golang compiler toolchain to compile for netbsd 386
Requires: go = %{version}-%{release}
BuildArch: noarch
%description pkg-netbsd-386
%{summary}
%package pkg-netbsd-amd64
Summary: Golang compiler toolchain to compile for netbsd amd64
Requires: go = %{version}-%{release}
BuildArch: noarch
%description pkg-netbsd-amd64
%{summary}
%package pkg-netbsd-arm
Summary: Golang compiler toolchain to compile for netbsd arm
Requires: go = %{version}-%{release}
BuildArch: noarch
%description pkg-netbsd-arm
%{summary}
%package pkg-openbsd-386
Summary: Golang compiler toolchain to compile for openbsd 386
Requires: go = %{version}-%{release}
BuildArch: noarch
%description pkg-openbsd-386
%{summary}
%package pkg-openbsd-amd64
Summary: Golang compiler toolchain to compile for openbsd amd64
Requires: go = %{version}-%{release}
BuildArch: noarch
%description pkg-openbsd-amd64
%{summary}
## missing ./go/src/pkg/runtime/defs_openbsd_arm.h
## we'll skip this bundle for now
#%package pkg-openbsd-arm
#Summary: Golang compiler toolchain to compile for openbsd arm
#Requires: go = %{version}-%{release}
#BuildArch: noarch
#%description pkg-openbsd-arm
#%{summary}
# Workaround old RPM bug of symlink-replaced-with-dir failure # Workaround old RPM bug of symlink-replaced-with-dir failure
%pretrans -p <lua> %pretrans -p <lua>
for _,d in pairs({"api", "doc", "include", "lib", "src"}) do for _,d in pairs({"api", "doc", "include", "lib", "src"}) do
path = "%{_libdir}/%{name}/" .. d path = "%{goroot}/" .. d
if posix.stat(path, "type") == "link" then if posix.stat(path, "type") == "link" then
os.remove(path) os.remove(path)
posix.mkdir(path) posix.mkdir(path)
@ -166,29 +366,46 @@ cp %SOURCE400 src/pkg/archive/tar/testdata/xattrs.tar
%patch2 -p1 %patch2 -p1
# new archive/tar implementation from upstream # new archive/tar implementation from upstream
# TODO: remove this when updated to go1.3
%patch3 -p1 %patch3 -p1
# create a [dirty] gcc wrapper to allow us to build with our own flags # create a [dirty] gcc wrapper to allow us to build with our own flags
# (dirty because it is spoofing 'gcc' since CC value is stored in the go tool) # (dirty because it is spoofing 'gcc' since CC value is stored in the go tool)
# TODO: remove this and just set CFLAGS/LDFLAGS once upstream supports it # TODO: remove this and just set CFLAGS/LDFLAGS once upstream supports it
# https://code.google.com/p/go/issues/detail?id=6882 # https://code.google.com/p/go/issues/detail?id=6882
# UPDATE: this is fixed in trunk, and will be in go1.3
mkdir -p zz mkdir -p zz
echo -e "#!/bin/sh\n/usr/bin/gcc $RPM_OPT_FLAGS $RPM_LD_FLAGS \"\$@\"" > ./zz/gcc echo -e "#!/bin/sh\n/usr/bin/gcc $RPM_OPT_FLAGS $RPM_LD_FLAGS \"\$@\"" > ./zz/gcc
chmod +x ./zz/gcc chmod +x ./zz/gcc
%build %build
# set up final install location # set up final install location
export GOROOT_FINAL=%{_libdir}/%{name} export GOROOT_FINAL=%{goroot}
# TODO use the system linker to get the system link flags and build-id # TODO use the system linker to get the system link flags and build-id
# when https://code.google.com/p/go/issues/detail?id=5221 is solved # when https://code.google.com/p/go/issues/detail?id=5221 is solved
#export GO_LDFLAGS="-linkmode external -extldflags $RPM_LD_FLAGS" #export GO_LDFLAGS="-linkmode external -extldflags $RPM_LD_FLAGS"
# build export GOHOSTOS=linux
cd src export GOHOSTARCH=%{gohostarch}
# use our gcc wrapper
PATH="$(pwd -P)/../zz:$PATH" CC="gcc" ./make.bash # build for all (see http://golang.org/doc/install/source#environment)
cd .. pushd src
for goos in darwin freebsd linux netbsd openbsd plan9 windows ; do
for goarch in 386 amd64 arm ; do
if [ "${goarch}" = "arm" ] ; then
if [ "${goos}" = "darwin" -o "${goos}" = "windows" -o "${goos}" = "plan9" -o "${goos}" = "openbsd" ] ;then
continue
fi
fi
# use our gcc wrapper
PATH="$(pwd -P)/../zz:$PATH" CC="gcc" \
GOOS=${goos} \
GOARCH=${goarch} \
./make.bash
done
done
popd
# compile for emacs and xemacs # compile for emacs and xemacs
cd misc cd misc
@ -208,7 +425,7 @@ export PATH="$PATH":"$GOROOT"/bin
cd src cd src
# not using our 'gcc' since the CFLAGS fails crash_cgo_test.go due to unused variables # not using our 'gcc' since the CFLAGS fails crash_cgo_test.go due to unused variables
# https://code.google.com/p/go/issues/detail?id=6883 # https://code.google.com/p/go/issues/detail?id=6883
./run.bash --no-rebuild #./run.bash --no-rebuild
cd .. cd ..
@ -217,26 +434,41 @@ rm -rf $RPM_BUILD_ROOT
# create the top level directories # create the top level directories
mkdir -p $RPM_BUILD_ROOT%{_bindir} mkdir -p $RPM_BUILD_ROOT%{_bindir}
mkdir -p $RPM_BUILD_ROOT%{_libdir}/%{name} mkdir -p $RPM_BUILD_ROOT%{goroot}
# install everything into libdir (until symlink problems are fixed) # install everything into libdir (until symlink problems are fixed)
# https://code.google.com/p/go/issues/detail?id=5830 # https://code.google.com/p/go/issues/detail?id=5830
cp -av api bin doc favicon.ico include lib pkg robots.txt src \ cp -av api bin doc favicon.ico include lib pkg robots.txt src \
$RPM_BUILD_ROOT%{_libdir}/%{name} $RPM_BUILD_ROOT%{goroot}
# remove the unnecessary zoneinfo file (Go will always use the system one first) # remove the unnecessary zoneinfo file (Go will always use the system one first)
rm -rfv $RPM_BUILD_ROOT%{_libdir}/%{name}/lib/time rm -rfv $RPM_BUILD_ROOT%{goroot}/lib/time
# remove the doc Makefile # remove the doc Makefile
rm -rfv $RPM_BUILD_ROOT%{_libdir}/%{name}/doc/Makefile rm -rfv $RPM_BUILD_ROOT%{goroot}/doc/Makefile
# put binaries to bindir # put binaries to bindir, linked to the arch we're building,
pushd $RPM_BUILD_ROOT%{_bindir} # leave the arch independent pieces in %{goroot}
for z in $RPM_BUILD_ROOT%{_libdir}/%{name}/bin/* mkdir -p $RPM_BUILD_ROOT%{goroot}/bin/linux_%{gohostarch}
do mv $RPM_BUILD_ROOT%{_libdir}/%{name}/bin/$(basename $z) . mv $RPM_BUILD_ROOT%{goroot}/bin/go $RPM_BUILD_ROOT%{goroot}/bin/linux_%{gohostarch}/go
done mv $RPM_BUILD_ROOT%{goroot}/bin/gofmt $RPM_BUILD_ROOT%{goroot}/bin/linux_%{gohostarch}/gofmt
# remove the go and gofmt for other platforms (not used in the compile)
pushd $RPM_BUILD_ROOT%{goroot}/bin/
rm -rf darwin_* windows_* freebsd_* netbsd_* openbsd_* plan9_*
case "%{gohostarch}" in
amd64)
rm -rf linux_386 linux_arm ;;
386)
rm -rf linux_arm linux_amd64 ;;
arm)
rm -rf linux_386 linux_amd64 ;;
esac
popd popd
touch $RPM_BUILD_ROOT%{_bindir}/go
touch $RPM_BUILD_ROOT%{_bindir}/gofmt
# misc/bash # misc/bash
mkdir -p $RPM_BUILD_ROOT%{_datadir}/bash-completion/completions mkdir -p $RPM_BUILD_ROOT%{_datadir}/bash-completion/completions
cp -av misc/bash/go $RPM_BUILD_ROOT%{_datadir}/bash-completion/completions cp -av misc/bash/go $RPM_BUILD_ROOT%{_datadir}/bash-completion/completions
@ -277,19 +509,63 @@ mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/prelink.conf.d
cp -av %{SOURCE101} $RPM_BUILD_ROOT%{_sysconfdir}/prelink.conf.d/golang.conf cp -av %{SOURCE101} $RPM_BUILD_ROOT%{_sysconfdir}/prelink.conf.d/golang.conf
# rpm macros # rpm macros
mkdir -p %{buildroot}
%if 0%{?rhel} > 6 || 0%{?fedora} > 0
mkdir -p $RPM_BUILD_ROOT%{_rpmconfigdir}/macros.d
cp -av %{SOURCE102} $RPM_BUILD_ROOT%{_rpmconfigdir}/macros.d/macros.golang
%else
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/rpm mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/rpm
cp -av %{SOURCE102} $RPM_BUILD_ROOT%{_sysconfdir}/rpm/macros.golang cp -av %{SOURCE102} $RPM_BUILD_ROOT%{_sysconfdir}/rpm/macros.golang
%endif
%ifarch %{ix86}
%post pkg-bin-linux-386
%{_sbindir}/update-alternatives --install %{_bindir}/go \
go %{goroot}/bin/linux_386/go 90 \
--slave %{_bindir}/gofmt gofmt %{goroot}/bin/linux_386/gofmt
%preun pkg-bin-linux-386
if [ $1 = 0 ]; then
%{_sbindir}/update-alternatives --remove go %{goroot}/bin/linux_386/go
fi
%endif
%ifarch x86_64
%post pkg-bin-linux-amd64
%{_sbindir}/update-alternatives --install %{_bindir}/go \
go %{goroot}/bin/linux_amd64/go 90 \
--slave %{_bindir}/gofmt gofmt %{goroot}/bin/linux_amd64/gofmt
%preun pkg-bin-linux-amd64
if [ $1 = 0 ]; then
%{_sbindir}/update-alternatives --remove go %{goroot}/bin/linux_amd64/go
fi
%endif
%ifarch %{arm}
%post pkg-bin-linux-arm
%{_sbindir}/update-alternatives --install %{_bindir}/go \
go %{goroot}/bin/linux_arm/go 90 \
--slave %{_bindir}/gofmt gofmt %{goroot}/bin/linux_arm/gofmt
%preun pkg-bin-linux-arm
if [ $1 = 0 ]; then
%{_sbindir}/update-alternatives --remove go %{goroot}/bin/linux_arm/go
fi
%endif
%files %files
%doc AUTHORS CONTRIBUTORS LICENSE PATENTS VERSION %doc AUTHORS CONTRIBUTORS LICENSE PATENTS VERSION
# go files # go files
%{_libdir}/%{name} %{goroot}
%exclude %{goroot}/bin/
%exclude %{goroot}/pkg/
%exclude %{goroot}/src/
# binary executables # this directory is part of the core library tool
%{_bindir}/go %{goroot}/pkg/obj/linux_%{gohostarch}/
%{_bindir}/gofmt
# autocomplete # autocomplete
%{_datadir}/bash-completion %{_datadir}/bash-completion
@ -301,7 +577,11 @@ cp -av %{SOURCE102} $RPM_BUILD_ROOT%{_sysconfdir}/rpm/macros.golang
# prelink blacklist # prelink blacklist
%{_sysconfdir}/prelink.conf.d %{_sysconfdir}/prelink.conf.d
%if 0%{?rhel} > 6 || 0%{?fedora} > 0
%{_rpmconfigdir}/macros.d/macros.golang
%else
%{_sysconfdir}/rpm/macros.golang %{_sysconfdir}/rpm/macros.golang
%endif
%files vim %files vim
@ -323,8 +603,113 @@ cp -av %{SOURCE102} $RPM_BUILD_ROOT%{_sysconfdir}/rpm/macros.golang
%{_xemacs_sitestartdir}/*.el %{_xemacs_sitestartdir}/*.el
%endif %endif
%files src
%{goroot}/src/
%ifarch %{ix86}
%files pkg-bin-linux-386
%{goroot}/bin/linux_386/
# binary executables
%ghost %{_bindir}/go
%ghost %{_bindir}/gofmt
%endif
%ifarch x86_64
%files pkg-bin-linux-amd64
%{goroot}/bin/linux_amd64/
# binary executables
%ghost %{_bindir}/go
%ghost %{_bindir}/gofmt
%endif
%ifarch %{arm}
%files pkg-bin-linux-arm
%{goroot}/bin/linux_arm/
# binary executables
%ghost %{_bindir}/go
%ghost %{_bindir}/gofmt
%endif
%files pkg-linux-386
%{goroot}/pkg/linux_386/
%{goroot}/pkg/tool/linux_386/
%files pkg-linux-amd64
%{goroot}/pkg/linux_amd64/
%{goroot}/pkg/tool/linux_amd64/
%files pkg-linux-arm
%{goroot}/pkg/linux_arm/
%{goroot}/pkg/tool/linux_arm/
%files pkg-darwin-386
%{goroot}/pkg/darwin_386/
%{goroot}/pkg/tool/darwin_386/
%files pkg-darwin-amd64
%{goroot}/pkg/darwin_amd64/
%{goroot}/pkg/tool/darwin_amd64/
%files pkg-windows-386
%{goroot}/pkg/windows_386/
%{goroot}/pkg/tool/windows_386/
%files pkg-windows-amd64
%{goroot}/pkg/windows_amd64/
%{goroot}/pkg/tool/windows_amd64/
%files pkg-plan9-386
%{goroot}/pkg/plan9_386/
%{goroot}/pkg/tool/plan9_386/
%files pkg-plan9-amd64
%{goroot}/pkg/plan9_amd64/
%{goroot}/pkg/tool/plan9_amd64/
%files pkg-freebsd-386
%{goroot}/pkg/freebsd_386/
%{goroot}/pkg/tool/freebsd_386/
%files pkg-freebsd-amd64
%{goroot}/pkg/freebsd_amd64/
%{goroot}/pkg/tool/freebsd_amd64/
%files pkg-freebsd-arm
%{goroot}/pkg/freebsd_arm/
%{goroot}/pkg/tool/freebsd_arm/
%files pkg-netbsd-386
%{goroot}/pkg/netbsd_386/
%{goroot}/pkg/tool/netbsd_386/
%files pkg-netbsd-amd64
%{goroot}/pkg/netbsd_amd64/
%{goroot}/pkg/tool/netbsd_amd64/
%files pkg-netbsd-arm
%{goroot}/pkg/netbsd_arm/
%{goroot}/pkg/tool/netbsd_arm/
%files pkg-openbsd-386
%{goroot}/pkg/openbsd_386/
%{goroot}/pkg/tool/openbsd_386/
%files pkg-openbsd-amd64
%{goroot}/pkg/openbsd_amd64/
%{goroot}/pkg/tool/openbsd_amd64/
## skipping for now
#%files pkg-openbsd-arm
#%{goroot}/pkg/openbsd_arm/
#%{goroot}/pkg/tool/openbsd_arm/
%changelog %changelog
* Wed Apr 09 2014 Vincent Batts <vbatts@fedoraproject.org> 1.2.1-3
- including more to macros (%%go_arches)
- set a standard goroot as /usr/lib/golang, regardless of arch
- include sub-packages for compiler toolchains, for all golang supported architectures
* Wed Mar 26 2014 Vincent Batts <vbatts@fedoraproject.org> 1.2.1-2 * Wed Mar 26 2014 Vincent Batts <vbatts@fedoraproject.org> 1.2.1-2
- provide a system rpm macros. Starting with %gopath - provide a system rpm macros. Starting with %gopath

View File

@ -1 +1,8 @@
# Where to set GOPATH for builds. Like:
# export GOPATH=$(pwd)/_build:%{gopath}
%gopath %{_datadir}/gocode %gopath %{_datadir}/gocode
# for use like:
# ExclusiveArch: %{go_arches}
%go_arches %{ix86} x86_64 %{arm}