pkgsrc-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[pkgsrc/trunk]: pkgsrc/lang/ghc90 When the LLVM backend is enabled, use clang...



details:   https://anonhg.NetBSD.org/pkgsrc/rev/99b29f007782
branches:  trunk
changeset: 373087:99b29f007782
user:      pho <pho%pkgsrc.org@localhost>
date:      Sun Feb 06 05:31:57 2022 +0000

description:
When the LLVM backend is enabled, use clang as the assembler

This turned out to be necessary because LLVM 13 emits assembly code that is
incompatible with "as" from Binutils < 2.36.

diffstat:

 lang/ghc90/Makefile      |  86 ++++++++++++++++++++++++-----------------------
 lang/ghc90/bootstrap.mk  |   4 +-
 lang/ghc90/buildlink3.mk |   4 +-
 lang/ghc90/options.mk    |  56 +++++++++++++++++++-----------
 4 files changed, 83 insertions(+), 67 deletions(-)

diffs (271 lines):

diff -r f634866313ab -r 99b29f007782 lang/ghc90/Makefile
--- a/lang/ghc90/Makefile       Sun Feb 06 01:07:17 2022 +0000
+++ b/lang/ghc90/Makefile       Sun Feb 06 05:31:57 2022 +0000
@@ -1,8 +1,9 @@
-# $NetBSD: Makefile,v 1.17 2022/01/18 02:22:49 pho Exp $
+# $NetBSD: Makefile,v 1.18 2022/02/06 05:31:57 pho Exp $
 # -----------------------------------------------------------------------------
 # Package metadata
 #
 DISTNAME=      ghc-9.0.2-src
+PKGREVISION=   1
 PKGNAME=       ${DISTNAME:S/-src$//}
 CATEGORIES=    lang
 MASTER_SITES=  https://downloads.haskell.org/~ghc/${PKGVERSION_NOREV}/
@@ -26,6 +27,10 @@
 BROKEN_EXCEPT_ON_PLATFORM+=    NetBSD-*-x86_64
 BROKEN_EXCEPT_ON_PLATFORM+=    SunOS-*-x86_64
 
+# We are going to do a PIE build on our responsibility. Do not put -pie in
+# wrappers, as that would prevent us from building stage-1 compiler.
+PKGSRC_OVERRIDE_MKPIE= yes
+
 .include "options.mk"
 
 
@@ -51,13 +56,12 @@
 # -----------------------------------------------------------------------------
 # Configuration
 #
-CONFIGURE_ARGS.common= \
+CONFIGURE_ARGS.common+= \
        --with-curses-libraries=${BUILDLINK_PREFIX.curses}/${BUILDLINK_LIBDIRS.curses:Q} \
        --with-gmp-includes=${BUILDLINK_PREFIX.gmp}/${BUILDLINK_INCDIRS.gmp:Q} \
        --with-gmp-libraries=${BUILDLINK_PREFIX.gmp}/${BUILDLINK_LIBDIRS.gmp:Q} \
        --with-iconv-includes=${BUILDLINK_PREFIX.iconv}/${BUILDLINK_INCDIRS.iconv:Q} \
        --with-iconv-libraries=${BUILDLINK_PREFIX.iconv}/${BUILDLINK_LIBDIRS.iconv:Q} \
-       --with-system-libffi \
        --with-ffi-includes=${BUILDLINK_PREFIX.libffi}/${BUILDLINK_INCDIRS.libffi:Q} \
        --with-ffi-libraries=${BUILDLINK_PREFIX.libffi}/${BUILDLINK_LIBDIRS.libffi:Q}
 
@@ -73,25 +77,23 @@
 # See rts/adjustor/NativeAmd64.c and rts/adjustor/LibffiAdjustor.c
 .endif
 
-CONFIGURE_ARGS+=       ${CONFIGURE_ARGS.common}
-
 # We must pass non-wrapper tools to ./configure because they will be
 # embedded in the compiler (actually ${WRKSRC}/settings).
-CONFIGURE_ENV+= \
-       ac_cv_prog_fp_prog_ar=${AR:Q} \
-       ac_cv_prog_LIBTOOL=libtool \
-       CC=${CC:Q} \
-       LD=${LD:Q}
+CONFIGURE_ENV+=                ac_cv_prog_fp_prog_ar=${AR:Q}
+CONFIGURE_ENV+=                ac_cv_prog_LIBTOOL=libtool
+CONFIGURE_ARGS.common+=        LD=${LD:Q}
 
-# LDFLAGS is currently not honored by "./configure". Since LDFLAGS
-# contains rpath flags it's very important to force GHC to honor
-# it. Otherwise neither GHC itself nor executables it produces will
-# have any rpaths so users will have to put "${PREFIX}/lib" into their
+CONFIGURE_ARGS+=       ${CONFIGURE_ARGS.common}
+CONFIGURE_ARGS+=       --with-system-libffi
+
+# CFLAGS and LDFLAGS are currently not honored by "./configure". Since
+# LDFLAGS contains rpath flags it's very important to force GHC to honor
+# it. Otherwise neither GHC itself nor executables it produces will have
+# any rpaths so users will have to put "${PREFIX}/lib" into their
 # "/etc/ld-elf.so.conf". See
 # http://hackage.haskell.org/trac/ghc/ticket/2933
 .for stage in 0 1 2
-CONFIGURE_ENV+= \
-       CONF_GCC_LINKER_OPTS_STAGE${stage}=${LDFLAGS:M*:Q}
+CONFIGURE_ENV+=        CONF_GCC_LINKER_OPTS_STAGE${stage}=${LDFLAGS:M*:Q}
 # Note that CONF_LD_LINKER_OPTS_STAGE{0,1,2} are only used for
 # creating static GHCi libraries (HS*.o). Setting them to ${LDFLAGS}
 # does more harm than good because our ${LDFLAGS} contains -Wl,*
@@ -101,25 +103,37 @@
 # the buildlink.
 .endfor
 
+# The use of internal variable in mk/bsd.prefs.mk is not very satisfying,
+# but the current infrastructure does not export a public variable
+# indicating whether a PIE build is requested or not. Note that we can't
+# build stage-1 compiler as PIE, because our bootkit libraries aren't
+# necessarily built as PIC.
+.for stage in 0 1 2
+.  if ${stage} == 0
+CONFIGURE_ENV+=        CONF_CC_OPTS_STAGE${stage}=${CFLAGS:M*:Q}
+.  else
+CONFIGURE_ENV+=        CONF_HC_OPTS_STAGE${stage}=-fPIC\ -pie
+CONFIGURE_ENV+=        CONF_CC_OPTS_STAGE${stage}=${CFLAGS:M*:Q}\ -fPIC
+.  endif
+.endfor
+
 
 # -----------------------------------------------------------------------------
 # Security
 #
-# The runtime system of GHC (rts) has a functionality called "RTS
-# linker" whose job is to load and execute *static* objects (.a and .o
-# files) at run time. It cannot survive PaX MPROTECT because
-# preloadObjectFile() in rts/linker.c tries to mmap pages with w+x. It
-# doesn't play nice with ASLR either because mmapForLinker() in
-# rts/linker.c wants to mmap pages in the lower 32-bit area on 64-bit
-# platforms.
+# The runtime system of GHC (rts) has a functionality called "RTS linker"
+# whose job is to load and execute *static* objects (.a and .o files) at
+# run time. It cannot survive PaX MPROTECT because preloadObjectFile() in
+# rts/linker.c tries to mmap pages with w+x. It doesn't play nice with ASLR
+# either because mmapForLinker() in rts/linker.c wants to always mmap pages
+# in the lower 32-bit area on 64-bit platforms.
 #
-# Luckily for us, the RTS linker is only used when the GHC executable
-# (or any user programs which uses GHC API as an interpreter, not a
-# compiler) is statically linked, which is no longer the case except
-# for ghc-iserv and ghc-iesrv-prof. They are launched when ghci is
-# started with -fexternal-interpreter without -dynamic, and their
-# purpose is to run non-PIC code from a dynamically linked ghci using
-# the evil RTS linker.
+# Luckily for us, the RTS linker is only used when the GHC executable (or
+# any user programs which uses GHC API as an interpreter, not a compiler)
+# is statically linked, which is no longer the case except for ghc-iserv
+# and ghc-iesrv-prof. They are launched when ghci is started with
+# -fexternal-interpreter without -dynamic, and their purpose is to run
+# non-PIC code from a dynamically linked ghci using the evil RTS linker.
 .for f in ghc-iserv ghc-iserv-prof
 NOT_PAX_MPROTECT_SAFE+=        lib/${PKGNAME_NOREV}/bin/${f}
 NOT_PAX_ASLR_SAFE+=    lib/${PKGNAME_NOREV}/bin/${f}
@@ -168,18 +182,6 @@
        ${RUN} ${ECHO} "SplitSections  = YES" >> ${WRKSRC}/mk/build.mk
 .endif
 
-# The use of internal variable in mk/bsd.prefs.mk is not very satisfying, but
-# the current infrastructure does not export a public variable indicating
-# whether a PIE build is requested or not. Note that we can't build stage-1
-# compiler as PIE, because our bootkit libraries aren't built as PIC.
-.if ${_PKGSRC_MKPIE} == "yes"
-       ${RUN} ${ECHO} "SRC_HC_OPTS_STAGE1 += -fPIC -pie" >> ${WRKSRC}/mk/build.mk
-       ${RUN} ${ECHO} "SRC_HC_OPTS_STAGE2 += -fPIC -pie" >> ${WRKSRC}/mk/build.mk
-.endif
-
-# We are going to do a PIE build on our responsibility. Do not put -pie in
-# wrappers, as that would prevent us from building stage-1 compiler.
-PKGSRC_OVERRIDE_MKPIE= yes
 
 # -----------------------------------------------------------------------------
 # Installation/removal hooks
diff -r f634866313ab -r 99b29f007782 lang/ghc90/bootstrap.mk
--- a/lang/ghc90/bootstrap.mk   Sun Feb 06 01:07:17 2022 +0000
+++ b/lang/ghc90/bootstrap.mk   Sun Feb 06 05:31:57 2022 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: bootstrap.mk,v 1.11 2021/09/30 15:32:53 jperkin Exp $
+# $NetBSD: bootstrap.mk,v 1.12 2022/02/06 05:31:57 pho Exp $
 # -----------------------------------------------------------------------------
 # Select a bindist of bootstrapping compiler on a per-platform basis.
 #
@@ -114,7 +114,7 @@
        @${PHASE_MSG} "Preparing bootstrapping compiler for ${PKGNAME}"
        ${RUN}cd ${WRKDIR}/bootkit-dist/ghc-${BOOT_VERSION}-boot && \
                ${PKGSRC_SETENV} ${CONFIGURE_ENV} ${SH} ./configure \
-                       --prefix=${TOOLS_DIR:Q} && \
+                       --prefix=${TOOLS_DIR:Q} ${CONFIGURE_ARGS.boot} && \
                ${PKGSRC_SETENV} ${MAKE_ENV} ${MAKE_PROGRAM} install
 
 
diff -r f634866313ab -r 99b29f007782 lang/ghc90/buildlink3.mk
--- a/lang/ghc90/buildlink3.mk  Sun Feb 06 01:07:17 2022 +0000
+++ b/lang/ghc90/buildlink3.mk  Sun Feb 06 05:31:57 2022 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: buildlink3.mk,v 1.5 2022/01/18 02:22:49 pho Exp $
+# $NetBSD: buildlink3.mk,v 1.6 2022/02/06 05:31:57 pho Exp $
 
 BUILDLINK_TREE+=       ghc
 
@@ -6,7 +6,7 @@
 GHC_BUILDLINK3_MK:=
 
 BUILDLINK_API_DEPENDS.ghc+=    ghc>=9.0
-BUILDLINK_ABI_DEPENDS.ghc+=    ghc>=9.0.2
+BUILDLINK_ABI_DEPENDS.ghc+=    ghc>=9.0.2nb1
 BUILDLINK_PKGSRCDIR.ghc?=      ../../lang/ghc90
 
 .include "../../converters/libiconv/buildlink3.mk"
diff -r f634866313ab -r 99b29f007782 lang/ghc90/options.mk
--- a/lang/ghc90/options.mk     Sun Feb 06 01:07:17 2022 +0000
+++ b/lang/ghc90/options.mk     Sun Feb 06 05:31:57 2022 +0000
@@ -1,17 +1,31 @@
-# $NetBSD: options.mk,v 1.4 2022/01/18 02:22:49 pho Exp $
+# $NetBSD: options.mk,v 1.5 2022/02/06 05:31:57 pho Exp $
 
 PKG_OPTIONS_VAR=       PKG_OPTIONS.ghc
 
 .include "../../mk/bsd.prefs.mk"
 
-# GHC has a native implementation of codegen for some platforms. On
-# those platforms LLVM is optional. It's a requirement anywhere else.
-# See compiler/GHC/Driver/Backend.hs
+# GHC has a native implementation of codegen for some platforms. On those
+# platforms LLVM is optional. It's a requirement anywhere else.  See
+# compiler/GHC/Driver/Backend.hs
+#
+# The LLVM backend tends to produce slightly faster code than what NCG
+# produces, but it is much slower than NCG. It is therefore not the default
+# backend on platforms where NCG is available. On platforms where NCG is
+# available, LLVM should be disabled by default because it's a huge
+# dependency that takes hours to compile.
+#
+# Note that bootkits also require LLVM/Clang on platforms lacking NCG. This
+# can cause a transitional problem when a new compiler arrives with NCG for
+# a platform which used to lack one. In this case we have to either (1)
+# build a new bootkit for the platform with LLVM backend disabled, or (2)
+# reuse the old bootkit by putting llvm/clang in BUILD_DEPENDS (regardless
+# of user choice) and arrange parameters so that they are used only by the
+# stage-0 compiler. We don't have an infrastructure for (2), as it's not
+# worth the additional complexity, so (1) is the only option atm.
 
 GHC_NCG_SUPPORTED=     i386 x86_64 powerpc powerpc64 sparc
 .if !empty(GHC_NCG_SUPPORTED:M${MACHINE_ARCH})
 PKG_SUPPORTED_OPTIONS+=        llvm
-PKG_SUGGESTED_OPTIONS+=        llvm
 GHC_LLVM_REQUIRED=     no
 .else
 GHC_LLVM_REQUIRED=     yes
@@ -22,30 +36,30 @@
 .endif
 
 .if !empty(PKG_OPTIONS:Mllvm) || ${GHC_LLVM_REQUIRED} == "yes"
-DEPENDS+=      llvm-[0-9]*:../../lang/llvm
-CONFIGURE_ENV+=        LLC=${PREFIX:Q}/bin/llc
-CONFIGURE_ENV+=        OPT=${PREFIX:Q}/bin/opt
+DEPENDS+=              llvm-[0-9]*:../../lang/llvm
+CONFIGURE_ARGS.common+=        LLC=${PREFIX:Q}/bin/llc
+CONFIGURE_ARGS.common+=        OPT=${PREFIX:Q}/bin/opt
+
+# When we use the LLVM backend, we *have* to use Clang's integrated
+# assembler because llc emits assembly source files incompatible with
+# Binutils < 2.36 (see https://reviews.llvm.org/D97448). It also requires
+# Clang on Darwin (see runClang in compiler/GHC/SysTools/Tasks.hs).
+DEPENDS+=              clang-[0-9]*:../../lang/clang
+CONFIGURE_ARGS.common+=        CLANG=${PREFIX:Q}/bin/clang
+CONFIGURE_ARGS.common+=        CC=${PREFIX:Q}/bin/clang
 
 # Maybe GHC doesn't like this but it's the only option available to us.
 LLVM_VERSION_CMD=      ${PKG_INFO} -E llvm | ${SED} -E 's/^llvm-([0-9]*)\..*/\1/'
 LLVM_MAX_VERSION_CMD=  ${EXPR} ${LLVM_VERSION_CMD:sh} + 1
 SUBST_CLASSES+=                llvm
 SUBST_STAGE.llvm=      post-extract
-SUBST_MESSAGE.llvm=    Accept whichever version of LLVM installed via pkgsrc
+SUBST_MESSAGE.llvm=    Modifying configure.ac to accept whichever version of LLVM installed via pkgsrc
 SUBST_FILES.llvm=      configure.ac
 SUBST_SED.llvm=                -e 's/LlvmMaxVersion=[0-9]*/LlvmMaxVersion=${LLVM_MAX_VERSION_CMD:sh}/'
 
-# Clang is also required on Darwin.
-# See compiler/GHC/SysTools/Tasks.hs (runClang).
-.  if ${OPSYS} == "Darwin"
-DEPENDS+=      clang-[0-9]*:../../lang/clang
-CONFIGURE_ENV+=        CLANG=${PREFIX:Q}/bin/clang
-.  else
-CONFIGURE_ENV+=        CLANG=${FALSE}
-.  endif
-
 .else
-CONFIGURE_ENV+=        LLC=${FALSE:Q}
-CONFIGURE_ENV+=        OPT=${FALSE:Q}
-CONFIGURE_ENV+=        CLANG=${FALSE:Q}
+CONFIGURE_ARGS.common+=        LLC=${FALSE:Q}
+CONFIGURE_ARGS.common+=        OPT=${FALSE:Q}
+CONFIGURE_ARGS.common+=        CLANG=${FALSE:Q}
+CONFIGURE_ARGS.common+=        CC=${CC:Q}
 .endif



Home | Main Index | Thread Index | Old Index