-
Notifications
You must be signed in to change notification settings - Fork 119
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* fix(haskell) vendor GHC * needs make * debugging * fix shims
- Loading branch information
Showing
2 changed files
with
167 additions
and
89 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,122 +1,75 @@ | ||
distributable: | ||
url: https://downloads.haskell.org/~ghc/{{version}}/ghc-{{version}}-src.tar.xz | ||
sig: "{{url}}.sig" | ||
strip-components: 1 | ||
distributable: ~ | ||
|
||
versions: | ||
github: ghc/ghc/tags | ||
strip: | ||
- /^ghc-/ | ||
- /-release$/ | ||
ignore: [9.5.x, 9.6.x] #FIXME help us to build these! | ||
|
||
provides: | ||
- bin/ghc | ||
- bin/ghc-{{version.marketing}} | ||
- bin/ghc-{{version}} | ||
- bin/ghc-pkg | ||
- bin/ghc-pkg-{{version.marketing}} | ||
- bin/ghc-pkg-{{version}} | ||
- bin/ghci | ||
- bin/ghci-{{version.marketing}} | ||
- bin/ghci-{{version}} | ||
- bin/ghcup | ||
- bin/haddock | ||
- bin/haddock-{{version.marketing}} | ||
- bin/haddock-{{version}} | ||
- bin/hp2ps | ||
- bin/hp2ps-{{version.marketing}} | ||
- bin/hp2ps-{{version}} | ||
- bin/hpc | ||
- bin/hpc-{{version.marketing}} | ||
- bin/hpc-{{version}} | ||
- bin/hsc2hs | ||
- bin/hsc2hs-{{version.marketing}} | ||
- bin/hsc2hs-{{version}} | ||
- bin/runghc | ||
- bin/runghc-{{version.marketing}} | ||
- bin/runghc-{{version}} | ||
- bin/runhaskell | ||
- bin/runhaskell-{{version.marketing}} | ||
- bin/runhaskell-{{version}} | ||
|
||
|
||
dependencies: | ||
gnu.org/gmp: 6 | ||
invisible-island.net/ncurses: 6 | ||
tea.xyz/gx/cc: 'c99' # ghc uses this during builds | ||
sourceware.org/libffi: 3 | ||
|
||
warnings: | ||
- vendored | ||
|
||
build: | ||
dependencies: | ||
gnu.org/autoconf: ^2 | ||
gnu.org/automake: ^1 # `aclocal` is used during the build for some reason | ||
tea.xyz/gx/make: '*' #FIXME specifically, gnu make is *required* | ||
curl.se: '*' | ||
gnu.org/m4: '*' | ||
git-scm.org: ^2 | ||
python.org: ^3 | ||
gnu.org/patch: '*' | ||
linux: | ||
github.com/numactl/numactl: ^2 # ghcup needs this | ||
|
||
# `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" | ||
else | ||
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh | ||
fi | ||
PATH="$HOME/.ghcup/bin:$PATH" | ||
if test -e $HOME/.cabal/bin; then | ||
rm -r $HOME/.cabal/bin | ||
fi | ||
export PATH="$HOME/.cabal/bin:$PATH" | ||
GHC="$HOME/.ghcup/bin/ghc" | ||
# We need PIC on linux-x86_64 (it's already on the other | ||
# platforms). This does that. | ||
# https://www.hobson.space/posts/haskell-foreign-library/ | ||
sed -i.bak \ | ||
's/\((OSLinux, ArchAArch64) -> \[Opt_PIC, Opt_ExternalDynamicRefs\]\)/\1\n (OSLinux, ArchX86_64) -> \[Opt_PIC, Opt_ExternalDynamicRefs\]/' \ | ||
compiler/GHC/Driver/Session.hs | ||
rm compiler/GHC/Driver/Session.hs.bak | ||
./configure $ARGS | ||
hadrian/build $HADRIAN_ARGS install | ||
for shim in $(find "{{prefix}}/bin" -type f); do | ||
sed -i.bak -e 's_="{{prefix}}_="$(dirname $(dirname $0))_' $shim | ||
rm $shim.bak | ||
done | ||
sed -i.bak 's|{{tea.prefix}}|$TEA_PREFIX|g' "{{prefix}}/bin/hsc2hs-ghc-{{version}}" | ||
rm "{{prefix}}/bin/hsc2hs-ghc-{{version}}.bak" | ||
tea.xyz/gx/make: '*' | ||
script: | ||
- curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh | ||
- PATH={{prefix}}/.ghcup/bin:$PATH | ||
- ghcup install ghc {{version}} | ||
- ghcup set ghc {{version}} | ||
- run: ln -s .ghcup/* . | ||
working-directory: ${{prefix}} | ||
- run: | | ||
sed -i.bak -e "s|$TEA_PREFIX|\$TEA_PREFIX|g" *-{{version}} | ||
rm *.bak | ||
working-directory: ${{prefix}}/ghc/{{version}}/bin | ||
env: | ||
BOOTSTRAP_HASKELL_NONINTERACTIVE: 1 | ||
BOOTSTRAP_HASKELL_ADJUST_BASHRC: 0 | ||
BOOTSTRAP_HASKELL_GHC_VERSION: ${{version}} | ||
CONF_CC_OPTS_STAGE0: $CFLAGS | ||
CONF_CC_OPTS_STAGE1: $CFLAGS | ||
CONF_CC_OPTS_STAGE2: $CFLAGS | ||
CONF_GCC_LINKER_OPTS_STAGE0: $LDFLAGS | ||
CONF_GCC_LINKER_OPTS_STAGE1: $LDFLAGS | ||
CONF_GCC_LINKER_OPTS_STAGE2: $LDFLAGS | ||
# ChatGPT | ||
GHC_OPTIONS: -fPIC | ||
ARGS: | ||
- --prefix={{prefix}} | ||
- --disable-numa | ||
- --with-curses-includes={{deps.invisible-island.net/ncurses.prefix}}/include/ncursesw | ||
- --with-intree-gmp | ||
- --with-system-libffi | ||
HADRIAN_ARGS: | ||
- -j | ||
- --docs=none | ||
- --flavour=release | ||
- --prefix="{{prefix}}" | ||
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 | ||
BOOTSTRAP_HASKELL_NO_UPGRADE: 1 | ||
BOOTSTRAP_HASKELL_MINIMAL: 1 | ||
GHCUP_INSTALL_BASE_PREFIX: ${{prefix}} | ||
GHCUP_SKIP_UPDATE_CHECK: 1 | ||
|
||
test: | ||
script: | | ||
out=$(runghc $FIXTURE) | ||
test "$out" = "Hello World" | ||
script: | ||
- test "$(runghc $FIXTURE)" = "Hello World" | ||
fixture: | ||
main = putStrLn "Hello World" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,125 @@ | ||
### This was deprecated due to significant drift and revlock in | ||
### ghc's build system | ||
|
||
distributable: | ||
url: https://downloads.haskell.org/~ghc/{{version}}/ghc-{{version}}-src.tar.xz | ||
sig: "{{url}}.sig" | ||
strip-components: 1 | ||
|
||
versions: | ||
github: ghc/ghc/tags | ||
strip: | ||
- /^ghc-/ | ||
- /-release$/ | ||
ignore: [9.5.x, 9.6.x] #FIXME help us to build these! | ||
|
||
provides: | ||
- bin/ghc | ||
- bin/ghc-pkg | ||
- bin/ghci | ||
- bin/haddock | ||
- bin/hp2ps | ||
- bin/hpc | ||
- bin/hsc2hs | ||
- bin/runghc | ||
- bin/runhaskell | ||
|
||
dependencies: | ||
gnu.org/gmp: 6 | ||
invisible-island.net/ncurses: 6 | ||
tea.xyz/gx/cc: 'c99' # ghc uses this during builds | ||
sourceware.org/libffi: 3 | ||
|
||
build: | ||
dependencies: | ||
gnu.org/autoconf: ^2 | ||
gnu.org/automake: ^1 # `aclocal` is used during the build for some reason | ||
tea.xyz/gx/make: '*' #FIXME specifically, gnu make is *required* | ||
curl.se: '*' | ||
gnu.org/m4: '*' | ||
git-scm.org: ^2 | ||
python.org: ^3 | ||
gnu.org/patch: '*' | ||
linux: | ||
github.com/numactl/numactl: ^2 # ghcup needs this | ||
|
||
# `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" | ||
else | ||
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh | ||
fi | ||
|
||
PATH="$HOME/.ghcup/bin:$PATH" | ||
|
||
if test -e $HOME/.cabal/bin; then | ||
rm -r $HOME/.cabal/bin | ||
fi | ||
|
||
export PATH="$HOME/.cabal/bin:$PATH" | ||
GHC="$HOME/.ghcup/bin/ghc" | ||
|
||
# We need PIC on linux-x86_64 (it's already on the other | ||
# platforms). This does that. | ||
# https://www.hobson.space/posts/haskell-foreign-library/ | ||
|
||
sed -i.bak \ | ||
's/\((OSLinux, ArchAArch64) -> \[Opt_PIC, Opt_ExternalDynamicRefs\]\)/\1\n (OSLinux, ArchX86_64) -> \[Opt_PIC, Opt_ExternalDynamicRefs\]/' \ | ||
compiler/GHC/Driver/Session.hs | ||
rm compiler/GHC/Driver/Session.hs.bak | ||
|
||
./configure $ARGS | ||
hadrian/build $HADRIAN_ARGS install | ||
|
||
for shim in $(find "{{prefix}}/bin" -type f); do | ||
sed -i.bak -e 's_="{{prefix}}_="$(dirname $(dirname $0))_' $shim | ||
rm $shim.bak | ||
done | ||
|
||
sed -i.bak 's|{{tea.prefix}}|$TEA_PREFIX|g' "{{prefix}}/bin/hsc2hs-ghc-{{version}}" | ||
rm "{{prefix}}/bin/hsc2hs-ghc-{{version}}.bak" | ||
env: | ||
BOOTSTRAP_HASKELL_NONINTERACTIVE: 1 | ||
BOOTSTRAP_HASKELL_ADJUST_BASHRC: 0 | ||
BOOTSTRAP_HASKELL_GHC_VERSION: ${{version}} | ||
CONF_CC_OPTS_STAGE0: $CFLAGS | ||
CONF_CC_OPTS_STAGE1: $CFLAGS | ||
CONF_CC_OPTS_STAGE2: $CFLAGS | ||
CONF_GCC_LINKER_OPTS_STAGE0: $LDFLAGS | ||
CONF_GCC_LINKER_OPTS_STAGE1: $LDFLAGS | ||
CONF_GCC_LINKER_OPTS_STAGE2: $LDFLAGS | ||
# ChatGPT | ||
GHC_OPTIONS: -fPIC | ||
ARGS: | ||
- --prefix={{prefix}} | ||
- --disable-numa | ||
- --with-curses-includes={{deps.invisible-island.net/ncurses.prefix}}/include/ncursesw | ||
- --with-intree-gmp | ||
- --with-system-libffi | ||
HADRIAN_ARGS: | ||
- -j | ||
- --docs=none | ||
- --flavour=release | ||
- --prefix="{{prefix}}" | ||
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: | | ||
out=$(runghc $FIXTURE) | ||
test "$out" = "Hello World" | ||
fixture: | ||
main = putStrLn "Hello World" |