Brand New Build!
Features Linux x86_64 docker builds for all archs
This commit is contained in:
parent
15ff87cf80
commit
b9b6975bfa
|
@ -1,73 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
build_linux() {
|
|
||||||
# Linux Docker image
|
|
||||||
name="$DOCKER_BASE"
|
|
||||||
DOCKER_BUILDS="$DOCKER_BUILDS $name"
|
|
||||||
docker build -t "$name:current" .
|
|
||||||
docker run "$name:current" --version
|
|
||||||
printf '%s\n' "#!/bin/sh" "echo 'hello world'" > myscript
|
|
||||||
docker run -v "$PWD:/mnt" "$name:current" myscript
|
|
||||||
|
|
||||||
# Copy static executable from docker image
|
|
||||||
id=$(docker create "$name:current")
|
|
||||||
docker cp "$id:/bin/shellcheck" "shellcheck"
|
|
||||||
docker rm "$id"
|
|
||||||
ls -l shellcheck
|
|
||||||
./shellcheck myscript
|
|
||||||
for tag in $TAGS
|
|
||||||
do
|
|
||||||
cp "shellcheck" "deploy/shellcheck-$tag.linux-x86_64";
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
build_aarch64() {
|
|
||||||
# Linux aarch64 static executable
|
|
||||||
docker run -v "$PWD:/mnt" koalaman/aarch64-builder 'buildsc'
|
|
||||||
for tag in $TAGS
|
|
||||||
do
|
|
||||||
cp "shellcheck" "deploy/shellcheck-$tag.linux-aarch64"
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
build_armv6hf() {
|
|
||||||
# Linux armv6hf static executable
|
|
||||||
docker run -v "$PWD:/mnt" koalaman/armv6hf-builder -c 'compile-shellcheck'
|
|
||||||
for tag in $TAGS
|
|
||||||
do
|
|
||||||
cp "shellcheck" "deploy/shellcheck-$tag.linux-armv6hf";
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
build_windows() {
|
|
||||||
# Windows .exe
|
|
||||||
docker run -v "$PWD:/appdata" koalaman/winghc cuib
|
|
||||||
for tag in $TAGS
|
|
||||||
do
|
|
||||||
cp "dist/build/ShellCheck/shellcheck.exe" "deploy/shellcheck-$tag.exe";
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
build_osx() {
|
|
||||||
# Darwin x86_64 executable
|
|
||||||
brew update
|
|
||||||
brew install cabal-install pandoc gnu-tar
|
|
||||||
sudo ln -sf /usr/local/bin/gsha512sum /usr/local/bin/sha512sum
|
|
||||||
sudo ln -sf /usr/local/bin/gtar /usr/local/bin/tar
|
|
||||||
export PATH="/usr/local/bin:$PATH"
|
|
||||||
|
|
||||||
cabal update
|
|
||||||
cabal install --dependencies-only
|
|
||||||
cabal build shellcheck
|
|
||||||
|
|
||||||
# Cabal 3 no longer has a predictable output path
|
|
||||||
path="$(find . -name 'shellcheck' -type f -perm +111)"
|
|
||||||
[[ -e "$path" ]]
|
|
||||||
|
|
||||||
for tag in $TAGS
|
|
||||||
do
|
|
||||||
cp "$path" "deploy/shellcheck-$tag.darwin-x86_64";
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,124 @@
|
||||||
|
name: Build Lol
|
||||||
|
|
||||||
|
# Run this workflow every time a new commit pushed to your repository
|
||||||
|
on: push
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
package_source:
|
||||||
|
name: Package Source Code
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Install Dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-mark manual ghc # Don't bother installing ghc just to tar up source
|
||||||
|
sudo apt-get install cabal-install
|
||||||
|
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Package Source
|
||||||
|
run: |
|
||||||
|
mkdir source
|
||||||
|
cabal sdist
|
||||||
|
mv dist/*.tar.gz source/source.tar.gz
|
||||||
|
|
||||||
|
- name: Deduce tags
|
||||||
|
run: |
|
||||||
|
exec > source/tags
|
||||||
|
echo "latest"
|
||||||
|
if tag=$(git describe --exact-match --tags)
|
||||||
|
then
|
||||||
|
echo "stable"
|
||||||
|
echo "$tag"
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: source
|
||||||
|
path: source/
|
||||||
|
|
||||||
|
build_source:
|
||||||
|
name: Build Source Code
|
||||||
|
needs: package_source
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
build: [linux.x86_64, linux.aarch64, linux.armv6hf, darwin.x86_64, windows.x86_64]
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Download artifacts
|
||||||
|
uses: actions/download-artifact@v2
|
||||||
|
|
||||||
|
- name: Build source
|
||||||
|
run: |
|
||||||
|
mkdir -p bin
|
||||||
|
mkdir -p bin/${{matrix.build}}
|
||||||
|
( cd bin && ../build/run_builder ../source/source.tar.gz ../build/${{matrix.build}} )
|
||||||
|
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: bin
|
||||||
|
path: bin/
|
||||||
|
|
||||||
|
package_binary:
|
||||||
|
name: Package Binaries
|
||||||
|
needs: build_source
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Download artifacts
|
||||||
|
uses: actions/download-artifact@v2
|
||||||
|
|
||||||
|
- name: Work around GitHub permissions bug
|
||||||
|
run: chmod +x bin/*/shellcheck*
|
||||||
|
|
||||||
|
- name: Package binaries
|
||||||
|
run: |
|
||||||
|
export TAGS="$(cat source/tags)"
|
||||||
|
mkdir -p deploy
|
||||||
|
cp -r bin/* deploy
|
||||||
|
cd deploy
|
||||||
|
../.prepare_deploy
|
||||||
|
rm -rf */ README* LICENSE*
|
||||||
|
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: deploy
|
||||||
|
path: deploy/
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
name: Deploy binaries
|
||||||
|
needs: package_binary
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
environment: Deploy
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Download artifacts
|
||||||
|
uses: actions/download-artifact@v2
|
||||||
|
|
||||||
|
- name: Upload to GitHub
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
export TAGS="$(cat source/tags)"
|
||||||
|
./.github_deploy
|
||||||
|
|
||||||
|
- name: Upload to Docker Hub
|
||||||
|
env:
|
||||||
|
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
|
||||||
|
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
|
DOCKER_EMAIL: ${{ secrets.DOCKER_EMAIL }}
|
||||||
|
DOCKER_BASE: ${{ secrets.DOCKER_USERNAME }}/shellcheck
|
||||||
|
run: |
|
||||||
|
export TAGS="$(cat source/tags)"
|
||||||
|
( source ./.multi_arch_docker && set -eux && multi_arch_docker::main )
|
|
@ -2,39 +2,10 @@
|
||||||
set -x
|
set -x
|
||||||
shopt -s extglob
|
shopt -s extglob
|
||||||
|
|
||||||
if [[ "$TRAVIS_SECURE_ENV_VARS" != "true" ]]
|
|
||||||
then
|
|
||||||
echo >&2 "Missing TRAVIS_SECURE_ENV_VARS. Skipping GitHub deployment."
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
install_deps() {
|
|
||||||
version="2.7.0" # 2.14.1 fails to overwrite duplicates
|
|
||||||
case "$(uname)" in
|
|
||||||
Linux)
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install curl
|
|
||||||
curl -L "https://github.com/github/hub/releases/download/v$version/hub-linux-amd64-$version.tgz" | tar xvz --strip-components=1 "hub-linux-amd64-$version/bin/hub"
|
|
||||||
;;
|
|
||||||
Darwin)
|
|
||||||
curl -L "https://github.com/github/hub/releases/download/v$version/hub-darwin-amd64-$version.tgz" | tar xvz --strip-components=1 "hub-darwin-amd64-$version/bin/hub"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Unknown: $(uname)"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
hub_path="$PWD/bin/hub"
|
|
||||||
hub() {
|
|
||||||
"$hub_path" "$@"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
install_deps
|
|
||||||
|
|
||||||
export EDITOR="touch"
|
export EDITOR="touch"
|
||||||
|
|
||||||
# Sanity check
|
# Sanity check
|
||||||
|
gh --version || exit 1
|
||||||
hub release show latest || exit 1
|
hub release show latest || exit 1
|
||||||
|
|
||||||
for tag in $TAGS
|
for tag in $TAGS
|
||||||
|
@ -51,8 +22,8 @@ do
|
||||||
do
|
do
|
||||||
[[ $file == *.@(xz|gz|zip) ]] || continue
|
[[ $file == *.@(xz|gz|zip) ]] || continue
|
||||||
[[ $file == *"$tag"* ]] || continue
|
[[ $file == *"$tag"* ]] || continue
|
||||||
files+=(-a "$file")
|
files+=("$file")
|
||||||
done
|
done
|
||||||
hub release edit "${files[@]}" "$tag" || exit 1
|
gh release upload "$tag" "${files[@]}" --clobber || exit 1
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,6 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# This script builds and deploys multi-architecture docker images from the
|
# This script builds and deploys multi-architecture docker images from the
|
||||||
# binaries previously built and deployed to GCS by the Travis pipeline.
|
# binaries previously built and deployed to GitHub.
|
||||||
|
|
||||||
if [[ "$TRAVIS_SECURE_ENV_VARS" != "true" ]]
|
|
||||||
then
|
|
||||||
echo >&2 "Missing TRAVIS_SECURE_ENV_VARS. Skipping Docker builds."
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
function multi_arch_docker::install_docker_buildx() {
|
function multi_arch_docker::install_docker_buildx() {
|
||||||
# Install up-to-date version of docker, with buildx support.
|
# Install up-to-date version of docker, with buildx support.
|
||||||
|
@ -108,6 +102,5 @@ function multi_arch_docker::main() {
|
||||||
multi_arch_docker::install_docker_buildx
|
multi_arch_docker::install_docker_buildx
|
||||||
multi_arch_docker::login_to_docker_hub
|
multi_arch_docker::login_to_docker_hub
|
||||||
multi_arch_docker::build_and_push_all
|
multi_arch_docker::build_and_push_all
|
||||||
set +x
|
|
||||||
multi_arch_docker::test_all
|
multi_arch_docker::test_all
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# This script packages up Travis compiled binaries
|
# This script packages up compiled binaries
|
||||||
set -ex
|
set -ex
|
||||||
shopt -s nullglob extglob
|
shopt -s nullglob extglob
|
||||||
cd deploy
|
|
||||||
|
ls -l
|
||||||
|
|
||||||
cp ../LICENSE LICENSE.txt
|
cp ../LICENSE LICENSE.txt
|
||||||
sed -e $'s/$/\r/' > README.txt << END
|
sed -e $'s/$/\r/' > README.txt << END
|
||||||
|
@ -22,26 +23,31 @@ This binary was compiled on $(date -u).
|
||||||
$(git log -n 3)
|
$(git log -n 3)
|
||||||
END
|
END
|
||||||
|
|
||||||
for file in ./*.exe
|
for dir in */
|
||||||
do
|
do
|
||||||
zip "${file%.*}.zip" README.txt LICENSE.txt "$file"
|
cp LICENSE.txt README.txt "$dir"
|
||||||
done
|
done
|
||||||
|
|
||||||
for file in *.{linux,darwin}-*
|
echo "Tags are $TAGS"
|
||||||
|
|
||||||
|
for tag in $TAGS
|
||||||
do
|
do
|
||||||
base="${file%.*}"
|
|
||||||
ext="${file##*.}"
|
for dir in windows.*/
|
||||||
os="${ext%-*}"
|
do
|
||||||
arch="${ext##*-}"
|
( cd "$dir" && zip "../shellcheck-$tag.zip" * )
|
||||||
cp "$file" "shellcheck"
|
|
||||||
tar -cJf "$base.$os.$arch.tar.xz" --transform="s:^:$base/:" README.txt LICENSE.txt shellcheck
|
|
||||||
rm "shellcheck"
|
|
||||||
done
|
done
|
||||||
|
|
||||||
rm !(*.xz|*.zip)
|
for dir in {linux,darwin}.*/
|
||||||
|
do
|
||||||
|
base="${dir%/}"
|
||||||
|
( cd "$dir" && tar -cJf "../shellcheck-$tag.$base.tar.xz" --transform="s:^:shellcheck-$tag/:" * )
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
for file in ./*
|
for file in ./*
|
||||||
do
|
do
|
||||||
|
[[ -f "$file" ]] || continue
|
||||||
sha512sum "$file" > "$file.sha512sum"
|
sha512sum "$file" > "$file.sha512sum"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
97
.travis.yml
97
.travis.yml
|
@ -1,97 +0,0 @@
|
||||||
language: shell
|
|
||||||
os: linux
|
|
||||||
|
|
||||||
services:
|
|
||||||
- docker
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
include:
|
|
||||||
- stage: Build
|
|
||||||
# This must weirdly not have a dash, otherwise an empty job is created
|
|
||||||
env: BUILD=linux
|
|
||||||
workspaces:
|
|
||||||
create:
|
|
||||||
name: ws-linux
|
|
||||||
paths: deploy
|
|
||||||
- env: BUILD=windows
|
|
||||||
workspaces:
|
|
||||||
create:
|
|
||||||
name: ws-windows
|
|
||||||
paths: deploy
|
|
||||||
- env: BUILD=armv6hf
|
|
||||||
workspaces:
|
|
||||||
create:
|
|
||||||
name: ws-armv6hf
|
|
||||||
paths: deploy
|
|
||||||
- env: BUILD=aarch64
|
|
||||||
workspaces:
|
|
||||||
create:
|
|
||||||
name: ws-aarch64
|
|
||||||
paths: deploy
|
|
||||||
- env: BUILD=osx
|
|
||||||
os: osx
|
|
||||||
workspaces:
|
|
||||||
create:
|
|
||||||
name: ws-osx
|
|
||||||
paths: deploy
|
|
||||||
|
|
||||||
- stage: Upload Artifacts to GitHub
|
|
||||||
workspaces:
|
|
||||||
use:
|
|
||||||
- ws-osx
|
|
||||||
- ws-linux
|
|
||||||
- ws-armv6hf
|
|
||||||
- ws-aarch64
|
|
||||||
- ws-windows
|
|
||||||
script:
|
|
||||||
- ls -la ${CASHER_DIR}/ || true
|
|
||||||
# Kludge broken TravisCI workspaces
|
|
||||||
- tar -xvf ${CASHER_DIR}/ws-osx-fetch.tgz --strip-components=5
|
|
||||||
- ls -la deploy
|
|
||||||
- ./.github_deploy
|
|
||||||
|
|
||||||
- stage: Deploy docker image
|
|
||||||
# Deploy only for pushes to master branch, not other branches, not PRs.
|
|
||||||
if: type = push
|
|
||||||
script:
|
|
||||||
- source ./.multi_arch_docker
|
|
||||||
- set -ex; multi_arch_docker::main; set +x
|
|
||||||
|
|
||||||
# This is in global context and runs for every stage that doesn't override it.
|
|
||||||
before_install: |
|
|
||||||
DOCKER_BASE="$DOCKER_USERNAME/shellcheck"
|
|
||||||
DOCKER_BUILDS=""
|
|
||||||
export TAGS=""
|
|
||||||
test "$TRAVIS_BRANCH" = master && TAGS="$TAGS latest" || true
|
|
||||||
test -n "$TRAVIS_TAG" && TAGS="$TAGS stable $TRAVIS_TAG" || true
|
|
||||||
echo "Tags are $TAGS"
|
|
||||||
|
|
||||||
# This is in global context and runs for every stage that doesn't override it.
|
|
||||||
script:
|
|
||||||
- mkdir -p deploy
|
|
||||||
- source ./.compile_binaries
|
|
||||||
- ./striptests
|
|
||||||
- set -ex; build_"$BUILD"; set +x;
|
|
||||||
- ./.prepare_deploy
|
|
||||||
|
|
||||||
# This is in global context and runs for every stage that doesn't override it.
|
|
||||||
after_failure: |
|
|
||||||
id
|
|
||||||
pwd
|
|
||||||
df -h
|
|
||||||
find . -name '*.log' -type f -exec grep "" /dev/null {} +
|
|
||||||
find . -ls
|
|
||||||
|
|
||||||
# This is in global context and runs for every stage that doesn't override it.
|
|
||||||
deploy:
|
|
||||||
provider: gcs
|
|
||||||
skip_cleanup: true
|
|
||||||
access_key_id: GOOG7MDN7WEH6IIGBDCA
|
|
||||||
secret_access_key:
|
|
||||||
secure: Bcx2cT0/E2ikj7sdamVq52xlLZF9dz9ojGPtoKfPyQhkkZa+McVI4xgUSuyyoSxyKj77sofx2y8m6PJYYumT4g5hREV1tfeUkl0J2DQFMbGDYEt7kxVkXCxojNvhHwTzLFv0ezstrxWWxQm81BfQQ4U9lggRXtndAP4czZnOeHPINPSiue1QNwRAEw05r5UoIUJXy/5xyUrjIxn381pAs+gJqP2COeN9kTKYH53nS/AAws29RprfZFnPlo7xxWmcjRcdS5KPdGXI/c6tQp5zl2iTh510VC1PN2w1Wvnn/oNWhiNdqPyVDsojIX5+sS3nejzJA+KFMxXSBlyXIY3wPpS/MdscU79X6Q5f9ivsFfsm7gNBmxHUPNn0HAvU4ROT/CCE9j6jSbs5PC7QBo3CK4++jxAwE/pd9HUc2rs3k0ofx3rgveJ7txpy5yPKfwIIBi98kVKlC4w7dLvNTOfjW1Imt2yH87XTfsE0UIG9st1WII6s4l/WgBx2GuwKdt6+3QUYiAlCFckkxWi+fAvpHZUEL43Qxub5fN+ZV7Zib1n7opchH4QKGBb6/y0WaDCmtCfu0lppoe/TH6saOTjDFj67NJSElK6ZDxGZ3uw4R+ret2gm6WRKT2Oeub8J33VzSa7VkmFpMPrAAfPa9N1Z4ewBLoTmvxSg2A0dDrCdJio=
|
|
||||||
bucket: shellcheck-private
|
|
||||||
local_dir: deploy
|
|
||||||
on:
|
|
||||||
repo: koalaman/shellcheck
|
|
||||||
condition: $TRAVIS_BUILD_STAGE_NAME = Build
|
|
||||||
all_branches: true
|
|
29
Dockerfile
29
Dockerfile
|
@ -1,29 +0,0 @@
|
||||||
# Build-only image
|
|
||||||
FROM ubuntu:18.04 AS build
|
|
||||||
USER root
|
|
||||||
WORKDIR /opt/shellCheck
|
|
||||||
|
|
||||||
# Install OS deps
|
|
||||||
RUN apt-get update && apt-get install -y ghc cabal-install
|
|
||||||
|
|
||||||
# Install Haskell deps
|
|
||||||
# (This is a separate copy/run so that source changes don't require rebuilding)
|
|
||||||
COPY ShellCheck.cabal ./
|
|
||||||
RUN cabal update && cabal install --dependencies-only --ghc-options="-optlo-Os -split-sections"
|
|
||||||
|
|
||||||
# Copy source and build it
|
|
||||||
COPY LICENSE shellcheck.hs ./
|
|
||||||
COPY src src
|
|
||||||
RUN cabal build Paths_ShellCheck && \
|
|
||||||
ghc -optl-static -optl-pthread -isrc -idist/build/autogen --make shellcheck -split-sections -optc-Wl,--gc-sections -optlo-Os && \
|
|
||||||
strip --strip-all shellcheck
|
|
||||||
|
|
||||||
RUN mkdir -p /out/bin && \
|
|
||||||
cp shellcheck /out/bin/
|
|
||||||
|
|
||||||
# Resulting ShellCheck image
|
|
||||||
FROM scratch
|
|
||||||
LABEL maintainer="Vidar Holen <vidar@vidarholen.net>"
|
|
||||||
WORKDIR /mnt
|
|
||||||
COPY --from=build /out /
|
|
||||||
ENTRYPOINT ["/bin/shellcheck"]
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
This directory contains Dockerfiles for all builds.
|
||||||
|
|
||||||
|
A build image will:
|
||||||
|
|
||||||
|
* Run on Linux x86\_64 with vanilla Docker (no exceptions)
|
||||||
|
* Not contain any software that would restrict easy modification or copying
|
||||||
|
* Take a `cabal sdist` style tar.gz of the ShellCheck directory on stdin
|
||||||
|
* Output a tar.gz of artifacts on stdout, in a directory named for the arch
|
||||||
|
|
||||||
|
This makes it simple to build any release without exotic hardware or software.
|
||||||
|
|
||||||
|
An image can be built and tagged using `build_builder`,
|
||||||
|
and run on a source tarball using `run_builder`.
|
|
@ -0,0 +1,12 @@
|
||||||
|
#!/bin/sh
|
||||||
|
if [ $# -eq 0 ]
|
||||||
|
then
|
||||||
|
echo >&2 "No build image directories specified"
|
||||||
|
echo >&2 "Example: $0 build/*/"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
for dir
|
||||||
|
do
|
||||||
|
( cd "$dir" && docker build -t "$(cat tag)" . ) || exit 1
|
||||||
|
done
|
|
@ -0,0 +1,31 @@
|
||||||
|
# DIGEST:sha256:fa32af4677e2860a1c5950bc8c360f309e2a87e2ddfed27b642fddf7a6093b76
|
||||||
|
FROM liushuyu/osxcross:latest
|
||||||
|
|
||||||
|
ENV TARGET x86_64-apple-darwin18
|
||||||
|
ENV TARGETNAME darwin.x86_64
|
||||||
|
|
||||||
|
# Build dependencies
|
||||||
|
USER root
|
||||||
|
ENV DEBIAN_FRONTEND noninteractive
|
||||||
|
RUN apt-get update && apt-get install -y ghc automake autoconf llvm curl
|
||||||
|
|
||||||
|
# Build GHC
|
||||||
|
WORKDIR /ghc
|
||||||
|
RUN curl -L "https://downloads.haskell.org/~ghc/8.10.4/ghc-8.10.4-src.tar.xz" | tar xJ --strip-components=1
|
||||||
|
RUN ./boot && ./configure --host x86_64-linux-gnu --build x86_64-linux-gnu --target "$TARGET"
|
||||||
|
RUN cp mk/flavours/quick-cross.mk mk/build.mk && make -j "$(nproc)"
|
||||||
|
RUN make install
|
||||||
|
RUN curl -L "https://downloads.haskell.org/~cabal/cabal-install-3.2.0.0/cabal-install-3.2.0.0-x86_64-unknown-linux.tar.xz" | tar xJv -C /usr/local/bin
|
||||||
|
|
||||||
|
# Due to an apparent cabal bug, we specify our options directly to cabal
|
||||||
|
# It won't reuse caches if ghc-options are specified in ~/.cabal/config
|
||||||
|
ENV CABALOPTS "--with-ghc=$TARGET-ghc;--with-hc-pkg=$TARGET-ghc-pkg"
|
||||||
|
|
||||||
|
# Prebuild the dependencies
|
||||||
|
RUN cabal update && IFS=';' && cabal install $CABALOPTS --lib Diff-0.4.0 base-compat-0.11.2 base-orphans-0.8.4 dlist-1.0 hashable-1.3.0.0 indexed-traversable-0.1.1 integer-logarithms-1.0.3.1 primitive-0.7.1.0 regex-base-0.94.0.0 splitmix-0.1.0.3 tagged-0.8.6.1 th-abstraction-0.4.2.0 transformers-compat-0.6.6 base-compat-batteries-0.11.2 time-compat-1.9.5 unordered-containers-0.2.13.0 data-fix-0.3.1 vector-0.12.2.0 scientific-0.3.6.2 regex-tdfa-1.3.1.0 random-1.2.0 distributive-0.6.2.1 attoparsec-0.13.2.5 uuid-types-1.0.3 comonad-5.0.8 bifunctors-5.5.10 assoc-1.0.2 these-1.1.1.1 strict-0.4.0.1 aeson-1.5.5.1
|
||||||
|
|
||||||
|
# Copy the build script
|
||||||
|
COPY build /usr/bin
|
||||||
|
|
||||||
|
WORKDIR /scratch
|
||||||
|
ENTRYPOINT ["/usr/bin/build"]
|
|
@ -0,0 +1,14 @@
|
||||||
|
#!/bin/sh
|
||||||
|
set -xe
|
||||||
|
{
|
||||||
|
tar xzv --strip-components=1
|
||||||
|
./striptests
|
||||||
|
mkdir "$TARGETNAME"
|
||||||
|
cabal update
|
||||||
|
( IFS=';'; cabal build $CABALOPTS )
|
||||||
|
find . -name shellcheck -type f -exec mv {} "$TARGETNAME/" \;
|
||||||
|
ls -l "$TARGETNAME"
|
||||||
|
"$TARGET-strip" -Sx "$TARGETNAME/shellcheck"
|
||||||
|
ls -l "$TARGETNAME"
|
||||||
|
} >&2
|
||||||
|
tar czv "$TARGETNAME"
|
|
@ -0,0 +1 @@
|
||||||
|
koalaman/scbuilder-darwin-x86_64
|
|
@ -0,0 +1,30 @@
|
||||||
|
FROM ubuntu:20.04
|
||||||
|
|
||||||
|
ENV TARGET aarch64-linux-gnu
|
||||||
|
ENV TARGETNAME linux.aarch64
|
||||||
|
|
||||||
|
# Build dependencies
|
||||||
|
USER root
|
||||||
|
ENV DEBIAN_FRONTEND noninteractive
|
||||||
|
RUN apt-get update && apt-get install -y ghc automake autoconf build-essential llvm curl qemu-user-static gcc-$TARGET
|
||||||
|
|
||||||
|
# Build GHC
|
||||||
|
WORKDIR /ghc
|
||||||
|
RUN curl -L "https://downloads.haskell.org/~ghc/8.10.4/ghc-8.10.4-src.tar.xz" | tar xJ --strip-components=1
|
||||||
|
RUN ./boot && ./configure --host x86_64-linux-gnu --build x86_64-linux-gnu --target "$TARGET"
|
||||||
|
RUN cp mk/flavours/quick-cross.mk mk/build.mk && make -j "$(nproc)"
|
||||||
|
RUN make install
|
||||||
|
RUN curl -L "https://downloads.haskell.org/~cabal/cabal-install-3.2.0.0/cabal-install-3.2.0.0-x86_64-unknown-linux.tar.xz" | tar xJv -C /usr/local/bin
|
||||||
|
|
||||||
|
# Due to an apparent cabal bug, we specify our options directly to cabal
|
||||||
|
# It won't reuse caches if ghc-options are specified in ~/.cabal/config
|
||||||
|
ENV CABALOPTS "--ghc-options;-split-sections -optc-Os -optc-Wl,--gc-sections;--with-ghc=$TARGET-ghc;--with-hc-pkg=$TARGET-ghc-pkg"
|
||||||
|
|
||||||
|
# Prebuild the dependencies
|
||||||
|
RUN cabal update && IFS=';' && cabal install $CABALOPTS --lib Diff-0.4.0 base-compat-0.11.2 base-orphans-0.8.4 dlist-1.0 hashable-1.3.0.0 indexed-traversable-0.1.1 integer-logarithms-1.0.3.1 primitive-0.7.1.0 regex-base-0.94.0.0 splitmix-0.1.0.3 tagged-0.8.6.1 th-abstraction-0.4.2.0 transformers-compat-0.6.6 base-compat-batteries-0.11.2 time-compat-1.9.5 unordered-containers-0.2.13.0 data-fix-0.3.1 vector-0.12.2.0 scientific-0.3.6.2 regex-tdfa-1.3.1.0 random-1.2.0 distributive-0.6.2.1 attoparsec-0.13.2.5 uuid-types-1.0.3 comonad-5.0.8 bifunctors-5.5.10 assoc-1.0.2 these-1.1.1.1 strict-0.4.0.1 aeson-1.5.5.1
|
||||||
|
|
||||||
|
# Copy the build script
|
||||||
|
COPY build /usr/bin
|
||||||
|
|
||||||
|
WORKDIR /scratch
|
||||||
|
ENTRYPOINT ["/usr/bin/build"]
|
|
@ -0,0 +1,15 @@
|
||||||
|
#!/bin/sh
|
||||||
|
set -xe
|
||||||
|
{
|
||||||
|
tar xzv --strip-components=1
|
||||||
|
./striptests
|
||||||
|
mkdir "$TARGETNAME"
|
||||||
|
cabal update
|
||||||
|
( IFS=';'; cabal build $CABALOPTS --enable-executable-static )
|
||||||
|
find . -name shellcheck -type f -exec mv {} "$TARGETNAME/" \;
|
||||||
|
ls -l "$TARGETNAME"
|
||||||
|
"$TARGET-strip" -s "$TARGETNAME/shellcheck"
|
||||||
|
ls -l "$TARGETNAME"
|
||||||
|
qemu-aarch64-static "$TARGETNAME/shellcheck" --version
|
||||||
|
} >&2
|
||||||
|
tar czv "$TARGETNAME"
|
|
@ -0,0 +1 @@
|
||||||
|
koalaman/scbuilder-linux-aarch64
|
|
@ -0,0 +1,59 @@
|
||||||
|
# I've again spent days trying to get a working armv6hf compiler going.
|
||||||
|
# God only knows how many recompilations of GCC, GHC, libraries, and
|
||||||
|
# ShellCheck itself, has gone into it.
|
||||||
|
#
|
||||||
|
# I tried Debian's toolchain. I tried my custom one built according to
|
||||||
|
# RPi `gcc -v`. I tried GHC9, glibc, musl, registerised vs not, but
|
||||||
|
# nothing has yielded an armv6hf binary that does not immediately
|
||||||
|
# segfault on qemu-arm-static or the RPi itself.
|
||||||
|
#
|
||||||
|
# I then tried the same but with armv7hf. Same story.
|
||||||
|
#
|
||||||
|
# Emulating the entire userspace with balenalib again? Very strange build
|
||||||
|
# failures where programs would fail to execute with > ~100 arguments.
|
||||||
|
#
|
||||||
|
# Finally, creating our own appears to work when using a custom QEmu
|
||||||
|
# patched to follow execve calls.
|
||||||
|
#
|
||||||
|
# PS: $100 bounty for getting a RPi1 compatible static build going
|
||||||
|
# with cross-compilation, similar to what the aarch64 build does.
|
||||||
|
#
|
||||||
|
|
||||||
|
FROM ubuntu:20.04
|
||||||
|
|
||||||
|
ENV TARGETNAME linux.armv6hf
|
||||||
|
|
||||||
|
# Build QEmu with execve follow support
|
||||||
|
USER root
|
||||||
|
ENV DEBIAN_FRONTEND noninteractive
|
||||||
|
RUN apt-get update
|
||||||
|
RUN apt-get install -y build-essential git ninja-build python3 pkg-config libglib2.0-dev libpixman-1-dev
|
||||||
|
WORKDIR /build
|
||||||
|
RUN git clone --depth 1 https://github.com/koalaman/qemu
|
||||||
|
RUN cd qemu && ./configure --static && cd build && ninja qemu-arm
|
||||||
|
RUN cp qemu/build/qemu-arm /build/qemu-arm-static
|
||||||
|
ENV QEMU_EXECVE 1
|
||||||
|
|
||||||
|
# Set up an armv6 userspace
|
||||||
|
WORKDIR /
|
||||||
|
RUN apt-get install -y debootstrap qemu-user-static
|
||||||
|
# We expect this to fail if the host doesn't have binfmt qemu support
|
||||||
|
RUN qemu-debootstrap --arch armhf bullseye pi http://mirrordirector.raspbian.org/raspbian || [ -e /pi/etc/issue ]
|
||||||
|
RUN cp /build/qemu-arm-static /pi/usr/bin/qemu-arm-static
|
||||||
|
RUN printf > /bin/pirun '%s\n' '#!/bin/sh' 'chroot /pi /usr/bin/qemu-arm-static /usr/bin/env "$@"' && chmod +x /bin/pirun
|
||||||
|
# If the debootstrap process didn't finish, continue it
|
||||||
|
RUN [ ! -e /pi/debootstrap ] || pirun '/debootstrap/debootstrap' --second-stage
|
||||||
|
|
||||||
|
# Install deps in the chroot
|
||||||
|
RUN pirun apt-get update
|
||||||
|
RUN pirun apt-get install -y ghc cabal-install
|
||||||
|
|
||||||
|
# Finally we can build the current dependencies. This takes hours.
|
||||||
|
ENV CABALOPTS "--ghc-options;-split-sections -optc-Os -optc-Wl,--gc-sections;--gcc-options;-Os -Wl,--gc-sections -ffunction-sections -fdata-sections"
|
||||||
|
RUN pirun cabal update
|
||||||
|
RUN IFS=";" && pirun cabal install --lib $CABALOPTS Diff-0.4.0 base-compat-0.11.2 base-orphans-0.8.4 dlist-1.0 hashable-1.3.1.0 indexed-traversable-0.1.1 integer-logarithms-1.0.3.1 primitive-0.7.1.0 regex-base-0.94.0.1 splitmix-0.1.0.3 tagged-0.8.6.1 th-abstraction-0.4.2.0 transformers-compat-0.6.6 base-compat-batteries-0.11.2 time-compat-1.9.5 unordered-containers-0.2.13.0 data-fix-0.3.1 vector-0.12.2.0 scientific-0.3.6.2 regex-tdfa-1.3.1.0 random-1.2.0 distributive-0.6.2.1 attoparsec-0.13.2.5 uuid-types-1.0.4 comonad-5.0.8 bifunctors-5.5.10 assoc-1.0.2 these-1.1.1.1 strict-0.4.0.1 aeson-1.5.6.0
|
||||||
|
|
||||||
|
# Copy the build script
|
||||||
|
WORKDIR /pi/scratch
|
||||||
|
COPY build /pi/usr/bin
|
||||||
|
ENTRYPOINT ["/bin/pirun", "/usr/bin/build"]
|
|
@ -0,0 +1,16 @@
|
||||||
|
#!/bin/sh
|
||||||
|
set -xe
|
||||||
|
cd /scratch
|
||||||
|
{
|
||||||
|
tar xzv --strip-components=1
|
||||||
|
./striptests
|
||||||
|
mkdir "$TARGETNAME"
|
||||||
|
# This script does not cabal update because compiling anything new is slow
|
||||||
|
( IFS=';'; cabal build $CABALOPTS --enable-executable-static )
|
||||||
|
find . -name shellcheck -type f -exec mv {} "$TARGETNAME/" \;
|
||||||
|
ls -l "$TARGETNAME"
|
||||||
|
strip -s "$TARGETNAME/shellcheck"
|
||||||
|
ls -l "$TARGETNAME"
|
||||||
|
"$TARGETNAME/shellcheck" --version
|
||||||
|
} >&2
|
||||||
|
tar czv "$TARGETNAME"
|
|
@ -0,0 +1 @@
|
||||||
|
koalaman/scbuilder-linux-armv6hf
|
|
@ -0,0 +1,26 @@
|
||||||
|
FROM ubuntu:20.04
|
||||||
|
|
||||||
|
ENV TARGETNAME linux.x86_64
|
||||||
|
|
||||||
|
# Install GHC and cabal
|
||||||
|
USER root
|
||||||
|
ENV DEBIAN_FRONTEND noninteractive
|
||||||
|
RUN apt-get update && apt-get install -y ghc curl xz-utils
|
||||||
|
|
||||||
|
# So we'd like a later version of Cabal that supports --enable-executable-static,
|
||||||
|
# but we can't use Ubuntu 20.10 because coreutils has switched to new syscalls that
|
||||||
|
# the TravisCI kernel doesn't support. Download it manually.
|
||||||
|
RUN curl "https://downloads.haskell.org/~cabal/cabal-install-3.2.0.0/cabal-install-3.2.0.0-x86_64-unknown-linux.tar.xz" | tar xJv -C /usr/bin
|
||||||
|
|
||||||
|
# Use ld.bfd instead of ld.gold due to
|
||||||
|
# x86_64-linux-gnu/libpthread.a(pthread_cond_init.o)(.note.stapsdt+0x14): error:
|
||||||
|
# relocation refers to local symbol "" [2], which is defined in a discarded section
|
||||||
|
ENV CABALOPTS "--ghc-options;-optl-Wl,-fuse-ld=bfd -split-sections -optc-Os -optc-Wl,--gc-sections"
|
||||||
|
|
||||||
|
# Other archs pre-build dependencies here, but this one doesn't to detect ecosystem movement
|
||||||
|
|
||||||
|
# Copy the build script
|
||||||
|
COPY build /usr/bin
|
||||||
|
|
||||||
|
WORKDIR /scratch
|
||||||
|
ENTRYPOINT ["/usr/bin/build"]
|
|
@ -0,0 +1,15 @@
|
||||||
|
#!/bin/sh
|
||||||
|
set -xe
|
||||||
|
{
|
||||||
|
tar xzv --strip-components=1
|
||||||
|
./striptests
|
||||||
|
mkdir "$TARGETNAME"
|
||||||
|
cabal update
|
||||||
|
( IFS=';'; cabal build $CABALOPTS --enable-executable-static )
|
||||||
|
find . -name shellcheck -type f -exec mv {} "$TARGETNAME/" \;
|
||||||
|
ls -l "$TARGETNAME"
|
||||||
|
strip -s "$TARGETNAME/shellcheck"
|
||||||
|
ls -l "$TARGETNAME"
|
||||||
|
"$TARGETNAME/shellcheck" --version
|
||||||
|
} >&2
|
||||||
|
tar czv "$TARGETNAME"
|
|
@ -0,0 +1 @@
|
||||||
|
koalaman/scbuilder-linux-x86_64
|
|
@ -0,0 +1,30 @@
|
||||||
|
#!/bin/bash
|
||||||
|
if [ $# -lt 2 ]
|
||||||
|
then
|
||||||
|
echo >&2 "This script builds a source archive (as produced by cabal sdist)"
|
||||||
|
echo >&2 "Usage: $0 sourcefile.tar.gz builddir..."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
file=$(realpath "$1")
|
||||||
|
shift
|
||||||
|
|
||||||
|
if [ ! -e "$file" ]
|
||||||
|
then
|
||||||
|
echo >&2 "$file does not exist"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
set -ex -o pipefail
|
||||||
|
|
||||||
|
for dir
|
||||||
|
do
|
||||||
|
tagfile="$dir/tag"
|
||||||
|
if [ ! -e "$tagfile" ]
|
||||||
|
then
|
||||||
|
echo >&2 "$tagfile does not exist"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
docker run -i "$(< "$tagfile")" < "$file" | tar xz
|
||||||
|
done
|
|
@ -0,0 +1,27 @@
|
||||||
|
FROM ubuntu:20.04
|
||||||
|
|
||||||
|
ENV TARGETNAME windows.x86_64
|
||||||
|
|
||||||
|
# We don't need wine32, even though it complains
|
||||||
|
USER root
|
||||||
|
ENV DEBIAN_FRONTEND noninteractive
|
||||||
|
RUN apt-get update && apt-get install -y curl busybox wine
|
||||||
|
|
||||||
|
# Fetch Windows version, will be available under z:\haskell
|
||||||
|
WORKDIR /haskell
|
||||||
|
RUN curl -L "https://downloads.haskell.org/~ghc/8.10.4/ghc-8.10.4-x86_64-unknown-mingw32.tar.xz" | tar xJ --strip-components=1
|
||||||
|
WORKDIR /haskell/bin
|
||||||
|
RUN curl -L "https://downloads.haskell.org/~cabal/cabal-install-3.2.0.0/cabal-install-3.2.0.0-x86_64-unknown-mingw32.zip" | busybox unzip -
|
||||||
|
RUN curl -L "https://curl.se/windows/dl-7.75.0/curl-7.75.0-win64-mingw.zip" | busybox unzip - && mv curl-7.75.0-win64-mingw/bin/* .
|
||||||
|
ENV WINEPATH /haskell/bin
|
||||||
|
|
||||||
|
# It's unknown whether Cabal on Windows suffers from the same issue
|
||||||
|
# that necessitated this but I don't care enough to find out
|
||||||
|
ENV CABALOPTS "--ghc-options;-split-sections -optc-Os -optc-Wl,--gc-sections"
|
||||||
|
|
||||||
|
# Precompile some deps to speed up later builds. This list is just copied from `cabal build`
|
||||||
|
RUN wine /haskell/bin/cabal.exe update && IFS=';' && wine /haskell/bin/cabal.exe install $CABALOPTS --lib Diff-0.4.0 base-compat-0.11.2 base-orphans-0.8.4 dlist-1.0 hashable-1.3.0.0 indexed-traversable-0.1.1 integer-logarithms-1.0.3.1 primitive-0.7.1.0 regex-base-0.94.0.0 splitmix-0.1.0.3 tagged-0.8.6.1 th-abstraction-0.4.2.0 transformers-compat-0.6.6 base-compat-batteries-0.11.2 time-compat-1.9.5 unordered-containers-0.2.13.0 data-fix-0.3.1 vector-0.12.2.0 scientific-0.3.6.2 regex-tdfa-1.3.1.0 random-1.2.0 distributive-0.6.2.1 attoparsec-0.13.2.5 uuid-types-1.0.3 comonad-5.0.8 bifunctors-5.5.10 assoc-1.0.2 these-1.1.1.1 strict-0.4.0.1 aeson-1.5.5.1
|
||||||
|
|
||||||
|
COPY build /usr/bin
|
||||||
|
WORKDIR /scratch
|
||||||
|
ENTRYPOINT ["/usr/bin/build"]
|
|
@ -0,0 +1,19 @@
|
||||||
|
#!/bin/sh
|
||||||
|
cabal() {
|
||||||
|
wine /haskell/bin/cabal.exe "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
set -xe
|
||||||
|
{
|
||||||
|
tar xzv --strip-components=1
|
||||||
|
./striptests
|
||||||
|
mkdir "$TARGETNAME"
|
||||||
|
cabal update
|
||||||
|
( IFS=';'; cabal build $CABALOPTS )
|
||||||
|
find dist*/ -name shellcheck.exe -type f -ls -exec mv {} "$TARGETNAME/" \;
|
||||||
|
ls -l "$TARGETNAME"
|
||||||
|
wine "/haskell/mingw/bin/strip.exe" -s "$TARGETNAME/shellcheck.exe"
|
||||||
|
ls -l "$TARGETNAME"
|
||||||
|
wine "$TARGETNAME/shellcheck.exe" --version
|
||||||
|
} >&2
|
||||||
|
tar czv "$TARGETNAME"
|
|
@ -0,0 +1 @@
|
||||||
|
koalaman/scbuilder-windows-x86_64
|
Loading…
Reference in New Issue