summaryrefslogtreecommitdiff
path: root/debian/rules
diff options
context:
space:
mode:
Diffstat (limited to 'debian/rules')
-rwxr-xr-xdebian/rules211
1 files changed, 211 insertions, 0 deletions
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 000000000..b2545c220
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,211 @@
+#!/usr/bin/make -f
+# This file is in the public domain.
+# You may freely use, modify, distribute, and relicense it.
+
+PACKAGE = golang
+
+libexecdir := /usr/lib/go
+datadir := /usr/share/go
+bindir := /bin
+
+# We loop over supported operating systems and architectures multiple times,
+# so these two variables contain a centralized version of that code.
+# The variables $$os and $$arch can be used inside such a loop.
+FOR_GO_ARCH := for os in $$(echo linux freebsd windows darwin netbsd); do \
+ archs="amd64 386"; \
+ [ "$$os" = "linux" ] || [ "$$os" = "freebsd" ] && archs="amd64 arm 386"; \
+ for arch in $$(echo $$archs); do
+FOR_GO_ARCH_END := done; done
+
+build-arch build-indep build clean install binary-arch binary-indep binary: debian/control
+ +dh --parallel $(opt_no_act) $@
+
+override_dh_auto_clean:
+ rm -rf bin pkg
+ # golang-go-$os-$arch.install files are auto-generated in override_dh_install
+ rm -f debian/golang-go-*.install
+ rm -f debian/*+
+ rm -f debian/build.stamp
+ rm -f test/pass.out test/run.out test/times.out
+ rm -rf debian/home
+
+override_dh_auto_build: debian/build.stamp
+
+override_dh_auto_test:
+ifeq ($(RUN_TEST), true)
+ cd $(CURDIR)/src && \
+ $(CURDIR)/debian/test.bash $(GOROOT)/pkg/tool/$(GOHOSTOS)_$(GOHOSTARCH);
+else
+ :
+endif
+
+override_dh_compress:
+ dh_compress -Xusr/share/doc/$(PACKAGE)-doc/html -Xusr/share/doc/$(PACKAGE)-doc/godoc
+
+# Generates debian/control from debian/control.base and debian/control.cross.
+# In the latter, @OS@ and @ARCH@ are replaced with every supported combination
+# of operating system and architecture (e.g. linux_amd64, linux_386, …).
+gencontrol:
+ echo "# DO NOT EDIT THIS FILE. EDIT debian/control.* instead!" > debian/control.tmp
+ cat debian/control.base >> debian/control.tmp
+ ${FOR_GO_ARCH} \
+ BUILDARCHS=all; \
+ [ "$$os" = "linux" ] && BUILDARCHS="i386 amd64 armel armhf"; \
+ sed -e "s,@OS@,$$os,g; s,@ARCH@,$$arch,g; s,@BUILDARCHS@,$$BUILDARCHS,g" debian/control.cross >> debian/control.tmp; \
+ ${FOR_GO_ARCH_END}
+ mv debian/control.tmp debian/control
+
+override_dh_install:
+ -${FOR_GO_ARCH} \
+ echo "pkg/$${os}_$${arch} /usr/lib/go/pkg/" > debian/golang-go-$$os-$$arch.install; \
+ [ "$$arch" = "amd64" ] && [ "$$os" = "linux" ] && echo "pkg/linux_amd64_race /usr/lib/go/pkg" >> debian/golang-go-$$os-$$arch.install; \
+ echo "golang-go-$$os-$$arch: arch-independent-package-contains-binary-or-object" > debian/golang-go-$$os-$$arch.lintian-overrides; \
+ ${FOR_GO_ARCH_END}
+ # Install the native runtime/cgo.a to the golang-go package.
+ # runtime/cgo is only built for the native architecture, but the
+ # golang-go-OS-ARCH packages are built on one particular buildd, which
+ # might either be i386 or amd64.
+ echo "listing of $$(pwd):"; ls -hlR .
+ echo "listing of GOBIN: ($(GOBIN))"; ls -hlR $(GOBIN)
+ for file in $$(cd pkg/ && ls */runtime/cgo.a); do \
+ mkdir -p $(CURDIR)/debian/golang-go/usr/lib/go/pkg/$$(dirname $$file); \
+ mv pkg/$$file $(CURDIR)/debian/golang-go/usr/lib/go/pkg/$$file; \
+ done
+ dh_install --fail-missing
+ # Remove .syso files of the race detector; it is not used yet and the files are arch-dependent.
+ find $(CURDIR)/debian/golang-src/usr/share/go/src/runtime/race -type f -name '*.syso' -delete
+ # Remove Plan9 rc(1) scripts
+ find $(CURDIR)/debian/golang-src/usr/share/go/src -type f -name "*.rc" -delete
+ # Remove empty /usr/share/go/src from golang-go, it is provided by golang-src
+ find $(CURDIR)/debian/golang-go/usr/share/go/src -type d -delete
+ # Subsequently, /usr/share/go is empty, too, so remove
+ find $(CURDIR)/debian/golang-go/usr/share/go -type d -delete
+ # For some reason, Go cross-compiles a handful of tools: {yacc,fix,api,vet,cgo}.
+ # Delete those, as they cannot be ran anyway.
+ # This is tracked upstream at https://code.google.com/p/go/issues/detail?id=5667
+ (cd $(CURDIR)/debian/golang-go/usr/lib/go/pkg/tool && find . -depth -path "./$(GOHOSTOS)_$(GOHOSTARCH)*" -prune -o -delete)
+ # Touch built and installed files and directories to have same timestamp
+ touch $(CURDIR)/debian/golang-go/usr/lib/go/pkg
+ find $(CURDIR)/debian/golang-go/usr/lib/go/pkg -exec touch -r $(CURDIR)/debian/golang-go/usr/lib/go/pkg {} \;
+
+override_dh_strip:
+ # strip disabled as golang upstream doesn't support it and it makes go
+ # crash. See http://bugs.debian.org/717172
+
+override_dh_prep:
+ dh_prep
+ echo 'go:Hostarch=$(GOHOSTARCH)' >> debian/golang-go.substvars
+
+override_dh_builddeb:
+ dh_builddeb -- -Zxz
+
+override_dh_shlibdeps:
+ dh_shlibdeps -Xtestdata -Xtest
+
+debian/build.stamp:
+ rm -f debian/build.stamp
+ mkdir -p $(GOBIN)
+ # Build native tools first, then bootstrap all other GOOS/GOARCH combinations.
+ cd src && bash ./make.bash --no-banner
+ # For the race detector to work (go test -race), we need to install the
+ # std library with the race detector enabled. This will result in
+ # having an additional “architecture” directory, e.g. linux_amd64_race.
+ #
+ # The race detector currently only works on linux/amd64. The check within
+ # the following loop works precisely the same way src/race.bash does.
+ -${FOR_GO_ARCH} \
+ export GOARCH=$$arch; \
+ export GOOS=$$os; \
+ cd src && bash ./make.bash --no-clean; \
+ [ "$$arch" = "amd64" ] && [ "$$os" = "linux" ] && $(GOBIN)/go install -race std; \
+ cd ..; \
+ ${FOR_GO_ARCH_END}
+ >debian/build.stamp
+
+opt_no_act =
+RUN_TEST := true
+
+ifneq (,$(filter noopt,$(DEB_BUILD_OPTIONS)))
+ $(warning no support for disabling optimization)
+endif
+
+ifneq (,$(findstring n,$(MAKEFLAGS)))
+ opt_no_act = --no-act
+endif
+
+ifneq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
+ RUN_TEST := false
+endif
+
+GOROOT := $(CURDIR)
+GOROOT_FINAL := $(libexecdir)
+GOBIN := $(CURDIR)$(bindir)
+GOARM :=
+
+# Always use the 387 floating point unit instead of sse2. This is important to
+# ensure that the binaries we build (both when compiling golang on the buildds
+# and when users cross-compile for 386) can actually run on older CPUs (where
+# old means e.g. an AMD Athlon XP 2400+). See http://bugs.debian.org/753160 and
+# https://code.google.com/p/go/issues/detail?id=8152
+GO386 := 387
+
+DEB_HOST_ARCH := $(shell dpkg-architecture -qDEB_HOST_ARCH 2>/dev/null)
+DEB_HOST_ARCH_OS := $(shell dpkg-architecture -qDEB_HOST_ARCH_OS 2>/dev/null)
+DEB_HOST_ARCH_CPU := $(shell dpkg-architecture -qDEB_HOST_ARCH_CPU 2>/dev/null)
+DEB_BUILD_ARCH_OS := $(shell dpkg-architecture -qDEB_BUILD_ARCH_OS 2>/dev/null)
+DEB_BUILD_ARCH_CPU := $(shell dpkg-architecture -qDEB_BUILD_ARCH_CPU 2>/dev/null)
+
+ifeq ($(DEB_BUILD_ARCH_OS), kfreebsd)
+ RUN_TEST := false
+ GOHOSTOS := freebsd
+else ifeq ($(DEB_BUILD_ARCH_OS), linux)
+ GOHOSTOS := linux
+else
+ $(error unrecongized build host kernel $(DEB_BUILD_ARCH_OS)!)
+endif
+
+ifeq ($(DEB_HOST_ARCH_OS), kfreebsd)
+ RUN_TEST := false
+ GOOS := freebsd
+else ifeq ($(DEB_HOST_ARCH_OS), linux)
+ GOOS := linux
+else
+ $(error unrecognized kernel $(DEB_HOST_ARCH_OS)!)
+endif
+
+ifeq ($(DEB_BUILD_ARCH_CPU), i386)
+ GOHOSTARCH := 386
+else ifeq ($(DEB_BUILD_ARCH_CPU), amd64)
+ GOHOSTARCH := amd64
+else ifeq ($(DEB_BUILD_ARCH_CPU), arm)
+ GOHOSTARCH := arm
+else ifeq ($(DEB_BUILD_ARCH_CPU), armhf)
+ GOHOSTARCH := arm
+else
+ $(error unrecognized build host instruction set $(DEB_HOST_ARCH_CPU)!)
+endif
+
+ifeq ($(DEB_HOST_ARCH_CPU), i386)
+ GOARCH := 386
+ GOPREFIX := 8
+else ifeq ($(DEB_HOST_ARCH_CPU), amd64)
+ GOARCH := amd64
+ GOPREFIX := 6
+else ifeq ($(DEB_HOST_ARCH_CPU), arm)
+ GOARCH := arm
+ GOPREFIX := 5
+ifeq ($(DEB_HOST_ARCH), armel)
+ RUN_TEST := false
+ GOARM := 5
+else ifeq ($(DEB_HOST_ARCH), armhf)
+ GOARM := 6
+else
+ $(error unrecognized arm architecture $(DEB_HOST_ARCH)!)
+endif
+else
+ $(error unrecognized instruction set $(DEB_HOST_ARCH_CPU)!)
+endif
+
+export GOROOT GOROOT_FINAL GOOS GOARCH GOARM GOBIN GOHOSTARCH GOHOSTOS GO386
+
+.PHONY: build clean install binary-arch binary-indep binary