Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 28 additions & 3 deletions .gitlab-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ variables:
DOCKER_REV: "853f348f9caf38b08740b280296fbd34e09abb3a"

GHC_VERSION: 8.10.7
CABAL_INSTALL_VERSION: 3.2.0.0
CABAL_INSTALL_VERSION: 3.4.0.0

workflow:
rules:
Expand Down Expand Up @@ -48,14 +48,39 @@ build-x86_64-linux-alpine:
build-x86_64-freebsd:
extends: .build
tags:
- x86_64-freebsd
- x86_64-freebsd13

build-x86_64-darwin:
extends: .build
tags:
- x86_64-darwin

build-aarch64-darwin:
tags:
- aarch64-darwin-m1
script: |
set -Eeuo pipefail
function runInNixShell() {
time nix-shell $CI_PROJECT_DIR/.gitlab/shell.nix \
-I nixpkgs=https://github.com/angerman/nixpkgs/archive/75f7281738b.tar.gz \
--argstr system "aarch64-darwin" \
--pure \
--keep CI_PROJECT_DIR \
--keep MACOSX_DEPLOYMENT_TARGET \
--keep GHC_VERSION \
--keep CABAL_INSTALL_VERSION \
--run "$1" 2>&1
}
runInNixShell "cabal update && mkdir vendored && cd vendored && cabal unpack network-3.1.2.1 && cd network-3.1.2.1 && autoreconf -fi" 2>&1
runInNixShell "./.gitlab/ci.sh" 2>&1
variables:
MACOSX_DEPLOYMENT_TARGET: "10.7"
artifacts:
expire_in: 2 week
paths:
- out

build-x86_64-windows:
extends: .build
tags:
- new-x86_64-windows
- new-x86_64-windows
112 changes: 22 additions & 90 deletions .gitlab/ci.sh
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -2,110 +2,42 @@

set -Eeuo pipefail

TOP="$(pwd)"
source "$TOP/.gitlab/common.sh"
source "$CI_PROJECT_DIR/.gitlab/common.sh"

# We don't have sudo access in GitLab CI, so we can't just dump binaries in
# the usual PATH locations.
toolchain="$(pwd)/toolchain"
mkdir -p "$toolchain/bin"
export PATH="$toolchain/bin:$PATH"

export CABAL_DIR="$TOP/cabal"
mkdir -p "$CABAL_DIR"
export GHCUP_INSTALL_BASE_PREFIX="$CI_PROJECT_DIR/toolchain"
export CABAL_DIR="$CI_PROJECT_DIR/cabal"

# Platform-specific bits
MAKE="make"
case "$(uname)" in
MSYS_*|MINGW*)
CABAL_DIR="$(cygpath -w "$CABAL_DIR")"
;;
FreeBSD)
MAKE="gmake"
export CABAL_DIR="$(cygpath -w "$CABAL_DIR")"
GHCUP_BINDIR="${GHCUP_INSTALL_BASE_PREFIX}/ghcup/bin"
;;
*)
GHCUP_BINDIR="${GHCUP_INSTALL_BASE_PREFIX}/.ghcup/bin"
;;
esac

fetch_cabal_install_unix() {
local cabal_url="$1"
run curl -L -o cabal.tar.xz "$cabal_url"
run tar --directory "$toolchain/bin/" -xf cabal.tar.xz cabal
chmod +x "$toolchain/bin/cabal"
CABAL="$toolchain/bin/cabal"
}

setup_cabal_install() {
if [ -z "${CABAL:-}" ]; then
info "Fetching GHC..."
case "$(uname)" in
FreeBSD)
fetch_cabal_install_unix "https://hasufell.de/d/d3e215db133e4fcaa61e/files/?p=/cabal-install-$CABAL_INSTALL_VERSION-x86_64-portbld-freebsd.tar.xz&dl=1" ;;
Darwin)
fetch_cabal_install_unix "https://downloads.haskell.org/~cabal/cabal-install-$CABAL_INSTALL_VERSION/cabal-install-$CABAL_INSTALL_VERSION-x86_64-apple-darwin17.7.0.tar.xz" ;;
MSYS_*|MINGW*)
cabal_url="https://downloads.haskell.org/~cabal/cabal-install-$CABAL_INSTALL_VERSION/cabal-install-$CABAL_INSTALL_VERSION-x86_64-unknown-mingw32.zip"
run curl -L -o cabal.zip "$cabal_url"
run unzip cabal.zip
cp cabal.exe "$toolchain/bin/cabal.exe"
chmod +x "$toolchain/bin/cabal.exe"
CABAL="$toolchain/bin/cabal.exe"
;;
*) fail "no cabal-install bindist for $(uname)"
esac

fi
export CABAL
run "$CABAL" --version
}


fetch_ghc_unix() {
local ghc_url="$1"
run curl -sSfL -o ghc.tar.xz "$ghc_url"
run tar -xf ghc.tar.xz

pushd "ghc-${GHC_VERSION}"
run ./configure --prefix="$toolchain"
run "$MAKE" install
popd
GHC="$toolchain/bin/ghc"
}

setup_ghc() {
if [ -z "${GHC:-}" ]; then
info "Fetching GHC..."
case "$(uname)" in
FreeBSD)
fetch_ghc_unix "https://downloads.haskell.org/~ghc/$GHC_VERSION/ghc-$GHC_VERSION-x86_64-unknown-freebsd.tar.xz" ;;
Darwin)
fetch_ghc_unix "https://downloads.haskell.org/~ghc/$GHC_VERSION/ghc-$GHC_VERSION-x86_64-apple-darwin.tar.xz" ;;
MSYS_*|MINGW*)
ghc_url="https://downloads.haskell.org/~ghc/$GHC_VERSION/ghc-$GHC_VERSION-x86_64-unknown-mingw32.tar.xz"
run curl -sSfL -o ghc.tar.xz "$ghc_url"
run tar -xf ghc.tar.xz
cp -R ghc-$GHC_VERSION/* "$toolchain"
GHC="$toolchain/bin/ghc.exe"
run "$GHC" --version
GHC="$(cygpath -w $GHC)"
return
;;
*) fail "no GHC bindist for $(uname)"
esac
fi
mkdir -p "$CABAL_DIR"
mkdir -p "$GHCUP_BINDIR"
export PATH="$GHCUP_BINDIR:$PATH"

export GHC
run "$GHC" --version
}
export BOOTSTRAP_HASKELL_NONINTERACTIVE=1
export BOOTSTRAP_HASKELL_GHC_VERSION=$GHC_VERSION
export BOOTSTRAP_HASKELL_CABAL_VERSION=$CABAL_INSTALL_VERSION
export BOOTSTRAP_HASKELL_VERBOSE=1
export BOOTSTRAP_HASKELL_ADJUST_CABAL_CONFIG=yes

setup_cabal_install
setup_ghc
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh

run "$CABAL" update
run "$CABAL" v2-install cabal-install \
-w "$GHC" \
--installdir="$TOP/out" \
run cabal v2-install cabal-install \
-w "ghc-$GHC_VERSION" \
--installdir="$CI_PROJECT_DIR/out" \
--install-method=copy \
--overwrite-policy=always \
--enable-executable-static \
--disable-profiling \
--enable-split-sections \
--enable-executable-stripping

cp dist-newstyle/cache/plan.json "$CI_PROJECT_DIR/out/plan.json"
90 changes: 90 additions & 0 deletions .gitlab/shell.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
{ system ? "aarch64-darwin"
#, nixpkgs ? fetchTarball https://github.com/angerman/nixpkgs/archive/257cb120334.tar.gz #apple-silicon.tar.gz
, pkgs ? import <nixpkgs> { inherit system; }
, compiler ? if system == "aarch64-darwin" then "ghc8103Binary" else "ghc8103"
}: pkgs.mkShell {
# this prevents nix from trying to write the env-vars file.
# we can't really, as NIX_BUILD_TOP/env-vars is not set.
noDumpEnvVars=1;

# stop polluting LDFLAGS with -liconv
dontAddExtraLibs = true;

# we need to inject ncurses into --with-curses-libraries.
# the real fix is to teach terminfo to use libcurses on macOS.
# CONFIGURE_ARGS = "--with-intree-gmp --with-curses-libraries=${pkgs.ncurses.out}/lib";
CONFIGURE_ARGS = "--with-intree-gmp --with-curses-libraries=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib --with-iconv-includes=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include --with-iconv-libraries=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib SH=/bin/bash";

# magic speedup pony :facepalm:
#
# nix has the ugly habbit of duplicating ld flags more than necessary. This
# somewhat consolidates this.
shellHook = ''
export NIX_LDFLAGS=$(for a in $NIX_LDFLAGS; do echo $a; done |sort|uniq|xargs)
export NIX_LDFLAGS_FOR_TARGET=$(for a in $NIX_LDFLAGS_FOR_TARGET; do echo $a; done |sort|uniq|xargs)
export NIX_LDFLAGS_FOR_TARGET=$(comm -3 <(for l in $NIX_LDFLAGS_FOR_TARGET; do echo $l; done) <(for l in $NIX_LDFLAGS; do echo $l; done))


# Impurity hack for GHC releases.
#################################
# We don't want binary releases to depend on nix, thus we'll need to make sure we don't leak in references.
# GHC externally depends only on iconv and curses. However we can't force a specific curses library for
# the terminfo package, as such we'll need to make sure we only look in the system path for the curses library
# and not pick up the tinfo from the nix provided ncurses package.
#
# We also need to force us to use the systems COREFOUNDATION, not the one that nix builds. Again this is impure,
# but it will allow us to have proper binary distributions.
#
# do not use nixpkgs provided core foundation
export NIX_COREFOUNDATION_RPATH=/System/Library/Frameworks
# drop curses from the LDFLAGS, we really want the system ones, not the nix ones.
export NIX_LDFLAGS=$(for lib in $NIX_LDFLAGS; do case "$lib" in *curses*);; *) echo -n "$lib ";; esac; done;)
export NIX_CFLAGS_COMPILE+=" -Wno-nullability-completeness -Wno-availability -Wno-expansion-to-defined -Wno-builtin-requires-header -Wno-unused-command-line-argument"

# unconditionally add the MacOSX.sdk and TargetConditional.h
export NIX_CFLAGS_COMPILE+=" -isystem /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include"
export NIX_LDFLAGS="-L/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib $NIX_LDFLAGS"

'';

nativeBuildInputs = (with pkgs; [
# This needs to come *before* ghc,
# otherwise we migth end up with the clang from
# the bootstrap GHC in PATH with higher priority.
clang_11
llvm_11

haskell.compiler.${compiler}
haskell.packages.${compiler}.cabal-install
haskell.packages.${compiler}.alex
haskell.packages.${compiler}.happy # _1_19_12 is needed for older GHCs.

automake
autoconf
m4

gmp
zlib.out
zlib.dev
glibcLocales
# locale doesn't build yet :-/
# locale

git

python3
# python3Full
# python3Packages.sphinx
perl

which
wget
curl
file

xz
xlibs.lndir

cacert ])
++ (with pkgs.darwin.apple_sdk.frameworks; [ Foundation Security ]);
}
3 changes: 1 addition & 2 deletions cabal.project
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ packages: cabal-benchmarks/

packages: vendor/cabal-doctest-1.0.8

-- Uncomment to allow picking up extra local unpacked deps:
--optional-packages: */
optional-packages: ./vendored/*/*.cabal

-- Remove after hackage-repo-tool release
allow-newer:
Expand Down