diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..6553e40 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,103 @@ +name: Precompile NIFs + +on: + push: + branches: + - main + paths: + - "native/**" + - ".github/workflows/release.yml" + tags: + - "*" + pull_request: + paths: + - ".github/workflows/release.yml" + workflow_dispatch: + +jobs: + build_release: + name: NIF ${{ matrix.nif }} - ${{ matrix.job.target }} (${{ matrix.job.os }} | ${{ matrix.job.variant || 'default' }}) + runs-on: ${{ matrix.job.os }} + + permissions: + contents: write + id-token: write + attestations: write + + strategy: + fail-fast: false + matrix: + nif: ["2.15"] + job: + - { target: aarch64-apple-darwin, os: macos-12 } + - { target: aarch64-unknown-linux-gnu, os: ubuntu-20.04, use-cross: true } + - { target: aarch64-unknown-linux-musl, os: ubuntu-20.04, use-cross: true } + - { target: x86_64-apple-darwin, os: macos-12 } + - { target: x86_64-pc-windows-gnu, os: windows-2022 } + - { target: x86_64-pc-windows-msvc, os: windows-2019 } + - { target: x86_64-unknown-freebsd, os: ubuntu-22.04, use-cross: true } + - { target: x86_64-unknown-linux-gnu, os: ubuntu-20.04 } + - { target: x86_64-unknown-linux-musl, os: ubuntu-20.04, use-cross: true } + + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Extract crate information + shell: bash + run: | + # Get the project version from mix.exs + echo "PROJECT_VERSION=$(sed -n 's/^ @version "\(.*\)"/\1/p' mix.exs | head -n1)" >> $GITHUB_ENV + + - name: Maybe add Rust flags for compilation + shell: bash + run: | + echo "RUSTFLAGS=${{ matrix.job.rustflags }}" >> $GITHUB_ENV + if: ${{ matrix.job.rustflags }} + + - name: Add target + shell: bash + run: | + rustup target add ${{ matrix.job.target }} + + - uses: Swatinem/rust-cache@v2 + with: + prefix-key: v0-precomp + shared-key: ${{ matrix.job.target }}-${{ matrix.nif }} + workspaces: | + native/typst_nif + + - name: Build the project + id: build-crate + uses: philss/rustler-precompiled-action@v1.1.4 + with: + project-name: typst_nif + project-version: ${{ env.PROJECT_VERSION }} + target: ${{ matrix.job.target }} + nif-version: ${{ matrix.nif }} + use-cross: ${{ matrix.job.use-cross }} + cross-version: ${{ matrix.job.cross-version || 'from-source' }} + project-dir: "native/typst_nif" + cargo-args: ${{ matrix.job.cargo-args }} + variant: ${{ matrix.job.variant }} + + - name: Artifact attestation + uses: actions/attest-build-provenance@v1 + with: + subject-path: ${{ steps.build-crate.outputs.file-path }} + + - name: Artifact upload + uses: actions/upload-artifact@v4 + with: + name: ${{ steps.build-crate.outputs.file-name }} + path: ${{ steps.build-crate.outputs.file-path }} + + - name: Publish archives and packages + uses: softprops/action-gh-release@v2 + with: + files: | + ${{ steps.build-crate.outputs.file-path }} + if: startsWith(github.ref, 'refs/tags/') + + + diff --git a/native/typst_nif/.cargo/config.toml b/native/typst_nif/.cargo/config.toml index 20f03f3..0c2f848 100644 --- a/native/typst_nif/.cargo/config.toml +++ b/native/typst_nif/.cargo/config.toml @@ -3,3 +3,12 @@ rustflags = [ "-C", "link-arg=-undefined", "-C", "link-arg=dynamic_lookup", ] +# See https://github.com/rust-lang/rust/issues/59302 +[target.x86_64-unknown-linux-musl] +rustflags = [ + "-C", "target-feature=-crt-static" +] + +# Provides a small build size, but takes more time to build. +[profile.release] +lto = true diff --git a/native/typst_nif/Cargo.toml b/native/typst_nif/Cargo.toml index 254da04..7fa19ec 100644 --- a/native/typst_nif/Cargo.toml +++ b/native/typst_nif/Cargo.toml @@ -11,7 +11,7 @@ crate-type = ["cdylib"] [dependencies] comemo = "0.4" -rustler = "0.35.0" +rustler = {version = "0.35", default-features = false, features = ["derive"]} tar = "0.4.43" time = "0.3.36" ttf-parser = "0.25.0" @@ -20,3 +20,10 @@ typst-kit = "0.12.0" typst-pdf = "0.12.0" ureq = "2.10.1" zune-inflate = "0.2.54" + +# And then, your features. +[features] +default = ["nif_version_2_15"] +nif_version_2_15 = ["rustler/nif_version_2_15"] +nif_version_2_16 = ["rustler/nif_version_2_16"] +nif_version_2_17 = ["rustler/nif_version_2_17"]