
This makes it easier to move the TinyGo compiler between Linux versions because it doesn't depend on any system libraries anymore. For example, binaries should be able to run on old Linux versions and on distributions without glibc (such as Alpine Linux).
464 строки
16 КиБ
YAML
464 строки
16 КиБ
YAML
name: Linux
|
|
|
|
on:
|
|
pull_request:
|
|
push:
|
|
branches:
|
|
- dev
|
|
- release
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
build-linux:
|
|
# Build Linux binaries, ready for release.
|
|
# This runs inside an Alpine Linux container so we can more easily create a
|
|
# statically linked binary.
|
|
runs-on: ubuntu-latest
|
|
container:
|
|
image: alpine:3.16
|
|
steps:
|
|
- name: Install apk dependencies
|
|
# tar: needed for actions/cache@v2
|
|
# git+openssh: needed for checkout (I think?)
|
|
# gcompat: needed for go binary
|
|
# ruby: needed to install fpm
|
|
run: apk add tar git openssh gcompat make g++ ruby
|
|
- name: Work around CVE-2022-24765
|
|
# We're not on a multi-user machine, so this is safe.
|
|
run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
|
|
- name: Checkout
|
|
uses: actions/checkout@v2
|
|
with:
|
|
submodules: true
|
|
- name: Install Go
|
|
uses: actions/setup-go@v2
|
|
with:
|
|
go-version: '1.18.1'
|
|
- name: Cache Go
|
|
uses: actions/cache@v2
|
|
with:
|
|
key: go-cache-linux-alpine-v1-${{ hashFiles('go.mod') }}
|
|
path: |
|
|
~/.cache/go-build
|
|
~/go/pkg/mod
|
|
- name: Cache LLVM source
|
|
uses: actions/cache@v2
|
|
id: cache-llvm-source
|
|
with:
|
|
key: llvm-source-14-linux-alpine-v1
|
|
path: |
|
|
llvm-project/clang/lib/Headers
|
|
llvm-project/clang/include
|
|
llvm-project/compiler-rt
|
|
llvm-project/lld/include
|
|
llvm-project/llvm/include
|
|
- name: Download LLVM source
|
|
if: steps.cache-llvm-source.outputs.cache-hit != 'true'
|
|
run: make llvm-source
|
|
- name: Cache LLVM build
|
|
uses: actions/cache@v2
|
|
id: cache-llvm-build
|
|
with:
|
|
key: llvm-build-14-linux-alpine-v1
|
|
path: llvm-build
|
|
- name: Build LLVM
|
|
if: steps.cache-llvm-build.outputs.cache-hit != 'true'
|
|
run: |
|
|
# fetch LLVM source
|
|
rm -rf llvm-project
|
|
make llvm-source
|
|
# install dependencies
|
|
apk add cmake samurai python3
|
|
# build!
|
|
make llvm-build
|
|
# Remove unnecessary object files (to reduce cache size).
|
|
find llvm-build -name CMakeFiles -prune -exec rm -r '{}' \;
|
|
- name: Cache Binaryen
|
|
uses: actions/cache@v2
|
|
id: cache-binaryen
|
|
with:
|
|
key: binaryen-linux-alpine-v1
|
|
path: build/wasm-opt
|
|
- name: Build Binaryen
|
|
if: steps.cache-binaryen.outputs.cache-hit != 'true'
|
|
run: |
|
|
apk add cmake samurai python3
|
|
make binaryen STATIC=1
|
|
- name: Cache wasi-libc
|
|
uses: actions/cache@v2
|
|
id: cache-wasi-libc
|
|
with:
|
|
key: wasi-libc-sysroot-linux-alpine-v1
|
|
path: lib/wasi-libc/sysroot
|
|
- name: Build wasi-libc
|
|
if: steps.cache-wasi-libc.outputs.cache-hit != 'true'
|
|
run: make wasi-libc
|
|
- name: Install fpm
|
|
run: |
|
|
gem install --no-document fpm
|
|
- name: Build TinyGo release
|
|
run: |
|
|
make release deb -j3 STATIC=1
|
|
cp -p build/release.tar.gz /tmp/tinygo.linux-amd64.tar.gz
|
|
cp -p build/release.deb /tmp/tinygo_amd64.deb
|
|
- name: Publish release artifact
|
|
uses: actions/upload-artifact@v2
|
|
with:
|
|
name: linux-amd64-double-zipped
|
|
path: |
|
|
/tmp/tinygo.linux-amd64.tar.gz
|
|
/tmp/tinygo_amd64.deb
|
|
test-linux-build:
|
|
# Test the binaries built in the build-linux job by running the smoke tests.
|
|
runs-on: ubuntu-latest
|
|
needs: build-linux
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v2
|
|
- name: Install Go
|
|
uses: actions/setup-go@v2
|
|
with:
|
|
go-version: '1.18.1'
|
|
- name: Install wasmtime
|
|
run: |
|
|
curl https://wasmtime.dev/install.sh -sSf | bash
|
|
echo "$HOME/.wasmtime/bin" >> $GITHUB_PATH
|
|
- name: Download release artifact
|
|
uses: actions/download-artifact@v2
|
|
with:
|
|
name: linux-amd64-double-zipped
|
|
- name: Extract release tarball
|
|
run: |
|
|
mkdir -p ~/lib
|
|
tar -C ~/lib -xf tinygo.linux-amd64.tar.gz
|
|
ln -s ~/lib/tinygo/bin/tinygo ~/go/bin/tinygo
|
|
- name: Install apt dependencies
|
|
run: |
|
|
sudo apt-get install --no-install-recommends \
|
|
gcc-avr \
|
|
avr-libc
|
|
- name: "Install Xtensa toolchain"
|
|
run: |
|
|
curl -L https://github.com/espressif/crosstool-NG/releases/download/esp-2020r2/xtensa-esp32-elf-gcc8_2_0-esp-2020r2-linux-amd64.tar.gz -o xtensa-esp32-elf-gcc8_2_0-esp-2020r2-linux-amd64.tar.gz
|
|
sudo tar -C /usr/local -xf xtensa-esp32-elf-gcc8_2_0-esp-2020r2-linux-amd64.tar.gz
|
|
sudo ln -s /usr/local/xtensa-esp32-elf/bin/xtensa-esp32-elf-ld /usr/local/bin/xtensa-esp32-elf-ld
|
|
rm xtensa-esp32-elf-gcc8_2_0-esp-2020r2-linux-amd64.tar.gz
|
|
- run: make tinygo-test-wasi-fast
|
|
- run: make smoketest
|
|
assert-test-linux:
|
|
# Run all tests that can run on Linux, with LLVM assertions enabled to catch
|
|
# potential bugs.
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v2
|
|
with:
|
|
submodules: true
|
|
- name: Install apt dependencies
|
|
run: |
|
|
echo "Show cpuinfo; sometimes useful when troubleshooting"
|
|
cat /proc/cpuinfo
|
|
sudo apt-get update
|
|
sudo apt-get install --no-install-recommends \
|
|
qemu-system-arm \
|
|
qemu-system-riscv32 \
|
|
qemu-user \
|
|
gcc-avr \
|
|
avr-libc \
|
|
simavr \
|
|
ninja-build
|
|
- name: Install Go
|
|
uses: actions/setup-go@v2
|
|
with:
|
|
go-version: '1.18.1'
|
|
- name: Install Node.js
|
|
uses: actions/setup-node@v2
|
|
with:
|
|
node-version: '14'
|
|
- name: Install wasmtime
|
|
run: |
|
|
curl https://wasmtime.dev/install.sh -sSf | bash
|
|
echo "$HOME/.wasmtime/bin" >> $GITHUB_PATH
|
|
- name: Cache Go
|
|
uses: actions/cache@v2
|
|
with:
|
|
key: go-cache-linux-asserts-v1-${{ hashFiles('go.mod') }}
|
|
path: |
|
|
~/.cache/go-build
|
|
~/go/pkg/mod
|
|
- name: Cache LLVM source
|
|
uses: actions/cache@v2
|
|
id: cache-llvm-source
|
|
with:
|
|
key: llvm-source-14-linux-asserts-v2
|
|
path: |
|
|
llvm-project/clang/lib/Headers
|
|
llvm-project/clang/include
|
|
llvm-project/compiler-rt
|
|
llvm-project/lld/include
|
|
llvm-project/llvm/include
|
|
- name: Download LLVM source
|
|
if: steps.cache-llvm-source.outputs.cache-hit != 'true'
|
|
run: make llvm-source
|
|
- name: Cache LLVM build
|
|
uses: actions/cache@v2
|
|
id: cache-llvm-build
|
|
with:
|
|
key: llvm-build-14-linux-asserts-v1
|
|
path: llvm-build
|
|
- name: Build LLVM
|
|
if: steps.cache-llvm-build.outputs.cache-hit != 'true'
|
|
run: |
|
|
# fetch LLVM source
|
|
rm -rf llvm-project
|
|
make llvm-source
|
|
# build!
|
|
make llvm-build ASSERT=1
|
|
# Remove unnecessary object files (to reduce cache size).
|
|
find llvm-build -name CMakeFiles -prune -exec rm -r '{}' \;
|
|
- name: Cache Binaryen
|
|
uses: actions/cache@v2
|
|
id: cache-binaryen
|
|
with:
|
|
key: binaryen-linux-asserts-v1
|
|
path: build/wasm-opt
|
|
- name: Build Binaryen
|
|
if: steps.cache-binaryen.outputs.cache-hit != 'true'
|
|
run: make binaryen
|
|
- name: Cache wasi-libc
|
|
uses: actions/cache@v2
|
|
id: cache-wasi-libc
|
|
with:
|
|
key: wasi-libc-sysroot-linux-asserts-v5
|
|
path: lib/wasi-libc/sysroot
|
|
- name: Build wasi-libc
|
|
if: steps.cache-wasi-libc.outputs.cache-hit != 'true'
|
|
run: make wasi-libc
|
|
- run: make gen-device -j4
|
|
- name: Test TinyGo
|
|
run: make ASSERT=1 test
|
|
- name: Build TinyGo
|
|
run: |
|
|
make ASSERT=1
|
|
echo "$(pwd)/build" >> $GITHUB_PATH
|
|
- name: Test stdlib packages
|
|
run: make tinygo-test
|
|
- name: Install Xtensa toolchain
|
|
run: |
|
|
curl -L https://github.com/espressif/crosstool-NG/releases/download/esp-2020r2/xtensa-esp32-elf-gcc8_2_0-esp-2020r2-linux-amd64.tar.gz -o xtensa-esp32-elf-gcc8_2_0-esp-2020r2-linux-amd64.tar.gz
|
|
sudo tar -C /usr/local -xf xtensa-esp32-elf-gcc8_2_0-esp-2020r2-linux-amd64.tar.gz
|
|
sudo ln -s /usr/local/xtensa-esp32-elf/bin/xtensa-esp32-elf-ld /usr/local/bin/xtensa-esp32-elf-ld
|
|
rm xtensa-esp32-elf-gcc8_2_0-esp-2020r2-linux-amd64.tar.gz
|
|
- run: make smoketest
|
|
- run: make wasmtest
|
|
- run: make tinygo-baremetal
|
|
build-linux-arm:
|
|
# Build ARM Linux binaries, ready for release.
|
|
# This intentionally uses an older Linux image, so that we compile against
|
|
# an older glibc version and therefore are compatible with a wide range of
|
|
# Linux distributions.
|
|
# It is set to "needs: build-linux" because it modifies the release created
|
|
# in that process to avoid doing lots of duplicate work and to avoid
|
|
# complications around precompiled libraries such as compiler-rt shipped as
|
|
# part of the release tarball.
|
|
runs-on: ubuntu-18.04
|
|
needs: build-linux
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v2
|
|
- name: Install apt dependencies
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install --no-install-recommends \
|
|
qemu-user \
|
|
g++-arm-linux-gnueabihf \
|
|
libc6-dev-armhf-cross
|
|
- name: Install Go
|
|
uses: actions/setup-go@v2
|
|
with:
|
|
go-version: '1.18.1'
|
|
- name: Cache Go
|
|
uses: actions/cache@v2
|
|
with:
|
|
key: go-cache-linux-arm-v2-${{ hashFiles('go.mod') }}
|
|
path: |
|
|
~/.cache/go-build
|
|
~/go/pkg/mod
|
|
- name: Cache LLVM source
|
|
uses: actions/cache@v2
|
|
id: cache-llvm-source
|
|
with:
|
|
key: llvm-source-14-linux-v2
|
|
path: |
|
|
llvm-project/clang/lib/Headers
|
|
llvm-project/clang/include
|
|
llvm-project/compiler-rt
|
|
llvm-project/lld/include
|
|
llvm-project/llvm/include
|
|
- name: Download LLVM source
|
|
if: steps.cache-llvm-source.outputs.cache-hit != 'true'
|
|
run: make llvm-source
|
|
- name: Cache LLVM build
|
|
uses: actions/cache@v2
|
|
id: cache-llvm-build
|
|
with:
|
|
key: llvm-build-14-linux-arm-v1
|
|
path: llvm-build
|
|
- name: Build LLVM
|
|
if: steps.cache-llvm-build.outputs.cache-hit != 'true'
|
|
run: |
|
|
# fetch LLVM source
|
|
rm -rf llvm-project
|
|
make llvm-source
|
|
# Install build dependencies.
|
|
sudo apt-get install --no-install-recommends ninja-build
|
|
# build!
|
|
make llvm-build CROSS=arm-linux-gnueabihf
|
|
# Remove unnecessary object files (to reduce cache size).
|
|
find llvm-build -name CMakeFiles -prune -exec rm -r '{}' \;
|
|
- name: Cache Binaryen
|
|
uses: actions/cache@v2
|
|
id: cache-binaryen
|
|
with:
|
|
key: binaryen-linux-arm-v1
|
|
path: build/wasm-opt
|
|
- name: Build Binaryen
|
|
if: steps.cache-binaryen.outputs.cache-hit != 'true'
|
|
run: |
|
|
sudo apt-get install --no-install-recommends ninja-build
|
|
git submodule update --init lib/binaryen
|
|
make CROSS=arm-linux-gnueabihf binaryen
|
|
- name: Install fpm
|
|
run: |
|
|
sudo gem install --no-document fpm
|
|
- name: Build TinyGo binary
|
|
run: |
|
|
make CROSS=arm-linux-gnueabihf
|
|
- name: Download amd64 release
|
|
uses: actions/download-artifact@v2
|
|
with:
|
|
name: linux-amd64-double-zipped
|
|
- name: Extract amd64 release
|
|
run: |
|
|
mkdir -p build/release
|
|
tar -xf tinygo.linux-amd64.tar.gz -C build/release tinygo
|
|
- name: Modify release
|
|
run: |
|
|
cp -p build/tinygo build/release/tinygo/bin
|
|
cp -p build/wasm-opt build/release/tinygo/bin
|
|
- name: Create arm release
|
|
run: |
|
|
make release deb RELEASEONLY=1 DEB_ARCH=armhf
|
|
cp -p build/release.tar.gz /tmp/tinygo.linux-arm.tar.gz
|
|
cp -p build/release.deb /tmp/tinygo_armhf.deb
|
|
- name: Publish release artifact
|
|
uses: actions/upload-artifact@v2
|
|
with:
|
|
name: linux-arm-double-zipped
|
|
path: |
|
|
/tmp/tinygo.linux-arm.tar.gz
|
|
/tmp/tinygo_armhf.deb
|
|
build-linux-arm64:
|
|
# Build ARM64 Linux binaries, ready for release.
|
|
# It is set to "needs: build-linux" because it modifies the release created
|
|
# in that process to avoid doing lots of duplicate work and to avoid
|
|
# complications around precompiled libraries such as compiler-rt shipped as
|
|
# part of the release tarball.
|
|
runs-on: ubuntu-18.04
|
|
needs: build-linux
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v2
|
|
- name: Install apt dependencies
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install --no-install-recommends \
|
|
qemu-user \
|
|
g++-aarch64-linux-gnu \
|
|
libc6-dev-arm64-cross \
|
|
ninja-build
|
|
- name: Install Go
|
|
uses: actions/setup-go@v2
|
|
with:
|
|
go-version: '1.18.1'
|
|
- name: Cache Go
|
|
uses: actions/cache@v2
|
|
with:
|
|
key: go-cache-linux-arm64-v2-${{ hashFiles('go.mod') }}
|
|
path: |
|
|
~/.cache/go-build
|
|
~/go/pkg/mod
|
|
- name: Cache LLVM source
|
|
uses: actions/cache@v2
|
|
id: cache-llvm-source
|
|
with:
|
|
key: llvm-source-14-linux-v1
|
|
path: |
|
|
llvm-project/clang/lib/Headers
|
|
llvm-project/clang/include
|
|
llvm-project/compiler-rt
|
|
llvm-project/lld/include
|
|
llvm-project/llvm/include
|
|
- name: Download LLVM source
|
|
if: steps.cache-llvm-source.outputs.cache-hit != 'true'
|
|
run: make llvm-source
|
|
- name: Cache LLVM build
|
|
uses: actions/cache@v2
|
|
id: cache-llvm-build
|
|
with:
|
|
key: llvm-build-14-linux-arm64-v1
|
|
path: llvm-build
|
|
- name: Build LLVM
|
|
if: steps.cache-llvm-build.outputs.cache-hit != 'true'
|
|
run: |
|
|
# fetch LLVM source
|
|
rm -rf llvm-project
|
|
make llvm-source
|
|
# build!
|
|
make llvm-build CROSS=aarch64-linux-gnu
|
|
# Remove unnecessary object files (to reduce cache size).
|
|
find llvm-build -name CMakeFiles -prune -exec rm -r '{}' \;
|
|
- name: Cache Binaryen
|
|
uses: actions/cache@v2
|
|
id: cache-binaryen
|
|
with:
|
|
key: binaryen-linux-arm64-v1
|
|
path: build/wasm-opt
|
|
- name: Build Binaryen
|
|
if: steps.cache-binaryen.outputs.cache-hit != 'true'
|
|
run: |
|
|
git submodule update --init lib/binaryen
|
|
make CROSS=aarch64-linux-gnu binaryen
|
|
- name: Install fpm
|
|
run: |
|
|
sudo gem install --no-document fpm
|
|
- name: Build TinyGo binary
|
|
run: |
|
|
make CROSS=aarch64-linux-gnu
|
|
- name: Download amd64 release
|
|
uses: actions/download-artifact@v2
|
|
with:
|
|
name: linux-amd64-double-zipped
|
|
- name: Extract amd64 release
|
|
run: |
|
|
mkdir -p build/release
|
|
tar -xf tinygo.linux-amd64.tar.gz -C build/release tinygo
|
|
- name: Modify release
|
|
run: |
|
|
cp -p build/tinygo build/release/tinygo/bin
|
|
cp -p build/wasm-opt build/release/tinygo/bin
|
|
- name: Create arm64 release
|
|
run: |
|
|
make release deb RELEASEONLY=1 DEB_ARCH=arm64
|
|
cp -p build/release.tar.gz /tmp/tinygo.linux-arm64.tar.gz
|
|
cp -p build/release.deb /tmp/tinygo_arm64.deb
|
|
- name: Publish release artifact
|
|
uses: actions/upload-artifact@v2
|
|
with:
|
|
name: linux-arm64-double-zipped
|
|
path: |
|
|
/tmp/tinygo.linux-arm64.tar.gz
|
|
/tmp/tinygo_arm64.deb
|