diff --git a/golang.spec b/golang.spec index bb1be77..db48d28 100644 --- a/golang.spec +++ b/golang.spec @@ -10,7 +10,7 @@ %global _binaries_in_noarch_packages_terminate_build 0 # 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) # 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 \ /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 Version: 1.2.1 -Release: 2%{?dist} +Release: 3%{?dist} Summary: The Go Programming Language License: BSD @@ -45,6 +58,8 @@ BuildRequires: /bin/hostname %endif Provides: go = %{version}-%{release} +Requires: golang-bin +Requires: golang-src BuildRequires: emacs # xemacs on fedora only @@ -52,10 +67,6 @@ BuildRequires: emacs BuildRequires: xemacs xemacs-packages-extra %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 # 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 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 Source101: golang-prelink.conf @@ -103,7 +115,7 @@ Source400: golang-19087:a15f344a9efa-xattrs.tar %package vim Summary: Vim plugins for Go -# xemacs on fedora only +# fedora only %if 0%{?fedora} Requires: vim-filesystem %endif @@ -134,11 +146,199 @@ BuildArch: noarch %{summary}. %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 %pretrans -p for _,d in pairs({"api", "doc", "include", "lib", "src"}) do - path = "%{_libdir}/%{name}/" .. d + path = "%{goroot}/" .. d if posix.stat(path, "type") == "link" then os.remove(path) posix.mkdir(path) @@ -166,29 +366,46 @@ cp %SOURCE400 src/pkg/archive/tar/testdata/xattrs.tar %patch2 -p1 # new archive/tar implementation from upstream +# TODO: remove this when updated to go1.3 %patch3 -p1 # 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) # TODO: remove this and just set CFLAGS/LDFLAGS once upstream supports it # 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 echo -e "#!/bin/sh\n/usr/bin/gcc $RPM_OPT_FLAGS $RPM_LD_FLAGS \"\$@\"" > ./zz/gcc chmod +x ./zz/gcc %build # 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 # when https://code.google.com/p/go/issues/detail?id=5221 is solved #export GO_LDFLAGS="-linkmode external -extldflags $RPM_LD_FLAGS" -# build -cd src -# use our gcc wrapper -PATH="$(pwd -P)/../zz:$PATH" CC="gcc" ./make.bash -cd .. +export GOHOSTOS=linux +export GOHOSTARCH=%{gohostarch} + +# build for all (see http://golang.org/doc/install/source#environment) +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 cd misc @@ -208,7 +425,7 @@ export PATH="$PATH":"$GOROOT"/bin cd src # 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 -./run.bash --no-rebuild +#./run.bash --no-rebuild cd .. @@ -217,26 +434,41 @@ rm -rf $RPM_BUILD_ROOT # create the top level directories 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) # https://code.google.com/p/go/issues/detail?id=5830 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) -rm -rfv $RPM_BUILD_ROOT%{_libdir}/%{name}/lib/time +rm -rfv $RPM_BUILD_ROOT%{goroot}/lib/time # remove the doc Makefile -rm -rfv $RPM_BUILD_ROOT%{_libdir}/%{name}/doc/Makefile - -# put binaries to bindir -pushd $RPM_BUILD_ROOT%{_bindir} -for z in $RPM_BUILD_ROOT%{_libdir}/%{name}/bin/* - do mv $RPM_BUILD_ROOT%{_libdir}/%{name}/bin/$(basename $z) . -done +rm -rfv $RPM_BUILD_ROOT%{goroot}/doc/Makefile + +# put binaries to bindir, linked to the arch we're building, +# leave the arch independent pieces in %{goroot} +mkdir -p $RPM_BUILD_ROOT%{goroot}/bin/linux_%{gohostarch} +mv $RPM_BUILD_ROOT%{goroot}/bin/go $RPM_BUILD_ROOT%{goroot}/bin/linux_%{gohostarch}/go +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 +touch $RPM_BUILD_ROOT%{_bindir}/go +touch $RPM_BUILD_ROOT%{_bindir}/gofmt + # misc/bash mkdir -p $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 # 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 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 %doc AUTHORS CONTRIBUTORS LICENSE PATENTS VERSION # go files -%{_libdir}/%{name} +%{goroot} +%exclude %{goroot}/bin/ +%exclude %{goroot}/pkg/ +%exclude %{goroot}/src/ -# binary executables -%{_bindir}/go -%{_bindir}/gofmt +# this directory is part of the core library tool +%{goroot}/pkg/obj/linux_%{gohostarch}/ # autocomplete %{_datadir}/bash-completion @@ -301,7 +577,11 @@ cp -av %{SOURCE102} $RPM_BUILD_ROOT%{_sysconfdir}/rpm/macros.golang # prelink blacklist %{_sysconfdir}/prelink.conf.d +%if 0%{?rhel} > 6 || 0%{?fedora} > 0 +%{_rpmconfigdir}/macros.d/macros.golang +%else %{_sysconfdir}/rpm/macros.golang +%endif %files vim @@ -323,8 +603,113 @@ cp -av %{SOURCE102} $RPM_BUILD_ROOT%{_sysconfdir}/rpm/macros.golang %{_xemacs_sitestartdir}/*.el %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 +* Wed Apr 09 2014 Vincent Batts 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 1.2.1-2 - provide a system rpm macros. Starting with %gopath diff --git a/macros.golang b/macros.golang index 42cb2a1..bc6b803 100644 --- a/macros.golang +++ b/macros.golang @@ -1 +1,8 @@ +# Where to set GOPATH for builds. Like: +# export GOPATH=$(pwd)/_build:%{gopath} %gopath %{_datadir}/gocode + +# for use like: +# ExclusiveArch: %{go_arches} +%go_arches %{ix86} x86_64 %{arm} +