From 53a5880386789fc3531e54f6e6ffdef9a8e41f1a Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Sat, 10 Oct 2026 20:50:57 -0400 Subject: [PATCH] Bump to 0.6.0; add a Linux riscv64 release build (#945) - Cargo.toml: [workspace.package] and the internal path-dependency requirements move to 0.6.0 (they pinned 0.5.0, which `cargo update -w` can't match); Cargo.lock refreshed. - release.yml: new `linux-riscv64` job, ported from GridCraft. Cross-compiles on ubuntu-24.04 against ports.ubuntu.com riscv64 libs (the linux job's -dev packages, :riscv64), builds the tar.gz and the CLI-only tar.gz, smoke-tests pdfcraft-cli under QEMU, and is in the draft release job's needs, so SHA256SUMS covers it. - packaging/linux/package.sh: CROSS_ARCH / CROSS_TARGET / CROSS_COMPILE / EMULATOR support. - README and docs/releasing.md list the riscv64 tarballs (glibc 2.39+). - contributors.json refreshed. Co-authored-by: Claude Opus 5.5 --- .github/workflows/release.yml | 87 +++++- Cargo.lock | 66 ++--- Cargo.toml | 62 ++--- README.md | 4 +- contributors/contributors.json | 479 +++++++++++++++++++++++++-------- docs/releasing.md | 1 + packaging/linux/package.sh | 27 +- 7 files changed, 548 insertions(+), 178 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ee5a21aa..af34d040 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -247,6 +247,91 @@ jobs: path: dist/release/* if-no-files-found: error + linux-riscv64: + name: Linux riscv64 + needs: version + # Cross-compiled on x86_64 (no hosted RISC-V runners) against the runner's own Ubuntu release + # from ports.ubuntu.com, so the binaries need that release's glibc (24.04: 2.39). 22.04's + # riscv64 ports lag its amd64 updates, which breaks the multiarch install. tar.gz only (the + # app tree and the CLI-only archive); the CLI is smoke-tested under QEMU. + runs-on: ubuntu-24.04 + # No `environment: release`: this job signs nothing, so it gets no release secrets. + env: + PDFCRAFT_VERSION: ${{ needs.version.outputs.version }} + PDFCRAFT_BUILD_DATE: ${{ needs.version.outputs.date }} + steps: + - uses: actions/checkout@v4 + # The craft-fonts build input (Japanese fonts): every release embeds it. Bump deliberately. + - name: Check out craft-fonts + uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + with: + repository: storytold/craft-fonts + ref: 8dcdacd5153e64560d109541a47d806f26f048c0 + path: craft-fonts + - uses: dtolnay/rust-toolchain@stable + with: + targets: riscv64gc-unknown-linux-gnu + - uses: Swatinem/rust-cache@v2 + with: + key: release-linux-riscv64 + - name: Apply version override + if: inputs.version != '' + run: cargo xtask version set "$PDFCRAFT_VERSION" + - name: Install cross-compilation dependencies + run: | + . /etc/os-release + sudo dpkg --add-architecture riscv64 + # Pin the existing (archive.ubuntu.com) sources to amd64; riscv64 comes from ports. + if [ -f /etc/apt/sources.list.d/ubuntu.sources ]; then + sudo sed -i '/^Types: deb/a Architectures: amd64' /etc/apt/sources.list.d/ubuntu.sources + fi + if [ -f /etc/apt/sources.list ]; then + sudo sed -i 's/^deb /deb [arch=amd64] /g' /etc/apt/sources.list + sudo sed -i 's/^deb-src /deb-src [arch=amd64] /g' /etc/apt/sources.list + fi + for suite in "$VERSION_CODENAME" "$VERSION_CODENAME-updates" "$VERSION_CODENAME-security"; do + echo "deb [arch=riscv64] http://ports.ubuntu.com/ubuntu-ports $suite main universe restricted multiverse" + done | sudo tee /etc/apt/sources.list.d/riscv64.list + sudo apt-get update + # The same -dev packages as the linux job, for riscv64; the C toolchain also builds + # aws-lc-sys and ring (signing, TLS). + sudo apt-get install -y --no-install-recommends \ + gcc-riscv64-linux-gnu g++-riscv64-linux-gnu binutils-riscv64-linux-gnu libc6-dev-riscv64-cross \ + libc6-dev:riscv64 qemu-user \ + libxkbcommon-dev:riscv64 libwayland-dev:riscv64 libx11-dev:riscv64 libxrandr-dev:riscv64 \ + libxi-dev:riscv64 libgl1-mesa-dev:riscv64 + - name: Build and package (tar.gz, CLI tar.gz) + env: + CRAFT_FONTS_DIR: ${{ github.workspace }}/craft-fonts + CRAFT_FONTS_REQUIRED: "1" + CARGO_TARGET_RISCV64GC_UNKNOWN_LINUX_GNU_LINKER: riscv64-linux-gnu-gcc + CC_riscv64gc_unknown_linux_gnu: riscv64-linux-gnu-gcc + CXX_riscv64gc_unknown_linux_gnu: riscv64-linux-gnu-g++ + AR_riscv64gc_unknown_linux_gnu: riscv64-linux-gnu-ar + PKG_CONFIG_SYSROOT_DIR: / + PKG_CONFIG_PATH: /usr/lib/riscv64-linux-gnu/pkgconfig:/usr/share/pkgconfig + PKG_CONFIG_ALLOW_CROSS: "1" + CROSS_ARCH: riscv64 + CROSS_TARGET: riscv64gc-unknown-linux-gnu + CROSS_COMPILE: riscv64-linux-gnu- + EMULATOR: qemu-riscv64 + QEMU_LD_PREFIX: /usr/riscv64-linux-gnu + run: packaging/linux/package.sh --formats "tar cli" + - name: Check the packages + run: | + tar -tzf "dist/release/pdfcraft-$PDFCRAFT_VERSION-linux-riscv64.tar.gz" | grep -E '/bin/pdfcraft$' + # The OCR models (#103), where the installed app looks: /../share/pdfcraft/models. + tar -tzf "dist/release/pdfcraft-$PDFCRAFT_VERSION-linux-riscv64.tar.gz" | grep -E '/share/pdfcraft/models/.+\.rten$' + cli="dist/release/pdfcraft-cli-$PDFCRAFT_VERSION-linux-riscv64.tar.gz" + tar -tzf "$cli" | grep -E '/pdfcraft-cli$' + tar -tzf "$cli" | grep -E '/LICENSE-APACHE$' + file target/riscv64gc-unknown-linux-gnu/release/pdfcraft | grep -F 'RISC-V' + - uses: actions/upload-artifact@v4 + with: + name: release-linux-riscv64 + path: dist/release/*.tar.gz + if-no-files-found: error + flatpak: name: Flatpak ${{ matrix.arch }} needs: [version, linux] @@ -379,7 +464,7 @@ jobs: release: name: Draft GitHub Release # Needs the signing jobs, which only run on `release`: a branch dry run never drafts a release. - needs: [version, macos, windows, linux, flatpak, freebsd, web] + needs: [version, macos, windows, linux, linux-riscv64, flatpak, freebsd, web] runs-on: ubuntu-latest environment: release permissions: diff --git a/Cargo.lock b/Cargo.lock index ec521319..bf315bcb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3543,7 +3543,7 @@ dependencies = [ [[package]] name = "pdfcraft" -version = "0.5.0" +version = "0.6.0" dependencies = [ "eframe", "egui", @@ -3561,7 +3561,7 @@ dependencies = [ [[package]] name = "pdfcraft-a11y" -version = "0.5.0" +version = "0.6.0" dependencies = [ "pdfcraft-content", "pdfcraft-cos", @@ -3572,7 +3572,7 @@ dependencies = [ [[package]] name = "pdfcraft-annot" -version = "0.5.0" +version = "0.6.0" dependencies = [ "hayro-syntax", "pdfcraft-cos", @@ -3583,7 +3583,7 @@ dependencies = [ [[package]] name = "pdfcraft-automation" -version = "0.5.0" +version = "0.6.0" dependencies = [ "base64 0.22.1", "image", @@ -3600,7 +3600,7 @@ dependencies = [ [[package]] name = "pdfcraft-cli" -version = "0.5.0" +version = "0.6.0" dependencies = [ "base64 0.22.1", "pdfcraft-automation", @@ -3614,18 +3614,18 @@ dependencies = [ [[package]] name = "pdfcraft-compare" -version = "0.5.0" +version = "0.6.0" [[package]] name = "pdfcraft-content" -version = "0.5.0" +version = "0.6.0" dependencies = [ "pdfcraft-cos", ] [[package]] name = "pdfcraft-cos" -version = "0.5.0" +version = "0.6.0" dependencies = [ "hayro-syntax", "pdfcraft-crypt", @@ -3637,7 +3637,7 @@ dependencies = [ [[package]] name = "pdfcraft-create" -version = "0.5.0" +version = "0.6.0" dependencies = [ "encoding_rs", "hayro-syntax", @@ -3652,7 +3652,7 @@ dependencies = [ [[package]] name = "pdfcraft-crypt" -version = "0.5.0" +version = "0.6.0" dependencies = [ "aes", "md-5", @@ -3664,7 +3664,7 @@ dependencies = [ [[package]] name = "pdfcraft-edit" -version = "0.5.0" +version = "0.6.0" dependencies = [ "hayro-syntax", "pdfcraft-annot", @@ -3678,7 +3678,7 @@ dependencies = [ [[package]] name = "pdfcraft-engine" -version = "0.5.0" +version = "0.6.0" dependencies = [ "chrono", "icu_properties", @@ -3713,14 +3713,14 @@ dependencies = [ [[package]] name = "pdfcraft-export" -version = "0.5.0" +version = "0.6.0" dependencies = [ "flate2", ] [[package]] name = "pdfcraft-filters" -version = "0.5.0" +version = "0.6.0" dependencies = [ "flate2", "proptest", @@ -3730,7 +3730,7 @@ dependencies = [ [[package]] name = "pdfcraft-fonts" -version = "0.5.0" +version = "0.6.0" dependencies = [ "harfrust", "pdfcraft-cos", @@ -3739,7 +3739,7 @@ dependencies = [ [[package]] name = "pdfcraft-forms" -version = "0.5.0" +version = "0.6.0" dependencies = [ "hayro-syntax", "pdfcraft-content", @@ -3751,18 +3751,18 @@ dependencies = [ [[package]] name = "pdfcraft-geom" -version = "0.5.0" +version = "0.6.0" [[package]] name = "pdfcraft-js" -version = "0.5.0" +version = "0.6.0" dependencies = [ "boa_engine", ] [[package]] name = "pdfcraft-measure" -version = "0.5.0" +version = "0.6.0" dependencies = [ "pdfcraft-annot", "pdfcraft-content", @@ -3774,14 +3774,14 @@ dependencies = [ [[package]] name = "pdfcraft-model" -version = "0.5.0" +version = "0.6.0" dependencies = [ "pdfcraft-cos", ] [[package]] name = "pdfcraft-ocr" -version = "0.5.0" +version = "0.6.0" dependencies = [ "ocrs", "pdfcraft-fonts", @@ -3791,7 +3791,7 @@ dependencies = [ [[package]] name = "pdfcraft-optimize" -version = "0.5.0" +version = "0.6.0" dependencies = [ "image", "pdfcraft-annot", @@ -3804,7 +3804,7 @@ dependencies = [ [[package]] name = "pdfcraft-organize" -version = "0.5.0" +version = "0.6.0" dependencies = [ "hayro-syntax", "pdfcraft-content", @@ -3814,14 +3814,14 @@ dependencies = [ [[package]] name = "pdfcraft-platform" -version = "0.5.0" +version = "0.6.0" dependencies = [ "zbus", ] [[package]] name = "pdfcraft-preflight" -version = "0.5.0" +version = "0.6.0" dependencies = [ "pdfcraft-cos", "pdfcraft-model", @@ -3829,7 +3829,7 @@ dependencies = [ [[package]] name = "pdfcraft-print" -version = "0.5.0" +version = "0.6.0" dependencies = [ "pdfcraft-content", "pdfcraft-cos", @@ -3839,7 +3839,7 @@ dependencies = [ [[package]] name = "pdfcraft-redact" -version = "0.5.0" +version = "0.6.0" dependencies = [ "pdfcraft-annot", "pdfcraft-content", @@ -3853,7 +3853,7 @@ dependencies = [ [[package]] name = "pdfcraft-render" -version = "0.5.0" +version = "0.6.0" dependencies = [ "bytemuck", "flate2", @@ -3871,7 +3871,7 @@ dependencies = [ [[package]] name = "pdfcraft-sign" -version = "0.5.0" +version = "0.6.0" dependencies = [ "aes", "aws-lc-rs", @@ -3905,7 +3905,7 @@ dependencies = [ [[package]] name = "pdfcraft-ui-egui" -version = "0.5.0" +version = "0.6.0" dependencies = [ "arboard", "base64 0.22.1", @@ -3944,7 +3944,7 @@ dependencies = [ [[package]] name = "pdfcraft-web" -version = "0.5.0" +version = "0.6.0" dependencies = [ "eframe", "egui", @@ -3956,7 +3956,7 @@ dependencies = [ [[package]] name = "pdfcraft-xfa" -version = "0.5.0" +version = "0.6.0" dependencies = [ "base64 0.22.1", "image", @@ -3970,7 +3970,7 @@ dependencies = [ [[package]] name = "pdfcraft-xfdf" -version = "0.5.0" +version = "0.6.0" dependencies = [ "pdfcraft-annot", "pdfcraft-cos", diff --git a/Cargo.toml b/Cargo.toml index 75e4741c..61e8ff2c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ exclude = ["vendor"] default-members = ["crates/*", "apps/pdfcraft", "apps/pdfcraft-cli", "xtask"] [workspace.package] -version = "0.5.0" +version = "0.6.0" edition = "2024" license = "MIT OR Apache-2.0" rust-version = "1.90" @@ -13,36 +13,36 @@ repository = "https://github.com/storytold/pdfcraft" [workspace.dependencies] # internal -pdfcraft-geom = { path = "crates/geom", version = "0.5.0" } -pdfcraft-filters = { path = "crates/filters", version = "0.5.0" } -pdfcraft-cos = { path = "crates/cos", version = "0.5.0" } -pdfcraft-crypt = { path = "crates/crypt", version = "0.5.0" } -pdfcraft-organize = { path = "crates/organize", version = "0.5.0" } -pdfcraft-measure = { path = "crates/measure", version = "0.5.0" } -pdfcraft-annot = { path = "crates/annot", version = "0.5.0" } -pdfcraft-fonts = { path = "crates/fonts", version = "0.5.0" } -pdfcraft-model = { path = "crates/model", version = "0.5.0" } -pdfcraft-content = { path = "crates/content", version = "0.5.0" } -pdfcraft-redact = { path = "crates/redact", version = "0.5.0" } -pdfcraft-print = { path = "crates/print", version = "0.5.0" } -pdfcraft-xfdf = { path = "crates/xfdf", version = "0.5.0" } -pdfcraft-sign = { path = "crates/sign", version = "0.5.0" } -pdfcraft-optimize = { path = "crates/optimize", version = "0.5.0" } -pdfcraft-a11y = { path = "crates/a11y", version = "0.5.0" } -pdfcraft-ocr = { path = "crates/ocr", version = "0.5.0" } -pdfcraft-js = { path = "crates/js", version = "0.5.0" } -pdfcraft-compare = { path = "crates/compare", version = "0.5.0" } -pdfcraft-preflight = { path = "crates/preflight", version = "0.5.0" } -pdfcraft-export = { path = "crates/export", version = "0.5.0" } -pdfcraft-edit = { path = "crates/edit", version = "0.5.0" } -pdfcraft-create = { path = "crates/create", version = "0.5.0" } -pdfcraft-forms = { path = "crates/forms", version = "0.5.0" } -pdfcraft-xfa = { path = "crates/xfa", version = "0.5.0" } -pdfcraft-render = { path = "crates/render", version = "0.5.0" } -pdfcraft-engine = { path = "crates/engine", version = "0.5.0" } -pdfcraft-platform = { path = "crates/platform", version = "0.5.0" } -pdfcraft-ui-egui = { path = "crates/ui-egui", version = "0.5.0" } -pdfcraft-automation = { path = "crates/automation", version = "0.5.0", default-features = false } +pdfcraft-geom = { path = "crates/geom", version = "0.6.0" } +pdfcraft-filters = { path = "crates/filters", version = "0.6.0" } +pdfcraft-cos = { path = "crates/cos", version = "0.6.0" } +pdfcraft-crypt = { path = "crates/crypt", version = "0.6.0" } +pdfcraft-organize = { path = "crates/organize", version = "0.6.0" } +pdfcraft-measure = { path = "crates/measure", version = "0.6.0" } +pdfcraft-annot = { path = "crates/annot", version = "0.6.0" } +pdfcraft-fonts = { path = "crates/fonts", version = "0.6.0" } +pdfcraft-model = { path = "crates/model", version = "0.6.0" } +pdfcraft-content = { path = "crates/content", version = "0.6.0" } +pdfcraft-redact = { path = "crates/redact", version = "0.6.0" } +pdfcraft-print = { path = "crates/print", version = "0.6.0" } +pdfcraft-xfdf = { path = "crates/xfdf", version = "0.6.0" } +pdfcraft-sign = { path = "crates/sign", version = "0.6.0" } +pdfcraft-optimize = { path = "crates/optimize", version = "0.6.0" } +pdfcraft-a11y = { path = "crates/a11y", version = "0.6.0" } +pdfcraft-ocr = { path = "crates/ocr", version = "0.6.0" } +pdfcraft-js = { path = "crates/js", version = "0.6.0" } +pdfcraft-compare = { path = "crates/compare", version = "0.6.0" } +pdfcraft-preflight = { path = "crates/preflight", version = "0.6.0" } +pdfcraft-export = { path = "crates/export", version = "0.6.0" } +pdfcraft-edit = { path = "crates/edit", version = "0.6.0" } +pdfcraft-create = { path = "crates/create", version = "0.6.0" } +pdfcraft-forms = { path = "crates/forms", version = "0.6.0" } +pdfcraft-xfa = { path = "crates/xfa", version = "0.6.0" } +pdfcraft-render = { path = "crates/render", version = "0.6.0" } +pdfcraft-engine = { path = "crates/engine", version = "0.6.0" } +pdfcraft-platform = { path = "crates/platform", version = "0.6.0" } +pdfcraft-ui-egui = { path = "crates/ui-egui", version = "0.6.0" } +pdfcraft-automation = { path = "crates/automation", version = "0.6.0", default-features = false } # pdf hayro = "0.7.1" diff --git a/README.md b/README.md index 5393fbaa..6cbd46fa 100644 --- a/README.md +++ b/README.md @@ -455,7 +455,9 @@ Use the MSI for your architecture. Per-user installation overrides are not suppo | Tarball | `pdfcraft--linux-x86_64.tar.gz` | `pdfcraft--linux-aarch64.tar.gz` | Unpack anywhere | | Command-line tool | `pdfcraft-cli--linux-x86_64.tar.gz` | `pdfcraft-cli--linux-aarch64.tar.gz` | `pdfcraft-cli` alone (and its opt-in MCP server), for servers, CI and agents | -Every Linux build needs glibc 2.35 or newer (Ubuntu 22.04+, Debian 12+, Fedora 36+, RHEL 10). +RISC-V (riscv64) builds come as tarballs only: `pdfcraft--linux-riscv64.tar.gz` and `pdfcraft-cli--linux-riscv64.tar.gz`. They are cross-compiled and need glibc 2.39 or newer (Ubuntu 24.04+, Debian 13+). + +Every other Linux build needs glibc 2.35 or newer (Ubuntu 22.04+, Debian 12+, Fedora 36+, RHEL 10). ### FreeBSD diff --git a/contributors/contributors.json b/contributors/contributors.json index dde9517d..af777cf7 100644 --- a/contributors/contributors.json +++ b/contributors/contributors.json @@ -2,23 +2,23 @@ "schema": 1, "repo": "storytold/pdfcraft", "branch": "main", - "head": "49c6e2ec5437a355da4e9dadd9cc2db3476b5cf8", - "head_date": "2026-10-10T00:56:13Z", - "commits": 493, + "head": "b8ddf71e30959dc8a5ca4b66c40b8fcaea68cf76", + "head_date": "2026-10-10T21:42:20Z", + "commits": 627, "unattributed_commits": 0, "contributors": [ { "login": "echelon", "people_entry": true, "github_name": null, - "prs": 77, - "commits": 258, - "lines_added": 221771, - "lines_deleted": 11405, + "prs": 78, + "commits": 261, + "lines_added": 224353, + "lines_deleted": 11715, "binary_added": 81, "binary_deleted": 25, "first_commit": "2026-09-30T09:17:08Z", - "last_commit": "2026-10-09T22:42:23Z" + "last_commit": "2026-10-10T18:23:28Z" }, { "login": "storybored379", @@ -37,14 +37,14 @@ "login": "justinjohn0306", "people_entry": false, "github_name": null, - "prs": 3, - "commits": 2, - "lines_added": 2936, - "lines_deleted": 159, + "prs": 4, + "commits": 3, + "lines_added": 3012, + "lines_deleted": 161, "binary_added": 1, "binary_deleted": 0, "first_commit": "2026-10-05T11:48:23Z", - "last_commit": "2026-10-08T03:02:40Z" + "last_commit": "2026-10-10T19:39:15Z" }, { "login": "midasdf", @@ -89,14 +89,14 @@ "login": "jcl-bit", "people_entry": true, "github_name": null, - "prs": 15, - "commits": 15, - "lines_added": 11099, - "lines_deleted": 348, + "prs": 16, + "commits": 16, + "lines_added": 11248, + "lines_deleted": 365, "binary_added": 0, "binary_deleted": 0, "first_commit": "2026-10-08T01:12:32Z", - "last_commit": "2026-10-09T23:09:23Z" + "last_commit": "2026-10-10T10:14:36Z" }, { "login": "rutkk", @@ -115,14 +115,14 @@ "login": "ShauryaSwarup", "people_entry": false, "github_name": null, - "prs": 1, - "commits": 1, - "lines_added": 4, + "prs": 2, + "commits": 2, + "lines_added": 59, "lines_deleted": 1, "binary_added": 0, "binary_deleted": 0, "first_commit": "2026-10-08T01:12:50Z", - "last_commit": "2026-10-08T01:12:50Z" + "last_commit": "2026-10-10T10:04:44Z" }, { "login": "cmoro-deusto", @@ -232,14 +232,14 @@ "login": "DWAA1660", "people_entry": false, "github_name": null, - "prs": 4, - "commits": 4, - "lines_added": 1003, - "lines_deleted": 55, + "prs": 12, + "commits": 12, + "lines_added": 2199, + "lines_deleted": 187, "binary_added": 0, "binary_deleted": 0, "first_commit": "2026-10-08T01:37:28Z", - "last_commit": "2026-10-08T16:49:25Z" + "last_commit": "2026-10-10T21:39:39Z" }, { "login": "pauliusiv123-rgb", @@ -336,14 +336,14 @@ "login": "Mawfyy", "people_entry": false, "github_name": null, - "prs": 4, - "commits": 4, - "lines_added": 327, - "lines_deleted": 28, + "prs": 5, + "commits": 5, + "lines_added": 458, + "lines_deleted": 31, "binary_added": 0, "binary_deleted": 0, "first_commit": "2026-10-08T03:14:45Z", - "last_commit": "2026-10-08T20:46:22Z" + "last_commit": "2026-10-10T01:26:23Z" }, { "login": "ysrdevs", @@ -362,14 +362,14 @@ "login": "CQMHV", "people_entry": false, "github_name": null, - "prs": 3, - "commits": 3, - "lines_added": 661, - "lines_deleted": 75, + "prs": 4, + "commits": 4, + "lines_added": 745, + "lines_deleted": 86, "binary_added": 0, "binary_deleted": 0, "first_commit": "2026-10-08T03:45:02Z", - "last_commit": "2026-10-08T17:40:30Z" + "last_commit": "2026-10-10T19:46:22Z" }, { "login": "neavo", @@ -453,14 +453,14 @@ "login": "cyfung1031", "people_entry": true, "github_name": null, - "prs": 21, - "commits": 21, - "lines_added": 66562, - "lines_deleted": 205, + "prs": 63, + "commits": 63, + "lines_added": 71877, + "lines_deleted": 726, "binary_added": 0, "binary_deleted": 0, "first_commit": "2026-10-08T13:00:21Z", - "last_commit": "2026-10-09T18:12:43Z" + "last_commit": "2026-10-10T21:17:13Z" }, { "login": "XusBadia", @@ -505,14 +505,14 @@ "login": "EpsilonLLC", "people_entry": false, "github_name": null, - "prs": 1, - "commits": 1, - "lines_added": 326, - "lines_deleted": 30, + "prs": 2, + "commits": 2, + "lines_added": 676, + "lines_deleted": 103, "binary_added": 0, "binary_deleted": 0, "first_commit": "2026-10-08T17:02:52Z", - "last_commit": "2026-10-08T17:02:52Z" + "last_commit": "2026-10-10T20:25:24Z" }, { "login": "sanyamsingh001", @@ -544,14 +544,14 @@ "login": "mlkonrad", "people_entry": true, "github_name": null, - "prs": 2, - "commits": 2, - "lines_added": 3129, - "lines_deleted": 206, + "prs": 6, + "commits": 6, + "lines_added": 3847, + "lines_deleted": 268, "binary_added": 0, "binary_deleted": 0, "first_commit": "2026-10-08T19:37:10Z", - "last_commit": "2026-10-08T22:46:34Z" + "last_commit": "2026-10-10T20:41:27Z" }, { "login": "Fazmin", @@ -596,14 +596,14 @@ "login": "MarekSpodBiedry", "people_entry": false, "github_name": null, - "prs": 4, - "commits": 4, - "lines_added": 773, - "lines_deleted": 113, + "prs": 15, + "commits": 15, + "lines_added": 1317, + "lines_deleted": 135, "binary_added": 0, "binary_deleted": 0, "first_commit": "2026-10-08T21:29:59Z", - "last_commit": "2026-10-09T13:14:55Z" + "last_commit": "2026-10-10T19:50:20Z" }, { "login": "MaksPV", @@ -778,14 +778,14 @@ "login": "LloydNicholson", "people_entry": false, "github_name": null, - "prs": 4, - "commits": 4, - "lines_added": 646, - "lines_deleted": 66, + "prs": 8, + "commits": 8, + "lines_added": 1204, + "lines_deleted": 119, "binary_added": 0, "binary_deleted": 0, "first_commit": "2026-10-09T16:19:10Z", - "last_commit": "2026-10-09T18:44:11Z" + "last_commit": "2026-10-10T21:42:20Z" }, { "login": "martinjohuber", @@ -804,14 +804,14 @@ "login": "bartalos86", "people_entry": false, "github_name": null, - "prs": 6, - "commits": 6, - "lines_added": 3873, - "lines_deleted": 176, + "prs": 11, + "commits": 11, + "lines_added": 5353, + "lines_deleted": 323, "binary_added": 0, "binary_deleted": 0, "first_commit": "2026-10-09T16:28:06Z", - "last_commit": "2026-10-09T22:45:54Z" + "last_commit": "2026-10-10T12:32:09Z" }, { "login": "dmatviichuk", @@ -895,14 +895,14 @@ "login": "tanish2k09", "people_entry": false, "github_name": null, - "prs": 2, - "commits": 2, - "lines_added": 698, - "lines_deleted": 3, + "prs": 3, + "commits": 3, + "lines_added": 1078, + "lines_deleted": 36, "binary_added": 0, "binary_deleted": 0, "first_commit": "2026-10-09T18:44:37Z", - "last_commit": "2026-10-09T18:46:42Z" + "last_commit": "2026-10-10T01:26:54Z" }, { "login": "thorstenhirsch", @@ -934,27 +934,27 @@ "login": "haranishi", "people_entry": false, "github_name": null, - "prs": 1, - "commits": 1, - "lines_added": 158, - "lines_deleted": 2, + "prs": 4, + "commits": 4, + "lines_added": 875, + "lines_deleted": 25, "binary_added": 0, "binary_deleted": 0, "first_commit": "2026-10-09T22:45:11Z", - "last_commit": "2026-10-09T22:45:11Z" + "last_commit": "2026-10-10T19:54:26Z" }, { "login": "Tevinhead", "people_entry": false, "github_name": null, - "prs": 1, - "commits": 1, - "lines_added": 312, - "lines_deleted": 21, + "prs": 5, + "commits": 5, + "lines_added": 5102, + "lines_deleted": 310, "binary_added": 0, "binary_deleted": 0, "first_commit": "2026-10-09T22:52:13Z", - "last_commit": "2026-10-09T22:52:13Z" + "last_commit": "2026-10-10T21:38:34Z" }, { "login": "rschuerer", @@ -1012,14 +1012,274 @@ "login": "edurbs", "people_entry": false, "github_name": null, - "prs": 1, - "commits": 1, - "lines_added": 2114, - "lines_deleted": 5, + "prs": 3, + "commits": 3, + "lines_added": 2517, + "lines_deleted": 41, "binary_added": 0, "binary_deleted": 0, "first_commit": "2026-10-10T00:56:13Z", - "last_commit": "2026-10-10T00:56:13Z" + "last_commit": "2026-10-10T02:39:36Z" + }, + { + "login": "mmmaarian03-crypto", + "people_entry": false, + "github_name": null, + "prs": 2, + "commits": 2, + "lines_added": 173, + "lines_deleted": 40, + "binary_added": 0, + "binary_deleted": 0, + "first_commit": "2026-10-10T10:04:32Z", + "last_commit": "2026-10-10T10:19:07Z" + }, + { + "login": "Hathor875", + "people_entry": true, + "github_name": "Krzysztof Cieślik", + "prs": 3, + "commits": 3, + "lines_added": 92, + "lines_deleted": 6, + "binary_added": 0, + "binary_deleted": 0, + "first_commit": "2026-10-10T10:12:10Z", + "last_commit": "2026-10-10T19:11:19Z" + }, + { + "login": "oussama-dalhi", + "people_entry": false, + "github_name": null, + "prs": 1, + "commits": 1, + "lines_added": 20, + "lines_deleted": 1, + "binary_added": 0, + "binary_deleted": 0, + "first_commit": "2026-10-10T10:12:57Z", + "last_commit": "2026-10-10T10:12:57Z" + }, + { + "login": "Toddpe", + "people_entry": false, + "github_name": null, + "prs": 2, + "commits": 2, + "lines_added": 392, + "lines_deleted": 207, + "binary_added": 0, + "binary_deleted": 0, + "first_commit": "2026-10-10T10:15:06Z", + "last_commit": "2026-10-10T10:32:06Z" + }, + { + "login": "benimaru327", + "people_entry": false, + "github_name": null, + "prs": 1, + "commits": 1, + "lines_added": 429, + "lines_deleted": 0, + "binary_added": 0, + "binary_deleted": 0, + "first_commit": "2026-10-10T10:23:11Z", + "last_commit": "2026-10-10T10:23:11Z" + }, + { + "login": "abdelhaqelamraoui", + "people_entry": false, + "github_name": null, + "prs": 1, + "commits": 1, + "lines_added": 2661, + "lines_deleted": 42, + "binary_added": 0, + "binary_deleted": 0, + "first_commit": "2026-10-10T10:36:54Z", + "last_commit": "2026-10-10T10:36:54Z" + }, + { + "login": "silverhadch", + "people_entry": false, + "github_name": null, + "prs": 2, + "commits": 2, + "lines_added": 650, + "lines_deleted": 62, + "binary_added": 0, + "binary_deleted": 0, + "first_commit": "2026-10-10T12:19:45Z", + "last_commit": "2026-10-10T20:28:29Z" + }, + { + "login": "muraa-p", + "people_entry": false, + "github_name": null, + "prs": 7, + "commits": 7, + "lines_added": 225, + "lines_deleted": 24, + "binary_added": 0, + "binary_deleted": 0, + "first_commit": "2026-10-10T19:06:02Z", + "last_commit": "2026-10-10T19:31:35Z" + }, + { + "login": "ch0kemeister", + "people_entry": false, + "github_name": null, + "prs": 3, + "commits": 3, + "lines_added": 147, + "lines_deleted": 32, + "binary_added": 0, + "binary_deleted": 0, + "first_commit": "2026-10-10T19:07:38Z", + "last_commit": "2026-10-10T19:50:55Z" + }, + { + "login": "Ni-zav", + "people_entry": false, + "github_name": null, + "prs": 1, + "commits": 1, + "lines_added": 41, + "lines_deleted": 1, + "binary_added": 0, + "binary_deleted": 0, + "first_commit": "2026-10-10T19:29:47Z", + "last_commit": "2026-10-10T19:29:47Z" + }, + { + "login": "snipeTR", + "people_entry": false, + "github_name": null, + "prs": 5, + "commits": 5, + "lines_added": 495, + "lines_deleted": 66, + "binary_added": 0, + "binary_deleted": 0, + "first_commit": "2026-10-10T19:32:07Z", + "last_commit": "2026-10-10T21:10:39Z" + }, + { + "login": "gyurix", + "people_entry": false, + "github_name": null, + "prs": 1, + "commits": 1, + "lines_added": 188, + "lines_deleted": 5, + "binary_added": 0, + "binary_deleted": 0, + "first_commit": "2026-10-10T19:47:33Z", + "last_commit": "2026-10-10T19:47:33Z" + }, + { + "login": "CyberFox-81", + "people_entry": false, + "github_name": null, + "prs": 1, + "commits": 1, + "lines_added": 211, + "lines_deleted": 6, + "binary_added": 0, + "binary_deleted": 0, + "first_commit": "2026-10-10T19:50:06Z", + "last_commit": "2026-10-10T19:50:06Z" + }, + { + "login": "A-viral-dev", + "people_entry": false, + "github_name": null, + "prs": 1, + "commits": 1, + "lines_added": 7, + "lines_deleted": 8, + "binary_added": 0, + "binary_deleted": 0, + "first_commit": "2026-10-10T19:50:42Z", + "last_commit": "2026-10-10T19:50:42Z" + }, + { + "login": "taylorandrew07-lab", + "people_entry": false, + "github_name": null, + "prs": 5, + "commits": 5, + "lines_added": 6295, + "lines_deleted": 389, + "binary_added": 0, + "binary_deleted": 0, + "first_commit": "2026-10-10T20:20:50Z", + "last_commit": "2026-10-10T21:01:08Z" + }, + { + "login": "80aa08", + "people_entry": false, + "github_name": null, + "prs": 1, + "commits": 1, + "lines_added": 2227, + "lines_deleted": 3, + "binary_added": 0, + "binary_deleted": 0, + "first_commit": "2026-10-10T21:03:47Z", + "last_commit": "2026-10-10T21:03:47Z" + }, + { + "login": "jay-tau", + "people_entry": true, + "github_name": "Joel Tony", + "prs": 1, + "commits": 1, + "lines_added": 65, + "lines_deleted": 9, + "binary_added": 0, + "binary_deleted": 0, + "first_commit": "2026-10-10T21:04:14Z", + "last_commit": "2026-10-10T21:04:14Z" + }, + { + "login": "mitul72", + "people_entry": false, + "github_name": null, + "prs": 1, + "commits": 1, + "lines_added": 293, + "lines_deleted": 15, + "binary_added": 0, + "binary_deleted": 0, + "first_commit": "2026-10-10T21:13:52Z", + "last_commit": "2026-10-10T21:13:52Z" + }, + { + "login": "joeabouserhal", + "people_entry": false, + "github_name": null, + "prs": 1, + "commits": 1, + "lines_added": 127, + "lines_deleted": 12, + "binary_added": 1, + "binary_deleted": 0, + "first_commit": "2026-10-10T21:21:30Z", + "last_commit": "2026-10-10T21:21:30Z" + }, + { + "login": "dsskaggs-ai", + "people_entry": false, + "github_name": null, + "prs": 1, + "commits": 1, + "lines_added": 41, + "lines_deleted": 3, + "binary_added": 0, + "binary_deleted": 0, + "first_commit": "2026-10-10T21:39:55Z", + "last_commit": "2026-10-10T21:39:55Z" } ], "models": [ @@ -1028,45 +1288,54 @@ "company": "Anthropic", "model": "Claude Opus", "version": "5.5", - "commits": 392, - "lines_added": 299122, - "lines_deleted": 16822 + "commits": 452, + "lines_added": 320722, + "lines_deleted": 18683 }, { "id": "openai/codex", "company": "OpenAI", "model": "Codex", "version": "", - "commits": 43, - "lines_added": 20596, - "lines_deleted": 2467 + "commits": 52, + "lines_added": 28322, + "lines_deleted": 3099 }, { "id": "anthropic/claude-fable/5.1", "company": "Anthropic", "model": "Claude Fable", "version": "5.1", - "commits": 9, - "lines_added": 1028, - "lines_deleted": 112 + "commits": 13, + "lines_added": 1525, + "lines_deleted": 217 }, { "id": "anthropic/claude-opus/5", "company": "Anthropic", "model": "Claude Opus", "version": "5", - "commits": 9, - "lines_added": 3783, - "lines_deleted": 197 + "commits": 10, + "lines_added": 4163, + "lines_deleted": 230 }, { "id": "anthropic/claude-sonnet/5.5", "company": "Anthropic", "model": "Claude Sonnet", "version": "5.5", - "commits": 4, - "lines_added": 2839, - "lines_deleted": 135 + "commits": 7, + "lines_added": 3556, + "lines_deleted": 158 + }, + { + "id": "anthropic/claude-haiku/5.5", + "company": "Anthropic", + "model": "Claude Haiku", + "version": "5.5", + "commits": 6, + "lines_added": 1813, + "lines_deleted": 179 }, { "id": "anthropic/claude", @@ -1082,9 +1351,9 @@ "company": "Anthropic", "model": "Claude Opus", "version": "4.8", - "commits": 1, - "lines_added": 1632, - "lines_deleted": 3 + "commits": 2, + "lines_added": 1708, + "lines_deleted": 5 }, { "id": "anthropic/claude-sonnet/5", diff --git a/docs/releasing.md b/docs/releasing.md index 8f88a468..7f82e29d 100644 --- a/docs/releasing.md +++ b/docs/releasing.md @@ -50,6 +50,7 @@ published (`gh workflow run release.yml --ref `). | Windows 11 on ARM64 | `pdfcraft--windows-arm64.msi`, `pdfcraft--windows-arm64-portable.zip` | `windows-latest` (cross-compiled) | | Linux x86_64 | `pdfcraft--linux-x86_64.{AppImage,AppImage.zsync,deb,rpm,tar.gz}`, `pdfcraft-cli--linux-x86_64.tar.gz` | `ubuntu-22.04` | | Linux aarch64 | `pdfcraft--linux-aarch64.{AppImage,AppImage.zsync,deb,rpm,tar.gz}`, `pdfcraft-cli--linux-aarch64.tar.gz` | `ubuntu-22.04-arm` | +| Linux riscv64 | `pdfcraft--linux-riscv64.tar.gz`, `pdfcraft-cli--linux-riscv64.tar.gz` (glibc 2.39+) | `ubuntu-24.04` (cross-compiled; CLI smoke-tested under QEMU) | | Flatpak x86_64 | `pdfcraft--linux-x86_64.flatpak` | `ubuntu-24.04` (repackages the Linux tarball) | | Flatpak aarch64 | `pdfcraft--linux-aarch64.flatpak` | `ubuntu-24.04-arm` (repackages the Linux tarball) | | FreeBSD 14 x86_64 | `pdfcraft--freebsd-x86_64.tar.gz` | FreeBSD VM on `ubuntu-latest` | diff --git a/packaging/linux/package.sh b/packaging/linux/package.sh index 129aaea9..19e26368 100755 --- a/packaging/linux/package.sh +++ b/packaging/linux/package.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Build and package PdfCraft for Linux ( is x86_64 or aarch64): +# Build and package PdfCraft for Linux ( is x86_64 or aarch64, or riscv64 when cross-compiling): # # $DIST/pdfcraft--linux-.AppImage any distro with glibc >= the build host's # $DIST/pdfcraft--linux-.AppImage.zsync delta updates (needs zsyncmake) @@ -8,6 +8,10 @@ # $DIST/pdfcraft--linux-.tar.gz plain FHS-style tree (bin/, share/) # $DIST/pdfcraft-cli--linux-.tar.gz the headless CLI alone (servers, CI, agents) # +# Cross-compiling (CI: riscv64, tar only): set CROSS_ARCH (riscv64), CROSS_TARGET (the Rust target), +# CROSS_COMPILE (binutils prefix, for strip) and optionally EMULATOR (e.g. qemu-riscv64) to +# smoke-test the CLI. +# # Usage: packaging/linux/package.sh [--skip-build] [--formats "appimage deb rpm tar cli"] # # Needs: cargo, curl and the network (the OCR models: cargo xtask models); nfpm for deb/rpm (https://nfpm.goreleaser.com); appimagetool for the AppImage @@ -26,13 +30,14 @@ while [ $# -gt 0 ]; do case "$1" in --skip-build) SKIP_BUILD=1; shift ;; --formats) FORMATS="$2"; shift 2 ;; - -h | --help) sed -n '2,16p' "$0"; exit 0 ;; + -h | --help) sed -n '2,20p' "$0"; exit 0 ;; *) echo "unknown argument: $1" >&2; exit 2 ;; esac done -ARCH="$(uname -m)" +ARCH="${CROSS_ARCH:-$(uname -m)}" case "$ARCH" in + riscv64) DEB_ARCH=riscv64 ;; x86_64) DEB_ARCH=amd64 ;; aarch64 | arm64) ARCH=aarch64; DEB_ARCH=arm64 ;; *) echo "unsupported architecture $ARCH" >&2; exit 2 ;; @@ -43,9 +48,13 @@ BASENAME="pdfcraft-$VERSION-linux-$ARCH" echo "==> PdfCraft $VERSION for Linux $ARCH ($FORMATS)" if [ "$SKIP_BUILD" = 0 ]; then - (cd "$ROOT" && cargo build --release --locked -p pdfcraft -p pdfcraft-cli) + if [ -n "${CROSS_TARGET:-}" ]; then + (cd "$ROOT" && cargo build --release --locked -p pdfcraft -p pdfcraft-cli --target "$CROSS_TARGET") + else + (cd "$ROOT" && cargo build --release --locked -p pdfcraft -p pdfcraft-cli) + fi fi -BIN="$CARGO_TARGET_DIR/release" +BIN="$CARGO_TARGET_DIR/${CROSS_TARGET:+$CROSS_TARGET/}release" WORK="$CARGO_TARGET_DIR/linux-package" STAGE="$WORK/root" rm -rf "$WORK" @@ -53,7 +62,7 @@ rm -rf "$WORK" # ---- stage an FHS tree (shared by every format) ------------------------------------------------- install -Dm755 "$BIN/pdfcraft" "$STAGE/usr/bin/pdfcraft" install -Dm755 "$BIN/pdfcraft-cli" "$STAGE/usr/bin/pdfcraft-cli" -strip "$STAGE/usr/bin/pdfcraft" "$STAGE/usr/bin/pdfcraft-cli" 2>/dev/null || true +"${CROSS_COMPILE:-}strip" "$STAGE/usr/bin/pdfcraft" "$STAGE/usr/bin/pdfcraft-cli" 2>/dev/null || true install -Dm644 "$HERE/$APP_ID.desktop" "$STAGE/usr/share/applications/$APP_ID.desktop" install -Dm644 "$HERE/$APP_ID.mime.xml" "$STAGE/usr/share/mime/packages/$APP_ID.xml" mkdir -p "$STAGE/usr/share/metainfo" @@ -151,6 +160,10 @@ if has appimage; then fi fi -"$STAGE/usr/bin/pdfcraft-cli" --version +if [ -z "${CROSS_TARGET:-}" ]; then + "$STAGE/usr/bin/pdfcraft-cli" --version +elif [ -n "${EMULATOR:-}" ]; then + "$EMULATOR" "$STAGE/usr/bin/pdfcraft-cli" --version +fi echo "==> done" ls -lh "$DIST"