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