From 8bceeb85b80fd87daaa5ec29ad67c2d443f6d52f Mon Sep 17 00:00:00 2001
From: Olivier Benz <olivier.benz@b-data.ch>
Date: Tue, 17 Dec 2024 10:29:04 +0100
Subject: [PATCH] Freeze GHC v9.10.1

---
 .gitlab-ci.yml          |   2 +-
 prior/9.10.1.Dockerfile | 215 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 216 insertions(+), 1 deletion(-)
 create mode 100644 prior/9.10.1.Dockerfile

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 7b91ccf..70ed22e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -6,7 +6,7 @@
     HLS_VERSION: "2.10.0.0"
     BUILD_GHC: "true"
     BUILD_HLS: "false"
-    TAG_VERSION_MAJ_MIN: "false"
+    TAG_VERSION_MAJ_MIN: "true"
     TAG_VERSION_MAJ: "false"
     TAG_HLS_LATEST: "true"
 
diff --git a/prior/9.10.1.Dockerfile b/prior/9.10.1.Dockerfile
new file mode 100644
index 0000000..335a887
--- /dev/null
+++ b/prior/9.10.1.Dockerfile
@@ -0,0 +1,215 @@
+ARG GHC_VERSION=9.10.1
+ARG CABAL_VERSION=3.12.1.0
+ARG STACK_VERSION=3.1.1
+
+ARG GHC_VERSION_BUILD=${GHC_VERSION}
+ARG CABAL_VERSION_BUILD=${CABAL_VERSION}
+
+FROM glcr.b-data.ch/ghc/ghc-musl:9.8.2-linux-amd64 AS bootstrap-amd64
+FROM glcr.b-data.ch/ghc/ghc-musl:9.8.2-linux-arm64v8 AS bootstrap-arm64
+FROM glcr.b-data.ch/ghc/ghc-musl:9.8.2-linux-riscv64 AS bootstrap-riscv64
+## linux/riscv64 bootstrap image: binutils-gold n/a; numactl-dev pre-installed
+
+FROM bootstrap-${TARGETARCH}${TARGETVARIANT} AS bootstrap
+
+RUN case "$(uname -m)" in \
+    x86_64) linker="gold" ;; \
+    aarch64) linker="gold" ;; \
+  esac \
+  && apk upgrade --no-cache \
+  && apk add --no-cache \
+    autoconf \
+    automake \
+    binutils${linker:+-}${linker} \
+    build-base \
+    clang18 \
+    coreutils \
+    cpio \
+    curl \
+    gnupg \
+    linux-headers \
+    libffi-dev \
+    llvm18 \
+    ncurses-dev \
+    perl \
+    python3 \
+    xz \
+    zlib-dev
+
+FROM bootstrap AS bootstrap-ghc
+
+ARG GHC_VERSION_BUILD
+
+ENV GHC_VERSION=${GHC_VERSION_BUILD}
+
+COPY patches/${GHC_VERSION}.patch /tmp/
+
+RUN cd /tmp \
+  && curl -sSLO https://downloads.haskell.org/~ghc/"$GHC_VERSION"/ghc-"$GHC_VERSION"-src.tar.xz \
+  && curl -sSLO https://downloads.haskell.org/~ghc/"$GHC_VERSION"/ghc-"$GHC_VERSION"-src.tar.xz.sig \
+  && gpg --keyserver hkps://keyserver.ubuntu.com:443 \
+    --receive-keys FFEB7CE81E16A36B3E2DED6F2DE04D4E97DB64AD || \
+    gpg --keyserver hkp://keyserver.ubuntu.com:80 \
+    --receive-keys FFEB7CE81E16A36B3E2DED6F2DE04D4E97DB64AD \
+  && gpg --verify "ghc-$GHC_VERSION-src.tar.xz.sig" "ghc-$GHC_VERSION-src.tar.xz" \
+  && tar -xJf "ghc-$GHC_VERSION-src.tar.xz" \
+  && cd "ghc-$GHC_VERSION" \
+  ## Apply patch: Bump max LLVM version to 19 (not inclusive)
+  ## https://gitlab.haskell.org/ghc/ghc/-/merge_requests/12726
+  && mv "/tmp/$GHC_VERSION.patch" . \
+  && patch -p0 <"$GHC_VERSION.patch" \
+  ## Configure and build
+  && case "$(uname -m)" in \
+    riscv64) numa="no" ;; \
+  esac \
+  && ./boot.source \
+  && ./configure \
+    --build=$(uname -m)-alpine-linux \
+    --host=$(uname -m)-alpine-linux \
+    --target=$(uname -m)-alpine-linux \
+    --enable-numa=${numa:-auto} \
+  ## Use the LLVM backend
+  ## Switch llvm-targets from unknown-linux-gnueabihf->alpine-linux
+  ## so we can match the llvm vendor string alpine uses
+  && sed -i -e 's/unknown-linux-gnueabihf/alpine-linux/g' llvm-targets \
+  && sed -i -e 's/unknown-linux-gnueabi/alpine-linux/g' llvm-targets \
+  && sed -i -e 's/unknown-linux-gnu/alpine-linux/g' llvm-targets \
+  && cabal update \
+  && cabal install alex \
+  && export PATH=/root/.local/bin:$PATH \
+  ## See https://unix.stackexchange.com/questions/519092/what-is-the-logic-of-using-nproc-1-in-make-command
+  && hadrian/build binary-dist -j"$(($(nproc)+1))" \
+    --flavour=perf+llvm+split_sections \
+    --docs=none
+
+FROM bootstrap AS bootstrap-cabal
+
+ARG CABAL_VERSION_BUILD
+
+ENV CABAL_VERSION=${CABAL_VERSION_BUILD}
+
+## Build Cabal (the tool) with the GHC bootstrap version
+RUN cabal update \
+  ## See https://gitlab.haskell.org/ghc/ghc/-/wikis/commentary/libraries/version-history
+  && cabal install "cabal-install-$CABAL_VERSION"
+
+FROM alpine:3.21 AS ghc-base
+
+ARG IMAGE_LICENSE="MIT"
+ARG IMAGE_SOURCE="https://gitlab.b-data.ch/ghc/ghc-musl"
+ARG IMAGE_VENDOR="Olivier Benz"
+ARG IMAGE_AUTHORS="Olivier Benz <olivier.benz@b-data.ch>"
+
+LABEL org.opencontainers.image.licenses="$IMAGE_LICENSE" \
+      org.opencontainers.image.source="$IMAGE_SOURCE" \
+      org.opencontainers.image.vendor="$IMAGE_VENDOR" \
+      org.opencontainers.image.authors="$IMAGE_AUTHORS"
+
+ARG GHC_VERSION_BUILD
+ARG CABAL_VERSION_BUILD
+ARG STACK_VERSION
+
+ENV GHC_VERSION=${GHC_VERSION_BUILD} \
+    CABAL_VERSION=${CABAL_VERSION_BUILD} \
+    STACK_VERSION=${STACK_VERSION}
+
+RUN apk add --no-cache \
+    bash \
+    build-base \
+    bzip2 \
+    bzip2-dev \
+    bzip2-static \
+    clang18 \
+    curl \
+    curl-static \
+    dpkg \
+    fakeroot \
+    git \
+    gmp-dev \
+    libcurl \
+    libffi \
+    libffi-dev \
+    llvm18 \
+    ncurses-dev \
+    ncurses-static \
+    openssl-dev \
+    openssl-libs-static \
+    pcre \
+    pcre-dev \
+    pcre2 \
+    pcre2-dev \
+    perl \
+    ## Install shadow for `stack --docker`
+    shadow \
+    wget \
+    xz \
+    xz-dev \
+    zlib \
+    zlib-dev \
+    zlib-static
+
+FROM ghc-base AS ghc-stage1
+
+COPY --from=bootstrap-ghc /tmp/ghc-"$GHC_VERSION"/_build/bindist/ghc-"$GHC_VERSION"-*-alpine-linux.tar.xz /tmp/
+
+RUN cd /tmp \
+  ## Install GHC
+  && tar -xJf ghc-"$GHC_VERSION"-*-alpine-linux.tar.xz \
+  && cd ghc-"$GHC_VERSION"-*-alpine-linux \
+  && ./configure \
+  && make install \
+  ## Install Stack
+  && cd /tmp \
+  && if [ "$(uname -m)" = "riscv64" ]; then \
+    curl -sSLO https://gitlab.b-data.ch/commercialhaskell/stack/-/releases/v"$STACK_VERSION"/downloads/builds/stack-"$STACK_VERSION"-linux-"$(uname -m)".tar.gz; \
+    curl -sSLO https://gitlab.b-data.ch/commercialhaskell/stack/-/releases/v"$STACK_VERSION"/downloads/builds/stack-"$STACK_VERSION"-linux-"$(uname -m)".tar.gz.sha256; \
+  else \
+    curl -sSLO https://github.com/commercialhaskell/stack/releases/download/v"$STACK_VERSION"/stack-"$STACK_VERSION"-linux-"$(uname -m)".tar.gz; \
+    curl -sSLO https://github.com/commercialhaskell/stack/releases/download/v"$STACK_VERSION"/stack-"$STACK_VERSION"-linux-"$(uname -m)".tar.gz.sha256; \
+  fi \
+  && sha256sum -cs stack-"$STACK_VERSION"-linux-"$(uname -m)".tar.gz.sha256 \
+  && tar -xzf stack-"$STACK_VERSION"-linux-"$(uname -m)".tar.gz \
+  && mv stack-"$STACK_VERSION"-linux-"$(uname -m)"/stack /usr/local/bin/stack \
+  ## Clean up
+  && rm -rf /tmp/*
+
+FROM ghc-stage1 AS ghc-stage2
+
+## Install Cabal (the tool) built with the GHC bootstrap version
+COPY --from=bootstrap-cabal /root/.local/bin/cabal /usr/local/bin/cabal
+
+## Rebuild Cabal (the tool) with the GHC target version
+RUN if [ "$(uname -m)" = "riscv64" ]; then \
+    apk add --no-cache numactl-dev; \
+  fi \
+  && cabal update \
+  && cabal install "cabal-install-$CABAL_VERSION"
+
+FROM ghc-stage1 AS test
+
+WORKDIR /usr/local/src
+
+## Install Cabal (the tool) built with the GHC target version
+COPY --from=ghc-stage2 /root/.local/bin/cabal /usr/local/bin/cabal
+
+COPY Main.hs Main.hs
+
+RUN ghc -static -optl-pthread -optl-static Main.hs \
+  && file Main \
+  && ./Main \
+  ## Test cabal workflow
+  && mkdir cabal-test \
+  && cd cabal-test \
+  && cabal update \
+  && cabal init -n --is-executable -p tester -l MIT \
+  && cabal run
+
+FROM ghc-base
+
+## Install GHC and Stack
+COPY --from=ghc-stage1 /usr/local /usr/local
+
+## Install Cabal (the tool) built with the GHC target version
+COPY --from=ghc-stage2 /root/.local/bin/cabal /usr/local/bin/cabal
+
+CMD ["ghci"]
-- 
GitLab