
#15916: GHC doesn't build on powerpc64 architecture on systems other than GNU / Linux -------------------------------------+------------------------------------- Reporter: pkubaj | Owner: trommler Type: feature request | Status: patch Priority: normal | Milestone: 8.10.1 Component: Compiler | Version: 8.6.2 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: powerpc64 Type of failure: Building GHC | Test Case: failed | Blocked By: 15411 | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | https://gitlab.haskell.org/ghc/ghc/merge_requests/81 -------------------------------------+------------------------------------- Comment (by pkubaj): OK. You need FreeBSD sources in {{{/usr/src}}} and the current ports tree in {{{/usr/ports}}} (all on amd64). {{{ cd /usr/src pkg install devel/powerpc64-xtoolchain-gcc make CROSS_TOOLCHAIN=powerpc64-gcc TARGET=powerpc TARGET_ARCH=powerpc64 buildworld make CROSS_TOOLCHAIN=powerpc64-gcc TARGET=powerpc TARGET_ARCH=powerpc64 installworld DESTDIR=/sysroots/powerpc64 make CROSS_TOOLCHAIN=powerpc64-gcc TARGET=powerpc TARGET_ARCH=powerpc64 distribution DESTDIR=/sysroots/powerpc64 }}} Now you need wrappers for toolchain. I put mine to ~/bin: powerpc64-portbld-freebsd-ar: #!/bin/sh exec /usr/local/bin/powerpc64-unknown-freebsd12.0-ar "$@" powerpc64-portbld-freebsd-g++: #!/bin/sh exec /usr/local/bin/powerpc64-unknown-freebsd12.0-g++ --sysroot=/sysroots/powerpc64 "$@" powerpc64-portbld-freebsd-gcc: #!/bin/sh exec /usr/local/bin/powerpc64-unknown-freebsd12.0-gcc --sysroot=/sysroots/powerpc64 "$@" powerpc64-portbld-freebsd-ld: #!/bin/sh exec /usr/local/bin/powerpc64-unknown-freebsd12.0-ld --sysroot=/sysroots/powerpc64 "$@" powerpc64-portbld-freebsd-nm: #!/bin/sh exec /usr/local/bin/powerpc64-unknown-freebsd12.0-gcc-nm "$@" powerpc64-portbld-freebsd-objdump: #!/bin/sh exec /usr/local/bin/powerpc64-unknown-freebsd12.0-objdump "$@" powerpc64-portbld-freebsd-ranlib: #!/bin/sh exec /usr/local/bin/powerpc64-unknown-freebsd12.0-ranlib "$@" powerpc64-portbld-freebsd-strip: #!/bin/sh exec /usr/local/bin/powerpc64-unknown-freebsd12.0-strip "$@" {{{ cd /usr/ports/lang/ghc }}} Put your patches to {{{files}}}. {{{ make patch cd work/ghc-8.6.3 cp mk/build.mk.sample mk/build.mk }}} Add to mk/build.mk: {{{ INTEGER_LIBRARY = integer-simple BIN_DIST_NAME=ghc-8.6.3-boot BIN_DIST_TAR=ghc-8.6.3-boot.tar DYNAMIC_GHC_PROGRAMS = NO }}} Then it doesn't build with dtrace): {{{ ./configure --target=powerpc64-portbld-freebsd --disable-dtrace gmake gmake binary-dist TAR_COMP=xz mv ghc-8.6.3-boot-powerpc64-portbld-freebsd.tar.xz ghc-8.6.3-boot- powerpc64-freebsd.tar.xz }}} And copy ghc-8.6.3-boot-powerpc64-freebsd.tar.xz to my POWER box to {{{/usr/ports/distfiles}}}. On it, I have the same set of patches and a patch to {{{lang/ghc/bsd.ghc.mk}}}: {{{ Index: bsd.ghc.mk =================================================================== --- bsd.ghc.mk (revision 489844) +++ bsd.ghc.mk (working copy) @@ -5,12 +5,13 @@ # Maintained by: haskell@FreeBSD.org # -ONLY_FOR_ARCHS= aarch64 amd64 armv6 armv7 i386 +ONLY_FOR_ARCHS= aarch64 amd64 armv6 armv7 i386 powerpc64 DATADIR= ${PREFIX}/share/ghc-${GHC_VERSION} EXAMPLESDIR= ${PREFIX}/share/examples/ghc-${GHC_VERSION} -USES= autoreconf gmake iconv:translit localbase:ldflags ncurses perl5 tar:xz +USES= autoreconf compiler:c11 gmake iconv:translit localbase:ldflags \ + ncurses perl5 tar:xz USE_LOCALE= en_US.UTF-8 USE_PERL5= build NO_CCACHE= ccache: error: Failed to create directory /nonexistent/.ccache/tmp: Permission denied @@ -83,6 +84,8 @@ .if empty(PORT_OPTIONS:MBOOT) . if ${ARCH} == armv6 || ${ARCH} == armv7 BOOT_GHC_VERSION= 8.4.2 +.elif ${ARCH} == powerpc64 +BOOT_GHC_VERSION= 8.6.3 . else BOOT_GHC_VERSION= 8.4.3 . endif }}} You also need to add a proper SHA256 and SIZE entries to {{{lang/ghc/distinfo}}}: {{{ SHA256 (ghc-8.6.3-boot-powerpc64-freebsd.tar.xz) = 258f4d41d2cf7977f756e6a5ac718e5ed140065d31ba89c8aee4f654d57a6315 SIZE (ghc-8.6.3-boot-powerpc64-freebsd.tar.xz) = 179817644 }}} SHA256 is returned by {{{sha256}}} and SIZE is from {{{stat -f %z ghc-8.6.3-boot-powerpc64-freebsd.tar.xz}}}. Then: {{{ cd /usr/ports/lang/ghc make (I disable all options to avoid further problems) }}} Then just wait for an error. Alternatively, you could mark a BOOT option, and install ghc locally like this. {{{ cd /usr/ports/distfiles tar xvvf ghc-8.6.3-boot-powerpc64-freebsd.tar.xz cd ghc-8.6.3-boot CFLAGS="-Wl,-rpath=/usr/local/lib/gcc8 -isystem /usr/local/include" CXXFLAGS="-Wl,-rpath=/usr/local/lib/gcc8 -isystem /usr/local/include" CC=gcc8 CXX=g++8 ./configure gmake install }}} I hope it's clear enough :) -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/15916#comment:30 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler