On 08/03/2017 12:06 AM, John Paul Adrian Glaubitz wrote: > Attaching an updated patch which has been tested to not break native builds.
Here's an updated patch for 8.0.2-9. The patch still has the drawback that haskell-devscripts-minimal has to be installed manually because it always tries to pull in the host version of GHC which, of course, doesn't work when that is the version of GHC that one is actually trying to bootstrap. I tried fixing that by changing the dependency of haskell-devscripts-minimal from "ghc" to "ghc:native". Unfortunately, dpkg doesn't seem to support ":native" in dependencies but only in build dependencies. Adrian -- .''`. John Paul Adrian Glaubitz : :' : Debian Developer - glaub...@debian.org `. `' Freie Universitaet Berlin - glaub...@physik.fu-berlin.de `- GPG: 62FF 8A75 84E0 2956 9546 0006 7426 3B37 F5B5 F913
diff -Nru ghc-8.0.2/debian/control ghc-8.0.2/debian/control --- ghc-8.0.2/debian/control 2017-08-26 19:04:25.000000000 +0200 +++ ghc-8.0.2/debian/control 2017-08-27 01:45:53.000000000 +0200 @@ -6,17 +6,17 @@ Standards-Version: 3.9.8 Build-Depends: debhelper (>= 10), - haskell-devscripts-minimal, + haskell-devscripts-minimal <!cross>, devscripts, grep-dctrl, pkg-config, - ghc (>= 7.8), + ghc:native (>= 7.8), libgmp-dev, llvm-3.7 [arm64 armel armhf], libffi-dev, binutils [arm64 armel armhf], libncurses5-dev, - python-sphinx, + python-sphinx <!cross>, dpkg-dev (>= 1.16.1.1) Build-Depends-Indep: hscolour, diff -Nru ghc-8.0.2/debian/patches/avoid-CrossCompilerPrefix-stage2.patch ghc-8.0.2/debian/patches/avoid-CrossCompilerPrefix-stage2.patch --- ghc-8.0.2/debian/patches/avoid-CrossCompilerPrefix-stage2.patch 1970-01-01 01:00:00.000000000 +0100 +++ ghc-8.0.2/debian/patches/avoid-CrossCompilerPrefix-stage2.patch 2017-08-27 01:45:53.000000000 +0200 @@ -0,0 +1,31 @@ +Description: Don't use cross-compile prefix for stage2 cross-builds +Origin: http://git.haskell.org/ghc.git/commitdiff/f2685df3b10e13f142736f28835e9064334bc143 +Note: Can be dropped for 8.2.0 +Last-Update: 2017-08-02 + +--- ghc-8.0.2.orig/mk/config.mk.in ++++ ghc-8.0.2/mk/config.mk.in +@@ -518,11 +518,6 @@ SUPPORTS_THIS_UNIT_ID = @SUPPORTS_THIS_U + + WhatGccIsCalled = @WhatGccIsCalled@ + GccVersion = @GccVersion@ +-ifeq "$(phase)" "0" +-CrossCompilePrefix = +-else +-CrossCompilePrefix = @CrossCompilePrefix@ +-endif + # TargetPlatformFull retains the string passed to configure so we have it in + # the necessary format to pass to libffi's configure. + TargetPlatformFull = @TargetPlatformFull@ +@@ -557,6 +552,11 @@ CrossCompiling = @CrossCompiling@ + # See Note [Stage1Only vs stage=1] + Stage1Only = NO + ++# Installed tools prefix: ++# we add prefix to crosscompiler GHC only (ghc-stage1), ++# not cross-built GHC (not ghc-stage2). ++CrossCompilePrefix = $(if $(filter YES,$(Stage1Only)),@CrossCompilePrefix@,) ++ + # Install stage 2 by default, or stage 1 in the cross compiler + # case. Can be changed to 3 + INSTALL_GHC_STAGE= $(if $(filter YES,$(Stage1Only)),1,2) diff -Nru ghc-8.0.2/debian/patches/build-unlit-and-hp2ps-twice.patch ghc-8.0.2/debian/patches/build-unlit-and-hp2ps-twice.patch --- ghc-8.0.2/debian/patches/build-unlit-and-hp2ps-twice.patch 1970-01-01 01:00:00.000000000 +0100 +++ ghc-8.0.2/debian/patches/build-unlit-and-hp2ps-twice.patch 2017-08-27 01:45:53.000000000 +0200 @@ -0,0 +1,80 @@ +Description: Build unlit and hp2ps twice +Author: Thomas Miedema <thomasmied...@gmail.com> + John Paul Adrian Glaubitz <glaub...@physik.fu-berlin.de> + +Index: ghc-8.0.1/utils/ghc-pkg/ghc.mk +=================================================================== +--- ghc-8.0.1.orig/utils/ghc-pkg/ghc.mk ++++ ghc-8.0.1/utils/ghc-pkg/ghc.mk +@@ -27,7 +27,7 @@ utils/ghc-pkg_PACKAGE = ghc-pkg + # Note [Why build certain utils twice?] + # + # We build certain utils twice: once with stage0, and once with stage1. +-# Examples are ghc-pkg and hsc2hs. ++# Examples are ghc-pkg, hsc2hs, hp2ps and unlit. + # + # These tools are needed during the bootstrapping process, so we have to use + # stage0 to build them at first (stage1 doesn't exist yet). (side note: they're +@@ -38,6 +38,11 @@ utils/ghc-pkg_PACKAGE = ghc-pkg + # dynamically linked. But the stage0 copies are either statically linked, or + # linked against libraries on the build machine. + # ++# Another reason why we can't install the stage0 copies is that they are ++# built to run on the build(=host) platform, but when installing a ++# "cross-compiled stage2 compiler" we need copies that run on the target ++# platform. ++# + # Therefore we build fresh copies, using the stage1 compiler, and install them + # when you run 'make install'. They are not used for any other purpose. + +Index: ghc-8.0.1/utils/hp2ps/ghc.mk +=================================================================== +--- ghc-8.0.1.orig/utils/hp2ps/ghc.mk ++++ ghc-8.0.1/utils/hp2ps/ghc.mk +@@ -17,10 +17,23 @@ utils/hp2ps_dist_C_SRCS = AreaB + Utilities.c + utils/hp2ps_dist_EXTRA_LIBRARIES = m + utils/hp2ps_dist_PROGNAME = $(CrossCompilePrefix)hp2ps +-utils/hp2ps_dist_INSTALL = YES ++utils/hp2ps_dist_INSTALL = NO + utils/hp2ps_dist_INSTALL_INPLACE = YES + + utils/hp2ps_CC_OPTS += $(addprefix -I,$(GHC_INCLUDE_DIRS)) + + $(eval $(call build-prog,utils/hp2ps,dist,0)) + ++utils/hp2ps_dist-install_C_SRCS = AreaBelow.c Curves.c Error.c Main.c \ ++ Reorder.c TopTwenty.c AuxFile.c Deviation.c \ ++ HpFile.c Marks.c Scale.c TraceElement.c \ ++ Axes.c Dimensions.c Key.c PsFile.c Shade.c \ ++ Utilities.c ++utils/hp2ps_dist-install_EXTRA_LIBRARIES = m ++utils/hp2ps_dist-install_PROGNAME = hp2ps ++utils/hp2ps_dist-install_TOPDIR = YES ++utils/hp2ps_dist-install_INSTALL = YES ++utils/hp2ps_dist-install_INSTALL_INPLACE = NO ++ ++# See Note [Why build certain utils twice?]. ++$(eval $(call build-prog,utils/hp2ps,dist-install,1)) +Index: ghc-8.0.1/utils/unlit/ghc.mk +=================================================================== +--- ghc-8.0.1.orig/utils/unlit/ghc.mk ++++ ghc-8.0.1/utils/unlit/ghc.mk +@@ -13,8 +13,16 @@ + utils/unlit_dist_C_SRCS = unlit.c + utils/unlit_dist_PROGNAME = unlit + utils/unlit_dist_TOPDIR = YES +-utils/unlit_dist_INSTALL = YES ++utils/unlit_dist_INSTALL = NO + utils/unlit_dist_INSTALL_INPLACE = YES + + $(eval $(call build-prog,utils/unlit,dist,0)) + ++utils/unlit_dist-install_C_SRCS = unlit.c ++utils/unlit_dist-install_PROGNAME = unlit ++utils/unlit_dist-install_TOPDIR = YES ++utils/unlit_dist-install_INSTALL = YES ++utils/unlit_dist-install_INSTALL_INPLACE = NO ++ ++# See Note [Why build certain utils twice?]. ++$(eval $(call build-prog,utils/unlit,dist-install,1)) diff -Nru ghc-8.0.2/debian/patches/series ghc-8.0.2/debian/patches/series --- ghc-8.0.2/debian/patches/series 2017-08-26 19:04:25.000000000 +0200 +++ ghc-8.0.2/debian/patches/series 2017-08-27 01:45:53.000000000 +0200 @@ -8,3 +8,6 @@ compiler-cmm-PprC-sparc-alignment.patch x32-use-native-x86_64-insn.patch osdecommitmemory-compat.patch +use-stage1-binaries-for-install.patch +build-unlit-and-hp2ps-twice.patch +avoid-CrossCompilerPrefix-stage2.patch diff -Nru ghc-8.0.2/debian/patches/use-stage1-binaries-for-install.patch ghc-8.0.2/debian/patches/use-stage1-binaries-for-install.patch --- ghc-8.0.2/debian/patches/use-stage1-binaries-for-install.patch 1970-01-01 01:00:00.000000000 +0100 +++ ghc-8.0.2/debian/patches/use-stage1-binaries-for-install.patch 2017-08-27 01:45:53.000000000 +0200 @@ -0,0 +1,26 @@ +Description: Use the stage1 binaries for install + In order to be able to perform a cross-build, we need to use + the stage1 binaries during installation. Both ghc and ghc-pkg + are run during the install target and therefore must be able + to run on the build machine. + . +Author: John Paul Adrian Glaubitz <glaub...@physik.fu-berlin.de> +Last-Update: 2017-01-29 + +--- ghc-8.0.1.orig/ghc.mk ++++ ghc-8.0.1/ghc.mk +@@ -958,8 +958,12 @@ INSTALLED_PACKAGE_CONF=$(DESTDIR)$(topdi + # Install packages in the right order, so that ghc-pkg doesn't complain. + # Also, install ghc-pkg first. + ifeq "$(Windows_Host)" "NO" +-INSTALLED_GHC_REAL=$(DESTDIR)$(ghclibexecdir)/bin/ghc +-INSTALLED_GHC_PKG_REAL=$(DESTDIR)$(ghclibexecdir)/bin/ghc-pkg ++# Use the inplace/stage1 versions for installation, ++# since the installed versions are built for the target ++#INSTALLED_GHC_REAL=$(DESTDIR)$(ghclibexecdir)/bin/ghc ++#INSTALLED_GHC_PKG_REAL=$(DESTDIR)$(ghclibexecdir)/bin/ghc-pkg ++INSTALLED_GHC_REAL=$(CURDIR)/inplace/bin/ghc-stage1 ++INSTALLED_GHC_PKG_REAL=$(CURDIR)/utils/ghc-pkg/dist/build/tmp/ghc-pkg + else + INSTALLED_GHC_REAL=$(DESTDIR)$(bindir)/ghc.exe + INSTALLED_GHC_PKG_REAL=$(DESTDIR)$(bindir)/ghc-pkg.exe diff -Nru ghc-8.0.2/debian/rules ghc-8.0.2/debian/rules --- ghc-8.0.2/debian/rules 2017-08-26 19:04:25.000000000 +0200 +++ ghc-8.0.2/debian/rules 2017-08-27 01:45:53.000000000 +0200 @@ -22,20 +22,20 @@ export DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) export DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) export DEB_HOST_ARCH ?= $(shell dpkg-architecture -qDEB_HOST_ARCH) -# Commented out for now. The build scripts don't recognise i486 as an -# architecture and cross compiling isn't supported anyway. -#ifeq ($(DEB_BUILD_GNU_TYPE), $(DEB_HOST_GNU_TYPE)) -# confflags += --build $(DEB_HOST_GNU_TYPE) -#else -# confflags += --build $(DEB_BUILD_GNU_TYPE) --host $(DEB_HOST_GNU_TYPE) -#endif + +# We're cross-building if DEB_BUILD_GNU_TYPE != DEB_HOST_GNU_TYPE +ifneq ($(DEB_BUILD_GNU_TYPE), $(DEB_HOST_GNU_TYPE)) + confflags += --target $(DEB_HOST_GNU_TYPE) --enable-unregisterised + BUILD_CROSS=YES +else + BUILD_CROSS=NO +endif ProjectVersion=$(shell cat VERSION) GHC=$(firstword $(shell bash -c "type -p ghc")) EXTRA_CONFIGURE_FLAGS=--with-ghc="$(GHC)" -BUILD_HADDOCK_DOCS=YES DEB_HOOGLE_TXT_DIR = /usr/lib/ghc-doc/hoogle/ ifneq (,$(filter powerpcspe x32, $(DEB_HOST_ARCH))) @@ -53,9 +53,20 @@ override_dh_auto_configure: echo "SRC_HC_OPTS += -lffi -optl-pthread" >> mk/build.mk +ifeq (NO,$(BUILD_CROSS)) echo "HADDOCK_DOCS := YES" >> mk/build.mk echo "EXTRA_HADDOCK_OPTS += --mathjax=file:///usr/share/javascript/mathjax/MathJax.js" >> mk/build.mk echo "XSLTPROC_OPTS += --nonet" >> mk/build.mk +else + echo "SRC_HC_OPTS += -O0 -H64m" >> mk/build.mk + echo "GhcStage1HcOpts = -O" >> mk/build.mk + echo "GhcStage2HcOpts = -O0" >> mk/build.mk + echo "GhcLibHcOpts = -O" >> mk/build.mk + echo "SplitObjs = NO" >> mk/build.mk + echo "HADDOCK_DOCS := NO" >> mk/build.mk + echo "BUILD_SPHINX_HTML := NO" >> mk/build.mk + echo "BUILD_SPHINX_PDF := NO" >> mk/build.mk +endif ifneq (,$(filter armel armhf, $(DEB_HOST_ARCH))) echo "SRC_HC_OPTS += -optl-B/usr/bin/ld.gold" >> mk/build.mk endif @@ -103,6 +114,8 @@ echo 'dvidir := $$(docdir)' >> mk/build.mk echo 'pdfdir := $$(docdir)' >> mk/build.mk echo 'psdir := $$(docdir)' >> mk/build.mk + echo 'STRIP_CMD = $(DEB_HOST_GNU_TYPE)-strip' >> mk/build.mk + echo 'RANLIB_CMD = $(DEB_HOST_GNU_TYPE)-ranlib'>> mk/build.mk # We want verbose builds echo 'V=1' >> mk/build.mk ./configure $(confflags) --prefix=/usr \ @@ -169,12 +182,11 @@ # Check if we have a ghci binary if test -e debian/tmp/usr/bin/ghci-$(ProjectVersion); then \ echo 'ghci=ghc-ghci' >> debian/ghc.substvars ; fi - +ifeq (NO,$(BUILD_CROSS)) # Add haddock substvars echo "haddock:Depends=haddock-interface-$$(debian/tmp/usr/lib/ghc/bin/haddock --interface-version)" >> debian/ghc-doc.substvars echo "haddock:Provides=haddock-interface-$$(debian/tmp/usr/lib/ghc/bin/haddock --interface-version)" >> debian/ghc.substvars - -ifeq (YES,$(BUILD_HADDOCK_DOCS)) + find debian/tmp/usr/share/man $(FILES) >> debian/ghc.install mkdir -p debian/tmp/usr/lib/ghc-doc cp debian/gen_contents_index debian/tmp/usr/lib/ghc-doc/ chmod +x debian/tmp/usr/lib/ghc-doc/gen_contents_index @@ -184,9 +196,8 @@ mkdir debian/tmp/usr/lib/ghc-doc/haddock/ghc/`basename $$f` ; \ mv $$f/*.haddock debian/tmp/usr/lib/ghc-doc/haddock/ghc/`basename $$f` ; done cd debian/tmp/usr/share/doc/ghc-doc/html/libraries/; ln -s ghc-$(ProjectVersion) ghc - install -Dm 644 debian/index.html debian/tmp/usr/share/doc/ghc-doc/index.html -endif + install -Dm 644 debian/index.html debian/tmp/usr/share/doc/ghc-doc/index.html # manpages rm -f debian/*.1 echo ".so man1/ghc.1" > debian/ghc-$(ProjectVersion).1 @@ -202,14 +213,13 @@ echo debian/*.1 > debian/ghc.manpages cp debian/haddock.man debian/haddock.1 echo debian/haddock.1 >> debian/ghc.manpages - +endif # #################### # Now all the files are sorted, create the package filelists # ghc find debian/tmp/usr/bin $(FILES) > debian/ghc.install # find debian/tmp/usr/share/ghc* $(FILES) >> debian/ghc.install - find debian/tmp/usr/share/man $(FILES) >> debian/ghc.install find debian/tmp/usr/lib/ghc $(FILES) ! $(PROF_FILE) >> debian/ghc.install find debian/tmp/var >> debian/ghc.install echo debian/tmp/usr/share/lintian/overrides/ghc >> debian/ghc.install @@ -217,14 +227,14 @@ find debian/tmp/usr/lib $(FILES) $(PROF_FILE) > debian/ghc-prof.install echo debian/tmp/usr/share/lintian/overrides/ghc-prof >> debian/ghc-prof.install # ghc-doc -ifeq (YES,$(BUILD_HADDOCK_DOCS)) +ifeq (NO,$(BUILD_CROSS)) mkdir -p debian/tmp/$(DEB_HOOGLE_TXT_DIR) find debian/tmp/usr/share/doc/ghc-doc/html/libraries/*/ -name "*.txt" \ -printf "%p $(DEB_HOOGLE_TXT_DIR)/%f\n" >> debian/ghc-doc.links find debian/tmp/usr/share/doc/ghc-doc $(FILES) > debian/ghc-doc.install find debian/tmp/usr/lib/ghc-doc $(FILES) >> debian/ghc-doc.install -endif sed -i s,^debian/tmp,, debian/*.install debian/*.links +endif rm -f debian/ghc.links echo "/var/lib/ghc/package.conf.d /usr/lib/ghc/package.conf.d" >> debian/ghc.links