diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index 044e7a6..53b1dc4 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -72,14 +72,22 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build and push + - name: Build and push (focal) uses: docker/build-push-action@v3 with: - context: ./docker/arm32v7 + context: ./docker/arm32v7/focal push: true tags: hasufell/arm32v7-ubuntu-haskell:focal platforms: linux/arm + - name: Build and push (bionic) + uses: docker/build-push-action@v3 + with: + context: ./docker/arm32v7/bionic + push: true + tags: hasufell/arm32v7-ubuntu-haskell:bionic + platforms: linux/arm + docker-aarch: runs-on: [self-hosted, Linux, ARM64] steps: @@ -100,10 +108,18 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build and push + - name: Build and push (focal) uses: docker/build-push-action@v3 with: - context: ./docker/arm64v8/ + context: ./docker/arm64v8/focal push: true tags: hasufell/arm64v8-ubuntu-haskell:focal platforms: linux/arm64 + + - name: Build and push (bionic) + uses: docker/build-push-action@v3 + with: + context: ./docker/arm64v8/bionic + push: true + tags: hasufell/arm64v8-ubuntu-haskell:bionic + platforms: linux/arm64 diff --git a/docker/arm32v7/bionic/Dockerfile b/docker/arm32v7/bionic/Dockerfile new file mode 100644 index 0000000..1e4467d --- /dev/null +++ b/docker/arm32v7/bionic/Dockerfile @@ -0,0 +1,64 @@ +FROM arm32v7/ubuntu:bionic + +ENV LANG C.UTF-8 +ENV DEBIAN_FRONTEND=noninteractive +ENV TZ=Asia/Singapore + +COPY update_opt.sh /usr/bin/update_opt.sh +RUN chmod +x /usr/bin/update_opt.sh + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + ca-certificates \ + curl \ + dirmngr \ + g++ \ + git \ + gnupg \ + libsqlite3-dev \ + libtinfo-dev \ + libgmp-dev \ + make \ + netbase \ + openssh-client \ + xz-utils \ + zlib1g-dev \ + libnuma-dev libgmp10 libssl-dev liblzma-dev libbz2-dev wget lsb-release software-properties-common apt-transport-https gcc autoconf automake build-essential gzip patchelf tree \ + llvm-9 clang-9 && \ + rm -rf /var/lib/apt/lists/* + +RUN update_opt.sh 9 1 + +ARG GHCUP_VERSION=0.1.17.8 +ARG GPG_KEY=7784930957807690A66EBDBE3786C5262ECB4A3F + +# install ghcup +RUN gpg --batch --keyserver keys.openpgp.org --recv-keys $GPG_KEY && \ + curl -sSfL -O https://downloads.haskell.org/~ghcup/$GHCUP_VERSION/armv7-linux-ghcup-$GHCUP_VERSION && \ + curl -sSfL -O https://downloads.haskell.org/~ghcup/$GHCUP_VERSION/SHA256SUMS && \ + curl -sSfL -O https://downloads.haskell.org/~ghcup/$GHCUP_VERSION/SHA256SUMS.sig && \ + gpg --verify SHA256SUMS.sig SHA256SUMS && \ + sha256sum -c --ignore-missing SHA256SUMS && \ + mv armv7-linux-ghcup-$GHCUP_VERSION /usr/bin/ghcup && \ + chmod +x /usr/bin/ghcup && \ + rm -rf SHA256SUMS SHA256SUMS.sig + +ARG GHC=8.10.7 +ARG CABAL_INSTALL=3.6.2.0 +ARG STACK=2.9.1 + +ENV GHCUP_CURL_OPTS="--silent" +ENV NO_COLOR=1 + +# install haskell toolchain +RUN ghcup config set gpg-setting GPGStrict && \ + ghcup --verbose install ghc --isolate=/usr --force ${GHC} && \ + ghcup --verbose install cabal --isolate=/usr/bin --force ${CABAL_INSTALL} && \ + find "/usr/lib/ghc-${GHC}/" \( -name "*_p.a" -o -name "*.p_hi" \) -type f -delete && \ + rm -r "/usr/share/doc/ghc-${GHC}" && \ + rm -rf /tmp/ghcup* && \ + ghcup gc -p -s -c -t + +ENV PATH /root/.cabal/bin:/root/.ghcup/bin:/root/.local/bin:$PATH + +CMD ["ghci"] diff --git a/docker/arm32v7/update_opt.sh b/docker/arm32v7/bionic/update_opt.sh similarity index 100% rename from docker/arm32v7/update_opt.sh rename to docker/arm32v7/bionic/update_opt.sh diff --git a/docker/arm32v7/Dockerfile b/docker/arm32v7/focal/Dockerfile similarity index 100% rename from docker/arm32v7/Dockerfile rename to docker/arm32v7/focal/Dockerfile diff --git a/docker/arm64v8/update_opt.sh b/docker/arm32v7/focal/update_opt.sh similarity index 100% rename from docker/arm64v8/update_opt.sh rename to docker/arm32v7/focal/update_opt.sh diff --git a/docker/arm64v8/bionic/Dockerfile b/docker/arm64v8/bionic/Dockerfile new file mode 100644 index 0000000..01627ca --- /dev/null +++ b/docker/arm64v8/bionic/Dockerfile @@ -0,0 +1,64 @@ +FROM arm64v8/ubuntu:bionic + +ENV LANG C.UTF-8 +ENV DEBIAN_FRONTEND=noninteractive +ENV TZ=Asia/Singapore + +COPY update_opt.sh /usr/bin/update_opt.sh +RUN chmod +x /usr/bin/update_opt.sh + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + ca-certificates \ + curl \ + dirmngr \ + g++ \ + git \ + gnupg \ + libsqlite3-dev \ + libtinfo-dev \ + libgmp-dev \ + make \ + netbase \ + openssh-client \ + xz-utils \ + zlib1g-dev \ + libnuma-dev libgmp10 libssl-dev liblzma-dev libbz2-dev wget lsb-release software-properties-common apt-transport-https gcc autoconf automake build-essential gzip patchelf tree \ + llvm-9 clang-9 && \ + rm -rf /var/lib/apt/lists/* + +RUN update_opt.sh 9 1 + +ARG GHCUP_VERSION=0.1.18.0 +ARG GPG_KEY=7784930957807690A66EBDBE3786C5262ECB4A3F + +# install ghcup +RUN gpg --batch --keyserver keys.openpgp.org --recv-keys $GPG_KEY && \ + curl -sSfL -O https://downloads.haskell.org/~ghcup/$GHCUP_VERSION/aarch64-linux-ghcup-$GHCUP_VERSION && \ + curl -sSfL -O https://downloads.haskell.org/~ghcup/$GHCUP_VERSION/SHA256SUMS && \ + curl -sSfL -O https://downloads.haskell.org/~ghcup/$GHCUP_VERSION/SHA256SUMS.sig && \ + gpg --verify SHA256SUMS.sig SHA256SUMS && \ + sha256sum -c --ignore-missing SHA256SUMS && \ + mv aarch64-linux-ghcup-$GHCUP_VERSION /usr/bin/ghcup && \ + chmod +x /usr/bin/ghcup && \ + rm -rf SHA256SUMS SHA256SUMS.sig + +ARG GHC=8.10.7 +ARG CABAL_INSTALL=3.6.2.0 +ARG STACK=2.9.1 + +ENV GHCUP_CURL_OPTS="--silent" +ENV NO_COLOR=1 + +# install haskell toolchain +RUN ghcup config set gpg-setting GPGStrict && \ + ghcup --verbose install ghc --isolate=/usr --force ${GHC} && \ + ghcup --verbose install cabal --isolate=/usr/bin --force ${CABAL_INSTALL} && \ + find "/usr/lib/ghc-${GHC}/" \( -name "*_p.a" -o -name "*.p_hi" \) -type f -delete && \ + rm -r "/usr/share/doc/ghc-${GHC}" && \ + rm -rf /tmp/ghcup* && \ + ghcup gc -p -s -c -t + +ENV PATH /root/.cabal/bin:/root/.ghcup/bin:/root/.local/bin:$PATH + +CMD ["ghci"] diff --git a/docker/arm64v8/bionic/update_opt.sh b/docker/arm64v8/bionic/update_opt.sh new file mode 100755 index 0000000..924e756 --- /dev/null +++ b/docker/arm64v8/bionic/update_opt.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# update_alternatives.sh + +update_alternatives() { + local version=${1} + local priority=${2} + local master=${3} + local slaves=${4} + local path=${5} + local cmdln + + cmdln="--verbose --install ${path}${master} ${master} ${path}${master}-${version} ${priority}" + for slave in ${slaves}; do + cmdln="${cmdln} --slave ${path}${slave} ${slave} ${path}${slave}-${version}" + done + update-alternatives ${cmdln} +} + +if [[ ${#} -ne 2 ]]; then + echo usage: "${0}" clang_version priority + exit 1 +fi + +version=${1} +priority=${2} +path="/usr/bin/" + +master="llvm-config" +slaves="llvm-addr2line llvm-ar llvm-as llvm-bcanalyzer llvm-bitcode-strip llvm-cat llvm-cfi-verify llvm-cov llvm-c-test llvm-cvtres llvm-cxxdump llvm-cxxfilt llvm-cxxmap llvm-debuginfod llvm-debuginfod-find llvm-diff llvm-dis llvm-dlltool llvm-dwarfdump llvm-dwarfutil llvm-dwp llvm-exegesis llvm-extract llvm-gsymutil llvm-ifs llvm-install-name-tool llvm-jitlink llvm-jitlink-executor llvm-lib llvm-libtool-darwin llvm-link llvm-lipo llvm-lto llvm-lto2 llvm-mc llvm-mca llvm-ml llvm-modextract llvm-mt llvm-nm llvm-objcopy llvm-objdump llvm-omp-device-info llvm-opt-report llvm-otool llvm-pdbutil llvm-PerfectShuffle llvm-profdata llvm-profgen llvm-ranlib llvm-rc llvm-readelf llvm-readobj llvm-reduce llvm-remark-size-diff llvm-rtdyld llvm-sim llvm-size llvm-split llvm-stress llvm-strings llvm-strip llvm-symbolizer llvm-tapi-diff llvm-tblgen llvm-tli-checker llvm-undname llvm-windres llvm-xray" + +update_alternatives "${version}" "${priority}" "${master}" "${slaves}" "${path}" + +master="clang" +slaves="analyze-build asan_symbolize bugpoint c-index-test clang++ clang-apply-replacements clang-change-namespace clang-check clang-cl clang-cpp clangd clang-doc clang-extdef-mapping clang-format clang-format-diff clang-include-fixer clang-linker-wrapper clang-move clang-nvlink-wrapper clang-offload-bundler clang-offload-packager clang-offload-wrapper clang-pseudo clang-query clang-refactor clang-rename clang-reorder-fields clang-repl clang-scan-deps clang-tidy count diagtool dsymutil FileCheck find-all-symbols git-clang-format hmaptool hwasan_symbolize intercept-build ld64.lld ld.lld llc lld lldb lldb-argdumper lldb-instr lldb-server lldb-vscode lld-link lli lli-child-target modularize not obj2yaml opt pp-trace run-clang-tidy sancov sanstats scan-build scan-build-py scan-view split-file UnicodeNameMappingGenerator verify-uselistorder wasm-ld yaml2obj yaml-bench" + +update_alternatives "${version}" "${priority}" "${master}" "${slaves}" "${path}" diff --git a/docker/arm64v8/Dockerfile b/docker/arm64v8/focal/Dockerfile similarity index 100% rename from docker/arm64v8/Dockerfile rename to docker/arm64v8/focal/Dockerfile diff --git a/docker/arm64v8/focal/update_opt.sh b/docker/arm64v8/focal/update_opt.sh new file mode 100755 index 0000000..924e756 --- /dev/null +++ b/docker/arm64v8/focal/update_opt.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# update_alternatives.sh + +update_alternatives() { + local version=${1} + local priority=${2} + local master=${3} + local slaves=${4} + local path=${5} + local cmdln + + cmdln="--verbose --install ${path}${master} ${master} ${path}${master}-${version} ${priority}" + for slave in ${slaves}; do + cmdln="${cmdln} --slave ${path}${slave} ${slave} ${path}${slave}-${version}" + done + update-alternatives ${cmdln} +} + +if [[ ${#} -ne 2 ]]; then + echo usage: "${0}" clang_version priority + exit 1 +fi + +version=${1} +priority=${2} +path="/usr/bin/" + +master="llvm-config" +slaves="llvm-addr2line llvm-ar llvm-as llvm-bcanalyzer llvm-bitcode-strip llvm-cat llvm-cfi-verify llvm-cov llvm-c-test llvm-cvtres llvm-cxxdump llvm-cxxfilt llvm-cxxmap llvm-debuginfod llvm-debuginfod-find llvm-diff llvm-dis llvm-dlltool llvm-dwarfdump llvm-dwarfutil llvm-dwp llvm-exegesis llvm-extract llvm-gsymutil llvm-ifs llvm-install-name-tool llvm-jitlink llvm-jitlink-executor llvm-lib llvm-libtool-darwin llvm-link llvm-lipo llvm-lto llvm-lto2 llvm-mc llvm-mca llvm-ml llvm-modextract llvm-mt llvm-nm llvm-objcopy llvm-objdump llvm-omp-device-info llvm-opt-report llvm-otool llvm-pdbutil llvm-PerfectShuffle llvm-profdata llvm-profgen llvm-ranlib llvm-rc llvm-readelf llvm-readobj llvm-reduce llvm-remark-size-diff llvm-rtdyld llvm-sim llvm-size llvm-split llvm-stress llvm-strings llvm-strip llvm-symbolizer llvm-tapi-diff llvm-tblgen llvm-tli-checker llvm-undname llvm-windres llvm-xray" + +update_alternatives "${version}" "${priority}" "${master}" "${slaves}" "${path}" + +master="clang" +slaves="analyze-build asan_symbolize bugpoint c-index-test clang++ clang-apply-replacements clang-change-namespace clang-check clang-cl clang-cpp clangd clang-doc clang-extdef-mapping clang-format clang-format-diff clang-include-fixer clang-linker-wrapper clang-move clang-nvlink-wrapper clang-offload-bundler clang-offload-packager clang-offload-wrapper clang-pseudo clang-query clang-refactor clang-rename clang-reorder-fields clang-repl clang-scan-deps clang-tidy count diagtool dsymutil FileCheck find-all-symbols git-clang-format hmaptool hwasan_symbolize intercept-build ld64.lld ld.lld llc lld lldb lldb-argdumper lldb-instr lldb-server lldb-vscode lld-link lli lli-child-target modularize not obj2yaml opt pp-trace run-clang-tidy sancov sanstats scan-build scan-build-py scan-view split-file UnicodeNameMappingGenerator verify-uselistorder wasm-ld yaml2obj yaml-bench" + +update_alternatives "${version}" "${priority}" "${master}" "${slaves}" "${path}"