name: macOS on: pull_request: push: branches: - dev - release concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: build-macos: name: build-macos strategy: matrix: # macos-13: amd64 (oldest supported version as of 18-10-2024) # macos-14: arm64 (oldest arm64 version) os: [macos-13, macos-14] include: - os: macos-13 goarch: amd64 - os: macos-14 goarch: arm64 runs-on: ${{ matrix.os }} steps: - name: exit early run: command-does-not-exist - name: Install Dependencies run: | HOMEBREW_NO_AUTO_UPDATE=1 brew install qemu binaryen - name: Checkout uses: actions/checkout@v4 with: submodules: true - name: Extract TinyGo version id: version run: ./.github/workflows/tinygo-extract-version.sh | tee -a "$GITHUB_OUTPUT" - name: Install Go uses: actions/setup-go@v5 with: go-version: '1.23' cache: true - name: Restore LLVM source cache uses: actions/cache/restore@v4 id: cache-llvm-source with: key: llvm-source-18-${{ matrix.os }}-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: Save LLVM source cache uses: actions/cache/save@v4 if: steps.cache-llvm-source.outputs.cache-hit != 'true' with: key: ${{ steps.cache-llvm-source.outputs.cache-primary-key }} path: | llvm-project/clang/lib/Headers llvm-project/clang/include llvm-project/compiler-rt llvm-project/lld/include llvm-project/llvm/include - name: Restore LLVM build cache uses: actions/cache/restore@v4 id: cache-llvm-build with: key: llvm-build-18-${{ matrix.os }}-v3 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 HOMEBREW_NO_AUTO_UPDATE=1 brew install cmake ninja # build! make llvm-build find llvm-build -name CMakeFiles -prune -exec rm -r '{}' \; - name: Save LLVM build cache uses: actions/cache/save@v4 if: steps.cache-llvm-build.outputs.cache-hit != 'true' with: key: ${{ steps.cache-llvm-build.outputs.cache-primary-key }} path: llvm-build - name: Cache wasi-libc sysroot uses: actions/cache@v4 id: cache-wasi-libc with: key: wasi-libc-sysroot-${{ matrix.os }}-v1 path: lib/wasi-libc/sysroot - name: Build wasi-libc if: steps.cache-wasi-libc.outputs.cache-hit != 'true' run: make wasi-libc - name: make gen-device run: make -j3 gen-device - name: Test TinyGo run: make test GOTESTFLAGS="-short" - name: Build TinyGo release tarball run: make release -j3 - name: Test stdlib packages run: make tinygo-test - name: Make release artifact run: cp -p build/release.tar.gz build/tinygo${{ steps.version.outputs.version }}.darwin-${{ matrix.goarch }}.tar.gz - name: Publish release artifact # Note: this release artifact is double-zipped, see: # https://github.com/actions/upload-artifact/issues/39 # We can essentially pick one of these: # - have a double-zipped artifact when downloaded from the UI # - have a very slow artifact upload # We're doing the former here, to keep artifact uploads fast. uses: actions/upload-artifact@v4 with: name: darwin-${{ matrix.goarch }}-double-zipped-${{ steps.version.outputs.version }} path: build/tinygo${{ steps.version.outputs.version }}.darwin-${{ matrix.goarch }}.tar.gz - name: Smoke tests run: make smoketest TINYGO=$(PWD)/build/tinygo test-macos-homebrew: name: homebrew-install runs-on: macos-latest strategy: matrix: version: [16, 17, 18] steps: - name: exit early run: command-does-not-exist - name: Set up Homebrew uses: Homebrew/actions/setup-homebrew@master - name: Fix Python symlinks run: | # Github runners have broken symlinks, so relink # see: https://github.com/actions/setup-python/issues/577 brew list -1 | grep python | while read formula; do brew unlink $formula; brew link --overwrite $formula; done - name: Install LLVM run: | brew install llvm@${{ matrix.version }} - name: Checkout uses: actions/checkout@v4 - name: Install Go uses: actions/setup-go@v5 with: go-version: '1.23' cache: true - name: Build TinyGo (LLVM ${{ matrix.version }}) run: go install -tags=llvm${{ matrix.version }} - name: Check binary run: tinygo version - name: Build TinyGo (default LLVM) if: matrix.version == 18 run: go install - name: Check binary if: matrix.version == 18 run: tinygo version