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 <me@jonathanchang.org>
Co-authored-by: Max Howell <mxcl@me.com>
This commit is contained in:
Jacob Heider 2022-12-01 08:05:12 -05:00 committed by GitHub
parent a17830b38e
commit 616098e71a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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 dont 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: |