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
 

Reply via email to