diff --git a/.github/workflows/ink-cross.yml b/.github/workflows/ink-cross.yml index d699f28..f2614d7 100644 --- a/.github/workflows/ink-cross.yml +++ b/.github/workflows/ink-cross.yml @@ -14,6 +14,396 @@ on: permissions: { } jobs: + vars: + runs-on: ubuntu-latest + outputs: + build-date: ${{ steps.date.outputs.BUILD_DATE }} + latest-rust-version: ${{ steps.date.outputs.LATEST_RUST_VERSION }} + latest-openssl-version: ${{ steps.date.outputs.LATEST_OPENSSL_VERSION }} + steps: + - name: Build Date + id: date + run: echo "BUILD_DATE=$(date --utc)" >> "$GITHUB_OUTPUT" + - name: Latest Rust Pinned + id: rust + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: echo "LATEST_RUST_VERSION=$(gh release view -R rust-lang/rust --json tagName --jq '.tagName')" >> "$GITHUB_OUTPUT" + - name: Latest Openssl + id: openssl + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: echo "LATEST_OPENSSL_VERSION=$(gh release view -R openssl/openssl --json tagName --jq '.tagName')" >> "$GITHUB_OUTPUT" + + ink-cross-step0: + runs-on: ubuntu-latest + needs: [ vars ] + permissions: + contents: read + packages: write + outputs: + digest: ${{ steps.step0.outputs.digest }} + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + - name: Vars + env: + BUILD_DATE: ${{ needs.vars.outputs.build-date }} + LATEST_RUST_VERSION: ${{ needs.vars.outputs.latest-rust-version }} + LATEST_OPENSSL_VERSION: ${{ needs.vars.outputs.latest-openssl-version }} + run: ./build-args.sh + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + with: + image: tonistiigi/binfmt:master + - name: Docker Setup Buildx + id: buildx + uses: docker/setup-buildx-action@v3 + - name: Docker Login + if: ${{ github.event_name != 'pull_request' }} + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Docker Login + if: ${{ github.event_name != 'pull_request' }} + uses: docker/login-action@v3 + with: + registry: quay.io + username: ${{ secrets.QUAY_USER }} + password: ${{ secrets.QUAY_TOKEN }} + - name: Build and push Docker images (step0) + uses: docker/build-push-action@v6 + id: step0 + with: + context: ./ + file: ./docker/base/step0.Dockerfile + no-cache: true + cache-to: type=inline + pull: true + push: true + provenance: mode=max + sbom: true + tags: ghcr.io/cargo-prebuilt/ink-cross:base-step0,quay.io/cargo-prebuilt/ink-cross:base-step0 + build-args: | + CMAKE_VERSION=${{ env.CMAKE_VERSION }} + labels: | + tech.harmless.ink-cross.target="base/step0" + tech.harmless.ink-cross.pull_request_build="${{ github.event_name == 'pull_request' }}" + tech.harmless.ink-cross.run_number="${{ github.run_number }}" + tech.harmless.ink-cross.repo="${{ github.repositoryUrl }}" + tech.harmless.ink-cross.build_date="${{ env.BUILD_DATE }}" + tech.harmless.ink-cross.version.cmake="${{ env.CMAKE_VERSION }}" + org.opencontainers.image.authors="harmless-tech, cargo-prebuilt" + org.opencontainers.image.source = "${{ github.server_url }}/${{ github.repository }}" + platforms: linux/amd64,linux/arm64 + builder: ${{ steps.buildx.outputs.name }} + + ink-cross-step1: + runs-on: ubuntu-latest + needs: [ vars, ink-cross-step0 ] + permissions: + contents: read + packages: write + outputs: + digest-pinned: ${{ steps.step1-pinned.outputs.digest }} + digest-stable: ${{ steps.step1-stable.outputs.digest }} + digest-beta: ${{ steps.step1-beta.outputs.digest }} + digest-nightly: ${{ steps.step1-nightly.outputs.digest }} + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + - name: Vars + env: + BUILD_DATE: ${{ needs.vars.outputs.build-date }} + LATEST_RUST_VERSION: ${{ needs.vars.outputs.latest-rust-version }} + LATEST_OPENSSL_VERSION: ${{ needs.vars.outputs.latest-openssl-version }} + run: ./build-args.sh + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + with: + image: tonistiigi/binfmt:master + - name: Docker Setup Buildx + id: buildx + uses: docker/setup-buildx-action@v3 + - name: Docker Login + if: ${{ github.event_name != 'pull_request' }} + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Docker Login + if: ${{ github.event_name != 'pull_request' }} + uses: docker/login-action@v3 + with: + registry: quay.io + username: ${{ secrets.QUAY_USER }} + password: ${{ secrets.QUAY_TOKEN }} + - name: Build and push Docker images (step1 pinned) + uses: docker/build-push-action@v6 + id: step1-pinned + with: + context: ./ + file: ./docker/base/step1.Dockerfile + no-cache: true + cache-to: type=inline + pull: true + push: true + provenance: mode=max + sbom: true + tags: ghcr.io/cargo-prebuilt/ink-cross:base-step1-${{ env.LATEST_RUST_VERSION }},quay.io/cargo-prebuilt/ink-cross:base-step1-${{ env.LATEST_RUST_VERSION }} + build-args: | + IMG_BASE=ghcr.io/cargo-prebuilt/ink-cross@${{ needs.ink-cross-step0.outputs.digest }} + RUST_VERSION=${{ env.LATEST_RUST_VERSION }} + labels: | + tech.harmless.ink-cross.target="base/step1/${{ env.LATEST_RUST_VERSION }}" + tech.harmless.ink-cross.pull_request_build="${{ github.event_name == 'pull_request' }}" + tech.harmless.ink-cross.run_number="${{ github.run_number }}" + tech.harmless.ink-cross.repo="${{ github.repositoryUrl }}" + tech.harmless.ink-cross.build_date="${{ env.BUILD_DATE }}" + tech.harmless.ink-cross.version.rust="${{ env.LATEST_RUST_VERSION }}" + org.opencontainers.image.authors="harmless-tech, cargo-prebuilt" + org.opencontainers.image.source = "${{ github.server_url }}/${{ github.repository }}" + platforms: linux/amd64,linux/arm64 + builder: ${{ steps.buildx.outputs.name }} + - name: Build and push Docker images (step1 stable) + uses: docker/build-push-action@v6 + id: step1-stable + with: + context: ./ + file: ./docker/base/step1.Dockerfile + no-cache: true + cache-to: type=inline + pull: true + push: true + provenance: mode=max + sbom: true + tags: ghcr.io/cargo-prebuilt/ink-cross:base-step1-stable,quay.io/cargo-prebuilt/ink-cross:base-step1-stable + build-args: | + IMG_BASE=ghcr.io/cargo-prebuilt/ink-cross@${{ needs.ink-cross-step0.outputs.digest }} + RUST_VERSION=stable + labels: | + tech.harmless.ink-cross.target="base/step1/stable" + tech.harmless.ink-cross.pull_request_build="${{ github.event_name == 'pull_request' }}" + tech.harmless.ink-cross.run_number="${{ github.run_number }}" + tech.harmless.ink-cross.repo="${{ github.repositoryUrl }}" + tech.harmless.ink-cross.build_date="${{ env.BUILD_DATE }}" + tech.harmless.ink-cross.version.rust="stable" + org.opencontainers.image.authors="harmless-tech, cargo-prebuilt" + org.opencontainers.image.source = "${{ github.server_url }}/${{ github.repository }}" + platforms: linux/amd64,linux/arm64 + builder: ${{ steps.buildx.outputs.name }} + - name: Build and push Docker images (step1 beta) + uses: docker/build-push-action@v6 + id: step1-beta + with: + context: ./ + file: ./docker/base/step1.Dockerfile + no-cache: true + cache-to: type=inline + pull: true + push: true + provenance: mode=max + sbom: true + tags: ghcr.io/cargo-prebuilt/ink-cross:base-step1-beta,quay.io/cargo-prebuilt/ink-cross:base-step1-beta + build-args: | + IMG_BASE=ghcr.io/cargo-prebuilt/ink-cross@${{ needs.ink-cross-step0.outputs.digest }} + RUST_VERSION=beta + labels: | + tech.harmless.ink-cross.target="base/step1/beta" + tech.harmless.ink-cross.pull_request_build="${{ github.event_name == 'pull_request' }}" + tech.harmless.ink-cross.run_number="${{ github.run_number }}" + tech.harmless.ink-cross.repo="${{ github.repositoryUrl }}" + tech.harmless.ink-cross.build_date="${{ env.BUILD_DATE }}" + tech.harmless.ink-cross.version.rust="beta" + org.opencontainers.image.authors="harmless-tech, cargo-prebuilt" + org.opencontainers.image.source = "${{ github.server_url }}/${{ github.repository }}" + platforms: linux/amd64,linux/arm64 + builder: ${{ steps.buildx.outputs.name }} + - name: Build and push Docker images (step1 nightly) + uses: docker/build-push-action@v6 + id: step1-nightly + with: + context: ./ + file: ./docker/base/step1.Dockerfile + no-cache: true + cache-to: type=inline + pull: true + push: true + provenance: mode=max + sbom: true + tags: ghcr.io/cargo-prebuilt/ink-cross:base-step1-nightly,quay.io/cargo-prebuilt/ink-cross:base-step1-nightly + build-args: | + IMG_BASE=ghcr.io/cargo-prebuilt/ink-cross@${{ needs.ink-cross-step0.outputs.digest }} + RUST_VERSION=nightly + labels: | + tech.harmless.ink-cross.target="base/step1/nightly" + tech.harmless.ink-cross.pull_request_build="${{ github.event_name == 'pull_request' }}" + tech.harmless.ink-cross.run_number="${{ github.run_number }}" + tech.harmless.ink-cross.repo="${{ github.repositoryUrl }}" + tech.harmless.ink-cross.build_date="${{ env.BUILD_DATE }}" + tech.harmless.ink-cross.version.rust="nightly" + org.opencontainers.image.authors="harmless-tech, cargo-prebuilt" + org.opencontainers.image.source = "${{ github.server_url }}/${{ github.repository }}" + platforms: linux/amd64,linux/arm64 + builder: ${{ steps.buildx.outputs.name }} + + ink-cross-step2-clang: + runs-on: ubuntu-latest + needs: [ vars, ink-cross-step1 ] + permissions: + contents: read + packages: write + outputs: + digest-pinned: ${{ steps.step2-pinned.outputs.digest }} + digest-stable: ${{ steps.step2-stable.outputs.digest }} + digest-beta: ${{ steps.step2-beta.outputs.digest }} + digest-nightly: ${{ steps.step2-nightly.outputs.digest }} + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + - name: Vars + env: + BUILD_DATE: ${{ needs.vars.outputs.build-date }} + LATEST_RUST_VERSION: ${{ needs.vars.outputs.latest-rust-version }} + LATEST_OPENSSL_VERSION: ${{ needs.vars.outputs.latest-openssl-version }} + run: ./build-args.sh + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + with: + image: tonistiigi/binfmt:master + - name: Docker Setup Buildx + id: buildx + uses: docker/setup-buildx-action@v3 + - name: Docker Login + if: ${{ github.event_name != 'pull_request' }} + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Docker Login + if: ${{ github.event_name != 'pull_request' }} + uses: docker/login-action@v3 + with: + registry: quay.io + username: ${{ secrets.QUAY_USER }} + password: ${{ secrets.QUAY_TOKEN }} + - name: Build and push Docker images (step2 pinned) + uses: docker/build-push-action@v6 + id: step2-pinned + with: + context: ./ + file: ./docker/base/step2-clang.Dockerfile + no-cache: true + cache-to: type=inline + pull: true + push: true + provenance: mode=max + sbom: true + tags: ghcr.io/cargo-prebuilt/ink-cross:base-step2-clang-${{ env.LATEST_RUST_VERSION }},quay.io/cargo-prebuilt/ink-cross:base-step2-clang-${{ env.LATEST_RUST_VERSION }} + build-args: | + IMG_BASE=ghcr.io/cargo-prebuilt/ink-cross@${{ needs.ink-cross-step1.outputs.digest-pinned }} + LLVM_VERSION=${{ env.LLVM_VERSION }} + labels: | + tech.harmless.ink-cross.target="base/step2-clang/${{ env.LLVM_VERSION }}" + tech.harmless.ink-cross.pull_request_build="${{ github.event_name == 'pull_request' }}" + tech.harmless.ink-cross.run_number="${{ github.run_number }}" + tech.harmless.ink-cross.repo="${{ github.repositoryUrl }}" + tech.harmless.ink-cross.build_date="${{ env.BUILD_DATE }}" + tech.harmless.ink-cross.version.llvm="${{ env.LLVM_VERSION }}" + org.opencontainers.image.authors="harmless-tech, cargo-prebuilt" + org.opencontainers.image.source = "${{ github.server_url }}/${{ github.repository }}" + platforms: linux/amd64,linux/arm64 + builder: ${{ steps.buildx.outputs.name }} + - name: Build and push Docker images (step2 stable) + uses: docker/build-push-action@v6 + id: step2-stable + with: + context: ./ + file: ./docker/base/step2-clang.Dockerfile + no-cache: true + cache-to: type=inline + pull: true + push: true + provenance: mode=max + sbom: true + tags: ghcr.io/cargo-prebuilt/ink-cross:base-step2-clang-stable,quay.io/cargo-prebuilt/ink-cross:base-step2-clang-stable + build-args: | + IMG_BASE=ghcr.io/cargo-prebuilt/ink-cross@${{ needs.ink-cross-step1.outputs.digest-stable }} + LLVM_VERSION=${{ env.LLVM_VERSION }} + labels: | + tech.harmless.ink-cross.target="base/step2-clang/${{ env.LLVM_VERSION }}" + tech.harmless.ink-cross.pull_request_build="${{ github.event_name == 'pull_request' }}" + tech.harmless.ink-cross.run_number="${{ github.run_number }}" + tech.harmless.ink-cross.repo="${{ github.repositoryUrl }}" + tech.harmless.ink-cross.build_date="${{ env.BUILD_DATE }}" + tech.harmless.ink-cross.version.llvm="${{ env.LLVM_VERSION }}" + org.opencontainers.image.authors="harmless-tech, cargo-prebuilt" + org.opencontainers.image.source = "${{ github.server_url }}/${{ github.repository }}" + platforms: linux/amd64,linux/arm64 + builder: ${{ steps.buildx.outputs.name }} + - name: Build and push Docker images (step2 beta) + uses: docker/build-push-action@v6 + id: step2-beta + with: + context: ./ + file: ./docker/base/step2-clang.Dockerfile + no-cache: true + cache-to: type=inline + pull: true + push: true + provenance: mode=max + sbom: true + tags: ghcr.io/cargo-prebuilt/ink-cross:base-step2-clang-beta,quay.io/cargo-prebuilt/ink-cross:base-step2-clang-beta + build-args: | + IMG_BASE=ghcr.io/cargo-prebuilt/ink-cross@${{ needs.ink-cross-step1.outputs.digest-beta }} + LLVM_VERSION=${{ env.LLVM_VERSION }} + labels: | + tech.harmless.ink-cross.target="base/step2-clang/${{ env.LLVM_VERSION }}" + tech.harmless.ink-cross.pull_request_build="${{ github.event_name == 'pull_request' }}" + tech.harmless.ink-cross.run_number="${{ github.run_number }}" + tech.harmless.ink-cross.repo="${{ github.repositoryUrl }}" + tech.harmless.ink-cross.build_date="${{ env.BUILD_DATE }}" + tech.harmless.ink-cross.version.llvm="${{ env.LLVM_VERSION }}" + org.opencontainers.image.authors="harmless-tech, cargo-prebuilt" + org.opencontainers.image.source = "${{ github.server_url }}/${{ github.repository }}" + platforms: linux/amd64,linux/arm64 + builder: ${{ steps.buildx.outputs.name }} + - name: Build and push Docker images (step2 nightly) + uses: docker/build-push-action@v6 + id: step2-nightly + with: + context: ./ + file: ./docker/base/step2-clang.Dockerfile + no-cache: true + cache-to: type=inline + pull: true + push: true + provenance: mode=max + sbom: true + tags: ghcr.io/cargo-prebuilt/ink-cross:base-step2-clang-nightly,quay.io/cargo-prebuilt/ink-cross:base-step2-clang-nightly + build-args: | + IMG_BASE=ghcr.io/cargo-prebuilt/ink-cross@${{ needs.ink-cross-step1.outputs.digest-nightly }} + LLVM_VERSION=${{ env.LLVM_VERSION }} + labels: | + tech.harmless.ink-cross.target="base/step2-clang/${{ env.LLVM_VERSION }}" + tech.harmless.ink-cross.pull_request_build="${{ github.event_name == 'pull_request' }}" + tech.harmless.ink-cross.run_number="${{ github.run_number }}" + tech.harmless.ink-cross.repo="${{ github.repositoryUrl }}" + tech.harmless.ink-cross.build_date="${{ env.BUILD_DATE }}" + tech.harmless.ink-cross.version.llvm="${{ env.LLVM_VERSION }}" + org.opencontainers.image.authors="harmless-tech, cargo-prebuilt" + org.opencontainers.image.source = "${{ github.server_url }}/${{ github.repository }}" + platforms: linux/amd64,linux/arm64 + builder: ${{ steps.buildx.outputs.name }} + +# TODO: Clang version! ink-cross: strategy: fail-fast: false @@ -52,6 +442,7 @@ jobs: platforms: linux/amd64,linux/arm64 nightly-only: true runs-on: ubuntu-latest + needs: [ vars, ink-cross-step1, ink-cross-step2-clang ] permissions: contents: read packages: write @@ -59,6 +450,12 @@ jobs: - uses: actions/checkout@v4 with: persist-credentials: false + - name: Vars + env: + BUILD_DATE: ${{ needs.vars.outputs.build-date }} + LATEST_RUST_VERSION: ${{ needs.vars.outputs.latest-rust-version }} + LATEST_OPENSSL_VERSION: ${{ needs.vars.outputs.latest-openssl-version }} + run: ./build-args.sh - name: Set up QEMU uses: docker/setup-qemu-action@v3 with: @@ -66,7 +463,6 @@ jobs: - name: Docker Setup Buildx id: buildx uses: docker/setup-buildx-action@v3 - - name: Docker Login if: ${{ github.event_name != 'pull_request' }} uses: docker/login-action@v3 @@ -81,21 +477,6 @@ jobs: registry: quay.io username: ${{ secrets.QUAY_USER }} password: ${{ secrets.QUAY_TOKEN }} - - - name: Vars - run: | - echo "BUILD_DATE=$(date --utc)" >> "$GITHUB_ENV" - ./build-args.sh - - name: Vars (Latest Rust Pinned) - if: ${{ matrix.nightly-only == '' }} - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: echo "LATEST_RUST_VERSION=$(gh release view -R rust-lang/rust --json tagName --jq '.tagName')" >> "$GITHUB_ENV" - - name: Vars (Latest Openssl) - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: echo "OPENSSL_VERSION=$(gh release view -R openssl/openssl --json tagName --jq '.tagName')" >> "$GITHUB_ENV" - - name: Build and push Docker images (pinned) if: ${{ matrix.nightly-only == '' }} uses: docker/build-push-action@v6 @@ -110,10 +491,8 @@ jobs: sbom: true tags: ghcr.io/cargo-prebuilt/ink-cross:${{ env.LATEST_RUST_VERSION }}-${{ matrix.target }},quay.io/cargo-prebuilt/ink-cross:${{ env.LATEST_RUST_VERSION }}-${{ matrix.target }} build-args: | - RUST_VERSION=${{ env.LATEST_RUST_VERSION }} - CMAKE_VERSION=${{ env.CMAKE_VERSION }} + IMG_BASE=ghcr.io/cargo-prebuilt/ink-cross@${{ needs.ink-cross-step1.outputs.digest-pinned }} OPENSSL_VERSION=${{ env.OPENSSL_VERSION }} - LLVM_VERSION=${{ env.LLVM_VERSION }} MUSL_VERSION=${{ env.MUSL_VERSION }} FREEBSD_MAJOR=${{ env.FREEBSD_MAJOR }} NETBSD_MAJOR=${{ env.NETBSD_MAJOR }} @@ -132,7 +511,6 @@ jobs: org.opencontainers.image.source = "${{ github.server_url }}/${{ github.repository }}" platforms: ${{ matrix.platforms }} builder: ${{ steps.buildx.outputs.name }} - - name: Build and push Docker images (stable) if: ${{ matrix.nightly-only == '' }} uses: docker/build-push-action@v6 @@ -146,11 +524,8 @@ jobs: sbom: true tags: ghcr.io/cargo-prebuilt/ink-cross:stable-${{ matrix.target }},quay.io/cargo-prebuilt/ink-cross:stable-${{ matrix.target }} build-args: | - RUST_VERSION=stable - RUSTUP_VERSION=${{ env.RUSTUP_VERSION }} - CMAKE_VERSION=${{ env.CMAKE_VERSION }} + IMG_BASE=ghcr.io/cargo-prebuilt/ink-cross@${{ needs.ink-cross-step1.outputs.digest-stable }} OPENSSL_VERSION=${{ env.OPENSSL_VERSION }} - LLVM_VERSION=${{ env.LLVM_VERSION }} MUSL_VERSION=${{ env.MUSL_VERSION }} FREEBSD_MAJOR=${{ env.FREEBSD_MAJOR }} NETBSD_MAJOR=${{ env.NETBSD_MAJOR }} @@ -162,7 +537,6 @@ jobs: tech.harmless.ink-cross.repo="${{ github.repositoryUrl }}" tech.harmless.ink-cross.build_date="${{ env.BUILD_DATE }}" tech.harmless.ink-cross.version.rust="stable" - tech.harmless.ink-cross.version.rustup="${{ env.RUSTUP_VERSION }}" tech.harmless.ink-cross.version.cmake="${{ env.CMAKE_VERSION }}" tech.harmless.ink-cross.version.openssl="${{ env.OPENSSL_VERSION }}" tech.harmless.ink-cross.version.llvm="${{ env.LLVM_VERSION }}" @@ -170,7 +544,6 @@ jobs: org.opencontainers.image.source = "${{ github.server_url }}/${{ github.repository }}" platforms: ${{ matrix.platforms }} builder: ${{ steps.buildx.outputs.name }} - - name: Build and push Docker images (beta) if: ${{ matrix.nightly-only == '' }} uses: docker/build-push-action@v6 @@ -184,11 +557,8 @@ jobs: sbom: true tags: ghcr.io/cargo-prebuilt/ink-cross:beta-${{ matrix.target }},quay.io/cargo-prebuilt/ink-cross:beta-${{ matrix.target }} build-args: | - RUST_VERSION=beta - RUSTUP_VERSION=${{ env.RUSTUP_VERSION }} - CMAKE_VERSION=${{ env.CMAKE_VERSION }} + IMG_BASE=ghcr.io/cargo-prebuilt/ink-cross@${{ needs.ink-cross-step1.outputs.digest-beta }} OPENSSL_VERSION=${{ env.OPENSSL_VERSION }} - LLVM_VERSION=${{ env.LLVM_VERSION }} MUSL_VERSION=${{ env.MUSL_VERSION }} FREEBSD_MAJOR=${{ env.FREEBSD_MAJOR }} NETBSD_MAJOR=${{ env.NETBSD_MAJOR }} @@ -200,7 +570,6 @@ jobs: tech.harmless.ink-cross.repo="${{ github.repositoryUrl }}" tech.harmless.ink-cross.build_date="${{ env.BUILD_DATE }}" tech.harmless.ink-cross.version.rust="beta" - tech.harmless.ink-cross.version.rustup="${{ env.RUSTUP_VERSION }}" tech.harmless.ink-cross.version.cmake="${{ env.CMAKE_VERSION }}" tech.harmless.ink-cross.version.openssl="${{ env.OPENSSL_VERSION }}" tech.harmless.ink-cross.version.llvm="${{ env.LLVM_VERSION }}" @@ -208,7 +577,6 @@ jobs: org.opencontainers.image.source = "${{ github.server_url }}/${{ github.repository }}" platforms: ${{ matrix.platforms }} builder: ${{ steps.buildx.outputs.name }} - - name: Build and push Docker images (nightly) uses: docker/build-push-action@v6 with: @@ -221,11 +589,8 @@ jobs: sbom: true tags: ghcr.io/cargo-prebuilt/ink-cross:nightly-${{ matrix.target }},quay.io/cargo-prebuilt/ink-cross:nightly-${{ matrix.target }} build-args: | - RUST_VERSION=nightly - RUSTUP_VERSION=${{ env.RUSTUP_VERSION }} - CMAKE_VERSION=${{ env.CMAKE_VERSION }} + IMG_BASE=ghcr.io/cargo-prebuilt/ink-cross@${{ needs.ink-cross-step1.outputs.digest-nightly }} OPENSSL_VERSION=${{ env.OPENSSL_VERSION }} - LLVM_VERSION=${{ env.LLVM_VERSION }} MUSL_VERSION=${{ env.MUSL_VERSION }} FREEBSD_MAJOR=${{ env.FREEBSD_MAJOR }} NETBSD_MAJOR=${{ env.NETBSD_MAJOR }} @@ -237,7 +602,6 @@ jobs: tech.harmless.ink-cross.repo="${{ github.repositoryUrl }}" tech.harmless.ink-cross.build_date="${{ env.BUILD_DATE }}" tech.harmless.ink-cross.version.rust="nightly" - tech.harmless.ink-cross.version.rustup="${{ env.RUSTUP_VERSION }}" tech.harmless.ink-cross.version.cmake="${{ env.CMAKE_VERSION }}" tech.harmless.ink-cross.version.openssl="${{ env.OPENSSL_VERSION }}" tech.harmless.ink-cross.version.llvm="${{ env.LLVM_VERSION }}" diff --git a/build-args.sh b/build-args.sh index f431d0f..480cbb5 100755 --- a/build-args.sh +++ b/build-args.sh @@ -2,11 +2,15 @@ { echo "CMAKE_VERSION=3.31.2" - echo "OPENSSL_VERSION=openssl-3.4.0" + #echo "OPENSSL_VERSION=openssl-3.4.0" echo "LLVM_VERSION=19" echo "MUSL_VERSION=1.2.5" echo "FREEBSD_MAJOR=13" echo "NETBSD_MAJOR=10" # Bypass openbsd cdn listing a release that is not out. (#36) echo "OPENBSD_MAJOR=7.6" + # Dynamics + echo "BUILD_DATE=$BUILD_DATE" + echo "RUST_VERSION=$LATEST_RUST_VERSION" + echo "OPENSSL_VERSION=$LATEST_OPENSSL_VERSION" } >> "$GITHUB_ENV" diff --git a/docker/base/step0.Dockerfile b/docker/base/step0.Dockerfile new file mode 100644 index 0000000..4af0eb5 --- /dev/null +++ b/docker/base/step0.Dockerfile @@ -0,0 +1,37 @@ +# syntax=docker/dockerfile:1 +ARG DEBIAN_VERSION=12-slim +FROM debian:$DEBIAN_VERSION + +# Build Args +ARG EXT_CURL_CMD="curl --retry 3 -fsSL --tlsv1.2" +ARG TARGETARCH + +# Versioning +ARG CMAKE_VERSION=3.31.2 +ENV CMAKE_VERSION=${CMAKE_VERSION} + +# Do not set +ENV DEBIAN_FRONTEND=noninteractive + +ENV RUSTUP_HOME=/usr/local/rustup \ + CARGO_HOME=/usr/local/cargo \ + PATH=/usr/local/cargo/bin:$PATH \ + CARGO_TERM_COLOR=always + +# Copy required scripts and Dockerfile +COPY ./scripts/base/step0 /ink/scripts/base/step0 +COPY ./docker/base/step0.Dockerfile /ink/dockerfiles + +# Upgrade and install apt packages +RUN /ink/scripts/base/step0/manage-apt.sh + +# Install cmake +RUN /ink/scripts/base/step0/install-cmake.sh +COPY ./cmake/toolchain-gcc.cmake /opt/toolchain.cmake + +# Cargo prebuilt +RUN /ink/scripts/base/step0/install-cargo-prebuilt.sh + +WORKDIR /project +ENTRYPOINT [ "/entrypoint.sh" ] +CMD [ "auditable", "build" ] diff --git a/docker/base/step1.Dockerfile b/docker/base/step1.Dockerfile new file mode 100644 index 0000000..46568ad --- /dev/null +++ b/docker/base/step1.Dockerfile @@ -0,0 +1,21 @@ +# syntax=docker/dockerfile:1 +ARG IMG_BASE=ghcr.io/cargo-prebuilt/ink-cross:base-step0 +FROM ${IMG_BASE} + +# Build Args +ARG EXT_CURL_CMD="curl --retry 3 -fsSL --tlsv1.2" +ARG TARGETARCH + +# Versioning +ARG RUST_VERSION=stable +ENV RUST_VERSION=${RUST_VERSION} + +# Copy required scripts and Dockerfile +COPY ./scripts/base/step1 /ink/scripts/base/step1 +COPY ./docker/base/step1.Dockerfile /ink/dockerfiles + +# Install rust toolchain +RUN /ink/scripts/base/step1/install-rustup.sh + +# Create Entrypoint +RUN /ink/scripts/base/step1/entrypoint.sh diff --git a/docker/base/step2-clang.Dockerfile b/docker/base/step2-clang.Dockerfile new file mode 100644 index 0000000..acb2bb3 --- /dev/null +++ b/docker/base/step2-clang.Dockerfile @@ -0,0 +1,21 @@ +# syntax=docker/dockerfile:1 +ARG IMG_BASE=ghcr.io/cargo-prebuilt/ink-cross:base-step1-stable +FROM ${IMG_BASE} + +# Build Args +ARG EXT_CURL_CMD="curl --retry 3 -fsSL --tlsv1.2" +ARG TARGETARCH + +# Versioning +ARG LLVM_VERSION=19 +ENV LLVM_VERSION=${LLVM_VERSION} + +# Copy required scripts and Dockerfile +COPY ./scripts/base/step2-clang /ink/scripts/base/step2-clang +COPY ./docker/base/step2-clang.Dockerfile /ink/dockerfiles + +# Override gnu cmake toolchain +COPY ./cmake/toolchain-clang.cmake /opt/toolchain.cmake + +# Install clang +RUN /ink/scripts/base/step2-clang/install-clang.sh diff --git a/docker/target/clang/aarch64-unknown-freebsd.Dockerfile b/docker/target/clang/aarch64-unknown-freebsd.Dockerfile new file mode 100644 index 0000000..08db917 --- /dev/null +++ b/docker/target/clang/aarch64-unknown-freebsd.Dockerfile @@ -0,0 +1,64 @@ +# syntax=docker/dockerfile:1 +ARG IMG_BASE=ghcr.io/cargo-prebuilt/ink-cross:base-step2-clang-nightly +FROM ${IMG_BASE} + +################################ +# This target is nightly ONLY! # +################################ + +# Build CMDS +ARG EXT_CURL_CMD="curl --retry 3 -fsSL --tlsv1.2" +ARG TARGETARCH + +# Versioning +ARG OPENSSL_VERSION=openssl-3.4.0 +ARG FREEBSD_MAJOR=13 + +ARG RUST_TARGET=aarch64-unknown-freebsd +ARG FREEBSD_ARCH=arm64 + +ARG CROSS_TOOLCHAIN=aarch64-unknown-freebsd${FREEBSD_MAJOR} +ARG CROSS_TOOLCHAIN_PREFIX=${CROSS_TOOLCHAIN}- +ARG CROSS_SYSROOT=/usr/${CROSS_TOOLCHAIN} + +ARG OPENSSL_COMBO=BSD-generic64 + +ARG LLVM_TARGET=$RUST_TARGET + +# Copy required scripts and Dockerfile +COPY ./scripts/target/clang /ink/scripts/target/clang +COPY ./scripts/target/bsd/freebsd /ink/scripts/target/bsd/freebsd +COPY ./docker/target/clang/$RUST_TARGET.Dockerfile /ink/dockerfiles + +# Setup clang +ENV PATH=$PATH:$CROSS_SYSROOT/usr/bin +RUN /ink/scripts/target/clang/setup-clang.sh + +# Install freebsd +RUN /ink/scripts/target/bsd/freebsd/extract-freebsd-sysroot.sh + +# Openssl +ENV OPENSSL_DIR=$CROSS_SYSROOT/usr +RUN /ink/scripts/target/clang/install-openssl-clang.sh + +# Install rust target +ENV RUST_TARGET=$RUST_TARGET +# RUN rustup target add "$RUST_TARGET" + +ENV CROSS_TOOLCHAIN_PREFIX=$CROSS_TOOLCHAIN_PREFIX +ENV CROSS_SYSROOT=$CROSS_SYSROOT +ENV CARGO_TARGET_AARCH64_UNKNOWN_FREEBSD_LINKER="${CROSS_TOOLCHAIN_PREFIX}clang" \ + CARGO_BUILD_TARGET=$RUST_TARGET \ + AR_aarch64_unknown_freebsd="${CROSS_TOOLCHAIN_PREFIX}ar" \ + CC_aarch64_unknown_freebsd="${CROSS_TOOLCHAIN_PREFIX}clang" \ + CXX_aarch64_unknown_freebsd="${CROSS_TOOLCHAIN_PREFIX}clang++" \ + CMAKE_TOOLCHAIN_FILE_aarch64_unknown_freebsd=/opt/toolchain.cmake \ + BINDGEN_EXTRA_CLANG_ARGS_aarch64_unknown_freebsd="--sysroot=$CROSS_SYSROOT" \ + RUST_TEST_THREADS=1 \ + PKG_CONFIG_ALLOW_CROSS_aarch64_unknown_freebsd=true \ + PKG_CONFIG_PATH="/usr/$CROSS_TOOLCHAIN/usr/lib/pkgconfig/:/usr/local/$CROSS_TOOLCHAIN/lib/pkgconfig/:/usr/lib/$CROSS_TOOLCHAIN/pkgconfig/" \ + PKG_CONFIG_ALLOW_CROSS=1 \ + CROSS_CMAKE_SYSTEM_NAME=FreeBSD \ + CROSS_CMAKE_SYSTEM_PROCESSOR=arm64 \ + CROSS_CMAKE_CRT=freebsd \ + CROSS_CMAKE_OBJECT_FLAGS="-ffunction-sections -fdata-sections -fPIC -m64" diff --git a/docker/target/clang/x86_64-unknown-freebsd.Dockerfile b/docker/target/clang/x86_64-unknown-freebsd.Dockerfile new file mode 100644 index 0000000..263704a --- /dev/null +++ b/docker/target/clang/x86_64-unknown-freebsd.Dockerfile @@ -0,0 +1,60 @@ +# syntax=docker/dockerfile:1 +ARG IMG_BASE=ghcr.io/cargo-prebuilt/ink-cross:base-step2-clang-stable +FROM ${IMG_BASE} + +# Build CMDS +ARG EXT_CURL_CMD="curl --retry 3 -fsSL --tlsv1.2" +ARG TARGETARCH + +# Versioning +ARG OPENSSL_VERSION=openssl-3.4.0 +ARG FREEBSD_MAJOR=13 + +ARG RUST_TARGET=x86_64-unknown-freebsd +ARG FREEBSD_ARCH=amd64 + +ARG CROSS_TOOLCHAIN=x86_64-unknown-freebsd${FREEBSD_MAJOR} +ARG CROSS_TOOLCHAIN_PREFIX=${CROSS_TOOLCHAIN}- +ARG CROSS_SYSROOT=/usr/${CROSS_TOOLCHAIN} + +ARG OPENSSL_COMBO=BSD-x86_64 + +ARG LLVM_TARGET=$RUST_TARGET + +# Copy required scripts and Dockerfile +COPY ./scripts/target/clang /ink/scripts/target/clang +COPY ./scripts/target/bsd/freebsd /ink/scripts/target/bsd/freebsd +COPY ./docker/target/clang/$RUST_TARGET.Dockerfile /ink/dockerfiles + +# Setup clang +ENV PATH=$PATH:$CROSS_SYSROOT/usr/bin +RUN /ink/scripts/target/clang/setup-clang.sh + +# Install freebsd +RUN /ink/scripts/target/bsd/freebsd/extract-freebsd-sysroot.sh + +# Openssl +ENV OPENSSL_DIR=$CROSS_SYSROOT/usr +RUN /ink/scripts/target/clang/install-openssl-clang.sh + +# Install rust target +ENV RUST_TARGET=$RUST_TARGET +RUN rustup target add "$RUST_TARGET" + +ENV CROSS_TOOLCHAIN_PREFIX=$CROSS_TOOLCHAIN_PREFIX +ENV CROSS_SYSROOT=$CROSS_SYSROOT +ENV CARGO_TARGET_X86_64_UNKNOWN_FREEBSD_LINKER="${CROSS_TOOLCHAIN_PREFIX}clang" \ + CARGO_BUILD_TARGET=$RUST_TARGET \ + AR_x86_64_unknown_freebsd="${CROSS_TOOLCHAIN_PREFIX}ar" \ + CC_x86_64_unknown_freebsd="${CROSS_TOOLCHAIN_PREFIX}clang" \ + CXX_x86_64_unknown_freebsd="${CROSS_TOOLCHAIN_PREFIX}clang++" \ + CMAKE_TOOLCHAIN_FILE_x86_64_unknown_freebsd=/opt/toolchain.cmake \ + BINDGEN_EXTRA_CLANG_ARGS_x86_64_unknown_freebsd="--sysroot=$CROSS_SYSROOT" \ + RUST_TEST_THREADS=1 \ + PKG_CONFIG_ALLOW_CROSS_x86_64_unknown_freebsd=true \ + PKG_CONFIG_PATH="/usr/$CROSS_TOOLCHAIN/usr/lib/pkgconfig/:/usr/local/$CROSS_TOOLCHAIN/lib/pkgconfig/:/usr/lib/$CROSS_TOOLCHAIN/pkgconfig/" \ + PKG_CONFIG_ALLOW_CROSS=1 \ + CROSS_CMAKE_SYSTEM_NAME=FreeBSD \ + CROSS_CMAKE_SYSTEM_PROCESSOR=amd64 \ + CROSS_CMAKE_CRT=freebsd \ + CROSS_CMAKE_OBJECT_FLAGS="-ffunction-sections -fdata-sections -fPIC -m64" diff --git a/docker/target/clang/x86_64-unknown-netbsd.Dockerfile b/docker/target/clang/x86_64-unknown-netbsd.Dockerfile new file mode 100644 index 0000000..8988d4c --- /dev/null +++ b/docker/target/clang/x86_64-unknown-netbsd.Dockerfile @@ -0,0 +1,60 @@ +# syntax=docker/dockerfile:1 +ARG IMG_BASE=ghcr.io/cargo-prebuilt/ink-cross:base-step2-clang-stable +FROM ${IMG_BASE} + +# Build CMDS +ARG EXT_CURL_CMD="curl --retry 3 -fsSL --tlsv1.2" +ARG TARGETARCH + +# Versioning +ARG OPENSSL_VERSION=openssl-3.4.0 +ARG NETBSD_MAJOR=10 + +ARG RUST_TARGET=x86_64-unknown-netbsd +ARG NETBSD_ARCH=amd64 + +ARG CROSS_TOOLCHAIN=x86_64-unknown-netbsd${NETBSD_MAJOR} +ARG CROSS_TOOLCHAIN_PREFIX=${CROSS_TOOLCHAIN}- +ARG CROSS_SYSROOT=/usr/${CROSS_TOOLCHAIN} + +ARG OPENSSL_COMBO=BSD-x86_64 + +ARG LLVM_TARGET=$RUST_TARGET + +# Copy required scripts and Dockerfile +COPY ./scripts/target/clang /ink/scripts/target/clang +COPY ./scripts/target/bsd/netbsd /ink/scripts/target/bsd/netbsd +COPY ./docker/target/clang/$RUST_TARGET.Dockerfile /ink/dockerfiles + +# Setup clang +ENV PATH=$PATH:$CROSS_SYSROOT/usr/bin +RUN /ink/scripts/target/clang/setup-clang.sh + +# Install freebsd +RUN /ink/scripts/target/bsd/netbsd/extract-netbsd-sysroot.sh + +# Openssl +ENV OPENSSL_DIR=$CROSS_SYSROOT/usr +RUN /ink/scripts/target/clang/install-openssl-clang.sh + +# Install rust target +ENV RUST_TARGET=$RUST_TARGET +RUN rustup target add "$RUST_TARGET" + +ENV CROSS_TOOLCHAIN_PREFIX=$CROSS_TOOLCHAIN_PREFIX +ENV CROSS_SYSROOT=$CROSS_SYSROOT +ENV CARGO_TARGET_X86_64_UNKNOWN_NETBSD_LINKER="${CROSS_TOOLCHAIN_PREFIX}clang" \ + CARGO_BUILD_TARGET=$RUST_TARGET \ + AR_x86_64_unknown_netbsd="${CROSS_TOOLCHAIN_PREFIX}ar" \ + CC_x86_64_unknown_netbsd="${CROSS_TOOLCHAIN_PREFIX}clang" \ + CXX_x86_64_unknown_netbsd="${CROSS_TOOLCHAIN_PREFIX}clang++" \ + CMAKE_TOOLCHAIN_FILE_x86_64_unknown_netbsd=/opt/toolchain.cmake \ + BINDGEN_EXTRA_CLANG_ARGS_x86_64_unknown_netbsd="--sysroot=$CROSS_SYSROOT" \ + RUST_TEST_THREADS=1 \ + PKG_CONFIG_ALLOW_CROSS_x86_64_unknown_netbsd=true \ + PKG_CONFIG_PATH="/usr/$CROSS_TOOLCHAIN/usr/lib/pkgconfig/:/usr/local/$CROSS_TOOLCHAIN/lib/pkgconfig/:/usr/lib/$CROSS_TOOLCHAIN/pkgconfig/" \ + PKG_CONFIG_ALLOW_CROSS=1 \ + CROSS_CMAKE_SYSTEM_NAME=NetBSD \ + CROSS_CMAKE_SYSTEM_PROCESSOR=amd64 \ + CROSS_CMAKE_CRT=netbsd \ + CROSS_CMAKE_OBJECT_FLAGS="-ffunction-sections -fdata-sections -fPIC -m64" diff --git a/docker/target/clang/x86_64-unknown-openbsd.Dockerfile b/docker/target/clang/x86_64-unknown-openbsd.Dockerfile new file mode 100644 index 0000000..7c30ac8 --- /dev/null +++ b/docker/target/clang/x86_64-unknown-openbsd.Dockerfile @@ -0,0 +1,66 @@ +# syntax=docker/dockerfile:1 +ARG IMG_BASE=ghcr.io/cargo-prebuilt/ink-cross:base-step2-clang-nightly +FROM ${IMG_BASE} + +################################ +# This target is nightly ONLY! # +################################ + +# Build CMDS +ARG EXT_CURL_CMD="curl --retry 3 -fsSL --tlsv1.2" +ARG TARGETARCH + +# Versioning +ARG OPENSSL_VERSION=openssl-3.4.0 +# Bypass openbsd cdn listing a release that is not out. (#36) +ARG OPENBSD_MAJOR=7.6 + +ARG RUST_TARGET=x86_64-unknown-openbsd +ARG OPENBSD_ARCH=amd64 + +ARG CROSS_TOOLCHAIN=x86_64-unknown-openbsd${OPENBSD_MAJOR} +ARG CROSS_TOOLCHAIN_PREFIX=${CROSS_TOOLCHAIN}- +ARG CROSS_SYSROOT=/usr/${CROSS_TOOLCHAIN} + +ARG OPENSSL_COMBO=BSD-x86_64 + +ARG LLVM_TARGET=$RUST_TARGET + +# Copy required scripts and Dockerfile +COPY ./scripts/target/clang /ink/scripts/target/clang +COPY ./scripts/target/bsd/openbsd /ink/scripts/target/bsd/openbsd +COPY ./scripts/target/musl /ink/scripts/target/musl +COPY ./docker/target/clang/$RUST_TARGET.Dockerfile /ink/dockerfiles + +# Setup clang +ENV PATH=$PATH:$CROSS_SYSROOT/usr/bin +RUN /ink/scripts/target/clang/setup-clang.sh + +# Install freebsd +RUN /ink/scripts/target/bsd/openbsd/extract-openbsd-sysroot.sh + +# Openssl +ENV OPENSSL_DIR=$CROSS_SYSROOT/usr +RUN /ink/scripts/target/musl/install-openssl-musl.sh + +# Install rust target +ENV RUST_TARGET=$RUST_TARGET +# RUN rustup target add "$RUST_TARGET" + +ENV CROSS_TOOLCHAIN_PREFIX=$CROSS_TOOLCHAIN_PREFIX +ENV CROSS_SYSROOT=$CROSS_SYSROOT +ENV CARGO_TARGET_X86_64_UNKNOWN_OPENBSD_LINKER=${CROSS_TOOLCHAIN_PREFIX}clang \ + CARGO_BUILD_TARGET=$RUST_TARGET \ + AR_x86_64_unknown_openbsd="${CROSS_TOOLCHAIN_PREFIX}ar" \ + CC_x86_64_unknown_openbsd="${CROSS_TOOLCHAIN_PREFIX}clang" \ + CXX_x86_64_unknown_openbsd="${CROSS_TOOLCHAIN_PREFIX}clang++" \ + CMAKE_TOOLCHAIN_FILE_x86_64_unknown_openbsd=/opt/toolchain.cmake \ + BINDGEN_EXTRA_CLANG_ARGS_x86_64_unknown_openbsd="--sysroot=$CROSS_SYSROOT" \ + RUST_TEST_THREADS=1 \ + PKG_CONFIG_ALLOW_CROSS_x86_64_unknown_openbsd=true \ + PKG_CONFIG_PATH="/usr/$CROSS_TOOLCHAIN/usr/lib/pkgconfig/:/usr/local/$CROSS_TOOLCHAIN/lib/pkgconfig/:/usr/lib/$CROSS_TOOLCHAIN/pkgconfig/" \ + PKG_CONFIG_ALLOW_CROSS=1 \ + CROSS_CMAKE_SYSTEM_NAME=OpenBSD \ + CROSS_CMAKE_SYSTEM_PROCESSOR=amd64 \ + CROSS_CMAKE_CRT=openbsd \ + CROSS_CMAKE_OBJECT_FLAGS="-ffunction-sections -fdata-sections -fPIC -m64" diff --git a/justfile b/justfile new file mode 100644 index 0000000..3f49be9 --- /dev/null +++ b/justfile @@ -0,0 +1,45 @@ +platforms := 'linux/arm64' +rust_version := 'stable' + +default: + just -l + +step0: + docker buildx build \ + --platform={{ platforms }} \ + -t ink:step0 \ + -f docker/base/step0.Dockerfile \ + . + +step1: step0 + docker buildx build \ + --platform={{ platforms }} \ + -t ink:step1-{{ rust_version }} \ + -f docker/base/step1.Dockerfile \ + --build-arg IMG_BASE=ink:step0 \ + --build-arg RUST_VERSION={{ rust_version }} \ + . + +step2-clang: step1 + docker buildx build \ + --platform={{ platforms }} \ + -t ink:step2-clang-{{ rust_version }} \ + -f docker/base/step2-clang.Dockerfile \ + --build-arg IMG_BASE=ink:step1-{{ rust_version }} \ + . + +target-gnu TARGET: step1 + docker buildx build \ + --platform={{ platforms }} \ + -t ink:{{ rust_version }}-{{ TARGET }} \ + -f docker/target/gnu/{{ TARGET }}.Dockerfile \ + --build-arg IMG_BASE=ink:step1-{{ rust_version }} \ + . + +target-clang TARGET: step2-clang + docker buildx build \ + --platform={{ platforms }} \ + -t ink:{{ rust_version }}-{{ TARGET }} \ + -f docker/target/clang/{{ TARGET }}.Dockerfile \ + --build-arg IMG_BASE=ink:step2-clang-{{ rust_version }} \ + . diff --git a/scripts/base/step0/install-cargo-prebuilt.sh b/scripts/base/step0/install-cargo-prebuilt.sh new file mode 100755 index 0000000..5150939 --- /dev/null +++ b/scripts/base/step0/install-cargo-prebuilt.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +set -euxo pipefail + +mkdir -p /tmp/prebuilt +pushd /tmp/prebuilt + +mkdir -p "$CARGO_HOME"/bin +case "$TARGETARCH" in +amd64) + $EXT_CURL_CMD "https://github.com/cargo-prebuilt/cargo-prebuilt/releases/latest/download/x86_64-unknown-linux-gnu.tar.gz" -o x86_64-unknown-linux-gnu.tar.gz + $EXT_CURL_CMD "https://github.com/cargo-prebuilt/cargo-prebuilt/releases/latest/download/hashes.sha256" | sha256sum -c --ignore-missing - + tar -xzvf x86_64-unknown-linux-gnu.tar.gz -C "$CARGO_HOME/bin" + ;; +arm64) + $EXT_CURL_CMD "https://github.com/cargo-prebuilt/cargo-prebuilt/releases/latest/download/aarch64-unknown-linux-gnu.tar.gz" -o aarch64-unknown-linux-gnu.tar.gz + $EXT_CURL_CMD "https://github.com/cargo-prebuilt/cargo-prebuilt/releases/latest/download/hashes.sha256" | sha256sum -c --ignore-missing - + tar -xzvf aarch64-unknown-linux-gnu.tar.gz -C "$CARGO_HOME/bin" + ;; +*) + echo "Unsupported Arch: $TARGETARCH" && exit 1 + ;; +esac + +# Packages +cargo-prebuilt cargo-auditable,cargo-quickinstall,cargo-binstall,bindgen-cli + +popd +rm -rf /tmp/prebuilt diff --git a/scripts/base/step0/install-cmake.sh b/scripts/base/step0/install-cmake.sh new file mode 100755 index 0000000..4da1bda --- /dev/null +++ b/scripts/base/step0/install-cmake.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +set -euxo pipefail + +mkdir -p /tmp/cmake +pushd /tmp/cmake + +case "$TARGETARCH" in +amd64) + export CMAKE_ARCH="x86_64" + ;; +arm64) + export CMAKE_ARCH="aarch64" + ;; +*) + echo "Unsupported Arch: $TARGETARCH" && exit 1 + ;; +esac +$EXT_CURL_CMD "https://github.com/Kitware/CMake/releases/download/v$CMAKE_VERSION/cmake-$CMAKE_VERSION-linux-$CMAKE_ARCH.sh" -O +$EXT_CURL_CMD "https://github.com/Kitware/CMake/releases/download/v$CMAKE_VERSION/cmake-$CMAKE_VERSION-SHA-256.txt" | sha256sum -c --ignore-missing - +sh "cmake-$CMAKE_VERSION-linux-$CMAKE_ARCH.sh" --skip-license --prefix=/usr/local + +rm -rf /usr/local/doc +rm -rf /usr/local/man + +popd +rm -rf /tmp/cmake diff --git a/scripts/base/step0/manage-apt.sh b/scripts/base/step0/manage-apt.sh new file mode 100755 index 0000000..b6187ab --- /dev/null +++ b/scripts/base/step0/manage-apt.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +set -euxo pipefail + +apt update +apt upgrade -y --no-install-recommends +apt install -y --no-install-recommends \ + autoconf \ + automake \ + bison \ + ca-certificates \ + curl \ + flex \ + git \ + libtool \ + libtool-bin \ + lsb-release \ + make \ + meson \ + ninja-build \ + perl \ + pkg-config \ + texinfo \ + xz-utils + +rm -rf /var/lib/apt/lists/* diff --git a/scripts/base/step1/entrypoint.sh b/scripts/base/step1/entrypoint.sh new file mode 100755 index 0000000..c202395 --- /dev/null +++ b/scripts/base/step1/entrypoint.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +set -euxo pipefail + +echo '#!/bin/sh' > /entrypoint.sh +echo "exec cargo +$RUST_VERSION \"\$@\"" >> /entrypoint.sh + +chmod +x /entrypoint.sh diff --git a/scripts/base/step1/install-rustup.sh b/scripts/base/step1/install-rustup.sh new file mode 100755 index 0000000..5c36033 --- /dev/null +++ b/scripts/base/step1/install-rustup.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +set -euxo pipefail +mkdir -p /tmp/rustup +pushd /tmp/rustup + +case "$TARGETARCH" in +amd64) + export RUSTUP_ARCH="x86_64-unknown-linux-gnu" + ;; +arm64) + export RUSTUP_ARCH="aarch64-unknown-linux-gnu" + ;; +*) + echo "Unsupported Arch: $TARGETARCH" && exit 1 + ;; +esac + +mkdir -p "target/$RUSTUP_ARCH/release" +$EXT_CURL_CMD "https://static.rust-lang.org/rustup/dist/$RUSTUP_ARCH/rustup-init" -o "rustup-init" +$EXT_CURL_CMD "https://static.rust-lang.org/rustup/dist/$RUSTUP_ARCH/rustup-init.sha256" | sha256sum -c - +chmod +x "rustup-init" +./"rustup-init" -y --no-modify-path --profile minimal --default-toolchain "$RUST_VERSION" --default-host "$RUSTUP_ARCH" +chmod -R a+w "$RUSTUP_HOME" "$CARGO_HOME" + +rustup component add --toolchain "$RUST_VERSION" clippy +rustup component add --toolchain "$RUST_VERSION" rustfmt + +if [ "$RUST_VERSION" = "nightly" ]; then + rustup toolchain install nightly --allow-downgrade -c rust-src,rustfmt,clippy,miri +fi + +popd +rm -rf /tmp/rustup diff --git a/scripts/base/step2-clang/install-clang.sh b/scripts/base/step2-clang/install-clang.sh new file mode 100755 index 0000000..62e0641 --- /dev/null +++ b/scripts/base/step2-clang/install-clang.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +set -euxo pipefail + +# Install clang +apt update +apt install -y software-properties-common gnupg + +source /etc/os-release + +$EXT_CURL_CMD https://apt.llvm.org/llvm-snapshot.gpg.key | tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc + +# Why is this needed... +add-apt-repository -y "deb http://apt.llvm.org/$VERSION_CODENAME/ llvm-toolchain-$VERSION_CODENAME-$LLVM_VERSION main" +add-apt-repository -y "deb http://apt.llvm.org/$VERSION_CODENAME/ llvm-toolchain-$VERSION_CODENAME-$LLVM_VERSION main" + +apt update +apt install -y --no-install-recommends "clang-$LLVM_VERSION" "lld-$LLVM_VERSION" "llvm-$LLVM_VERSION" + +apt purge -y software-properties-common gnupg +apt autoremove -y +rm -rf /var/lib/apt/lists/* + +clang-"$LLVM_VERSION" --version diff --git a/scripts/target/bsd/freebsd/extract-freebsd-sysroot.sh b/scripts/target/bsd/freebsd/extract-freebsd-sysroot.sh new file mode 100755 index 0000000..1b7b02a --- /dev/null +++ b/scripts/target/bsd/freebsd/extract-freebsd-sysroot.sh @@ -0,0 +1,109 @@ +#!/bin/bash + +set -euxo pipefail + +### https://github.com/cross-rs/cross/blob/main/docker/freebsd.sh +max_freebsd() { + local best="$FREEBSD_MAJOR.0" + local minor=0 + local version= + local release_major= + local release_minor= + for release in "${@}"; do + version=$(echo "${release}" | cut -d '-' -f 1) + release_major=$(echo "${version}"| cut -d '.' -f 1) + release_minor=$(echo "${version}"| cut -d '.' -f 2) + if [ "${release_major}" == "${FREEBSD_MAJOR}" ] && [ "${release_minor}" -gt "${minor}" ]; then + best="${release}" + minor="${release_minor}" + fi + done + if [[ -z "$best" ]]; then + echo -e "\e[31merror:\e[0m could not find best release for FreeBSD ${FREEBSD_MAJOR}." 1>&2 + exit 1 + fi + echo "${best}" +} + +latest_freebsd() { + local mirror="${1}" + local response= + local line= + local lines= + local releases= + local max_release= + + response=$(curl --retry 3 -sSfL "${mirror}/${FREEBSD_ARCH}/" | grep RELEASE) + if [[ "${response}" != *RELEASE* ]]; then + echo -e "\e[31merror:\e[0m could not find a candidate release for FreeBSD ${FREEBSD_MAJOR}." 1>&2 + exit 1 + fi + readarray -t lines <<< "${response}" + + # shellcheck disable=SC2016 + local regex='/\s*(\d+\.\d+-RELEASE)\s*\/?\s*<\/a>/; print $1' + # not all lines will match: some return `*-RELEASE/` as a line + if [[ "${response}" == *" "$CROSS_SYSROOT"/usr/lib/libc++.so + +for lib in "$CROSS_SYSROOT"/usr/lib/*.so.*; do + LINK="$(basename "$lib")" + LINK="${LINK%.*}" + [ ! -f "$CROSS_SYSROOT"/usr/lib/"$LINK" ] && echo "Made $LINK link" && ln -s "$lib" "$CROSS_SYSROOT"/usr/lib/"$LINK" +done + +ln -sf "$CROSS_SYSROOT"/usr/lib/libthr.so.3 "$CROSS_SYSROOT"/usr/lib/libpthread.so + +popd +rm -rf /tmp/freebsd diff --git a/scripts/target/bsd/netbsd/extract-netbsd-sysroot.sh b/scripts/target/bsd/netbsd/extract-netbsd-sysroot.sh new file mode 100755 index 0000000..a6a2ff8 --- /dev/null +++ b/scripts/target/bsd/netbsd/extract-netbsd-sysroot.sh @@ -0,0 +1,100 @@ +#!/bin/bash + +set -euxo pipefail + +### https://github.com/cross-rs/cross/blob/main/docker/freebsd.sh +max_netbsd() { + local best="$NETBSD_MAJOR.0" + local minor=0 + local version= + local release_major= + local release_minor= + for release in "${@}"; do + version=$(echo "${release}" | cut -d '-' -f 1) + release_major=$(echo "${version}"| cut -d '.' -f 1) + release_minor=$(echo "${version}"| cut -d '.' -f 2) + if [ "${release_major}" == "${NETBSD_MAJOR}" ] && [ "${release_minor}" -gt "${minor}" ]; then + best="${release}" + minor="${release_minor}" + fi + done + if [[ -z "$best" ]]; then + echo -e "\e[31merror:\e[0m could not find best release for NetBSD ${NETBSD_MAJOR}." 1>&2 + exit 1 + fi + echo "${best}" +} + +latest_netbsd() { + local mirror="${1}" + local response= + local line= + local lines= + local releases= + local max_release= + + response=$(curl --retry 3 -sSfL "${mirror}/" | grep NetBSD) + if [[ "${response}" != *NetBSD* ]]; then + echo -e "\e[31merror:\e[0m could not find a candidate release for NetBSD ${NETBSD_MAJOR}." 1>&2 + exit 1 + fi + readarray -t lines <<< "${response}" + + # shellcheck disable=SC2016 + local regex='/\s*(NetBSD-\d+\.\d+)\s*\/?\s*<\/a>/; print $1' + # not all lines will match: some return `*-RELEASE/` as a line + if [[ "${response}" == *"&2 + exit 1 + fi + echo "${best}" +} + +latest_openbsd() { + local mirror="${1}" + local response= + local line= + local lines= + local releases= + local max_release= + + response=$(curl --retry 3 -sSfL "${mirror}/" | grep \>${OPENBSD_MAJOR}\.) + if [[ -z "${response}" ]]; then + echo -e "\e[31merror:\e[0m could not find a candidate release for OpenBSD ${OPENBSD_MAJOR}." 1>&2 + exit 1 + fi + readarray -t lines <<< "${response}" + + # shellcheck disable=SC2016 + local regex='/\s*(\d+\.\d+)\s*\/?\s*<\/a>/; print $1' + # not all lines will match: some return `*-RELEASE/` as a line + if [[ "${response}" == *" "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"clang +echo "exec /usr/bin/clang-$LLVM_VERSION --target=$LLVM_TARGET --sysroot=$CROSS_SYSROOT $EXTRA \"\$@\"" >> "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"clang +chmod +x "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"clang + +echo '#!/bin/sh' > "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"clang++ +echo "exec /usr/bin/clang++-$LLVM_VERSION --target=$LLVM_TARGET --sysroot=$CROSS_SYSROOT $EXTRA $EXTRAPLUS \"\$@\"" >> "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"clang++ +chmod +x "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"clang++ + +echo '#!/bin/sh' > "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"ar +echo "exec /usr/bin/llvm-ar-$LLVM_VERSION \"\$@\"" >> "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"ar +chmod +x "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"ar + +echo '#!/bin/sh' > "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"as +echo "exec /usr/bin/llvm-as-$LLVM_VERSION \"\$@\"" >> "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"as +chmod +x "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"as + +echo '#!/bin/sh' > "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"ld +echo "exec /usr/bin/lld-$LLVM_VERSION \"\$@\"" >> "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"ld +chmod +x "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"ld + +echo '#!/bin/sh' > "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"nm +echo "exec /usr/bin/llvm-nm-$LLVM_VERSION \"\$@\"" >> "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"nm +chmod +x "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"nm + +echo '#!/bin/sh' > "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"objcopy +echo "exec /usr/bin/llvm-objcopy-$LLVM_VERSION \"\$@\"" >> "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"objcopy +chmod +x "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"objcopy + +echo '#!/bin/sh' > "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"objdump +echo "exec /usr/bin/llvm-objdump-$LLVM_VERSION \"\$@\"" >> "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"objdump +chmod +x "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"objdump + +echo '#!/bin/sh' > "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"ranlib +echo "exec /usr/bin/llvm-ranlib-$LLVM_VERSION \"\$@\"" >> "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"ranlib +chmod +x "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"ranlib + +echo '#!/bin/sh' > "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"strip +echo "exec /usr/bin/llvm-strip-$LLVM_VERSION \"\$@\"" >> "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"strip +chmod +x "$CROSS_SYSROOT"/usr/bin/"$CROSS_TOOLCHAIN_PREFIX"strip + +"$CROSS_TOOLCHAIN_PREFIX"clang --version +"$CROSS_TOOLCHAIN_PREFIX"clang++ --version +"$CROSS_TOOLCHAIN_PREFIX"ar --version +"$CROSS_TOOLCHAIN_PREFIX"ld --version || true +"$CROSS_TOOLCHAIN_PREFIX"nm --version +"$CROSS_TOOLCHAIN_PREFIX"objcopy --version +"$CROSS_TOOLCHAIN_PREFIX"objdump --version +"$CROSS_TOOLCHAIN_PREFIX"ranlib --version +"$CROSS_TOOLCHAIN_PREFIX"strip --version diff --git a/scripts/target/gnu/install-openssl-gnu.sh b/scripts/target/gnu/install-openssl-gnu.sh new file mode 100755 index 0000000..9781b16 --- /dev/null +++ b/scripts/target/gnu/install-openssl-gnu.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +set -euxo pipefail + +mkdir -p /tmp/openssl +pushd /tmp/openssl + +git clone --depth=1 -b "$OPENSSL_VERSION" https://github.com/openssl/openssl.git openssl +cd ./openssl + +AR="$CROSS_TOOLCHAIN_PREFIX"ar CC="$CROSS_TOOLCHAIN_PREFIX"gcc ./Configure "$OPENSSL_COMBO" \ + --libdir=lib --prefix="$CROSS_SYSROOT" --openssldir="/usr/local/$CROSS_TOOLCHAIN/ssl" \ + no-dso no-shared no-ssl3 no-tests no-comp \ + no-legacy no-camellia no-idea no-seed + +make "-j$(nproc)" +make "-j$(nproc)" install_sw +make "-j$(nproc)" install_ssldirs + +popd +rm -rf /tmp/openssl diff --git a/scripts/target/gnu/manage-apt.sh b/scripts/target/gnu/manage-apt.sh new file mode 100755 index 0000000..88f5f90 --- /dev/null +++ b/scripts/target/gnu/manage-apt.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +set -euxo pipefail + +apt update + +if [ -n "${GCC_PKGS+x}" ]; then + apt install -y --no-install-recommends $GCC_PKGS +fi + +rm -rf /var/lib/apt/lists/* diff --git a/scripts/target/musl/extract-alpine-sysroot.sh b/scripts/target/musl/extract-alpine-sysroot.sh new file mode 100755 index 0000000..72b283c --- /dev/null +++ b/scripts/target/musl/extract-alpine-sysroot.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +set -euxo pipefail + +# Create sysroot +CHROOT=/opt/sysroot + +mkdir -p $CHROOT/etc/apk/ +cp /etc/apk/repositories $CHROOT/etc/apk/ +cp /etc/resolv.conf $CHROOT/etc/ + +apk add -p "$CHROOT" --initdb -U --arch "$APK_ARCH" --allow-untrusted alpine-base + +apk add -p "$CHROOT" gcc libstdc++-dev musl-dev linux-headers + +# Extract +EXPORT=/opt/export + +mkdir -p $EXPORT/lib/gcc/"$CROSS_TOOLCHAIN" + +# Include +cp -r $CHROOT/usr/include $EXPORT + +pushd $EXPORT/include/c++/*.*.* +mv ./*-alpine-linux-musl* "$CROSS_TOOLCHAIN" +popd + +# Lib +rm -f $CHROOT/usr/lib/lib{crypto,ssl}.so* +cp $CHROOT/usr/lib/*.o $EXPORT/lib +cp $CHROOT/usr/lib/*.a $EXPORT/lib +cp $CHROOT/usr/lib/*.so* $EXPORT/lib + +cp -r $CHROOT/usr/lib/gcc/*-alpine-linux-musl*/* $EXPORT/lib/gcc/"$CROSS_TOOLCHAIN"/ + +# Remove CHROOT +rm -rf $CHROOT diff --git a/scripts/target/musl/install-musl.sh b/scripts/target/musl/install-musl.sh new file mode 100755 index 0000000..b043dbf --- /dev/null +++ b/scripts/target/musl/install-musl.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +set -euxo pipefail + +mkdir -p /tmp/musl +pushd /tmp/musl + +git clone --depth=1 -b v"$MUSL_VERSION" https://git.musl-libc.org/git/musl musl +cd ./musl + +CROSS_COMPILE="$CROSS_TOOLCHAIN_PREFIX" CC="$CROSS_TOOLCHAIN_PREFIX"clang AR="$CROSS_TOOLCHAIN_PREFIX"ar \ + ./configure --prefix="$CROSS_SYSROOT"/usr --disable-shared --enable-optimize=* + +make "-j$(nproc)" +make "-j$(nproc)" install + +popd +rm -rf /tmp/musl diff --git a/scripts/target/musl/install-openssl-musl.sh b/scripts/target/musl/install-openssl-musl.sh new file mode 100755 index 0000000..9050cf8 --- /dev/null +++ b/scripts/target/musl/install-openssl-musl.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +set -euxo pipefail + +mkdir -p /tmp/openssl +pushd /tmp/openssl + +git clone --depth=1 -b "$OPENSSL_VERSION" https://github.com/openssl/openssl.git openssl +cd ./openssl + +AR="$CROSS_TOOLCHAIN_PREFIX"ar CC="$CROSS_TOOLCHAIN_PREFIX"clang ./Configure "$OPENSSL_COMBO" \ + --libdir=lib --prefix="$CROSS_SYSROOT"/usr --openssldir="/usr/local/$CROSS_TOOLCHAIN/ssl" \ + no-dso no-shared no-ssl3 no-tests no-comp \ + no-legacy no-camellia no-idea no-seed \ + no-engine no-async -DOPENSSL_NO_SECURE_MEMORY # Musl options + +make "-j$(nproc)" +make "-j$(nproc)" install_sw +make "-j$(nproc)" install_ssldirs + +popd +rm -rf /tmp/openssl