From 616098e71a4508d7046128e8f81b24d90ac5ffb6 Mon Sep 17 00:00:00 2001 From: Jacob Heider Date: Thu, 1 Dec 2022 08:05:12 -0500 Subject: [PATCH] fix haskell.org build and rpath issues (#2) Extreme bunch of work by all of us. In the end it was just a matter of finding the env vars for LDFLAGS for the various stages. Dang ghc-devs, you hate us. Co-authored-by: Jonathan Chang Co-authored-by: Max Howell --- projects/haskell.org/package.yml | 83 +++++++++++++++++++++----------- 1 file changed, 56 insertions(+), 27 deletions(-) diff --git a/projects/haskell.org/package.yml b/projects/haskell.org/package.yml index ea4b8d69..d138591e 100644 --- a/projects/haskell.org/package.yml +++ b/projects/haskell.org/package.yml @@ -1,5 +1,6 @@ distributable: - url: https://downloads.haskell.org/~ghc/{{ version}}/ghc-{{ version}}-src.tar.xz + url: https://downloads.haskell.org/~ghc/{{version}}/ghc-{{version}}-src.tar.xz + sig: "{{url}}.sig" strip-components: 1 versions: @@ -9,9 +10,9 @@ versions: # strip: # - /^ghc-/ # - /-release$/ - - -#NOTE relocatable if we edit the shell scripts + # however ghc breaks every time they release a new version + # so you are welcome to embrace trying to build it, we kindly ask they care + # more about ensuring their monolithic nonsense has stability in builds provides: - bin/ghc @@ -27,7 +28,8 @@ provides: dependencies: gnu.org/gmp: 6 invisible-island.net/ncurses: 6 - tea.xyz/gx/cc: c99 # ghc uses `gcc` as part of its build process + tea.xyz/gx/cc: 'c99' # ghc uses this during builds + sourceware.org/libffi: 3 build: dependencies: @@ -36,17 +38,19 @@ build: tea.xyz/gx/make: '*' #FIXME specifically, gnu make is *required* curl.se: '*' gnu.org/m4: '*' - script: |- - # `ghc` needs `ghc` to bootstrap `ghc` - # The canonical way to achieve this is with `ghcup` - # To that end, we capture $HOME so as to no pollute the user's life with unwanted - # stage0 tooling. Instead, everything is localized to {{ prefix }}/src, and can be - # cleaned up at will, and won't capture any of the user's workflow + git-scm.org: ^2 + python.org: ^3 + gnu.org/patch: '*' + linux: + github.com/numactl/numactl: ^2 # ghcup needs this - export HOME={{ prefix }}/src - export BOOTSTRAP_HASKELL_NONINTERACTIVE=1 - export BOOTSTRAP_HASKELL_ADJUST_BASHRC=0 - export BOOTSTRAP_HASKELL_GHC_VERSION={{ version }} + # `ghc` needs `ghc` to bootstrap `ghc` + # The canonical way to achieve this is with `ghcup` + # To that end, we capture $HOME so as to no pollute the user's life with unwanted + # stage0 tooling. Instead, everything is localized to $HOME, and can be + # cleaned up at will, and won't capture any of the user's workflow + script: | + export HOME="$(pwd)" if test -d .ghcup; then echo "ghcup already installed" @@ -54,24 +58,49 @@ build: curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh fi - PATH="{{ prefix }}/src/.ghcup/bin:$PATH" + PATH="$HOME/.ghcup/bin:$PATH" - if test -e {{ prefix }}/src/.cabal/bin; then - rm -r {{ prefix }}/src/.cabal/bin + if test -e $HOME/.cabal/bin; then + rm -r $HOME/.cabal/bin fi - cabal update && cabal install alex happy + cabal update + cabal install alex happy - export PATH="{{ prefix }}/src/.cabal/bin:$PATH" - GHC="{{ prefix }}/src/.ghcup/bin/ghc" + export PATH="$HOME/.cabal/bin:$PATH" + GHC="$HOME/.ghcup/bin/ghc" - export CPATH=/opt/invisible-island.net/ncurses/v6/include/ncursesw:$CPATH + ./configure $ARGS + hadrian/build -j --docs=none --prefix="{{prefix}}" install - #FIXME oddly, they don’t provide `./configure`; we have to generate it - autoconf - ./configure --prefix={{ prefix }} - - hadrian/build -j install --prefix={{ prefix }} --docs=none + for shim in $(find "{{prefix}}/bin" -type f); do + sed -i.bak -e 's_="{{prefix}}_="$(dirname $(dirname $0))_' $shim + rm $shim.bak + done + env: + BOOTSTRAP_HASKELL_NONINTERACTIVE: 1 + BOOTSTRAP_HASKELL_ADJUST_BASHRC: 0 + BOOTSTRAP_HASKELL_GHC_VERSION: ${{version}} + CONF_CC_OPTS_STAGE0: $LDFLAGS + CONF_CC_OPTS_STAGE1: $LDFLAGS + CONF_CC_OPTS_STAGE2: $LDFLAGS + CONF_GCC_LINKER_OPTS_STAGE0: $LDFLAGS + CONF_GCC_LINKER_OPTS_STAGE1: $LDFLAGS + CONF_GCC_LINKER_OPTS_STAGE2: $LDFLAGS + ARGS: + - --prefix={{prefix}} + - --disable-numa + - --with-curses-includes={{deps.invisible-island.net/ncurses.prefix}}/include/ncursesw + - --with-intree-gmp + - --with-system-libffi + linux: + C_INCLUDE_PATH: ${{deps.invisible-island.net/ncurses.prefix}}/include/ncursesw + # ^^ yep telling `./configure` about it just aint enough + darwin: + ARGS: + - --with-ffi-includes=$(xcrun --show-sdk-path)/usr/include/ffi + # workaround `fatal error: 'ffitarget_arm64.h' file not found` + C_INCLUDE_PATH: $(xcrun --show-sdk-path)/usr/include/ffi test: script: |