Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 29 May 2026 20:48:59 +0000
From:      Piotr Kubaj <pkubaj@FreeBSD.org>
To:        ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-main@FreeBSD.org
Subject:   git: 51c541c1e65f - main - lang/ghc{,96}: port to powerpc64
Message-ID:  <6a19fbbb.33deb.16130d8a@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by pkubaj:

URL: https://cgit.FreeBSD.org/ports/commit/?id=51c541c1e65f3b9dc225babd7ba0ef66e812a673

commit 51c541c1e65f3b9dc225babd7ba0ef66e812a673
Author:     Piotr Kubaj <pkubaj@FreeBSD.org>
AuthorDate: 2026-05-29 20:46:28 +0000
Commit:     Piotr Kubaj <pkubaj@FreeBSD.org>
CommitDate: 2026-05-29 20:48:54 +0000

    lang/ghc{,96}: port to powerpc64
    
    1. In the Makefile, switch ARCH == powerpc64le to ARCH:Mpowerpc64*,
    2. Add some additional ARCH == powerpc64 for switching to ELFv2, since GHC assumes powerpc64 is ELFv1.
    3. Add additional patch to disable ELFv1 code in StgCRun.c.
    
    Bootstrap is built against 14.3-RELEASE.
    
    PR:     295675
    Approved by:    arrowd@
---
 lang/ghc/Makefile                       | 20 ++++++++++++++++----
 lang/ghc/distinfo                       |  2 ++
 lang/ghc/files/patch-rts_StgCRun.c      | 11 +++++++++++
 lang/ghc/files/patch-rts_StgCRunAsm.S   |  5 +++--
 lang/ghc96/files/patch-rts_StgCRun.c    | 11 +++++++++++
 lang/ghc96/files/patch-rts_StgCRunAsm.S |  5 +++--
 6 files changed, 46 insertions(+), 8 deletions(-)

diff --git a/lang/ghc/Makefile b/lang/ghc/Makefile
index 327f10609c8c..bf9a4ad6494c 100644
--- a/lang/ghc/Makefile
+++ b/lang/ghc/Makefile
@@ -14,7 +14,7 @@ WWW=		https://www.haskell.org/ghc/
 LICENSE=	BSD3CLAUSE
 LICENSE_FILE=	${WRKSRC}/LICENSE
 
-ONLY_FOR_ARCHS=		aarch64 amd64 powerpc64le
+ONLY_FOR_ARCHS=		aarch64 amd64 powerpc64 powerpc64le
 
 BUILD_DEPENDS=		${LOCALBASE}/lib/libgmp.so:math/gmp
 
@@ -131,7 +131,7 @@ DO_MAKE_BUILD=		${SETENVI} ${WRK_ENV} ${HADRIAN_CMD} ${_MAKE_JOBS}
 ALL_TARGET=		binary-dist-dir
 INSTALL_WRKSRC=		${WRKSRC}/_build/bindist/ghc-${GHC_VERSION}-${CONFIGURE_TARGET}
 
-GHC_ARCH=		${ARCH:S/amd64/x86_64/:C/armv.*/arm/:S/powerpc64le/ppc64/}
+GHC_ARCH=		${ARCH:S/amd64/x86_64/:C/armv.*/arm/:C/powerpc64.*/ppc64/}
 BOOT_DIR=		${WRKDIR}/ghc-${BOOT_GHC_VERSION}-${CONFIGURE_TARGET}
 BOOT_INSTALL_DIR=	${WRKDIR}/ghc-boot-install
 
@@ -152,12 +152,12 @@ DISTFILES+=		${HADRIAN_BOOT_TARBALL}:boot
 .if ${ARCH} == aarch64
 CONFIGURE_TARGET=	${ARCH}-unknown-freebsd${"${ARCH:Maarch64}" != "":?:-gnueabihf}
 CONFIGURE_ARGS+=	--host=${CONFIGURE_TARGET}
-.elif ${ARCH} == powerpc64le
+.elif ${ARCH:Mpowerpc64*}
 CONFIGURE_TARGET=	${ARCH}-unknown-freebsd
 CONFIGURE_ARGS+=	--host=${CONFIGURE_TARGET}
 .endif
 
-.if ${ARCH} == powerpc64le && ${GHC_VERSION} == 9.6.7
+.if ${ARCH:Mpowerpc64*} && ${GHC_VERSION} == 9.6.7
 BOOT_GHC_VERSION=       9.6.7
 HADRIAN_BOOT_TARBALL=   hadrian-9.6.7-boot-powerpc64le.tar.gz
 .endif
@@ -169,9 +169,21 @@ pre-configure:
 # If we are using bootstrap compiler, configure and install it into ${BOOT_DIR}
 	cd ${BOOT_DIR} && ${SETENVI} ${CONFIGURE_ENV} ${CONFIGURE_CMD} --prefix=${BOOT_INSTALL_DIR}
 	cd ${BOOT_DIR} && ${SETENVI} ${WRK_ENV} ${GMAKE} PACKAGES='' install
+.if ${ARCH} == powerpc64
+# Boot's settings are generated by configure which maps `powerpc64` to ELF_V1,
+# but FreeBSD ppc64 is ELFv2; flip so the boot's NCG dispatches correctly.
+	${REINPLACE_CMD} -e 's|ArchPPC_64 ELF_V1|ArchPPC_64 ELF_V2|g' \
+		${BOOT_INSTALL_DIR}/lib/ghc-${BOOT_GHC_VERSION}/lib/settings
+.endif
 .endif
 
 pre-build:
+.if ${ARCH} == powerpc64
+# FreeBSD ppc64 BE is ELFv2, but GHC's configure hardcodes powerpc64 -> ELF_V1.
+	${REINPLACE_CMD} -e 's|ArchPPC_64 ELF_V1|ArchPPC_64 ELF_V2|g' \
+		${WRKSRC}/hadrian/cfg/default.target \
+		${WRKSRC}/hadrian/cfg/default.host.target
+.endif
 .if ! ${PORT_OPTIONS:MBOOT}
 # Compile Hadrian using the bootstrap compiler and bootstrap Hadrian distfile
 	cd ${WRKSRC}/hadrian/bootstrap && \
diff --git a/lang/ghc/distinfo b/lang/ghc/distinfo
index b7888aa0468d..c480882f8f78 100644
--- a/lang/ghc/distinfo
+++ b/lang/ghc/distinfo
@@ -31,3 +31,5 @@ SHA256 (ghc-9.6.7-boot-powerpc64le-freebsd.tar.xz) = 0090b3a8d2420af339b94d8df14
 SIZE (ghc-9.6.7-boot-powerpc64le-freebsd.tar.xz) = 142326376
 SHA256 (hadrian-9.6.7-boot-powerpc64le.tar.gz) = 46b51e5929b3cd1f7c0a30ad5d4fd689d4d10fe555cb6350df80e1dcd78e2e19
 SIZE (hadrian-9.6.7-boot-powerpc64le.tar.gz) = 1500047
+SHA256 (ghc-9.6.7-boot-powerpc64-freebsd.tar.xz) = d2f09f4fbd06169891664d7598e51d4615003c2879eec92d0f022e25e99c5cc0
+SIZE (ghc-9.6.7-boot-powerpc64-freebsd.tar.xz) = 136217048
diff --git a/lang/ghc/files/patch-rts_StgCRun.c b/lang/ghc/files/patch-rts_StgCRun.c
new file mode 100644
index 000000000000..93dd0a666354
--- /dev/null
+++ b/lang/ghc/files/patch-rts_StgCRun.c
@@ -0,0 +1,11 @@
+--- rts/StgCRun.c.orig
++++ rts/StgCRun.c
+@@ -670,7 +670,7 @@
+    Everything is in assembler, so we don't have to deal with GCC...
+    -------------------------------------------------------------------------- */
+
+-#if defined(powerpc64_HOST_ARCH)
++#if defined(powerpc64_HOST_ARCH) && !defined(freebsd_HOST_OS)
+ /* 64-bit PowerPC ELF ABI 1.9
+  *
+  * Stack frame organization (see Figure 3-17, ELF ABI 1.9, p 14)
diff --git a/lang/ghc/files/patch-rts_StgCRunAsm.S b/lang/ghc/files/patch-rts_StgCRunAsm.S
index 838a8222eb42..51b8b4ccf4b7 100644
--- a/lang/ghc/files/patch-rts_StgCRunAsm.S
+++ b/lang/ghc/files/patch-rts_StgCRunAsm.S
@@ -2,9 +2,10 @@
 +++ rts/StgCRunAsm.S
 @@ -6,7 +6,7 @@
  #if !defined(USE_MINIINTERPRETER)
- 
- #if defined(powerpc64le_HOST_ARCH)
+
+-#if defined(powerpc64le_HOST_ARCH)
 -# if defined(linux_HOST_OS)
++#if defined(powerpc64le_HOST_ARCH) || defined(powerpc64_HOST_ARCH)
 +# if defined(linux_HOST_OS) || defined(freebsd_HOST_OS)
  /* 64-bit PowerPC ELF V2 ABI Revision 1.4
   *
diff --git a/lang/ghc96/files/patch-rts_StgCRun.c b/lang/ghc96/files/patch-rts_StgCRun.c
new file mode 100644
index 000000000000..93dd0a666354
--- /dev/null
+++ b/lang/ghc96/files/patch-rts_StgCRun.c
@@ -0,0 +1,11 @@
+--- rts/StgCRun.c.orig
++++ rts/StgCRun.c
+@@ -670,7 +670,7 @@
+    Everything is in assembler, so we don't have to deal with GCC...
+    -------------------------------------------------------------------------- */
+
+-#if defined(powerpc64_HOST_ARCH)
++#if defined(powerpc64_HOST_ARCH) && !defined(freebsd_HOST_OS)
+ /* 64-bit PowerPC ELF ABI 1.9
+  *
+  * Stack frame organization (see Figure 3-17, ELF ABI 1.9, p 14)
diff --git a/lang/ghc96/files/patch-rts_StgCRunAsm.S b/lang/ghc96/files/patch-rts_StgCRunAsm.S
index 838a8222eb42..51b8b4ccf4b7 100644
--- a/lang/ghc96/files/patch-rts_StgCRunAsm.S
+++ b/lang/ghc96/files/patch-rts_StgCRunAsm.S
@@ -2,9 +2,10 @@
 +++ rts/StgCRunAsm.S
 @@ -6,7 +6,7 @@
  #if !defined(USE_MINIINTERPRETER)
- 
- #if defined(powerpc64le_HOST_ARCH)
+
+-#if defined(powerpc64le_HOST_ARCH)
 -# if defined(linux_HOST_OS)
++#if defined(powerpc64le_HOST_ARCH) || defined(powerpc64_HOST_ARCH)
 +# if defined(linux_HOST_OS) || defined(freebsd_HOST_OS)
  /* 64-bit PowerPC ELF V2 ABI Revision 1.4
   *


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a19fbbb.33deb.16130d8a>