From d508b28beb26189614af56af03afaddae2ea41a4 Mon Sep 17 00:00:00 2001 From: septs Date: Mon, 24 Jun 2024 09:28:41 +0800 Subject: [PATCH] refactor: bash scripts (#123) --- .github/workflows/build.yaml | 4 +- scripts/build-ci.sh | 84 ++++++++++-------------------------- scripts/build-woa.sh | 49 ++++----------------- scripts/functions.sh | 84 ++++++++++++++++++++++++++++++++++++ scripts/setup-debian.sh | 15 +++++-- 5 files changed, 129 insertions(+), 107 deletions(-) create mode 100644 scripts/functions.sh diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 0697547..0d0b08c 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -13,7 +13,7 @@ jobs: name: Build for ${{ matrix.build.name }} runs-on: ${{ matrix.os }} strategy: - fail-fast: false + fail-fast: false matrix: os: [ubuntu-latest] build: @@ -29,7 +29,7 @@ jobs: uses: actions/checkout@v4 - name: Setup Toolchain - run: ./scripts/setup-debian.sh + run: sudo ./scripts/setup-debian.sh ${{ matrix.build.variant }} if: runner.os == 'Linux' - name: Build for ${{ matrix.build.name }} diff --git a/scripts/build-ci.sh b/scripts/build-ci.sh index 53cbf23..6391e97 100755 --- a/scripts/build-ci.sh +++ b/scripts/build-ci.sh @@ -1,66 +1,25 @@ #!/bin/bash -set -euo pipefail -WORKSPACE="$(pwd)" -KERNEL="$(uname -s)" -MATCHINE="$(uname -m)" -CURL_VERSION="8.6.0_1" -WOA_TOOLCHAIN_VERSION="2024-02-08" -MINGW_CURL_WIN64_BLOB="https://curl.se/windows/dl-$CURL_VERSION/curl-$CURL_VERSION-win64-mingw.zip" -MINGW_CURL_WIN64A_BLOB="https://curl.se/windows/dl-$CURL_VERSION/curl-$CURL_VERSION-win64a-mingw.zip" -MINGW32_TOOLCHAIN_BLOB="https://github.com/Windows-on-ARM-Experiments/mingw-woarm64-build/releases/download/$WOA_TOOLCHAIN_VERSION/aarch64-w64-mingw32-msvcrt-toolchain.tar.gz" - -case "$KERNEL" in -Linux) - KERNEL="linux" - ;; -Darwin) - KERNEL="darwin" - MATCHINE="universal" - ;; -esac +SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd) -function download { - URL="$1" - SAVED_PATH="$(mktemp)" - SAVED_DIR="$(mktemp -d)" - wget --no-verbose "$URL" -O "$SAVED_PATH" - case "$URL" in - *.zip) - unzip -q -d "$SAVED_DIR" "$SAVED_PATH" - rm "$SAVED_PATH" - echo "$SAVED_DIR" - ;; - *.tar.gz) - tar -C "$SAVED_DIR" --gzip --extract --file="$SAVED_PATH" - rm "$SAVED_PATH" - echo "$SAVED_DIR" - ;; - *) - echo "$SAVED_PATH" - ;; - esac -} +source "$SCRIPT_DIR/functions.sh" -set -x +set -euo pipefail BUILD="$(mktemp -d)" -cd "$BUILD" || exit 1 - ARTIFACT="$WORKSPACE/build" -mkdir "$BUILD/output" -[ -d "$ARTIFACT" ] || mkdir "$ARTIFACT" +cd "$BUILD" || exit 1 -cp "$WORKSPACE/src/LICENSE" "$BUILD/output/lpac-LICENSE" -cp "$WORKSPACE/euicc/LICENSE" "$BUILD/output/libeuicc-LICENSE" -cp "$WORKSPACE/cjson/LICENSE" "$BUILD/output/cjson-LICENSE" -cp "$WORKSPACE/dlfcn-win32/LICENSE" "$BUILD/output/dlfcn-win32-LICENSE" +mkdir -p "$BUILD/output" +mkdir -p "$ARTIFACT" case "${1:-}" in make) cmake "$WORKSPACE" make -j - zip -r -j "$ARTIFACT/lpac-$KERNEL-$MATCHINE.zip" output/* + copy-license "$BUILD/output" + copy-usage "$BUILD/output" + create-bundle "$ARTIFACT/lpac-$KERNEL-$MATCHINE.zip" "$BUILD/output" ;; debian) cmake "$WORKSPACE" -DCPACK_GENERATOR=DEB @@ -70,27 +29,28 @@ debian) mingw) cmake "$WORKSPACE" -DCMAKE_TOOLCHAIN_FILE=./cmake/linux-mingw64.cmake make -j - CURL="$(download "$MINGW_CURL_WIN64_BLOB")" - cp "$CURL"/curl-*-mingw/bin/libcurl-x64.dll output/libcurl.dll - cp "$CURL"/curl-*-mingw/COPYING.txt output/libcurl-LICENSE - zip -r -j "$ARTIFACT/lpac-windows-x86_64-mingw.zip" output/* + copy-license "$BUILD/output" + copy-curl-win "$BUILD/output" + copy-usage "$BUILD/output" + create-bundle "$ARTIFACT/lpac-windows-x86_64-mingw.zip" "$BUILD/output" ;; woa-mingw) TOOLCHAIN="$(download "$MINGW32_TOOLCHAIN_BLOB")" cmake "$WORKSPACE" -DCMAKE_TOOLCHAIN_FILE=./cmake/linux-mingw64-woa.cmake "-DTOOLCHAIN_BIN_PATH=$TOOLCHAIN/bin" make -j - CURL="$(download "$MINGW_CURL_WIN64A_BLOB")" - cp "$CURL"/curl-*-mingw/bin/libcurl-arm64.dll output/libcurl.dll - cp "$CURL"/curl-*-mingw/COPYING.txt output/libcurl-LICENSE - zip -r -j "$ARTIFACT/lpac-windows-arm64-mingw.zip" output/* + rm -rf "$TOOLCHAIN" + copy-license "$BUILD/output" + copy-curl-woa "$BUILD/output" + copy-usage "$BUILD/output" + create-bundle "$ARTIFACT/lpac-windows-arm64-mingw.zip" "$BUILD/output" ;; woa-zig) cmake "$WORKSPACE" -DCMAKE_TOOLCHAIN_FILE=./cmake/aarch64-windows-zig.cmake make -j - CURL="$(download "$MINGW_CURL_WIN64A_BLOB")" - cp "$CURL"/curl-*-mingw/bin/libcurl-arm64.dll output/libcurl.dll - cp "$CURL"/curl-*-mingw/COPYING.txt output/libcurl-LICENSE - zip -r -j "$ARTIFACT/lpac-windows-arm64-zig.zip" output/* + copy-license "$BUILD/output" + copy-curl-woa "$BUILD/output" + copy-usage "$BUILD/output" + create-bundle "$ARTIFACT/lpac-windows-arm64-zig.zip" "$BUILD/output" ;; *) echo "Usage: $0 {make,debian,mingw,woa-mingw,woa-zig}" diff --git a/scripts/build-woa.sh b/scripts/build-woa.sh index 1998568..5c4915b 100755 --- a/scripts/build-woa.sh +++ b/scripts/build-woa.sh @@ -1,59 +1,28 @@ #!/bin/bash -set -euo pipefail -WORKSPACE="$(pwd)" -CURL_VERSION="8.6.0_1" -WOA_TOOLCHAIN_VERSION="2024-02-08" -MINGW_CURL_WIN64A_BLOB="https://curl.se/windows/dl-$CURL_VERSION/curl-$CURL_VERSION-win64a-mingw.zip" -MINGW32_TOOLCHAIN_BLOB="https://github.com/Windows-on-ARM-Experiments/mingw-woarm64-build/releases/download/$WOA_TOOLCHAIN_VERSION/aarch64-w64-mingw32-msvcrt-toolchain.tar.gz" +SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd) -function download { - URL="$1" - SAVED_PATH="$(mktemp)" - SAVED_DIR="$(mktemp -d)" - wget --no-verbose "$URL" -O "$SAVED_PATH" - case "$URL" in - *.zip) - unzip -q -d "$SAVED_DIR" "$SAVED_PATH" - rm "$SAVED_PATH" - echo "$SAVED_DIR" - ;; - *.tar.gz) - tar -C "$SAVED_DIR" --gzip --extract --file="$SAVED_PATH" - rm "$SAVED_PATH" - echo "$SAVED_DIR" - ;; - *) - echo "$SAVED_PATH" - ;; - esac -} +source "$SCRIPT_DIR/functions.sh" -set -x +set -euo pipefail BUILD="$(mktemp -d)" cd "$BUILD" || exit 1 -mkdir "$BUILD/output" -cp "$WORKSPACE/src/LICENSE" output/lpac-LICENSE -cp "$WORKSPACE/euicc/LICENSE" output/libeuicc-LICENSE -cp "$WORKSPACE/cjson/LICENSE" output/cjson-LICENSE -cp "$WORKSPACE/dlfcn-win32/LICENSE" output/dlfcn-win32-LICENSE - case "${1:-}" in mingw) TOOLCHAIN="$(download "$MINGW32_TOOLCHAIN_BLOB")" cmake "$WORKSPACE" -DCMAKE_TOOLCHAIN_FILE=./cmake/linux-mingw64-woa.cmake "-DTOOLCHAIN_BIN_PATH=$TOOLCHAIN/bin" make -j - CURL="$(download "$MINGW_CURL_WIN64A_BLOB")" - cp "$CURL"/curl-*-mingw/bin/libcurl-arm64.dll output/libcurl.dll - cp "$CURL"/curl-*-mingw/COPYING.txt output/libcurl-LICENSE + copy-license "$BUILD/output" + copy-curl-woa "$BUILD/output" + copy-usage "$BUILD/output" ;; zig) cmake "$WORKSPACE" -DCMAKE_TOOLCHAIN_FILE=./cmake/aarch64-windows-zig.cmake make -j - CURL="$(download "$MINGW_CURL_WIN64A_BLOB")" - cp "$CURL"/curl-*-mingw/bin/libcurl-arm64.dll output/libcurl.dll - cp "$CURL"/curl-*-mingw/COPYING.txt output/libcurl-LICENSE + copy-license "$BUILD/output" + copy-curl-woa "$BUILD/output" + copy-usage "$BUILD/output" ;; *) echo "Usage: $0 {mingw,zig}" diff --git a/scripts/functions.sh b/scripts/functions.sh new file mode 100644 index 0000000..a872b89 --- /dev/null +++ b/scripts/functions.sh @@ -0,0 +1,84 @@ +#!/bin/bash +export KERNEL="$(uname -s)" +export MATCHINE="$(uname -m)" + +export WORKSPACE="${GITHUB_WORKSPACE:-$(pwd)}" +export CURL_VERSION="8.6.0_1" +export WOA_TOOLCHAIN_VERSION="2024-02-08" +export MINGW_CURL_WIN64_BLOB="https://curl.se/windows/dl-$CURL_VERSION/curl-$CURL_VERSION-win64-mingw.zip" +export MINGW_CURL_WIN64A_BLOB="https://curl.se/windows/dl-$CURL_VERSION/curl-$CURL_VERSION-win64a-mingw.zip" +export MINGW32_TOOLCHAIN_BLOB="https://github.com/Windows-on-ARM-Experiments/mingw-woarm64-build/releases/download/$WOA_TOOLCHAIN_VERSION/aarch64-w64-mingw32-msvcrt-toolchain.tar.gz" + +case "$KERNEL" in +Linux) + KERNEL="linux" + ;; +Darwin) + KERNEL="darwin" + MATCHINE="universal" + ;; +esac + +function download { + local URL="$1" + local SAVED_PATH="$(mktemp)" + local SAVED_DIR="$(mktemp -d)" + wget --no-verbose "$URL" -O "$SAVED_PATH" + case "$URL" in + *.zip) + unzip -q -d "$SAVED_DIR" "$SAVED_PATH" + rm "$SAVED_PATH" + echo "$SAVED_DIR" + ;; + *.tar.gz) + tar -C "$SAVED_DIR" --gzip --extract --file="$SAVED_PATH" + rm "$SAVED_PATH" + echo "$SAVED_DIR" + ;; + *) + echo "$SAVED_PATH" + ;; + esac +} + +function copy-license { + local OUTPUT="$1" + + cp "$WORKSPACE/src/LICENSE" "$OUTPUT/LICENSE-lpac" + cp "$WORKSPACE/euicc/LICENSE" "$OUTPUT/LICENSE-libeuicc" + cp "$WORKSPACE/cjson/LICENSE" "$OUTPUT/LICENSE-cjson" + cp "$WORKSPACE/dlfcn-win32/LICENSE" "$OUTPUT/LICENSE-dlfcn-win32" +} + +function copy-curl-woa { + local OUTPUT="$1" + + CURL="$(download "$MINGW_CURL_WIN64A_BLOB")" + cp "$CURL"/curl-*-mingw/bin/libcurl-arm64.dll "$OUTPUT/libcurl.dll" + cp "$CURL"/curl-*-mingw/COPYING.txt "$OUTPUT/LICENSE-libcurl" + rm -rf "$CURL" +} + +function copy-curl-win { + local OUTPUT="$1" + + CURL="$(download "$MINGW_CURL_WIN64_BLOB")" + cp "$CURL"/curl-*-mingw/bin/libcurl-x64.dll "$OUTPUT/libcurl.dll" + cp "$CURL"/curl-*-mingw/COPYING.txt "$OUTPUT/LICENSE-libcurl" + rm -rf "$CURL" +} + +function copy-usage { + local OUTPUT="$1" + + cp "$WORKSPACE/docs/USAGE.md" "$OUTPUT/README.md" +} + +function create-bundle { + local BUNDLE_FILE="$1" + local INPUT_DIR="$2" + + pushd "$INPUT_DIR" + zip -r "$BUNDLE_FILE" * + popd +} diff --git a/scripts/setup-debian.sh b/scripts/setup-debian.sh index c29f1c4..8b75c69 100755 --- a/scripts/setup-debian.sh +++ b/scripts/setup-debian.sh @@ -1,4 +1,13 @@ #!/bin/bash -set -xeuo pipefail -sudo apt-get update -sudo apt-get install -y build-essential libpcsclite-dev libcurl4-openssl-dev gcc-mingw-w64 g++-mingw-w64 zip +set -euo pipefail +export DEBIAN_FRONTEND=noninteractive +export DEBIAN_PRIORITY=critical + +apt-get -qq -o=Dpkg::Use-Pty=0 update +apt-get -qq -o=Dpkg::Use-Pty=0 install -y build-essential libpcsclite-dev libcurl4-openssl-dev zip + +case "${1:-}" in +mingw) + apt-get -qq -o=Dpkg::Use-Pty=0 install gcc-mingw-w64 g++-mingw-w64 + ;; +esac