diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index c8b71ee37..574ad1692 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -13,27 +13,86 @@ jobs: run: make format - name: Check for erroneous constructs run: make lint - pr: - name: Check that it builds without error + dependencies: + name: Generate dependency chains runs-on: ubuntu-24.04 - needs: lint + outputs: + recipes-matrix: ${{ steps.recipes-matrix.outputs.JSON_CONTENT }} steps: - name: Checkout the Git repository uses: actions/checkout@v4 - name: Setup Toltec dependencies uses: ./.github/actions/setup + - name: Cache repo + uses: actions/cache@v4 + with: + path: build/repo + key: ${{ github.base_ref }}-${{ hashFiles('package/*/package') }} + - name: Get recipe lists + id: recipes-matrix + run: | + make .venv/bin/activate + echo 'JSON_CONTENT<> $GITHUB_OUTPUT + echo '{"include":' >> $GITHUB_OUTPUT + make dependency-chain >> $GITHUB_OUTPUT + echo "}" >> $GITHUB_OUTPUT + echo 'EOF' >> $GITHUB_OUTPUT + env: + FLAGS: --remote-repo ${{ secrets.REMOTE_HTTP }}//${{ github.base_ref }} + build: + name: Build ${{ matrix.recipes }} + runs-on: ubuntu-24.04 + needs: [lint, dependencies] + strategy: + matrix: ${{ fromJson(needs.dependencies.outputs.recipes-matrix) }} + fail-fast: false + steps: + - name: Checkout the Git repository + uses: actions/checkout@v4 + - name: Setup Toltec dependencies + uses: ./.github/actions/setup + - name: Cache repo + uses: actions/cache@v4 + with: + path: build/repo + key: ${{ github.base_ref }}-${{ hashFiles('package/*/package') }} - name: Build packages - run: FLAGS='--remote-repo https://toltec-dev.org/${{ github.base_ref }}' make repo-new - - name: Save the build output + run: make repo-new + env: + FLAGS: --remote-repo ${{ secrets.REMOTE_HTTP }}//${{ github.base_ref }} --filter "${{ matrix.recipes }}" + CLEANUP: 1 + - name: Upload all ipk uses: actions/upload-artifact@v4 with: - name: repo + name: recipes-${{ matrix.recipes }} + path: build/repo/**/*.ipk + deploy: + name: Deploy experimental branch + runs-on: ubuntu-24.04 + needs: [build] + if: ${{ contains(github.event.pull_request.labels.*.name, 'experimental') }} + steps: + - name: Checkout the Git repository + uses: actions/checkout@v4 + - name: Setup Toltec dependencies + uses: ./.github/actions/setup + - name: Cache repo + uses: actions/cache@v4 + with: + path: build/repo + key: ${{ github.base_ref }}-${{ hashFiles('package/*/package') }} + - name: Download all packages + uses: actions/download-artifact@v5 + with: path: build/repo + pattern: recipes-* + merge-multiple: true - name: Build packages for experimental - if: ${{ contains(github.event.pull_request.labels.*.name, 'experimental') }} - run: make repo FLAGS='--remote-repo https://toltec-dev.org/${{ github.base_ref }}' + run: make repo + env: + FLAGS: --remote-repo ${{ secrets.REMOTE_HTTP }}//${{ github.base_ref }} + CLEANUP: 1 - name: Sync packages with the remote repository - if: ${{ contains(github.event.pull_request.labels.*.name, 'experimental') }} uses: ./.github/actions/sync-repository with: local-path: build/repo/ diff --git a/.github/workflows/stable.yml b/.github/workflows/stable.yml index cae93c130..d8242c57f 100644 --- a/.github/workflows/stable.yml +++ b/.github/workflows/stable.yml @@ -4,17 +4,84 @@ on: branches: - stable jobs: - stable: - name: Build and publish the stable channel + dependencies: + name: Generate dependency chains runs-on: ubuntu-24.04 + outputs: + recipes-matrix: ${{ steps.recipes-matrix.outputs.JSON_CONTENT }} steps: - name: Checkout the Git repository uses: actions/checkout@v4 - name: Setup Toltec dependencies uses: ./.github/actions/setup - - name: Build packages + - name: Cache repo + uses: actions/cache@v4 + with: + path: build/repo + key: stable-${{ hashFiles('package/*/package') }} + - name: Get recipe lists + id: recipes-matrix run: | - make repo FLAGS='--remote-repo ${{ secrets.REMOTE_HTTP }}/stable' + make .venv/bin/activate + echo 'JSON_CONTENT<> $GITHUB_OUTPUT + echo '{"include":' >> $GITHUB_OUTPUT + make dependency-chain >> $GITHUB_OUTPUT + echo "}" >> $GITHUB_OUTPUT + echo 'EOF' >> $GITHUB_OUTPUT + env: + FLAGS: --remote-repo ${{ secrets.REMOTE_HTTP }}/stable + build: + name: Build ${{ matrix.recipes }} + runs-on: ubuntu-24.04 + needs: [dependencies] + strategy: + matrix: ${{ fromJson(needs.dependencies.outputs.recipes-matrix) }} + fail-fast: false + steps: + - name: Checkout the Git repository + uses: actions/checkout@v4 + - name: Setup Toltec dependencies + uses: ./.github/actions/setup + - name: Cache repo + uses: actions/cache@v4 + with: + path: build/repo + key: stable-${{ hashFiles('package/*/package') }} + - name: Build packages + run: make repo-new + env: + FLAGS: --remote-repo ${{ secrets.REMOTE_HTTP }}/stable --filter "${{ matrix.recipes }}" + CLEANUP: 1 + - name: Upload all ipk + uses: actions/upload-artifact@v4 + with: + name: recipes-${{ matrix.recipes }} + path: build/repo/**/*.ipk + deploy: + name: Deploy stable branch + runs-on: ubuntu-24.04 + needs: [build] + steps: + - name: Checkout the Git repository + uses: actions/checkout@v4 + - name: Setup Toltec dependencies + uses: ./.github/actions/setup + - name: Cache repo + uses: actions/cache@v4 + with: + path: build/repo + key: stable-${{ hashFiles('package/*/package') }} + - name: Download all packages + uses: actions/download-artifact@v5 + with: + path: build/repo + pattern: recipes-* + merge-multiple: true + - name: Build packages for stable + run: make repo + env: + FLAGS: --remote-repo ${{ secrets.REMOTE_HTTP }}//stable + CLEANUP: 1 - name: Sync packages with the remote repository uses: ./.github/actions/sync-repository with: diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 57d0d9a8d..0929b88fc 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -4,17 +4,84 @@ on: branches: - testing jobs: - testing: - name: Build and publish the testing channel + dependencies: + name: Generate dependency chains runs-on: ubuntu-24.04 + outputs: + recipes-matrix: ${{ steps.recipes-matrix.outputs.JSON_CONTENT }} steps: - name: Checkout the Git repository uses: actions/checkout@v4 - name: Setup Toltec dependencies uses: ./.github/actions/setup - - name: Build packages + - name: Cache repo + uses: actions/cache@v4 + with: + path: build/repo + key: testing-${{ hashFiles('package/*/package') }} + - name: Get recipe lists + id: recipes-matrix run: | - make repo FLAGS='--remote-repo ${{ secrets.REMOTE_HTTP }}/testing' + make .venv/bin/activate + echo 'JSON_CONTENT<> $GITHUB_OUTPUT + echo '{"include":' >> $GITHUB_OUTPUT + make dependency-chain >> $GITHUB_OUTPUT + echo "}" >> $GITHUB_OUTPUT + echo 'EOF' >> $GITHUB_OUTPUT + env: + FLAGS: --remote-repo ${{ secrets.REMOTE_HTTP }}//testing + build: + name: Build ${{ matrix.recipes }} + runs-on: ubuntu-24.04 + needs: [dependencies] + strategy: + matrix: ${{ fromJson(needs.dependencies.outputs.recipes-matrix) }} + fail-fast: false + steps: + - name: Checkout the Git repository + uses: actions/checkout@v4 + - name: Setup Toltec dependencies + uses: ./.github/actions/setup + - name: Cache repo + uses: actions/cache@v4 + with: + path: build/repo + key: testing-${{ hashFiles('package/*/package') }} + - name: Build packages + run: make repo-new + env: + FLAGS: --remote-repo ${{ secrets.REMOTE_HTTP }}//testing --filter "${{ matrix.recipes }}" + CLEANUP: 1 + - name: Upload all ipk + uses: actions/upload-artifact@v4 + with: + name: recipes-${{ matrix.recipes }} + path: build/repo/**/*.ipk + deploy: + name: Deploy testing branch + runs-on: ubuntu-24.04 + needs: [build] + steps: + - name: Checkout the Git repository + uses: actions/checkout@v4 + - name: Setup Toltec dependencies + uses: ./.github/actions/setup + - name: Cache repo + uses: actions/cache@v4 + with: + path: build/repo + key: testing-${{ hashFiles('package/*/package') }} + - name: Download all packages + uses: actions/download-artifact@v5 + with: + path: build/repo + pattern: recipes-* + merge-multiple: true + - name: Build packages for testing + run: make repo + env: + FLAGS: --remote-repo ${{ secrets.REMOTE_HTTP }}//testing + CLEANUP: 1 - name: Sync packages with the remote repository uses: ./.github/actions/sync-repository with: diff --git a/Makefile b/Makefile index 0ec4607ca..c359b7a1a 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,13 @@ RECIPES_CLEAN=$(foreach app, $(RECIPES), $(app)-clean) ifeq ($(RUNNER_DEBUG), 1) FLAGS+= --verbose +else +ifeq ($(VERBOSE), 1) +FLAGS+= --verbose +endif +endif +ifeq ($(CLEANUP), 1) +FLAGS+= --cleanup endif define USAGE @@ -62,6 +69,10 @@ repo-local: .venv/bin/activate . .venv/bin/activate; \ ./scripts/repo_build.py --local $(FLAGS) +dependency-chain: .venv/bin/activate + @. .venv/bin/activate; \ + ./scripts/dependency_chain.py $(FLAGS) + repo-new: .venv/bin/activate . .venv/bin/activate; \ ./scripts/repo_build.py --diff $(FLAGS) @@ -112,7 +123,7 @@ format-fix: .venv/bin/activate lint: .venv/bin/activate @echo "==> Linting Bash scripts" -# shellcheck $$(shfmt -f .) -P SCRIPTDIR + shellcheck $$(shfmt -f .) -P SCRIPTDIR @echo "==> Typechecking Python files" . .venv/bin/activate; \ MYPYPATH=scripts mypy --disallow-untyped-defs scripts @@ -130,6 +141,8 @@ clean: help \ repo \ repo-local \ + dependency-chain \ + repo-new \ repo-check \ $(RECIPES) \ $(RECIPES_PUSH) \ diff --git a/docs/package.md b/docs/package.md index 072da60b5..70a36b8a1 100644 --- a/docs/package.md +++ b/docs/package.md @@ -38,17 +38,24 @@ You can also declare custom variables to reduce repetition but make sure to pref The list of devices that are compatible with this package. The following values are accepted: -Name | Meaning -------------|------------------------------------------------------------------------- -`rmall` | Packages which work on all reMarkable devices without modification. -`rm1` | Packages requiring reMarkable 1-specific resources or compilation flags. -`rm2` | Packages requiring reMarkable 2-specific resources or compilation flags. -`rmallos2` | Packages which work on all reMarkable devices without modification, but only on the 2.x series of operating system. -`rm1os2` | Packages requiring reMarkable 1-specific resources or compilation flags, but only on the 2.x series of operating system. -`rm2os2` | Packages requiring reMarkable 2-specific resources or compilation flags, but only on the 2.x series of operating system. -`rmallos3` | Packages which work on all reMarkable devices without modification, but only on the 3.x series of operating system. -`rm1os3` | Packages requiring reMarkable 1-specific resources or compilation flags, but only on the 3.x series of operating system. -`rm2os3` | Packages requiring reMarkable 2-specific resources or compilation flags, but only on the 3.x series of operating system. +Name | Meaning +--------------|------------------------------------------------------------------------- +`rmall` | Packages which work on all reMarkable devices without modification. +`rm1` | Packages requiring reMarkable 1 specific resources or compilation flags. +`rm2` | Packages requiring reMarkable 2 specific resources or compilation flags. +`rmpp` | Packages requiring reMarkable Paper Pro specific resources or compilation flags. +`rmppm` | Packages requiring reMarkable Paper Pro Move specific resources or compilation flags. +`rmallos2` | Packages which work on all reMarkable devices without modification, but only on the 2.x series of operating system. +`rm1os2` | Packages requiring reMarkable 1 specific resources or compilation flags, but only on the 2.x series of operating system. +`rm2os2` | Packages requiring reMarkable 2 specific resources or compilation flags, but only on the 2.x series of operating system. +`rmallos3` | Packages which work on all reMarkable devices without modification, but only on 3.0 to 3.3.2 versions of the operating system. +`rm1os3` | Packages requiring reMarkable 1 specific resources or compilation flags, but only on 3.0 to 3.3.2 versions of the operating system. +`rm2os3` | Packages requiring reMarkable 2 specific resources or compilation flags, but only on 3.0 to 3.3.2 versions of the operating system. +`rmallos3v22` | Packages which work on all reMarkable devices without modification, but only on 3.22.0.64 or newer operating system versions. +`rm1os3v22` | Packages requiring reMarkable 1-specific resources or compilation flags, but only on 3.22.0.64 or newer operating system versions. +`rm2os3v22` | Packages requiring reMarkable 2-specific resources or compilation flags, but only on 3.22.0.64 or newer operating system versions. +`rmppos3v22` | Packages requiring reMarkable Paper Pro specific resources or compilation flags, but only on 3.22.0.64 or newer operating system versions. +`rmppmos3v22` | Packages requiring reMarkable Pape Pro Move specific resources or compilation flags, but only on 3.22.0.64 or newer operating system versions. For example, use `archs=(rm1)` for a package that only works on reMarkable 1, or `archs=(rm1 rm2)` for a package that works both on reMarkable 1 and reMarkable 2 but needs different dependencies or compilation flags for each of those. diff --git a/package/.shellcheckrc b/package/.shellcheckrc index d0c08d3fd..1df568964 100644 --- a/package/.shellcheckrc +++ b/package/.shellcheckrc @@ -13,3 +13,6 @@ disable=SC2034 # Do not warn about undeclared variables since recipes may use build variables # such as `srcdir` or `pkgdir` disable=SC2154 + +# Do not warn about unused functions, such as package() or build() +disable=SC2329 diff --git a/package/Compatibility b/package/Compatibility index cf3ac4c40..f331e8213 100644 --- a/package/Compatibility +++ b/package/Compatibility @@ -32,6 +32,7 @@ rm1=3.0.4.1305 rm1=3.2.2.1581 rm1=3.2.3.1595 rm1=3.3.2.1666 +rm1=3.22.0.64 rm2=2.6.1.71 rm2=2.6.2.75 @@ -68,3 +69,8 @@ rm2=3.0.4.1305 rm2=3.2.2.1581 rm2=3.2.3.1595 rm2=3.3.2.1666 +rm2=3.22.0.64 + +rmpp=3.22.0.64 + +rmppm=3.22.0.64 diff --git a/package/appmarkable/package b/package/appmarkable/package index d2c31f358..99077ad21 100644 --- a/package/appmarkable/package +++ b/package/appmarkable/package @@ -1,11 +1,11 @@ #!/usr/bin/env bash # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT - +archs=(rm1 rm2) pkgnames=(appmarkable) pkgdesc="Front-end for apps that do not have a graphical user interface" url="https://github.com/LinusCDE/appmarkable" -pkgver=0.1.3-1 +pkgver=0.1.3-2 timestamp=2024-06-01T21:00Z section="devel" maintainer="Linus K. " diff --git a/package/bandwhich/package b/package/bandwhich/package index c9c1243a7..5c193583c 100644 --- a/package/bandwhich/package +++ b/package/bandwhich/package @@ -2,23 +2,39 @@ # Copyright (c) 2024 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2 rmpp rmppm) pkgnames=(bandwhich) pkgdesc="CLI network utilization tool" url=https://github.com/imsnif/bandwhich -pkgver=0.22.2-1 +pkgver=0.23.1-1 timestamp=2024-01-27T19:33Z section="utils" maintainer="gbyl " license=MIT -image=rust:v3.1 +image=rust:v3.2 +image_rmpp=rust:v4.0 +image_rmppm=rust:v4.0 source=("https://github.com/imsnif/bandwhich/archive/refs/tags/v${pkgver%-*}.zip") -sha256sums=(5d1eaa1796ec3c16f349cb6b00bd9dba6d425e9323d63af648a41cd68c5d456b) +sha256sums=(92f33ddac849161d0d10aef23b027a531c6604f1b96078ed59f0baeed9f91ae5) build() { cargo build --release } package() { - install -D -m 755 "$srcdir"/target/armv7-unknown-linux-gnueabihf/release/bandwhich "$pkgdir"/opt/bin/bandwhich + local target + case $arch in + rm1 | rm2) + target=armv7-unknown-linux-gnueabihf + ;; + rmpp | rmppm) + target=aarch64-unknown-linux-gnu + ;; + *) + echo "Unhandled arch: $arch" + exit 1 + ;; + esac + install -D -m 755 "$srcdir"/target/"$target"/release/bandwhich "$pkgdir"/opt/bin/bandwhich } diff --git a/package/calculator/package b/package/calculator/package index d4344ca52..4a5132ed5 100644 --- a/package/calculator/package +++ b/package/calculator/package @@ -2,10 +2,11 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(calculator) pkgdesc="Touch-based calculator" url=https://github.com/reHackable/Calculator -pkgver=0.0.0-17 +pkgver=0.0.0-18 timestamp=2020-08-20T12:28Z section="math" maintainer="Mattéo Delabre " diff --git a/package/chessmarkable/package b/package/chessmarkable/package index 40f68a952..d0e69b98d 100644 --- a/package/chessmarkable/package +++ b/package/chessmarkable/package @@ -2,10 +2,11 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(chessmarkable) pkgdesc="Chess game" url=https://github.com/LinusCDE/chessmarkable -pkgver=0.8.1-1 +pkgver=0.8.1-2 timestamp=2025-09-11T12:04Z section="games" maintainer="Linus K. " diff --git a/package/debian-chroot/package b/package/debian-chroot/package index 41f422ace..2821231ee 100644 --- a/package/debian-chroot/package +++ b/package/debian-chroot/package @@ -38,6 +38,7 @@ debian-chroot() { mkdir -p "$pkgdir"/opt/etc/ ln -s /home/root/.config/debian-chroot.conf \ "$pkgdir"/opt/etc/debian-chroot.conf + # shellcheck disable=SC1091,SC1090 source "$srcdir"/debian-chroot.conf mkdir -p "$pkgdir"/opt/lib/ ln -s "$chroot_path" "$pkgdir"/opt/lib/debian-chroot @@ -47,6 +48,7 @@ debian-chroot() { debian-chroot true } preremove() { + # shellcheck disable=SC1091,SC1090 source /home/root/.config/debian-chroot.conf if lsof "$chroot_path" 2> /dev/null | grep "$chroot_path"; then echo "Error: debian-chroot has running processes" @@ -58,6 +60,7 @@ debian-chroot() { cp /home/root/.config/debian-chroot.conf /tmp/_debian-chroot.conf } postremove() { + # shellcheck disable=SC1091,SC1090 source /tmp/_debian-chroot.conf rm -rf "$chroot_path" rm /tmp/_debian-chroot.conf diff --git a/package/display/package b/package/display/package index d8f144a98..c7c9cc598 100644 --- a/package/display/package +++ b/package/display/package @@ -1,126 +1,28 @@ #!/usr/bin/env bash -# Copyright (c) 2021 The Toltec Contributors +# Copyright (c) 2025 The Toltec Contributors # SPDX-License-Identifier: MIT - -archs=(rm1 rm2) -pkgnames=(display rm2fb-client) -timestamp=2023-08-27T02:39:10Z -maintainer="raisjn " +archs=( + rmallos2 + rmallos3 + rm1os3v22 + rm2os3v22 + rmppos3v22 + rmppmos3v22 +) +pkgnames=(display) +pkgdesc="Metapackage for allowing applications to display to the screen" +timestamp=2024-05-24T06:12:38Z +maintainer="Eeems " license=MIT -url="https://github.com/ddvk/remarkable2-framebuffer" -pkgver=1:0.0.33-4 -_release="${pkgver%-*}" -_release="v${_release#*:}" -_libver=1.0.1 +url="https://toltec-dev.org" +pkgver=2:0.0.1-1 section="devel" - -image=qt:v3.2 -source=( - "https://github.com/ddvk/remarkable2-framebuffer/archive/$_release.zip" - rm2fb.service - rm2fb-client - rm2fb-preload.conf - rm2fb-preload.env -) -sha256sums=( - dd57f1ba31f08a28d801989e9a705bd93cc637cd8f4dffa160412119e69329ff - SKIP - SKIP - SKIP - SKIP -) - -build() { - if [[ $arch = rm1 ]]; then - # Create an empty client library for rM1 - pushd src/client - echo | "${CROSS_COMPILE}gcc" \ - -fPIC -fvisibility=hidden -shared \ - -o "librm2fb_client.so.$_libver" \ - -xc - - popd - else - qmake - make - fi -} - -display() { - pkgdesc="Interface to the reMarkable framebuffer" - installdepends=(xochitl "rm2fb-client=$pkgver") - conflicts=(rm2fb) - replaces=(rm2fb) - - package() { - if [[ $arch = rm2 ]]; then - libname="librm2fb_server.so.$_libver" - install -D -m 644 -t "$pkgdir"/opt/lib "$srcdir"/src/server/"$libname" - ln -s "$libname" "$pkgdir"/opt/lib/"${libname%.*.*}" - ln -s "$libname" "$pkgdir"/opt/lib/"${libname%.*}" - install -D -m 644 -t "$pkgdir"/lib/systemd/system "$srcdir"/rm2fb.service - fi - } - - configure() { - if [[ $arch = rm2 ]]; then - systemctl daemon-reload - if systemctl enable rm2fb --now; then - # Restart xochitl if it's running - if is-active xochitl; then - # Reset the crash count so we don't trigger remarkable-fail - echo "0" > /tmp/crashnum - systemctl restart xochitl - fi - else - disable-unit rm2fb.service - echo "Failed to start rm2fb. Keeping it disabled for now." - echo "Please check the logs and open an issue:" - echo " https://github.com/toltec-dev/toltec/issues/new" - exit 1 - fi - fi - } - - preremove() { - if [[ $arch = rm2 ]]; then - disable-unit rm2fb.service - echo -n "make sure " - if ! is-enabled xochitl.service; then - echo "to re-enable xochitl with 'systemctl enable xochitl --now'" - echo -n "and " - fi - echo "to disable / uninstall any launchers like draft, oxide or remux before" - echo "rebooting your tablet to complete the uninstallation" - fi - } -} - -rm2fb-client() { - pkgdesc="Shim to make reMarkable 1 apps work on reMarkable 2" - installdepends=("display=$pkgver") - conflicts=(rm2fb) - replaces=(rm2fb) - - package() { - libname="librm2fb_client.so" - libnamever="$libname.$_libver" - install -D -m 644 -t "$pkgdir"/opt/lib "$srcdir"/src/client/"$libnamever" - install -d "$pkgdir"/usr/lib - ln -s /opt/lib/"$libnamever" "$pkgdir"/usr/lib/"$libnamever" - ln -s /opt/lib/"$libnamever" "$pkgdir"/opt/lib/"$libname" - - for dest in opt/lib usr/lib; do - ln -s "$libnamever" "$pkgdir/$dest/${libnamever%.*.*}" - ln -s "$libnamever" "$pkgdir/$dest/${libnamever%.*}" - done - - install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/rm2fb-client - - if [[ $arch = rm2 ]]; then - install -D -m 644 -t "$pkgdir"/opt/etc/xochitl.env.d "$srcdir"/rm2fb-preload.env - install -D -m 644 -t "$pkgdir"/etc/systemd/system/draft.service.d "$srcdir"/rm2fb-preload.conf - install -D -m 644 -t "$pkgdir"/etc/systemd/system/remux.service.d "$srcdir"/rm2fb-preload.conf - install -D -m 644 -t "$pkgdir"/etc/systemd/system/tarnish.service.d "$srcdir"/rm2fb-preload.conf - fi - } +installdepends=() +installdepends_rmallos2=(rm2fb-server rm2fb-client) +installdepends_rmallos3=(rm2fb-server rm2fb-client) +installdepends_rm1os3v22=(rm2fb-server rm2fb-client) +installdepends_rm2os3v22=(rm2fb-server rm2fb-client) + +package() { + true } diff --git a/package/doomarkable/package b/package/doomarkable/package index a5c9a3a70..e6c0d05f1 100644 --- a/package/doomarkable/package +++ b/package/doomarkable/package @@ -2,10 +2,11 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(doomarkable) pkgdesc="DOOM game" url=https://github.com/LinusCDE/doomarkable -pkgver=0.4.1-3 +pkgver=0.4.1-4 timestamp=2021-10-31T16:15Z section="games" maintainer="Linus K. " @@ -13,7 +14,7 @@ license=MIT installdepends=(display) flags=(patch_rm2fb) -image=rust:v3.2 +image=rust:v3.1 source=(https://github.com/LinusCDE/doomarkable/archive/7d10769d625fbe733768e39cf5006cde341d2fef.zip) sha256sums=(df86cc87d2dde7993f47f809faaab8568abe4dd2987e5ab4e00e337caef03706) diff --git a/package/dotnet/package b/package/dotnet/package index 6a6d09303..19669aec0 100644 --- a/package/dotnet/package +++ b/package/dotnet/package @@ -2,6 +2,7 @@ # Copyright (c) 2020 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2 rmpp rmppm) pkgnames=( dotnet-profile dotnet-host @@ -12,19 +13,43 @@ pkgnames=( aspnet-targeting-pack netstandard-targeting-pack ) -pkgver=3.1.20-1 -timestamp=2020-12-27T18:48Z +pkgver=3.1.32-1 +timestamp=2022-12-13T00:00Z maintainer="Eeems " url=https://www.microsoft.com/net/core section="devel" license=MIT -source=( - https://download.visualstudio.microsoft.com/download/pr/cefd43b6-16ac-4435-bcc6-594ebb0441cf/7d064f0f61c4174f620eafe97484e6cb/dotnet-sdk-3.1.414-linux-arm.tar.gz +source_rm1=( + https://builds.dotnet.microsoft.com/dotnet/Sdk/3.1.426/dotnet-sdk-3.1.426-linux-arm.tar.gz dotnet-profile.sh ) -sha256sums=( - dd9cf827b9af32a975f5c62c59221568782768d7ff5fc1622111f13c1dbe9339 +sha256sums_rm1=( + ec2305f43fe64a258a32cce29e77a40ddc503c95df01c9e8673af9ee5a23674e + SKIP +) +source_rm2=( + https://builds.dotnet.microsoft.com/dotnet/Sdk/3.1.426/dotnet-sdk-3.1.426-linux-arm.tar.gz + dotnet-profile.sh +) +sha256sums_rm2=( + ec2305f43fe64a258a32cce29e77a40ddc503c95df01c9e8673af9ee5a23674e + SKIP +) +source_rmpp=( + https://builds.dotnet.microsoft.com/dotnet/Sdk/3.1.426/dotnet-sdk-3.1.426-linux-arm64.tar.gz + dotnet-profile.sh +) +sha256sums_rmpp=( + 7e396017a3e32b0209406c73ead9f4c03d3f521768fcd548d02a0ff5c3d45593 + SKIP +) +source_rmppm=( + https://builds.dotnet.microsoft.com/dotnet/Sdk/3.1.426/dotnet-sdk-3.1.426-linux-arm64.tar.gz + dotnet-profile.sh +) +sha256sums_rmppm=( + 7e396017a3e32b0209406c73ead9f4c03d3f521768fcd548d02a0ff5c3d45593 SKIP ) @@ -91,7 +116,18 @@ dotnet-targeting-pack() { package() { install -dm 755 "$pkgdir"/opt/usr/share/{dotnet,dotnet/packs,licenses} - cp -dr --no-preserve='ownership' "$srcdir"/packs/Microsoft.NETCore.App.{Host.linux-arm,Ref} "$pkgdir"/opt/usr/share/dotnet/packs/ + case $arch in + rm1 | rm2) + cp -dr --no-preserve='ownership' "$srcdir"/packs/Microsoft.NETCore.App.{Host.linux-arm,Ref} "$pkgdir"/opt/usr/share/dotnet/packs/ + ;; + rmpp | rmppm) + cp -dr --no-preserve='ownership' "$srcdir"/packs/Microsoft.NETCore.App.{Host.linux-arm64,Ref} "$pkgdir"/opt/usr/share/dotnet/packs/ + ;; + *) + echo "Unhandled architecture: $arc" + exit 1 + ;; + esac ln -s dotnet-host-bin "$pkgdir"/opt/usr/share/licenses/dotnet-targeting-pack-bin } } diff --git a/package/draft/package b/package/draft/package index 030f682ab..7c4469d26 100644 --- a/package/draft/package +++ b/package/draft/package @@ -2,10 +2,11 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(draft) pkgdesc="Launcher which wraps around the standard interface" url=https://github.com/dixonary/draft-reMarkable -pkgver=0.2.0-26 +pkgver=0.2.0-27 timestamp=2020-07-20T10:23Z section="launchers" maintainer="Mattéo Delabre " diff --git a/package/entware-rc/package b/package/entware-rc/package index 40b8432f4..cf417da48 100644 --- a/package/entware-rc/package +++ b/package/entware-rc/package @@ -6,12 +6,12 @@ archs=(rmall) pkgnames=(entware-rc) pkgdesc="Manage entware installed services" url=https://toltec-dev.org/ -pkgver=0.1-1 +pkgver=0.1-2 timestamp=2024-05-22T22:59:03Z section="utils" maintainer="Eeems " license=MIT -installdepends=() +installdepends=(findutils) source=( entware-rc@.service diff --git a/package/evtest/package b/package/evtest/package index 6d458bb69..138f46a80 100644 --- a/package/evtest/package +++ b/package/evtest/package @@ -2,6 +2,7 @@ # Copyright (c) 2020 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2 rmpp rmppm) pkgnames=(evtest) pkgdesc="Kernel evdev device information and monitor" url=https://gitlab.freedesktop.org/libevdev/evtest @@ -12,14 +13,27 @@ maintainer="Linus K. " license=GPL-2.0-only makedepends=(build:automake) -image=base:v3.2 +image=base:v4.0 source=("https://gitlab.freedesktop.org/libevdev/evtest/-/archive/evtest-${pkgver%-*}/evtest-evtest-${pkgver%-*}.zip") sha256sums=(62f7e34c5bab91b5015de5b056d79051c677c5bd5702facb2885f8e4ba0df84c) build() { - export CC=arm-linux-gnueabihf-gcc - ./autogen.sh --host armv7 - ./configure --host armv7 + local host + case $arch in + rm1 | rm2) + host=armv7 + ;; + rmpp | rmppm) + host=aarch64 + ;; + *) + echo "Unhandled arch: $arch" + exit 1 + ;; + esac + export CC="${CROSS_COMPILE}gcc" + ./autogen.sh --host $host + ./configure --host $host make } diff --git a/package/fbink/package b/package/fbink/package index 30ce47133..c0c4dfa9f 100644 --- a/package/fbink/package +++ b/package/fbink/package @@ -2,14 +2,16 @@ # Copyright (c) 2020 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(fbink fbdepth fbink-doom) url=https://github.com/NiLuJe/FBInk -pkgver=1.25.0-2 +pkgver=1.25.0-3 timestamp=2022-12-05T02:50:38Z maintainer="Mattéo Delabre " license=GPL-3.0 installdepends=(display) flags=(patch_rm2fb) +preparedepends=(build:git) image=base:v3.2 diff --git a/package/fingerterm/package b/package/fingerterm/package index 312956b0f..ed08c6ba3 100644 --- a/package/fingerterm/package +++ b/package/fingerterm/package @@ -2,10 +2,11 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(fingerterm) pkgdesc="Terminal emulator with an on-screen touch keyboard" url=https://github.com/dixonary/fingerterm-reMarkable -pkgver=1.3.5-16 +pkgver=1.3.5-17 timestamp=2020-10-27T12:02Z section="admin" maintainer="Mattéo Delabre " diff --git a/package/folly/package b/package/folly/package index fad24c3a2..873cbf0b0 100644 --- a/package/folly/package +++ b/package/folly/package @@ -2,10 +2,11 @@ # Copyright (c) 2020 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(folly) pkgdesc="Z-machine interpreter for interactive fiction" url="https://github.com/bkirwi/folly" -pkgver=0.0.1-5 +pkgver=0.0.1-6 timestamp=2022-04-18T17:50:16Z section=games maintainer="Ben Kirwin " diff --git a/package/fuse/package b/package/fuse/package index a2b3204e4..6e82e4178 100755 --- a/package/fuse/package +++ b/package/fuse/package @@ -6,12 +6,13 @@ archs=(rm1os2 rm2os2) pkgnames=(fuse) pkgdesc="FUSE (Filesystem in Userspace) Kernel Module" url=https://github.com/libfuse/libfuse -pkgver=1.0.0-6 +pkgver=1.0.0-7 timestamp=2021-04-06T22:16Z section=kernel maintainer="plan5 <30434574+plan5@users.noreply.github.com>" license=GPL-2.0-only makedepends=(build:bc build:lzop build:git) +preparedepends=(build:git) flags=(nostrip) image=base:v3.2 diff --git a/package/fuseki/package b/package/fuseki/package index 13e00517d..429807499 100644 --- a/package/fuseki/package +++ b/package/fuseki/package @@ -2,17 +2,18 @@ # Copyright (c) 2025 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(fuseki) pkgdesc="Go frontend using GnuGo" url="https://github.com/palfrey/fuseki" -pkgver=0.1.0-1 +pkgver=0.1.0-2 timestamp=2025-08-25T16:56+0100 section=games maintainer="Tom Parker-Shemilt " license=AGPL-3.0-or-later image=rust:v3.3 source=( - https://github.com/palfrey/fuseki/archive/refs/tags/${pkgver%-*}.zip + "https://github.com/palfrey/fuseki/archive/refs/tags/${pkgver%-*}.zip" fuseki-runner.draft fuseki-runner ) diff --git a/package/gnugo/package b/package/gnugo/package index 7c5f335f6..76f0f1422 100644 --- a/package/gnugo/package +++ b/package/gnugo/package @@ -2,10 +2,11 @@ # Copyright (c) 2025 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(gnugo) pkgdesc="Program that plays the game of Go" url="https://www.gnu.org/software/gnugo/" -pkgver=3.8.0-1 +pkgver=3.8.0-2 timestamp=2025-08-25T16:56+0100 section=games maintainer="Tom Parker-Shemilt " diff --git a/package/kernelctl/package b/package/kernelctl/package index 31acac595..16e48770e 100644 --- a/package/kernelctl/package +++ b/package/kernelctl/package @@ -2,10 +2,11 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(kernelctl) pkgdesc="Manage aftermarket kernels" url=https://toltec-dev.org/ -pkgver=0.2-1 +pkgver=0.2-2 timestamp=2022-11-12T00:00Z section="utils" maintainer="Salvatore Stella " diff --git a/package/keyd/package b/package/keyd/package index ce9523a42..e843998c9 100644 --- a/package/keyd/package +++ b/package/keyd/package @@ -2,17 +2,23 @@ # Copyright (c) 2020 The Toltec Contributors # SPDX-License-Identifier: MIT -archs=(rmallos3) +archs=( + rm1os3 + rm1os3v22 + rm2os3 + rm2os3v22 + rmppos3v22 + rmppmos3v22 +) pkgnames=(keyd) pkgdesc="A key remapping daemon for linux" url="https://github.com/rvaiya/keyd" -pkgver=2.4.3-1 +pkgver=2.4.3-2 timestamp=2023-05-16T10:11Z section=utils maintainer="Kai " license=MIT -image=base:v3.1 source=( https://github.com/rvaiya/keyd/archive/refs/tags/v2.4.3.zip default.conf @@ -22,6 +28,12 @@ sha256sums=( SKIP ) +image=base:v3.3 +rm1os3v22=base:v4.0 +image_rm2os3v22=$rm1os3v22 +image_rmppos3v22=$rm1os3v22 +image_rmppmos3v22=$image_rmppos3v22 + build() { make PREFIX=/opt CONFIG_DIR=/opt/etc/keyd "CC=${CROSS_COMPILE}cc" sed -i 's|ExecStart=/usr/bin/keyd|ExecStart=/opt/bin/keyd|' keyd.service @@ -36,7 +48,7 @@ package() { } configure() { - addgroup keyd + grep -qw ^keyd /etc/group || addgroup keyd systemctl daemon-reload if is-active keyd; then systemctl restart keyd @@ -51,7 +63,9 @@ configure() { preremove() { disable-unit keyd - delgroup keyd + if grep -qw ^keyd /etc/group; then + delgroup keyd + fi } postremove() { diff --git a/package/keywriter/package b/package/keywriter/package index 28d3c9ede..3ad83f3d7 100644 --- a/package/keywriter/package +++ b/package/keywriter/package @@ -2,10 +2,11 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(keywriter) pkgdesc="Markdown-enabled free writing app" url=https://github.com/dps/remarkable-keywriter -pkgver=0.2~20-gddc9e73-3 +pkgver=0.2~20-gddc9e73-4 timestamp=2022-02-09T07:05:03Z section="writing" maintainer="Mattéo Delabre " @@ -26,6 +27,7 @@ sha256sums=( 3c594d8219b17acd140b7011b44ebc69ab9d68910da827494f8c9cc2f5b12ecf SKIP ) +preparedepends=(build:libarchive-tools) prepare() { bsdtar -x \ diff --git a/package/koreader/package b/package/koreader/package index e4c5ed9f9..d7bb32465 100644 --- a/package/koreader/package +++ b/package/koreader/package @@ -2,10 +2,11 @@ # Copyright (c) 2024 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(koreader) pkgdesc="Ebook reader supporting PDF, DjVu, EPUB, FB2 and many more formats" url=https://github.com/koreader/koreader -pkgver=2025.08-1 +pkgver=2025.08-2 timestamp=2025-08-16T20:20:24Z section="readers" maintainer="raisjn " diff --git a/package/launcherctl/launcherctl b/package/launcherctl/launcherctl index ff87e6a0f..ed23d9c0b 100755 --- a/package/launcherctl/launcherctl +++ b/package/launcherctl/launcherctl @@ -41,6 +41,10 @@ enabled_launchers() { query() { launcher="$1" shift + if ! [ -f "${data_dir}/${launcher}" ]; then + echo "Launcher ${launcher} does not exist" + return 1 + fi "${data_dir}/${launcher}" "$@" } check_enabled_launchers() { diff --git a/package/launcherctl/package b/package/launcherctl/package index 3b217bf3e..e5c10cc2c 100644 --- a/package/launcherctl/package +++ b/package/launcherctl/package @@ -5,12 +5,14 @@ pkgnames=(launcherctl) pkgdesc="Manage your installed launcher" url=https://toltec-dev.org/ -pkgver=0.0.1-3 +pkgver=0.0.1-4 timestamp=2023-12-18T03:32Z section="launchers" maintainer="Eeems " license=MIT +installdepends=(xochitl findutils) + source=( launcherctl ) diff --git a/package/lf/package b/package/lf/package index 73e360741..0bc5473ac 100644 --- a/package/lf/package +++ b/package/lf/package @@ -2,22 +2,37 @@ # Copyright (c) 2024 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2 rmpp rmppm) pkgnames=(lf) pkgdesc="Terminal file manager" url=https://github.com/gokcehan/lf -pkgver=r32-1 +pkgver=r32-2 timestamp=2024-03-31T20:04Z section="utils" maintainer="gbyl " license=MIT installdepends=(libncurses-dev) -image=golang:v3.1 +image=golang:v3.2 +image_rmpp=golang:v4.0 +image_rmppm=golang:v4.0 + source=("https://github.com/gokcehan/lf/archive/refs/tags/${pkgver%-*}.zip") sha256sums=(571ee17d8181d77a3b8bcd7aaaff0bde062c1851d93e9d324dfe15948136891a) build() { - export GOARCH=arm + case $arch in + rm1 | rm2) + export GOARCH=arm + ;; + rmpp | rmppm) + export GOARCH=arm64 + ;; + *) + echo "Unhandled arch: $arch" + exit 1 + ;; + esac go build } diff --git a/package/libdlib/package b/package/libdlib/package index 532e4a1bf..6a134b35a 100644 --- a/package/libdlib/package +++ b/package/libdlib/package @@ -2,10 +2,11 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(libdlib libdlib-dev) pkgdesc="Toolkit for making machine learning and data analysis applications in C++" url=http://dlib.net -pkgver=19.21-3 +pkgver=19.21-4 timestamp=2020-08-08T19:41:07Z section="devel" maintainer="Mattéo Delabre " diff --git a/package/libvncserver/package b/package/libvncserver/package index ce0efd572..a9d5fda8d 100644 --- a/package/libvncserver/package +++ b/package/libvncserver/package @@ -2,10 +2,11 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(libvncserver libvncclient libvncserver-dev) pkgdesc="C libraries for implementing VNC servers or clients" url=https://libvnc.github.io -pkgver=0.9.13-3 +pkgver=0.9.13-4 timestamp=2020-06-13T19:19:11Z section="devel" maintainer="Mattéo Delabre " diff --git a/package/linux-mainline/package b/package/linux-mainline/package index 5939125aa..1c8053280 100644 --- a/package/linux-mainline/package +++ b/package/linux-mainline/package @@ -6,7 +6,7 @@ archs=(rm2) pkgnames=(linux-mainline) pkgdesc="reMarkable 2 kernel based on the mainline kernel" url=https://www.kernel.org -pkgver=6.3.0-3 +pkgver=6.3.0-4 timestamp=2023-08-23T21:50:09Z section=kernel maintainer="Alistair Francis " @@ -28,7 +28,9 @@ sha256sums=( build() { cp remarkable_defconfig arch/arm/configs/ ARCH=arm make remarkable_defconfig - ARCH=arm PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig/ PKG_CONFIG_SYSROOT_DIR="" make -j8 + local threads + threads="$(echo -e "8\n$(nproc)" | sort -n | tail -n1)" + ARCH=arm PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig/ PKG_CONFIG_SYSROOT_DIR="" make -j"${threads:-8}" } package() { diff --git a/package/linux-stracciatella/package b/package/linux-stracciatella/package index 994842c50..fc7facb23 100644 --- a/package/linux-stracciatella/package +++ b/package/linux-stracciatella/package @@ -6,7 +6,7 @@ archs=(rm1 rm2) pkgnames=(linux-stracciatella) pkgdesc="RemarkableAS's vanilla kernel with a few extra flakes" url=https://github.com/Etn40ff/linux-remarkable -pkgver=5.4.70.4-1 +pkgver=5.4.70.4-2 timestamp=2023-12-28T22:42:42Z section="kernel" maintainer="Salvatore Stella " @@ -18,19 +18,22 @@ image=base:v3.1 _wireguard_version=1.0.20220627 source=( "https://github.com/Etn40ff/linux-remarkable/archive/refs/tags/${pkgver%-*}.tar.gz" - "https://git.zx2c4.com/wireguard-linux-compat/snapshot/wireguard-linux-compat-$_wireguard_version.tar.xz" + # "https://git.zx2c4.com/wireguard-linux-compat/snapshot/wireguard-linux-compat-$_wireguard_version.tar.xz" + "https://github.com/WireGuard/wireguard-linux-compat/archive/refs/tags/v$_wireguard_version.tar.gz" ) sha256sums=( 29fd9d7adcb243b841d3577088dd2aec6106eaaa3bc51440411f49ea50658c01 - 362d412693c8fe82de00283435818d5c5def7f15e2433a07a9fe99d0518f63c0 + # 362d412693c8fe82de00283435818d5c5def7f15e2433a07a9fe99d0518f63c0 + 7bd8ea9407804faad721a66affab1c9e5f190151420b807a8259bd24db9836d0 ) -noextract=("wireguard-linux-compat-$_wireguard_version.tar.xz") +noextract=("v$_wireguard_version.tar.gz") +preparedepends=(build:libarchive-tools) prepare() { # Jury-rig the wireguard module into sources and enable it mkdir "$srcdir/net/wireguard" bsdtar --strip-components 2 -xJ -C "$srcdir/net/wireguard" \ - -f "$srcdir/wireguard-linux-compat-$_wireguard_version.tar.xz" \ + -f "$srcdir/v$_wireguard_version.tar.gz" \ "wireguard-linux-compat-$_wireguard_version/src" sed -i "/^obj-\\\$(CONFIG_NETFILTER).*+=/a obj-\$(CONFIG_WIREGUARD) += wireguard/" "$srcdir/net/Makefile" sed -i "/^if INET\$/a source \"net/wireguard/Kconfig\"" "$srcdir/net/Kconfig" @@ -44,7 +47,9 @@ build() { elif [[ $arch = rm2 ]]; then ARCH=arm make zero-sugar_defconfig fi - ARCH=arm make -j8 + local threads + threads="$(echo -e "8\n$(nproc)" | sort -n | tail -n1)" + ARCH=arm make -j"${threads:-8}" } package() { diff --git a/package/micro/package b/package/micro/package index e1651a49a..34125b6ea 100644 --- a/package/micro/package +++ b/package/micro/package @@ -2,17 +2,27 @@ # Copyright (c) 2020 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2 rmpp rmppm) pkgnames=(micro) pkgdesc="Modern and intuitive terminal-based text editor" url=https://micro-editor.github.io/ -pkgver=2.0.14-1 +pkgver=2.0.14-2 timestamp=2024-08-27T18:13:07Z section="utils" maintainer="Eeems " license=MIT -source=("https://github.com/zyedidia/micro/releases/download/v2.0.14/micro-2.0.14-linux-arm.tar.gz") -sha256sums=(9f490d88bd30a548af99a905f50244dc6c80f3c7a3c6f98faeb5b0a7329f7dea) +source_rm1=("https://github.com/zyedidia/micro/releases/download/v2.0.14/micro-2.0.14-linux-arm.tar.gz") +sha256sums_rm1=(9f490d88bd30a548af99a905f50244dc6c80f3c7a3c6f98faeb5b0a7329f7dea) + +source_rm2=("https://github.com/zyedidia/micro/releases/download/v2.0.14/micro-2.0.14-linux-arm.tar.gz") +sha256sums_rm2=(9f490d88bd30a548af99a905f50244dc6c80f3c7a3c6f98faeb5b0a7329f7dea) + +source_rmpp=("https://github.com/zyedidia/micro/releases/download/v2.0.14/micro-2.0.14-linux-arm64.tar.gz") +sha256sums_rmpp=(2e01b3ea62cdea3e62eb3ee99f6bffe84de06f689cf479173c4e7221b6613d06) + +source_rmppm=("https://github.com/zyedidia/micro/releases/download/v2.0.14/micro-2.0.14-linux-arm64.tar.gz") +sha256sums_rmppm=(2e01b3ea62cdea3e62eb3ee99f6bffe84de06f689cf479173c4e7221b6613d06) package() { install -Dm644 "$srcdir"/LICENSE "$pkgdir/opt/usr/share/licenses/$pkgname/LICENSE" diff --git a/package/mmc-utils/package b/package/mmc-utils/package index 8c57dc85f..ce3e2e900 100644 --- a/package/mmc-utils/package +++ b/package/mmc-utils/package @@ -2,17 +2,18 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT -archs=(rmall) -pkgnames=(mmc-utils) +archs=(rm1 rm2) +pkgnames=(mmc-utils mmc-utils-doc) pkgdesc="A tool for monitoring the eMMC protocol" url=https://git.kernel.org/pub/scm/utils/mmc/mmc-utils.git/ -pkgver=1.0-2 +pkgver=1.0-3 timestamp=2021-08-12T19:41:07Z -section="devel" +section="utils" maintainer="Alistair Francis " license=GPL-2.0-only image=base:v3.2 +preparedepends=(build:git) source=( 0001-Makefile-Remove-Werror.patch ) @@ -33,13 +34,24 @@ prepare() { build() { # Use our toolchain - export AR=arm-linux-gnueabihf-ar - export CC=arm-linux-gnueabihf-gcc - export STRIP=arm-linux-gnueabihf-strip + export AR="${CROSS_COMPILE}ar" + export CC="${CROSS_COMPILE}gcc" + export STRIP="${CROSS_COMPILE}strip" - make -C "$srcdir"/mmc-utils -j4 + cd "$srcdir"/mmc-utils + make -j4 } -package() { - DESTDIR="$pkgdir" make -C "$srcdir"/mmc-utils install +mmc-utils() { + package() { + install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/mmc-utils/mmc + } +} + +mmc-utils-doc() { + installdepends=(man-db) + pkgdesc="Man files for mmc-utils" + package() { + install -D -m 644 <(gzip -c "$srcdir"/mmc-utils/man/mmc.1) "$pkgdir"/opt/share/man/man1/mmc.1.gz + } } diff --git a/package/move-logs-to-opt/package b/package/move-logs-to-opt/package index 99e131bb6..a02723025 100644 --- a/package/move-logs-to-opt/package +++ b/package/move-logs-to-opt/package @@ -2,10 +2,11 @@ # Copyright (c) 2023 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(move-logs-to-opt) pkgdesc="Move log files to /opt to save space on the root partition" url=https://github.com/toltec-dev/toltec -pkgver=0.0.1-1 +pkgver=0.0.1-2 timestamp=2024-01-07T23:55Z section="utils" maintainer="Eeems " diff --git a/package/netevent/package b/package/netevent/package index 14937a260..73c4c9fea 100644 --- a/package/netevent/package +++ b/package/netevent/package @@ -2,16 +2,19 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2 rmpp rmppm) pkgnames=(netevent) pkgdesc="Input-Event device cloning utility" url="https://github.com/Blub/netevent" -pkgver=2.2.2-2 +pkgver=2.2.2-3 timestamp=2023-04-29T14:21:02Z section=utils maintainer="Salvatore Stella " license=GPL-2.0-only image=base:v3.2 +image_rmpp=base:v4.0 +image_rmppm=base:v4.0 source=( "https://github.com/Blub/netevent/archive/refs/tags/${pkgver%-*}.tar.gz" ) diff --git a/package/netsurf/package b/package/netsurf/package index f6d5b411b..79228aa60 100644 --- a/package/netsurf/package +++ b/package/netsurf/package @@ -2,13 +2,13 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(netsurf) pkgdesc="Lightweight web browser" url=https://github.com/alex0809/netsurf-reMarkable -pkgver=0.4.0-4 +pkgver=0.4.0-5 timestamp=2024-09-04T21:14+00:00 maintainer="Alex Friesenhahn " -archs=(rmall) license=GPL-2.0-or-later section="readers" makedepends=( @@ -37,22 +37,109 @@ flags=(patch_rm2fb) source=( https://github.com/alex0809/netsurf-reMarkable/archive/11ba4e18c65c687693c03d58da329e90662282e8.zip + https://gitlab.freedesktop.org/freetype/freetype/-/archive/VER-2-10-4/freetype-VER-2-10-4.tar.gz netsurf.draft - ssl-links.patch ) sha256sums=( 18813be8d3492bdfc6d498ee62e32c691a329b64388970c04ca4ce8b3e656241 + 4d47fca95debf8eebde5d27e93181f05b4758701ab5ce3e7b3c54b937e8f0962 SKIP - SKIP +) +noextract=( + libiconv-1.16.tar.gz + freetype-VER-2-10-4.tar.gz + 2.0.90 ) prepare() { - patch -d "$srcdir" -p1 < "$srcdir"/ssl-links.patch + set -e + ( + # toltecmk times out when trying to download this, but manual curl works fine + if [ -f libiconv-1.16.tar.gz ] && ! echo "e6a1b1b589654277ee790cce3734f07876ac4ccfaecbee8afa0b649cf529cc04 libiconv-1.16.tar.gz" | sha256sum -c; then + rm libiconv-1.16.tar.gz + fi + if ! [ -f libiconv-1.16.tar.gz ]; then + curl https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz -o libiconv-1.16.tar.gz + fi + echo "e6a1b1b589654277ee790cce3734f07876ac4ccfaecbee8afa0b649cf529cc04 libiconv-1.16.tar.gz" | sha256sum -c + mkdir -p libiconv + cd libiconv + tar --strip-components=1 -xf ../libiconv-1.16.tar.gz + ) & + + ( + if [ -f libjpeg-turbo.tar.gz ] && ! echo "6a965adb02ad898b2ae48214244618fe342baea79db97157fdc70d8844ac6f09 libjpeg-turbo.tar.gz" | sha256sum -c; then + rm libjpeg-turbo.tar.gz + fi + if ! [ -f libjpeg-turbo.tar.gz ]; then + curl https://codeload.github.com/libjpeg-turbo/libjpeg-turbo/tar.gz/refs/tags/2.0.90 -o libjpeg-turbo.tar.gz + fi + echo "6a965adb02ad898b2ae48214244618fe342baea79db97157fdc70d8844ac6f09 libjpeg-turbo.tar.gz" | sha256sum -c + mkdir -p libjpeg-turbo + cd libjpeg-turbo + tar --strip-components=1 -xf ../libjpeg-turbo.tar.gz + ) & + + ( + mkdir -p freetype + cd freetype + tar --strip-components=1 -xf ../freetype-VER-2-10-4.tar.gz + ) & + + # shellcheck disable=SC2046 + wait $(jobs -p) } build() { + set -e ln -s /usr/bin/which /bin - scripts/install_dependencies.sh + MAKEFLAGS="-j$(nproc)" + export MAKEFLAGS + export DEBIAN_FRONTEND=noninteractive + + ( + # Build libiconv 1.16 + cd libiconv + ./configure \ + --prefix="$SYSROOT/usr" \ + --host="$CHOST" \ + --enable-static \ + --disable-shared + make + make install + ) & + ( + # Build FreeType 2.10.4 + cd freetype + bash autogen.sh + ./configure \ + --without-zlib \ + --without-png \ + --enable-static=yes \ + --enable-shared=no \ + --without-bzip2 \ + --host=arm-linux-gnueabihf \ + --host="$CHOST" \ + --disable-freetype-config + make + DESTDIR="$SYSROOT" make install + ) & + + ( + # Build libjpeg-turbo 2.0.90 + cd libjpeg-turbo + cmake \ + -DCMAKE_SYSROOT="$SYSROOT" \ + -DCMAKE_TOOLCHAIN_FILE="/usr/share/cmake/$CHOST.cmake" \ + -DCMAKE_INSTALL_LIBDIR="$SYSROOT/lib" \ + -DCMAKE_INSTALL_INCLUDEDIR="$SYSROOT/usr/include" \ + -DENABLE_SHARED=FALSE + make + make install + ) & + + # shellcheck disable=SC2046 + wait $(jobs -p) TARGET_WORKSPACE=$(pwd)/build scripts/build.sh } diff --git a/package/netsurf/ssl-links.patch b/package/netsurf/ssl-links.patch deleted file mode 100644 index b2d6dc819..000000000 --- a/package/netsurf/ssl-links.patch +++ /dev/null @@ -1,23 +0,0 @@ -# From https://github.com/alex0809/netsurf-reMarkable/pull/39 -From 97d45f3e8fd7320ef3ffbd94c7e796d4e076acfe Mon Sep 17 00:00:00 2001 -From: Leonid Belyaev -Date: Mon, 17 Feb 2025 19:21:51 -0500 -Subject: [PATCH] curl follows links for openssl - ---- - scripts/install_dependencies.sh | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/scripts/install_dependencies.sh b/scripts/install_dependencies.sh -index be1adc699..ae771b639 100755 ---- a/scripts/install_dependencies.sh -+++ b/scripts/install_dependencies.sh -@@ -22,7 +22,7 @@ export DEBIAN_FRONTEND=noninteractive \ - export DEBIAN_FRONTEND=noninteractive \ - && mkdir openssl \ - && cd openssl \ -- && curl https://www.openssl.org/source/openssl-1.1.1k.tar.gz -o openssl.tar.gz \ -+ && curl -L https://www.openssl.org/source/openssl-1.1.1k.tar.gz -o openssl.tar.gz \ - && echo "892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5 openssl.tar.gz" > sha256sums \ - && sha256sum -c sha256sums \ - && tar --strip-components=1 -xf openssl.tar.gz \ diff --git a/package/oxide/package b/package/oxide/package index 3d1a071d2..5c1d64eb8 100644 --- a/package/oxide/package +++ b/package/oxide/package @@ -2,10 +2,15 @@ # Copyright (c) 2024 The Toltec Contributors # SPDX-License-Identifier: MIT -archs=(rm1 rm2) +archs=( + rm1os2 + rm1os3 + rm2os2 + rm2os3 +) pkgnames=(oxide oxide-extra oxide-utils inject_evdev liboxide liboxide-dev libsentry) _oxidever=2.8.4 -pkgver=$_oxidever-3 +pkgver=$_oxidever-5 _sentryver=0.7.6 timestamp=2024-06-26T22:31:46Z maintainer="Eeems " @@ -29,7 +34,9 @@ build() { | xargs -r -0 sed -i 's/linux-oe-g++/linux-arm-remarkable-g++/g' find . -name "*.pri" -type f -print0 \ | xargs -r -0 sed -i 's/linux-oe-g++/linux-arm-remarkable-g++/g' - CMAKE_TOOLCHAIN_FILE="/usr/share/cmake/$CHOST.cmake" make FEATURES=sentry release + local threads + threads="$(echo -e "8\n$(nproc)" | sort -n | tail -n1)" + CMAKE_TOOLCHAIN_FILE="/usr/share/cmake/$CHOST.cmake" make FEATURES=sentry release -j"${threads:-8}" } oxide() { diff --git a/package/plato/package b/package/plato/package index a71462528..bc1b81a28 100644 --- a/package/plato/package +++ b/package/plato/package @@ -2,10 +2,11 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(plato) pkgdesc="Document reader" url=https://github.com/LinusCDE/plato -pkgver=0.9.44-1 +pkgver=0.9.44-2 timestamp=2025-09-16T17:58Z section="readers" maintainer="Linus K. " diff --git a/package/puzzles/package b/package/puzzles/package index 11e95cde3..10b76a0cc 100644 --- a/package/puzzles/package +++ b/package/puzzles/package @@ -2,11 +2,12 @@ # Copyright (c) 2020 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(puzzles) timestamp=2021-03-04T14:03-08:00 maintainer="Mattéo Delabre " _ver=0.2.4 -pkgver=${_ver}-5 +pkgver=${_ver}-6 license=MIT pkgdesc="Simon Tatham's Puzzle Package" url="https://github.com/mrichards42/remarkable_puzzles" diff --git a/package/quickjs/package b/package/quickjs/package index ef41e2092..0b5f04ca8 100644 --- a/package/quickjs/package +++ b/package/quickjs/package @@ -2,29 +2,33 @@ # Copyright (c) 2020 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2 rmpp rmppm) pkgnames=(quickjs) pkgdesc="A small and embeddable Javascript engine" url=https://bellard.org/quickjs/ -pkgver=2024.01.13-1 +pkgver=2025-09-13-2 section="devel" -timestamp=2024-01-13T00:00Z +timestamp=2025-09-13T00:00Z maintainer="khanhas " license=MIT -image=base:v3.1 +image=base:v3.2 +image_rmpp=base:v4.0 +image_rmppm=base:v4.0 + source=( - https://bellard.org/quickjs/quickjs-2024-01-13.tar.xz + https://bellard.org/quickjs/quickjs-2025-09-13-2.tar.xz ) sha256sums=( - 3c4bf8f895bfa54beb486c8d1218112771ecfc5ac3be1036851ef41568212e03 + 996c6b5018fc955ad4d06426d0e9cb713685a00c825aa5c0418bd53f7df8b0b4 ) build() { - make CROSS_PREFIX="$CROSS_COMPILE" qjs qjscalc + make CROSS_PREFIX="$CROSS_COMPILE" qjs qjsc } package() { install -d "$pkgdir"/opt/bin install -D -m 755 -t "$pkgdir"/opt/bin/ "$srcdir"/qjs - ln -s qjs "$pkgdir"/opt/bin/qjscalc + install -D -m 755 -t "$pkgdir"/opt/bin/ "$srcdir"/qjsc } diff --git a/package/recrossable/package b/package/recrossable/package index b584d783d..ddd461256 100644 --- a/package/recrossable/package +++ b/package/recrossable/package @@ -2,10 +2,11 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(recrossable) pkgdesc="Solve crossword puzzles" url=https://github.com/sandsmark/recrossable -pkgver=0.0.0-9 +pkgver=0.0.0-10 timestamp=2021-01-15T12:58:22Z section="games" maintainer="Mattéo Delabre " diff --git a/package/regenda/package b/package/regenda/package index 1f2b48c9b..62ba37f9f 100644 --- a/package/regenda/package +++ b/package/regenda/package @@ -2,10 +2,11 @@ # Copyright (c) 2023 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(regenda) pkgdesc="Caldav agenda app" url=https://github.com/tenJirka/reGenda -pkgver=0.0.2-2 +pkgver=0.0.2-3 timestamp=2023-09-06T06:45Z section="utils" maintainer="tenJirka " @@ -15,7 +16,7 @@ installdepends=(python3 python3-lxml python3-pytz python3-yaml python3-requests flags=(patch_rm2fb) source=(https://github.com/tenJirka/reGenda/archive/refs/tags/0.0.2.zip) sha256sums=(4f51de514945f9cfc6a1852181baab4bb0f4daadb222e8ddb05929f17e2044d9) -image=python +image=python:v3.2 build() { python3 -m venv venv @@ -38,8 +39,6 @@ package() { cp -r "$srcdir"/python_modules/icalendar* "$pkgdir"/opt/usr/lib/reGenda/ cp -r "$srcdir"/python_modules/rm_pySAS* "$pkgdir"/opt/usr/lib/reGenda/ cp -r "$srcdir"/python_modules/recurring_ical_events* "$pkgdir"/opt/usr/lib/reGenda/ - cp -r "$srcdir"/python_modules/tzlocal* "$pkgdir"/opt/usr/lib/reGenda/ - cp -r "$srcdir"/python_modules/vobject* "$pkgdir"/opt/usr/lib/reGenda/ cp -r "$srcdir"/python_modules/x_wr_timezone* "$pkgdir"/opt/usr/lib/reGenda/ } diff --git a/package/remarkable-splash/package b/package/remarkable-splash/package index 553788394..d1cd8bdc1 100644 --- a/package/remarkable-splash/package +++ b/package/remarkable-splash/package @@ -2,10 +2,11 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(remarkable-splash) pkgdesc="Show splashscreens + remarkable-shutdown replacement that does not clear the screen" url=https://github.com/ddvk/remarkable-splash -pkgver=1.0-6 +pkgver=1.0-7 timestamp=2019-12-31T10:07Z section="utils" maintainer="Eeems " diff --git a/package/rempack/package b/package/rempack/package index 60cf3091c..74d7de314 100644 --- a/package/rempack/package +++ b/package/rempack/package @@ -2,13 +2,14 @@ # Copyright (c) 2020 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(rempack) pkgdesc="A user friendly package manager frontend for opkg" archs=(rmall) url="https://github.com/rexxar-tc/rempack" -pkgver=1.1.4 +pkgver=1.1.4-1 timestamp=2025-03-09T21:13:27 -section=admin +section="admin" maintainer="Brant Martin " license=MIT image=base:v3.1 @@ -24,7 +25,7 @@ sha256sums=( SKIP ) build() { - cd $srcdir + cd "$srcdir" mkdir output cmake -S . -B output --preset "Release Native" cmake --build output --target rempack diff --git a/package/restream/package b/package/restream/package index 93f3e5569..12355ba74 100644 --- a/package/restream/package +++ b/package/restream/package @@ -2,10 +2,11 @@ # Copyright (c) 2020 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(restream) pkgdesc="Binary framebuffer capture tool for the reStream script" url=https://github.com/rien/reStream -pkgver=1.2.0-2 +pkgver=1.2.0-3 timestamp=2021-11-04T19:09:14Z section="screensharing" maintainer="Dan Shick " diff --git a/package/reterm/package b/package/reterm/package index f8dee0995..d51ddea4d 100644 --- a/package/reterm/package +++ b/package/reterm/package @@ -1,10 +1,16 @@ #!/usr/bin/env bash # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=( + rm1os2 + rm1os3 + rm2os2 + rm2os3 +) pkgnames=(reterm) pkgdesc="Landscape terminal support for the Remarkable 2 + type cover" section="admin" -pkgver="20230628.1927-2" +pkgver="20230628.1927-3" timestamp="2023-06-28T19:28:06Z" maintainer="Eeems " url="https://github.com/i-am-shodan/ReTerm" @@ -14,6 +20,7 @@ source=(https://github.com/i-am-shodan/ReTerm/archive/refs/tags/release_20230628 sha256sums=(3a6db39cfb83606c4ac5153fe2ac0319ab5c8322c73172178534c047a15c635b) image=dotnet6:latest makedepends=(build:gawk build:git) +preparedepends=(build:git) prepare() { cd "$srcdir" diff --git a/package/retris/package b/package/retris/package index 1e05ecb05..df554d62d 100644 --- a/package/retris/package +++ b/package/retris/package @@ -2,10 +2,11 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(retris) pkgdesc="Tetris game" url=https://github.com/LinusCDE/retris -pkgver=0.6.4-1 +pkgver=0.6.4-2 timestamp=2021-01-30T02:41Z section="games" maintainer="Linus K. " diff --git a/package/rm2fb-timower/package b/package/rm2fb-timower/package new file mode 100644 index 000000000..4f07a711e --- /dev/null +++ b/package/rm2fb-timower/package @@ -0,0 +1,161 @@ +#!/usr/bin/env bash +# Copyright (c) 2025 The Toltec Contributors +# SPDX-License-Identifier: MIT + +archs=(rm1os3v22 rm2os3v22) +pkgnames=(rm2fb-server rm2fb-client) +timestamp=2025-10-02T19:05:58Z +maintainer="Eeems " +license=MIT +url="https://github.com/timower/rM2-stuff/tree/master/libs/rm2fb" +_tag=0.1.3 +_commit=b52e5a169c58e7fe67a5ad679317437edd881ddf +pkgver=2:${_tag}-1 +_libver=1.1.0 +section="devel" + +source=( + rm2fb-client + rm2fb-preload.conf + rm2fb-preload.env + rm2fb.service +) +sha256sums=( + SKIP + SKIP + SKIP + SKIP +) + +image=base:v4.0 + +makedepends=() +makedepends_rm2os3v22=(build:xxd) +preparedepends=(build:git build:git-lfs) + +prepare() { + cd "$srcdir" + mkdir -p rm2fb + cd rm2fb + git init + git lfs install + git remote add origin https://github.com/timower/rM2-stuff.git + git fetch --depth 1 origin ${_commit} --no-tags + git checkout ${_commit} + git lfs fetch + git lfs checkout +} + +build() { + if [[ $arch = rm1os3v22 ]]; then + # Create an empty client library for rM1 + mkdir -p install/lib + pushd install/lib + echo | "${CROSS_COMPILE}gcc" \ + -fPIC -fvisibility=hidden -shared \ + -o "librm2fb_client.so.$_libver" \ + -xc - + echo | "${CROSS_COMPILE}gcc" \ + -fPIC -fvisibility=hidden -shared \ + -o "librm2fb_client_no_hook.so" \ + -xc - + popd + else + mkdir build + mkdir install + pushd build + cmake -DCMAKE_TOOLCHAIN_FILE="/usr/share/cmake/$CHOST.cmake" \ + -DCMAKE_INSTALL_PREFIX="$srcdir/install" -DCMAKE_BUILD_TYPE=Release ../rm2fb + pushd libs/rm2fb + make + make install + popd + popd + fi + # Work around current post-processing not handling symlinks that are not currently valid + rm -f install/usr/lib/librm2fb_client.so.1 + rm -f build/librm2fb_client.so.1 +} + +rm2fb-server() { + pkgdesc="Interface to the reMarkable framebuffer" + installdepends=(xochitl "rm2fb-client=$pkgver") + conflicts=(rm2fb) + replaces=(rm2fb) + + package() { + if [[ $arch = rm2os3v22 ]]; then + libname="librm2fb_server.so.$_libver" + install -D -m 644 "$srcdir"/install/lib/librm2fb_server.so "$pkgdir"/opt/lib/"$libname" + ln -s "$libname" "$pkgdir"/opt/lib/"${libname%.*.*.*}" + ln -s "$libname" "$pkgdir"/opt/lib/"${libname%.*.*}" + ln -s "$libname" "$pkgdir"/opt/lib/"${libname%.*}" + install -D -m 644 -t "$pkgdir"/lib/systemd/system "$srcdir"/rm2fb.service + install -D -m 644 -t "$pkgdir"/lib/systemd/system "$srcdir"/install/lib/systemd/system/rm2fb.socket + install -D -m 755 "$srcdir"/install/bin/rm2fb_server "$pkgdir"/opt/bin/rm2fb-server + fi + } + + configure() { + if [[ $arch = rm2os3v22 ]]; then + systemctl daemon-reload + if systemctl enable rm2fb.service --now; then + # Restart xochitl if it's running + if is-active xochitl; then + # Reset the crash count so we don't trigger remarkable-fail + echo "0" > /tmp/crashnum + systemctl restart xochitl + fi + else + disable-unit rm2fb.service + echo "Failed to start rm2fb. Keeping it disabled for now." + echo "Please check the logs and open an issue:" + echo " https://github.com/toltec-dev/toltec/issues/new" + exit 1 + fi + fi + } + + preremove() { + if [[ $arch = rm2os3v22 ]]; then + disable-unit rm2fb.service + echo -n "make sure " + if ! is-enabled xochitl.service; then + echo "to re-enable xochitl with 'systemctl enable xochitl --now'" + echo -n "and " + fi + echo "to disable / uninstall any launchers like draft, oxide or remux before" + echo "rebooting your tablet to complete the uninstallation" + fi + } +} + +rm2fb-client() { + pkgdesc="Shim to make reMarkable 1 apps work on reMarkable 2" + installdepends=("rm2fb-server=$pkgver") + conflicts=(rm2fb) + replaces=(rm2fb) + + package() { + libname="librm2fb_client.so.$_libver" + install -D -m 644 -t "$pkgdir"/opt/lib "$srcdir"/install/lib/"$libname" + install -D -m 644 -t "$pkgdir"/opt/lib "$srcdir"/install/lib/librm2fb_client_no_hook.so + install -d "$pkgdir"/usr/lib + ln -s /opt/lib/"$libname" "$pkgdir"/usr/lib/"$libname" + + for dest in opt/lib usr/lib; do + ln -s "$libname" "$pkgdir/$dest/${libname%.*.*.*}" + ln -s "$libname" "$pkgdir/$dest/${libname%.*.*}" + ln -s "$libname" "$pkgdir/$dest/${libname%.*}" + done + + install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/rm2fb-client + + if [[ $arch = rm2os3v22 ]]; then + install -D -m 644 -t "$pkgdir"/opt/etc/xochitl.env.d "$srcdir"/rm2fb-preload.env + install -D -m 644 -t "$pkgdir"/etc/systemd/system/draft.service.d "$srcdir"/rm2fb-preload.conf + install -D -m 644 -t "$pkgdir"/etc/systemd/system/remux.service.d "$srcdir"/rm2fb-preload.conf + install -D -m 644 -t "$pkgdir"/etc/systemd/system/tarnish.service.d "$srcdir"/rm2fb-preload.conf + fi + } +} diff --git a/package/rm2fb-timower/rm2fb-client b/package/rm2fb-timower/rm2fb-client new file mode 100755 index 000000000..1ce19b84c --- /dev/null +++ b/package/rm2fb-timower/rm2fb-client @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +# Copyright (c) 2025 The Toltec Contributors +# SPDX-License-Identifier: MIT +LD_PRELOAD=/opt/lib/librm2fb_client.so.1 RM2FB_ACTIVE=1 exec "$@" diff --git a/package/rm2fb-timower/rm2fb-preload.conf b/package/rm2fb-timower/rm2fb-preload.conf new file mode 100644 index 000000000..a2b02b315 --- /dev/null +++ b/package/rm2fb-timower/rm2fb-preload.conf @@ -0,0 +1,3 @@ +[Service] +Environment="LD_PRELOAD=/opt/lib/librm2fb_client.so.1" +Environment="RM2FB_ACTIVE=1" diff --git a/package/rm2fb-timower/rm2fb-preload.env b/package/rm2fb-timower/rm2fb-preload.env new file mode 100644 index 000000000..56c6d09e7 --- /dev/null +++ b/package/rm2fb-timower/rm2fb-preload.env @@ -0,0 +1,9 @@ +# Copyright (c) 2025 The Toltec Contributors +# SPDX-License-Identifier: MIT +# Please do not modify files shipped by Toltec, or they risk being +# overwritten with updates. Instead create your own files in this directory. +if [[ -f /dev/shm/swtfb.01 ]]; then + export LD_PRELOAD="$LD_PRELOAD:/opt/lib/librm2fb_client.so" +else + echo "rm2fb server is not running: starting without rm2fb client" +fi diff --git a/package/rm2fb-timower/rm2fb-server b/package/rm2fb-timower/rm2fb-server new file mode 100755 index 000000000..65c994275 --- /dev/null +++ b/package/rm2fb-timower/rm2fb-server @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +# Copyright (c) 2025 The Toltec Contributors +# SPDX-License-Identifier: MIT +LD_PRELOAD=/opt/lib/librm2fb_server.so exec -a "rm2fb-server" /usr/bin/xochitl diff --git a/package/rm2fb-timower/rm2fb.service b/package/rm2fb-timower/rm2fb.service new file mode 100644 index 000000000..9dd8e403d --- /dev/null +++ b/package/rm2fb-timower/rm2fb.service @@ -0,0 +1,17 @@ +[Unit] +Description=reMarkable 2 Framebuffer Server +StartLimitIntervalSec=600 +StartLimitBurst=4 +Before=xochitl.service launcher.service remarkable-reboot.service remarkable-shutdown.service +After=opt.mount +ConditionFileNotEmpty=/opt/bin/rm2fb-server + +[Service] +Restart=on-failure +RestartSec=5 +ExecStart=/opt/bin/rm2fb-server +Environment=HOME=/home/root + +[Install] +Also=rm2fb.socket +WantedBy=multi-user.target diff --git a/package/rm2fb/package b/package/rm2fb/package new file mode 100644 index 000000000..d4e926912 --- /dev/null +++ b/package/rm2fb/package @@ -0,0 +1,126 @@ +#!/usr/bin/env bash +# Copyright (c) 2025 The Toltec Contributors +# SPDX-License-Identifier: MIT + +archs=(rm1os2 rm2os2 rm1os3 rm2os3) +pkgnames=(rm2fb-server rm2fb-client) +timestamp=2023-08-27T02:39:10Z +maintainer="raisjn " +license=MIT +url="https://github.com/ddvk/remarkable2-framebuffer" +pkgver=1:0.0.33-5 +_release="${pkgver%-*}" +_release="v${_release#*:}" +_libver=1.0.1 +section="devel" + +image=qt:v3.2 +source=( + "https://github.com/ddvk/remarkable2-framebuffer/archive/$_release.zip" + rm2fb.service + rm2fb-client + rm2fb-preload.conf + rm2fb-preload.env +) +sha256sums=( + dd57f1ba31f08a28d801989e9a705bd93cc637cd8f4dffa160412119e69329ff + SKIP + SKIP + SKIP + SKIP +) + +build() { + if [[ $arch = rm1 ]]; then + # Create an empty client library for rM1 + pushd src/client + echo | "${CROSS_COMPILE}gcc" \ + -fPIC -fvisibility=hidden -shared \ + -o "librm2fb_client.so.$_libver" \ + -xc - + popd + else + qmake + make + fi +} + +rm2fb-server() { + pkgdesc="Interface to the reMarkable framebuffer" + installdepends=(xochitl "rm2fb-client=$pkgver") + conflicts=(rm2fb) + replaces=(rm2fb) + + package() { + if [[ $arch = rm2 ]]; then + libname="librm2fb_server.so.$_libver" + install -D -m 644 -t "$pkgdir"/opt/lib "$srcdir"/src/server/"$libname" + ln -s "$libname" "$pkgdir"/opt/lib/"${libname%.*.*}" + ln -s "$libname" "$pkgdir"/opt/lib/"${libname%.*}" + install -D -m 644 -t "$pkgdir"/lib/systemd/system "$srcdir"/rm2fb.service + fi + } + + configure() { + if [[ $arch = rm2 ]]; then + systemctl daemon-reload + if systemctl enable rm2fb --now; then + # Restart xochitl if it's running + if is-active xochitl; then + # Reset the crash count so we don't trigger remarkable-fail + echo "0" > /tmp/crashnum + systemctl restart xochitl + fi + else + disable-unit rm2fb.service + echo "Failed to start rm2fb. Keeping it disabled for now." + echo "Please check the logs and open an issue:" + echo " https://github.com/toltec-dev/toltec/issues/new" + exit 1 + fi + fi + } + + preremove() { + if [[ $arch = rm2 ]]; then + disable-unit rm2fb.service + echo -n "make sure " + if ! is-enabled xochitl.service; then + echo "to re-enable xochitl with 'systemctl enable xochitl --now'" + echo -n "and " + fi + echo "to disable / uninstall any launchers like draft, oxide or remux before" + echo "rebooting your tablet to complete the uninstallation" + fi + } +} + +rm2fb-client() { + pkgdesc="Shim to make reMarkable 1 apps work on reMarkable 2" + installdepends=("rm2fb-server=$pkgver") + conflicts=(rm2fb) + replaces=(rm2fb) + + package() { + libname="librm2fb_client.so" + libnamever="$libname.$_libver" + install -D -m 644 -t "$pkgdir"/opt/lib "$srcdir"/src/client/"$libnamever" + install -d "$pkgdir"/usr/lib + ln -s /opt/lib/"$libnamever" "$pkgdir"/usr/lib/"$libnamever" + ln -s /opt/lib/"$libnamever" "$pkgdir"/opt/lib/"$libname" + + for dest in opt/lib usr/lib; do + ln -s "$libnamever" "$pkgdir/$dest/${libnamever%.*.*}" + ln -s "$libnamever" "$pkgdir/$dest/${libnamever%.*}" + done + + install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/rm2fb-client + + if [[ $arch = rm2 ]]; then + install -D -m 644 -t "$pkgdir"/opt/etc/xochitl.env.d "$srcdir"/rm2fb-preload.env + install -D -m 644 -t "$pkgdir"/etc/systemd/system/draft.service.d "$srcdir"/rm2fb-preload.conf + install -D -m 644 -t "$pkgdir"/etc/systemd/system/remux.service.d "$srcdir"/rm2fb-preload.conf + install -D -m 644 -t "$pkgdir"/etc/systemd/system/tarnish.service.d "$srcdir"/rm2fb-preload.conf + fi + } +} diff --git a/package/display/rm2fb-client b/package/rm2fb/rm2fb-client similarity index 100% rename from package/display/rm2fb-client rename to package/rm2fb/rm2fb-client diff --git a/package/display/rm2fb-preload.conf b/package/rm2fb/rm2fb-preload.conf similarity index 100% rename from package/display/rm2fb-preload.conf rename to package/rm2fb/rm2fb-preload.conf diff --git a/package/display/rm2fb-preload.env b/package/rm2fb/rm2fb-preload.env similarity index 100% rename from package/display/rm2fb-preload.env rename to package/rm2fb/rm2fb-preload.env diff --git a/package/display/rm2fb.service b/package/rm2fb/rm2fb.service similarity index 100% rename from package/display/rm2fb.service rename to package/rm2fb/rm2fb.service diff --git a/package/rmfakecloud-proxy/package b/package/rmfakecloud-proxy/package index 99322188e..dfa1ce9b3 100644 --- a/package/rmfakecloud-proxy/package +++ b/package/rmfakecloud-proxy/package @@ -2,26 +2,29 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2 rmpp rmppm) pkgnames=(rmfakecloud-proxy) pkgdesc="Connect Xochitl to a rmfakecloud server" _url=https://github.com/ddvk/rmfakecloud-proxy url="$_url" -_upver=0.0.3 -pkgver="$_upver-6" -timestamp=2022-02-26T22:59Z +_upver=0.0.8 +pkgver="$_upver-1" +timestamp=2025-08-20T15:50:55Z section="utils" maintainer="Mattéo Delabre " license=MIT installdepends=(procps-ng-pgrep findutils) image=golang:v3.2 +image_rmpp=golang:v4.0 +image_rmppm=golang:v4.0 source=( "https://github.com/ddvk/rmfakecloud-proxy/archive/v$_upver.zip" rmfakecloudctl rmfakecloud-proxy.service ) sha256sums=( - eaa3fdcce250e23f368a4c9ddcfb99ff178decf31b2a7f84501dfc6fdb2e6d8f + 81778d159a5d2d5e2f6d585c159e21f84ccc3b8dacdd5cda785aa47aa9b7658d SKIP SKIP ) @@ -32,8 +35,18 @@ build() { package main const Version = "rmfakecloud-proxy ${_upver%-*} ($GOOS-$GOARCH) $GOVERSION\n$_url" GO - - GOARCH=arm GOARM=7 go build -ldflags="-w -s" -o dist/rmfakecloud-proxy + case $arch in + rm1 | rm2) + GOARCH=arm GOARM=7 go build -ldflags="-w -s" -o dist/rmfakecloud-proxy + ;; + rmpp | rmppm) + GOARCH=arm64 go build -ldflags="-w -s" -o dist/rmfakecloud-proxy + ;; + *) + echo "Unhandled arch: $arch" + exit 1 + ;; + esac } package() { diff --git a/package/rmfakecloud-proxy/rmfakecloudctl b/package/rmfakecloud-proxy/rmfakecloudctl index c530f3589..ed27a7c09 100644 --- a/package/rmfakecloud-proxy/rmfakecloudctl +++ b/package/rmfakecloud-proxy/rmfakecloudctl @@ -249,10 +249,14 @@ subjectKeyIdentifier = hash subjectAltName=@san [ san ] DNS.1 = *.appspot.com -DNS.2 = my.remarkable.com -DNS.3 = internal.cloud.remarkable.com -DNS.4 = ping.remarkable.com -DNS.5 = *.remarkable.com +DNS.2 = *.remarkable.com +DNS.3 = *.cloud.remarkable.com +DNS.4 = *.cloud.remarkable.engineering +DNS.5 = *.rmfakecloud.localhost +DNS.6 = *.internal.cloud.remarkable.com +DNS.7 = *.tectonic.remarkable.com +DNS.8 = *.ping.remarkable.com +DNS.9 = *.internal.tctn.cloud.remarkable.com CSR openssl req -new -config "$csr" \ @@ -290,8 +294,15 @@ $proxy_listen hwr-production-dot-remarkable-production.appspot.com $proxy_listen service-manager-production-dot-remarkable-production.appspot.com $proxy_listen local.appspot.com $proxy_listen my.remarkable.com -$proxy_listen internal.cloud.remarkable.com $proxy_listen ping.remarkable.com +$proxy_listen internal.cloud.remarkable.com +$proxy_listen eu.tectonic.remarkable.com +$proxy_listen backtrace-proxy.cloud.remarkable.engineering +$proxy_listen dev.ping.remarkable.com +$proxy_listen dev.tectonic.remarkable.com +$proxy_listen dev.internal.cloud.remarkable.com +$proxy_listen eu.internal.tctn.cloud.remarkable.com +$proxy_listen webapp-prod.cloud.remarkable.engineering EOF } @@ -301,8 +312,15 @@ uninstall-hosts() { sed -i '/ service-manager-production-dot-remarkable-production.appspot.com$/d' "$hosts_path" sed -i '/ local.appspot.com$/d' "$hosts_path" sed -i '/ my.remarkable.com$/d' "$hosts_path" - sed -i '/ internal.cloud.remarkable.com$/d' "$hosts_path" sed -i '/ ping.remarkable.com$/d' "$hosts_path" + sed -i '/ internal.cloud.remarkable.com$/d' "$hosts_path" + sed -i '/ eu.tectonic.remarkable.com$/d' "$hosts_path" + sed -i '/ backtrace-proxy.cloud.remarkable.engineering$/d' "$hosts_path" + sed -i '/ dev.ping.remarkable.com$/d' "$hosts_path" + sed -i '/ dev.tectonic.remarkable.com$/d' "$hosts_path" + sed -i '/ dev.internal.cloud.remarkable.com$/d' "$hosts_path" + sed -i '/ eu.internal.tctn.cloud.remarkable.com$/d' "$hosts_path" + sed -i '/ webapp-prod.cloud.remarkable.engineering$/d' "$hosts_path" } # Try to make a full install of rmfakecloud-proxy diff --git a/package/rmfm/package b/package/rmfm/package index 81c25a3ad..f4fccc680 100644 --- a/package/rmfm/package +++ b/package/rmfm/package @@ -2,10 +2,11 @@ # Copyright (c) 2020 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(rmfm) pkgdesc="Bare-bones file manager using Node.js and sas" url="https://forgejo.sny.sh/sun/rmFM" -pkgver=1.5.1-1 +pkgver=1.5.1-2 timestamp=2023-12-06T08:51:41+01:00 section=utils maintainer="Sunny " diff --git a/package/rmkit/package b/package/rmkit/package index abcd970a4..d412d2d3b 100644 --- a/package/rmkit/package +++ b/package/rmkit/package @@ -1,7 +1,7 @@ #!/usr/bin/env bash # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT - +archs=(rm1 rm2) pkgnames=(bufshot dumbskull genie harmony iago lamp mines nao remux rpncalc simple wordlet) timestamp=2024-01-11T20:03:10Z maintainer="raisjn " @@ -25,13 +25,15 @@ sha256sums=( build() { pip3 install okp - ARCH="rm" make + local threads + threads="$(echo -e "8\n$(nproc)" | sort -n | tail -n1)" + ARCH="rm" make -j"${threads:-8}" } bufshot() { pkgdesc="program for saving the framebuffer as a png" url="https://github.com/rmkit-dev/rmkit/tree/master/src/bufshot" - pkgver=0.1.2-4 + pkgver=0.1.2-5 section="utils" package() { @@ -42,7 +44,7 @@ bufshot() { dumbskull() { pkgdesc="Dungeon Crawl themed Solitaire" url="https://rmkit.dev/apps/dumbskull" - pkgver=0.0.1-5 + pkgver=0.0.1-6 section="games" package() { @@ -54,7 +56,7 @@ dumbskull() { genie() { pkgdesc="Gesture engine that connects commands to gestures" url="https://rmkit.dev/apps/genie" - pkgver=0.1.7-3 + pkgver=0.1.7-4 section="utils" package() { @@ -80,7 +82,7 @@ genie() { harmony() { pkgdesc="Procedural sketching app" url="https://rmkit.dev/apps/harmony" - pkgver=0.2.3-3 + pkgver=0.2.3-4 section="drawing" package() { @@ -97,7 +99,7 @@ harmony() { iago() { pkgdesc="overlay for drawing shapes via stroke injection" url="https://rmkit.dev/apps/iago" - pkgver=0.1.2-3 + pkgver=0.1.2-4 section="utils" installdepends+=("lamp") @@ -109,7 +111,7 @@ iago() { lamp() { pkgdesc="config based stroke injection utility" url="https://rmkit.dev/apps/lamp" - pkgver=0.1.1-4 + pkgver=0.1.1-5 section="utils" package() { @@ -120,7 +122,7 @@ lamp() { mines() { pkgdesc="Mine detection game" url="https://rmkit.dev/apps/minesweeper" - pkgver=0.1.4-5 + pkgver=0.1.4-6 section="games" package() { @@ -133,7 +135,7 @@ mines() { nao() { pkgdesc="Nao Package Manager: opkg UI built with SAS" url="https://rmkit.dev/apps/nao" - pkgver=0.1.2-5 + pkgver=0.1.2-6 section="admin" installdepends+=(simple) @@ -147,7 +149,7 @@ nao() { remux() { pkgdesc="Launcher that supports multi-tasking applications" url="https://rmkit.dev/apps/remux" - pkgver=0.3.0-7 + pkgver=0.3.0-8 section="launchers" installdepends=(procps-ng-ps) @@ -184,7 +186,7 @@ remux() { rpncalc() { pkgdesc="RPN Calculator" url="https://rmkit.dev/apps/rpncalc" - pkgver=0.0.3-5 + pkgver=0.0.3-6 section="math" package() { @@ -197,7 +199,7 @@ rpncalc() { simple() { pkgdesc="Simple app script for writing scripted applications" url="https://rmkit.dev/apps/sas" - pkgver=0.2.1-3 + pkgver=0.2.1-4 section="devel" package() { @@ -208,7 +210,7 @@ simple() { wordlet() { pkgdesc="Wordle clone" url="https://rmkit.dev/apps/wordlet" - pkgver=0.0.2-5 + pkgver=0.0.2-6 section="games" package() { diff --git a/package/rmservewacominput/package b/package/rmservewacominput/package index c740ccf66..174f91aba 100644 --- a/package/rmservewacominput/package +++ b/package/rmservewacominput/package @@ -2,10 +2,11 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(rmservewacominput) pkgdesc="Serve pen input on port 33333" url=https://github.com/LinusCDE/rmWacomToMouse -pkgver=0.3.0-3 +pkgver=0.3.0-4 timestamp=2021-03-10T18:36Z section="utils" maintainer="Linus K. " @@ -26,7 +27,7 @@ sha256sums=( build() { cd c_implementation - CC=arm-linux-gnueabihf-gcc make + CC=${CROSS_COMPILE}gcc make } package() { diff --git a/package/rmstylusbutton/package b/package/rmstylusbutton/package index 24847793f..1eb9d666a 100644 --- a/package/rmstylusbutton/package +++ b/package/rmstylusbutton/package @@ -5,7 +5,7 @@ archs=(rm2) pkgnames=(rmstylusbutton) _pkgver=3.0 -pkgver=$_pkgver-1 +pkgver=$_pkgver-2 pkgdesc="Use a stylus button with the reMarkable 2" timestamp=2024-03-04T04:30:52Z maintainer="Moritz " @@ -26,7 +26,7 @@ sha256sums=( ) build() { - export CC=arm-linux-gnueabihf-gcc + export CC=${CROSS_COMPILE}gcc make } diff --git a/package/signature-rm/package b/package/signature-rm/package index d826d244c..1762185f5 100644 --- a/package/signature-rm/package +++ b/package/signature-rm/package @@ -2,18 +2,24 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT -archs=(rmallos2 rmallos3) +archs=( + rm1os2 + rm1os3 + rm2os2 + rm2os3 +) pkgnames=("signature-rm") pkgdesc="Remove the signature from the bottom of emails" url="https://github.com/rM-self-serve/signature-rM" -pkgver=1.0.2-3 +pkgver=1.0.2-4 timestamp=2023-12-06T11:43:00Z section="utils" maintainer="rM-self-serve <122753594+rM-self-serve@users.noreply.github.com>" license=MIT image=rust:v3.1 conflicts=(webinterface-onboot) -conflicts_rmallos2=(ddvk-hacks) +conflicts_rm1os2=(ddvk-hacks) +conflicts_rm2os2=(ddvk-hacks) source=( "$url"/archive/b5561af4eb6a0f5aa6e98e1a1279066f0c4bd9b7.zip diff --git a/package/sill/package b/package/sill/package index f34ee5fe2..1011a7e1d 100644 --- a/package/sill/package +++ b/package/sill/package @@ -2,10 +2,11 @@ # Copyright (c) 2020 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(sill) pkgdesc="Gesture-based text editor (and shell) for the reMarkable tablet" url=https://github.com/bkirwi/sill -pkgver=0.1.1-1 +pkgver=0.1.1-2 section="writing" timestamp=2023-08-12T00:00Z maintainer="Kai " diff --git a/package/sudoku/package b/package/sudoku/package index 24e7c8957..f391902d4 100644 --- a/package/sudoku/package +++ b/package/sudoku/package @@ -2,10 +2,11 @@ # Copyright (c) 2024 HookedBehemoth # SPDX-License-Identifier: GPL-3.0-only +archs=(rm1 rm2) pkgnames=(sudoku) pkgdesc="Sudoku for Remarkable" url="https://github.com/HookedBehemoth/remarkable-sudoku" -pkgver=0.1.2-1 +pkgver=0.1.2-2 timestamp=2023-02-04T22:49Z section="games" maintainer="Luis S. " @@ -13,7 +14,7 @@ license=GPL-3.0-only installdepends=(display) flags=(patch_rm2fb) -image=rust:v3.1 +image=rust:v3.2 source=("https://github.com/HookedBehemoth/remarkable-sudoku/archive/refs/tags/v${pkgver%-*}.tar.gz") sha256sums=(08a801a6ffc3f328fc92c8aebadbcc7a123b1abebf5cbe276d5f9f52058ee864) diff --git a/package/sysfs_preload/package b/package/sysfs_preload/package index 35950ef02..97c260736 100644 --- a/package/sysfs_preload/package +++ b/package/sysfs_preload/package @@ -2,10 +2,11 @@ # Copyright (c) 2023 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(sysfs_preload) pkgdesc="A simple preload that forces any calls to /sys/power/state to use systemd instead." url="https://github.com/Eeems-Org/sysfs_preload" -pkgver=1.0.3-1 +pkgver=1.0.3-2 timestamp=2024-10-11T04:33:10Z section=utils maintainer="Eeems " diff --git a/package/tilem/package b/package/tilem/package index adca938fe..5fc8dfaf7 100644 --- a/package/tilem/package +++ b/package/tilem/package @@ -2,10 +2,11 @@ # Copyright (c) 2020 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(tilem) pkgdesc="TI-84+ calculator emulator" url=https://github.com/timower/rM2-stuff/tree/master/apps/tilem -_tag=0.1.2 +_tag=0.1.3 pkgver=${_tag}-1 timestamp=2024-05-29T17:05:56Z maintainer="Mattéo Delabre " @@ -13,6 +14,7 @@ license=GPL-3.0 section="utils" image=base:v3.1 installdepends=(display) +preparedepends=(build:git build:git-lfs) flags=(nostrip) source=() diff --git a/package/toltec-base/opt-usr-bin.sh b/package/toltec-base/opt-usr-bin.sh index 9ff6643dc..150f4ad13 100644 --- a/package/toltec-base/opt-usr-bin.sh +++ b/package/toltec-base/opt-usr-bin.sh @@ -1,3 +1,3 @@ #!/bin/sh -export PATH=/opt/usr/bin:$PATH +export PATH="/opt/usr/bin:$PATH" diff --git a/package/toltec-base/package b/package/toltec-base/package index 6e3d8be49..623a5f281 100644 --- a/package/toltec-base/package +++ b/package/toltec-base/package @@ -2,20 +2,58 @@ # Copyright (c) 2023 The Toltec Contributors # SPDX-License-Identifier: MIT -archs=(rmall rmallos2 rmallos3 rm1 rm1os2 rm1os3 rm2 rm2os2 rm2os3) +archs=( + rmall + rmallos2 + rmallos3 + rmallos3v22 + rm1 + rm1os2 + rm1os3 + rm1os3v22 + rm2 + rm2os2 + rm2os3 + rm2os3v22 + rmpp + rmppos3v22 + rmppm + rmppmos3v22 +) pkgnames=(toltec-base) pkgdesc="Metapackage defining the base set of packages in a Toltec install" url=https://toltec-dev.org/ -pkgver=1.4-2 -timestamp=2023-12-27T08:30Z +pkgver=1.5-1 +timestamp=2025-11-02T00:00Z section="utils" maintainer="Eeems " license=MIT -installdepends=(toltec-bootstrap toltec-deletions toltec-completion launcherctl wget-ssl ca-certificates entware-rc) -installdepends_rm1os2=(open-remarkable-shutdown) -installdepends_rm1os3=(open-remarkable-shutdown) -installdepends_rm2os2=(rm2-suspend-fix) -installdepends_rm2os3=(rm2-suspend-fix) + +installdepends=( + toltec-bootstrap + toltec-deletions + toltec-completion + launcherctl + wget-ssl + ca-certificates + entware-rc +) + +installdepends_rm1=(open-remarkable-shutdown) +installdepends_rm1os2=("${installdepends_rm1[@]}") +installdepends_rm1os3=("${installdepends_rm1[@]}") +installdepends_rm1os3v22=("${installdepends_rm1[@]}") + +installdepends_rm2=(rm2-suspend-fix) +installdepends_rm2os2=("${installdepends_rm2[@]}") +installdepends_rm2os3=("${installdepends_rm2[@]}") +installdepends_rm2os3v22=("${installdepends_rm2[@]}") + +installdepends_rmpp=() +installdepends_rmppos3v22=("${installdepends_rmpp[@]}") + +installdepends_rmppm=() +installdepends_rmppmos3v22=("${installdepends_rmppm[@]}") source=(opt-usr-bin.sh) sha256sums=(SKIP) @@ -33,11 +71,11 @@ configure() { echo "Disabling automatic update" disable-unit update-engine.service case "$arch" in - rmall | rmallos2 | rmallos3) + rmall | rmallos2 | rmallos3 | rmallos3v22) echo "Warning: rmall version of toltec-base should not be installed" echo "Please run opkg install --force-reinstall toltec-base" ;; - rm1 | rm1os2 | rm1os3) + rm1 | rm1os2 | rm1os3 | rm1os3v22) if ! is-masked sys-subsystem-net-devices-usb1.device; then systemctl mask sys-subsystem-net-devices-usb1.device fi @@ -45,7 +83,7 @@ configure() { systemctl mask busybox-ifplugd@usb1.service fi ;; - rm2 | rm2os2 | rm2os3) + rm2 | rm2os2 | rm2os3 | rm2os3v22) if is-masked sys-subsystem-net-devices-usb1.device; then systemctl unmask sys-subsystem-net-devices-usb1.device fi @@ -53,17 +91,73 @@ configure() { systemctl unmask busybox-ifplugd@usb1.service fi ;; + rmpp | rmppos3v22) + if is-active etc-dropbear.mount; then + systemctl stop etc-dropbear.mount + fi + disable-unit var-volatile-etc.service + sed -i -E 's|(/dev/root\s+/\s+auto\s+)ro(\s+)|\1rw\2|' /etc/fstab + systemctl start etc-dropbear.mount + mount -o remount,rw / + ;; + rmppm | rmppmos3v22) + if is-active etc-dropbear.mount; then + systemctl stop etc-dropbear.mount + fi + disable-unit var-volatile-etc.service + sed -i -E 's|(/dev/root\s+/\s+auto\s+)ro(\s+)|\1rw\2|' /etc/fstab + systemctl start etc-dropbear.mount + mount -o remount,rw / + ;; esac } postremove() { - if is-masked sys-subsystem-net-devices-usb1.device; then - systemctl unmask sys-subsystem-net-devices-usb1.device - fi - if is-masked busybox-ifplugd@usb1.service; then - systemctl unmask busybox-ifplugd@usb1.service - fi - if ! is-enabled update-engine.service; then - systemctl enable update-engine - fi + case "$arch" in + rmall | rmallos2 | rmallos3 | rmallos3v22) + if is-masked sys-subsystem-net-devices-usb1.device; then + systemctl unmask sys-subsystem-net-devices-usb1.device + fi + if is-masked busybox-ifplugd@usb1.service; then + systemctl unmask busybox-ifplugd@usb1.service + fi + if ! is-enabled update-engine.service; then + systemctl enable update-engine + fi + ;; + rm1 | rm1os2 | rm1os3 | rm1os3v22) + if is-masked sys-subsystem-net-devices-usb1.device; then + systemctl unmask sys-subsystem-net-devices-usb1.device + fi + if is-masked busybox-ifplugd@usb1.service; then + systemctl unmask busybox-ifplugd@usb1.service + fi + if ! is-enabled update-engine.service; then + systemctl enable update-engine + fi + ;; + rm2 | rm2os2 | rm2os3 | rm2os3v22) + if is-masked sys-subsystem-net-devices-usb1.device; then + systemctl unmask sys-subsystem-net-devices-usb1.device + fi + if is-masked busybox-ifplugd@usb1.service; then + systemctl unmask busybox-ifplugd@usb1.service + fi + if ! is-enabled update-engine.service; then + systemctl enable update-engine + fi + ;; + rmpp | rmppos3v22) + if ! is-enabled var-volatile-etc.service; then + systemctl enable var-volatile-etc.service 2> /dev/null + fi + sed -i -E 's|(/dev/root\s+/\s+auto\s+)rw(\s+)|\1ro\2|' /etc/fstab + ;; + rmppm | rmppmos3v22) + if ! is-enabled var-volatile-etc.service; then + systemctl enable var-volatile-etc.service 2> /dev/null + fi + sed -i -E 's|(/dev/root\s+/\s+auto\s+)rw(\s+)|\1ro\2|' /etc/fstab + ;; + esac } diff --git a/package/toltec-bootstrap/package b/package/toltec-bootstrap/package index 8d89d3b98..ca93702e4 100644 --- a/package/toltec-bootstrap/package +++ b/package/toltec-bootstrap/package @@ -5,8 +5,8 @@ pkgnames=(toltec-bootstrap) pkgdesc="Manage your Toltec install" url=https://toltec-dev.org/ -pkgver=0.4.5-2 -timestamp=2025-07-26T00:54Z +pkgver=0.5.0-1 +timestamp=2025-10-31T00:00Z section="utils" maintainer="Eeems " license=MIT @@ -16,7 +16,10 @@ license=MIT # below as a transitional dependency to ensure that it gets installed for # existing users (see toltec-dev/toltec#532 for context). This dependency # should be removed once the package has reached enough users -installdepends=(coreutils-tsort toltec-base) +installdepends=( + coreutils-tsort + toltec-base +) source=( toltecctl @@ -56,7 +59,7 @@ configure() { fi switch-branch "$(get-branch)" - echo "Your Opkg configuration has been upgraded" + echo "Your opkg configuration has been upgraded" if generate-opkg-conf; then echo echo "! The upgrade is not finished! Please run \`opkg update\`" diff --git a/package/toltec-bootstrap/toltecctl b/package/toltec-bootstrap/toltecctl index 96bcb873e..957e6d290 100644 --- a/package/toltec-bootstrap/toltecctl +++ b/package/toltec-bootstrap/toltecctl @@ -96,17 +96,52 @@ identify-model() { "reMarkable 2.0") echo "rm2" ;; + "reMarkable Ferrari") + echo "rmpp" + ;; + "reMarkable Chiappa") + echo "rmppm" + ;; *) echo "unknown" ;; esac } +# Get the human readable name for the device +# +# Output: The human readable device name +get-model-human-readable-name() { + local device + device="$(identify-model)" + case $device in + "rm1") + echo "reMarkable 1" + ;; + "rm2") + echo "reMarkable 2" + ;; + "rmpp") + echo "reMarkable Paper Pro" + ;; + "rmppm") + echo "reMarkable Paper Pro Move" + ;; + *) + echo "Unknown" + ;; + esac +} + # Find the current OS release version # # Output: Current version in the X.Y.Z.P format get-release-version() { - awk -F= '/RELEASE_VERSION/{print $2}' /usr/share/remarkable/update.conf + if [ -f /usr/share/remarkable/update.conf ]; then + awk -F= '/RELEASE_VERSION/{print $2}' /usr/share/remarkable/update.conf + elif [ -f /etc/os-release ]; then + awk -F= '/IMG_VERSION=".+"/{print $2}' /etc/os-release | cut -d'"' -f2 + fi } # Check to see if the version is supported and error if it isn't supported @@ -207,14 +242,17 @@ add-bind-mount() { Description=Bind mount $1 over $2 DefaultDependencies=no Conflicts=umount.target -Before=local-fs.target umount.target +BindsTo=home.mount +After=home.mount + [Mount] What=$1 Where=$2 Type=none Options=bind + [Install] -WantedBy=local-fs.target +WantedBy=multi-user.target UNIT systemctl daemon-reload @@ -393,11 +431,11 @@ update-package-arch() { return 3 fi case "$arch" in - rmallos2 | rmallos3) + rmallos2 | rmallos3 | rmallos3v22) version="$(identify-support-version)" new_status="$(echo "$status" | replace-string "Architecture: ${arch}" "Architecture: rmall${version}")" ;; - rm1os2 | rm1os3 | rm2os2 | rm2os3) + rm1os2 | rm1os3 | rm1os3v22 | rm2os2 | rm2os3 | rm2os3v22) model="$(identify-model)" version="$(identify-support-version)" new_status="$(echo "$status" | replace-string "Architecture: ${arch}" "Architecture: ${model}${version}")" @@ -559,6 +597,22 @@ CONF # Create the Opkg configuration file for fetching Entware packages create-entware-conf() { + local arch + local repo + case "$(uname -m)" in + "armv7l") + arch="armv7-3.2" + repo="armv7sf-k3.2" + ;; + "aarch64") + arch="aarch64-3.10" + repo="aarch64-k3.10" + ;; + *) + echo "Unsupported device architecture" + exit 1 + ;; + esac mkdir -p "$opkg_conf_dir" cat > "$opkg_conf_dir"/10-entware.conf << CONF # Entware repository configuration @@ -568,8 +622,8 @@ create-entware-conf() { # then run \`toltecctl generate-opkg-conf\` to regenerate '$opkg_conf' arch all 100 -arch armv7-3.2 160 -src/gz entware https://bin.entware.net/armv7sf-k3.2 +arch $arch 160 +src/gz entware https://bin.entware.net/$repo CONF } @@ -594,6 +648,17 @@ get-branch() { awk "$awk_get_branch" "$opkg_conf_dir/15-toltec.conf" | head -n1 || true } +# Convert a version string into a number that can be sorted +# +# Arguments: +# +# $1 - Version number +# +# Output: Sortable version number +function version { + echo "$@" | awk -F. '{ printf("%d%04d%04d%04d\n", $1,$2,$3,$4); }' +} + # Compare two version numbers # # Arguments: @@ -601,9 +666,9 @@ get-branch() { # $1 - Version number to compare # $2 - Version number to compare # -# Output: True if the first number is larger than the second +# Output: True if the first number is larger or equal to than the second compare-versions() { - [ "$(echo -e "${1}\n${2}" | sort | head -n1)" != "$1" ] + [ "$(version "$1")" -ge "$(version "$2")" ] } # Identify which toltec version this should be limited to @@ -611,7 +676,8 @@ compare-versions() { # Output: One of the following strings # # os2 - 2.x OS version -# os3 - 3.x OS version +# os3 - 3.0 to 3.3.2 OS version +# os3v22 - 3.22 OS version # unknown identify-support-version() { local current_version @@ -621,8 +687,10 @@ identify-support-version() { echo "unknown" elif compare-versions "3.0" "$current_version"; then echo "os2" - elif compare-versions "4.0" "$current_version"; then + elif compare-versions "3.3.3" "$current_version"; then echo "os3" + elif compare-versions "4.0" "$current_version"; then + echo "os3v22" else echo "unknown" fi @@ -641,11 +709,11 @@ switch-branch() { model="$(identify-model)" version="$(identify-support-version)" - if [[ $model = "unknown" ]]; then + if [[ $model == "unknown" ]]; then log ERROR "You’re running an unsupported or unrecognised device" exit 1 fi - if [[ $version = "unknown" ]]; then + if [[ $version == "unknown" ]]; then log ERROR "You're running an unsupported or unrecognised OS version" exit 1 fi @@ -664,14 +732,22 @@ arch ${model} 250 src/gz toltec-${model} ${toltec_srv_root}/${branch}/${model} arch rmall${version} 260 src/gz toltec-rmall$version ${toltec_srv_root}/${branch}/rmall${version} -arch ${model}os2 270 -arch ${model}os3 270 +arch ${model}${version} 270 src/gz toltec-${model}${version} ${toltec_srv_root}/${branch}/${model}${version} CONF } # Re-enable Toltec install after system update reenable() { + # Make sure root partition and /etc are editable, and that changes will persist + if ! [ -w / ]; then + log INFO "Remounting / as rw" + mount -o remount,rw / + fi + if mountpoint -q /etc && grep ' /etc ' /proc/mounts | grep -q overlay; then + log INFO "Unmounting overlay on /etc" + umount -R /etc + fi log INFO "Mounting /opt" add-bind-mount "$toltec_src" "$toltec_dest" switch-branch "$(get-branch)" @@ -728,7 +804,20 @@ install-standalone-opkg() { else wget="wget" fi - local opkg_remote=https://bin.entware.net/armv7sf-k3.2/installer/opkg + local arch + case "$(uname -m)" in + "armv7l") + arch=armv7sf-k3.2 + ;; + "aarch64") + arch=aarch64-k3.10 + ;; + *) + echo "ERROR: Unsupported device architecture" + exit 1 + ;; + esac + local opkg_remote=https://bin.entware.net/$arch/installer/opkg if ! "$wget" --no-verbose "$opkg_remote" --output-document "$opkg_path"; then log ERROR "Unable to fetch standalone opkg, make sure you have a stable Wi-Fi connection" @@ -745,9 +834,23 @@ install-standalone-opkg() { # Install a local wget binary which supports TLS (the original one # installed on the reMarkable does not) in the PATH install-standalone-wget() { + local wget_remote + local wget_checksum local wget_path="${toltec_share}/wget" - local wget_remote=http://toltec-dev.org/thirdparty/bin/wget-v1.21.1-2 - local wget_checksum=3130886a020a56b7471ed60f3742db26acdced4b27fed5be22f9892b77589bc5 + case "$(uname -m)" in + "armv7l") + wget_remote=http://toltec-dev.org/thirdparty/bin/wget-v1.21.1-3 + wget_checksum=3130886a020a56b7471ed60f3742db26acdced4b27fed5be22f9892b77589bc5 + ;; + "aarch64") + wget_remote=http://toltec-dev.org/thirdparty/bin/wget-aarch64-v1.21.1-3 + wget_checksum=5480e42cd48bafa5d9a4276fa1359c9c6d79ceed3ea0eb8e4a06c0e61fa34cf0 + ;; + *) + echo "ERROR: Unsupported device architecture" + exit 1 + ;; + esac if [ -f "$wget_path" ] && ! [[ -e $wget_path ]] || ! sha256sum -c <(echo "$wget_checksum $wget_path") > /dev/null 2>&1; then rm "$wget_path" @@ -800,6 +903,19 @@ uninstall() { # Re-enable xochitl if needed systemctl enable xochitl + + case $(identify-model) in + rmpp | rmppm) + if systemctl --quiet is-active etc-dropbear.mount 2> /dev/null; then + systemctl stop etc-dropbear.mount + fi + if ! systemctl --quiet is-active var-volatile-etc.service 2> /dev/null; then + systemctl start var-volatile-etc.service + fi + systemctl start etc-dropbear.mount + mount -o remount,ro / + ;; + esac } # The current toltec install state @@ -811,7 +927,6 @@ uninstall() { # no - opt.mount is not enabled, or does not exist install-state() { local unit_name - local enabled unit_name="$(systemd-escape --path "$toltec_dest").mount" if ! systemctl --quiet is-enabled "$unit_name" 2> /dev/null; then echo "no" @@ -824,11 +939,30 @@ install-state() { # Output toltec installation status status() { + # Get information that takes some time + local install_state + install_state="$(install-state)" + local version_status=0 + check-version "$(get-branch)" &> /dev/null || version_status=$? + local extra="" + if command -v launcherctl > /dev/null; then + extra="$extra\n$(launcherctl status)\n" + fi + if command -v rmfakecloudctl > /dev/null; then + extra="$extra\nrmfakecloud $(rmfakecloudctl status | grep -v Run)\n" + fi + if command -v rcctl > /dev/null; then + local status + status=$(rcctl status) + if [[ "$status" != "" ]]; then + extra="$extra\nEntware Services:\n$status\n" + fi + fi + + # Output status echo -ne "Enabled: \033[1m" - local enabled=false - case "$(install-state)" in + case "${install_state}" in yes) - enabled=true echo -ne "\e[32mYes" ;; no) @@ -842,13 +976,16 @@ status() { ;; esac echo -e "\e[0m" + if ! [ -w / ]; then + echo -e " \e[33mWarning:\e[0m / is ro" + fi + if mountpoint -q /etc && grep ' /etc ' /proc/mounts | grep -q overlay; then + echo -e " \e[33mWarning:\e[0m /etc is overlay" + fi echo -ne "Supported: \033[1m" - local rc - rc=0 - check-version "$(get-branch)" &> /dev/null || rc=$? - if [ $rc -eq 0 ]; then + if [ $version_status -eq 0 ]; then echo -ne "\e[32mYes" - elif [ $rc -eq 2 ] || [ $rc -eq 3 ]; then + elif [ $version_status -eq 2 ] || [ $version_status -eq 3 ]; then echo -ne "\e[33mUnknown" else echo -ne "\e[31mNo" @@ -862,9 +999,10 @@ status() { echo -e "\033[1m\e[33mUnknown\e[0m" fi echo -n "Model: " - identify-model + get-model-human-readable-name echo -n "OS: " get-release-version + echo -en "$extra" } help() { @@ -875,7 +1013,20 @@ Manage your Toltec install. Available commands: generate-opkg-conf Rebuild the Opkg configuration file. switch-branch [BRANCH] Change the current branch to BRANCH. reenable Re-enable Toltec after a system update. - uninstall Permanently remove Toltec." + uninstall Permanently remove Toltec. + info Get information about the device." +} + +help-info() { + echo "Usage: $(basename "$0") info COMMAND +Get information about your device. Available commands: + + help Display this message and exit. + branch Get the current toltec branch + enabled Get the status of the toltec install. + model Get the model of the device + os Get the installed OS version on the device. + supported Get the supported state of this OS." } if [[ $0 = "${BASH_SOURCE[0]}" ]]; then @@ -1023,6 +1174,59 @@ MSG help ;; + info) + if [[ $# -eq 0 ]]; then + help-info + exit 1 + fi + subaction="$1" + shift + + case "$subaction" in + help | --help) + help-info + ;; + + enabled) + install-state + ;; + + supported) + version_status=0 + check-version "$(get-branch)" &> /dev/null || version_status=$? + if [ $version_status -eq 0 ]; then + echo yes + elif [ $version_status -eq 2 ] || [ $version_status -eq 3 ]; then + echo unknown + else + echo no + fi + ;; + + branch) + if [ -f "$opkg_conf" ]; then + get-branch + else + echo "unknown" + fi + ;; + + os) + get-release-version + ;; + + model) + identify-model + ;; + + *) + log ERROR "Invalid command '$action $subaction'\n" + help-info + exit 1 + ;; + esac + ;; + *) log ERROR "Invalid command '$action'\n" help diff --git a/package/toltec-deletions/package b/package/toltec-deletions/package index 4d78a343c..012b5d602 100644 --- a/package/toltec-deletions/package +++ b/package/toltec-deletions/package @@ -2,28 +2,32 @@ # Copyright (c) 2023 The Toltec Contributors # SPDX-License-Identifier: MIT -archs=(rm1os2 rm1os3 rm2os2 rm2os3) +archs=( + rm1os2 + rm1os3 + rm1os3v22 + rm2os2 + rm2os3 + rm2os3v22 + rmppos3v22 + rmppmos3v22 +) pkgnames=(toltec-deletions) pkgdesc="Metapackage to handle package deletions between OS versions" url=https://toltec-dev.org/ -pkgver=0.1-9 -timestamp=2023-12-03T04:51:58Z +pkgver=0.2-1 +timestamp=2025-11-02T00:00Z section="utils" maintainer="Eeems " license=MIT installdepends=(toltec-bootstrap) -conflicts_rm1os2=() + replaces_rm1os2=() -conflicts_rm2os2=() +conflicts_rm1os2=("${replaces_rm1os2[@]}") + replaces_rm2os2=() -conflicts_rm1os3=( - ddvk-hacks - fuse - wireguard - innernet-client - gocryptfs - remarkable-stylus -) +conflicts_rm2os2=("${replaces_rm2os2[@]}") + replaces_rm1os3=( ddvk-hacks fuse @@ -32,15 +36,22 @@ replaces_rm1os3=( gocryptfs remarkable-stylus ) -conflicts_rm2os3=( - ddvk-hacks - fuse - wireguard - innernet-client - gocryptfs - remarkable-stylus - open-remarkable-shutdown +conflicts_rm1os3=("${replaces_rm1os3[@]}") + +replaces_rm1os3v22=( + "${replaces_rm1os3[@]}" + oxide + oxide-extra + oxide-utils + inject_evdev + liboxide + liboxide-dev + libsentry + reterm + signature-rm ) +conflicts_rm1os3v22=("${replaces_rm1os3v22[@]}") + replaces_rm2os3=( ddvk-hacks fuse @@ -50,13 +61,35 @@ replaces_rm2os3=( remarkable-stylus open-remarkable-shutdown ) +conflicts_rm2os3=("${replaces_rm2os3[@]}") + +replaces_rm2os3v22=( + "${replaces_rm2os3[@]}" + oxide + oxide-extra + oxide-utils + inject_evdev + liboxide + liboxide-dev + libsentry + reterm + signature-rm +) +conflicts_rm2os3v22=("${replaces_rm2os3v22[@]}") + +replaces_rmppos3v22=() +conflicts_rmppos3v22=("${replaces_rmppos3v22[@]}") + +replaces_rmppmos3v22=() +conflicts_rmppmos3v22=("${replaces_rmppmos3v22[@]}") source=() sha256sums=() package() { # This should be fully reinstalled on reenable - # So add a file to root + # So add a file to root. Do not use the normal /opt/share/toltec/reenable.d, + # As this needs to be a reinstall instead of a re-configure mkdir -p "$pkgdir"/usr/share/toltec/reenable.d touch "$pkgdir"/usr/share/toltec/reenable.d/toltec-deletions } diff --git a/package/vnsee/package b/package/vnsee/package index 3030054f1..c3174462f 100644 --- a/package/vnsee/package +++ b/package/vnsee/package @@ -2,10 +2,11 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(vnsee) pkgdesc="VNC client allowing you to use the device as a second screen" url=https://github.com/matteodelabre/vnsee -pkgver=0.4.1-3 +pkgver=0.4.1-4 timestamp=2021-08-29T13:45:26Z section="screensharing" maintainer="Mattéo Delabre " @@ -34,6 +35,7 @@ sha256sums=( noextract=( "$_boost_pp_ver.zip" ) +preparedepends=(build:libarchive-tools) prepare() { patch -d "$srcdir" -p1 < "$srcdir"/vnsee-gui-set-path.patch diff --git a/package/webinterface-localhost/package b/package/webinterface-localhost/package index da657551a..8b73c516c 100644 --- a/package/webinterface-localhost/package +++ b/package/webinterface-localhost/package @@ -2,11 +2,12 @@ # Copyright (c) 2020 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) _pkgname="webinterface-localhost" pkgnames=("$_pkgname") pkgdesc="View the web interface if running, on localhost. Useful for tailscale." url=https://toltec-dev.org/ -pkgver=0.0.0-1 +pkgver=0.0.0-2 timestamp=2024-03-11T13:03:16Z section="utils" maintainer="rM-self-serve <122753594+rM-self-serve@users.noreply.github.com>" diff --git a/package/webinterface-upload-button/package b/package/webinterface-upload-button/package index bcd8d982b..ccd666839 100644 --- a/package/webinterface-upload-button/package +++ b/package/webinterface-upload-button/package @@ -2,10 +2,11 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=("webinterface-upload-button") pkgdesc="A simple upload button for the web interface" url="https://github.com/rM-self-serve/webinterface-upload-button" -pkgver=1.1.1-3 +pkgver=1.1.1-4 timestamp=2023-12-16T15:35:49Z section="utils" maintainer="rM-self-serve <122753594+rM-self-serve@users.noreply.github.com>" diff --git a/package/webinterface-wifi/package b/package/webinterface-wifi/package index 655beab42..8ed621b68 100644 --- a/package/webinterface-wifi/package +++ b/package/webinterface-wifi/package @@ -2,11 +2,12 @@ # Copyright (c) 2020 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) _pkgname="webinterface-wifi" pkgnames=("$_pkgname") pkgdesc="View the web interface if running, over wifi" url="https://github.com/rM-self-serve/$_pkgname" -pkgver=2.0.0-2 +pkgver=2.0.0-3 timestamp=2023-11-26T00:02:11Z section="utils" maintainer="rM-self-serve <122753594+rM-self-serve@users.noreply.github.com>" diff --git a/package/whiteboard-hypercard/package b/package/whiteboard-hypercard/package index 9cb9a468b..2252a9c20 100644 --- a/package/whiteboard-hypercard/package +++ b/package/whiteboard-hypercard/package @@ -2,10 +2,11 @@ # Copyright (c) 2024 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(whiteboard-hypercard) pkgdesc="Real-time collaboration, drawing or whiteboarding" url=https://github.com/fenollp/reMarkable-tools -pkgver=0.5.0-1 +pkgver=0.5.0-2 timestamp=2024-09-12T19:00:22Z section="drawing" maintainer="Pierre Fenoll " diff --git a/package/wikipedia/package b/package/wikipedia/package index b11686a6b..33a5c9f58 100644 --- a/package/wikipedia/package +++ b/package/wikipedia/package @@ -2,10 +2,11 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(wikipedia) pkgdesc="The free encyclopedia" url=https://github.com/dps/remarkable-wikipedia -pkgver=0.1.0-5 +pkgver=0.1.0-6 timestamp=2021-03-11T04:50Z section="readers" maintainer="David Singleton " diff --git a/package/wireguard/package b/package/wireguard/package index 80c511938..6bdde263f 100755 --- a/package/wireguard/package +++ b/package/wireguard/package @@ -5,12 +5,13 @@ archs=(rm1os2 rm2os2) pkgnames=(wireguard) pkgdesc="Fast, modern, secure VPN tunnel" url=https://www.wireguard.com -pkgver=1.0.20220627-1 +pkgver=1.0.20220627-2 timestamp=2021-02-19T14:08Z section=kernel maintainer="Jonah Weissman " license=GPL-2.0-only makedepends=(build:bc build:lzop build:git build:flex build:bison build:libssl-dev) +preparedepends=(build:git) flags=(nostrip) installdepends=(wireguard-tools) @@ -26,11 +27,13 @@ _defconfigs=( image=base:v3.2 source=( - "https://git.zx2c4.com/wireguard-linux-compat/snapshot/wireguard-linux-compat-${pkgver%-*}.tar.xz" + # "https://git.zx2c4.com/wireguard-linux-compat/snapshot/wireguard-linux-compat-${pkgver%-*}.tar.xz" + "https://github.com/WireGuard/wireguard-linux-compat/archive/refs/tags/v${pkgver%-*}.tar.gz" fix-multiple-yylloc-definitions.patch ) sha256sums=( - 362d412693c8fe82de00283435818d5c5def7f15e2433a07a9fe99d0518f63c0 + # 362d412693c8fe82de00283435818d5c5def7f15e2433a07a9fe99d0518f63c0 + 7bd8ea9407804faad721a66affab1c9e5f190151420b807a8259bd24db9836d0 SKIP ) diff --git a/package/xochitl/package b/package/xochitl/package index ba890d642..de81c4235 100644 --- a/package/xochitl/package +++ b/package/xochitl/package @@ -2,6 +2,7 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2 rmpp rmppm) pkgnames=(xochitl) pkgdesc="Read documents and take notes" url=https://remarkable.com @@ -55,45 +56,67 @@ package() { install -D -m 644 -t "$pkgdir"/opt/usr/share/applications "$srcdir"/xochitl.oxide install -D -T -m 755 "$srcdir"/launcherctl-xochitl "$pkgdir"/opt/share/launcherctl/"$pkgname" - install -D -m 644 -t "$pkgdir"/etc/systemd/system/xochitl.service.d \ - "$srcdir"/toltec-wrapper.conf - install -D -m 644 -t "$pkgdir"/etc/systemd/system/remarkable-shutdown.service.d \ - "$srcdir"/toltec-after-launcher.conf - install -D -m 644 -t "$pkgdir"/etc/systemd/system/remarkable-reboot.service.d \ - "$srcdir"/toltec-after-launcher.conf - install -D -m 644 -t "$pkgdir"/etc/systemd/system \ - "$srcdir"/manual-sync@.service + case $arch in + rm1 | rm2) + install -D -m 644 -t "$pkgdir"/etc/systemd/system/xochitl.service.d \ + "$srcdir"/toltec-wrapper.conf + install -D -m 644 -t "$pkgdir"/etc/systemd/system/remarkable-shutdown.service.d \ + "$srcdir"/toltec-after-launcher.conf + install -D -m 644 -t "$pkgdir"/etc/systemd/system/remarkable-reboot.service.d \ + "$srcdir"/toltec-after-launcher.conf + install -D -m 644 -t "$pkgdir"/etc/systemd/system \ + "$srcdir"/manual-sync@.service + ;; + rmpp | rmppm) ;; + *) + echo "Unhandled arch: $arch" + exit 1 + ;; + esac } configure() { - systemctl daemon-reload - - # sync.service and rm-sync.service interfere with launchers - # we use manual-sync@.service instead - if [ -f /usr/bin/sync ] && ! is-masked sync.service; then - systemctl mask sync.service - fi - - if [ -f /usr/bin/rm-sync ] && ! is-masked rm-sync.service; then - systemctl mask rm-sync.service - fi - - # manual-sync.service has been changed to manual-sync@.service - # Make sure to disable and stop the old version - disable-unit manual-sync.service - - if [ -f /usr/bin/rm-sync ] && ! is-active manual-sync@rm-sync.service; then - systemctl enable --now manual-sync@rm-sync.service - elif [ -f /usr/bin/sync ] && ! is-active manual-sync@sync.service; then - systemctl enable --now manual-sync@sync.service - fi - - if is-enabled xochitl.service && ! is-enabled launcher.service; then - # This package changes xochitl.service to alias it to launcher.service - # when enabled. If xochitl was previously enabled, force the creation - # of this alias by re-enabling the service - systemctl enable xochitl.service 2> /dev/null - fi + case $arch in + rm1 | rm2) + systemctl daemon-reload + + # sync.service and rm-sync.service interfere with launchers + # we use manual-sync@.service instead + if [ -f /usr/bin/sync ] && ! is-masked sync.service; then + systemctl mask sync.service + fi + + if [ -f /usr/bin/rm-sync ] && ! is-masked rm-sync.service; then + systemctl mask rm-sync.service + fi + + # manual-sync.service has been changed to manual-sync@.service + # Make sure to disable and stop the old version + disable-unit manual-sync.service + + if [ -f /usr/bin/rm-sync ]; then + if ! is-active manual-sync@rm-sync.service; then + systemctl enable --now manual-sync@rm-sync.service + fi + elif [ -f /usr/bin/sync ]; then + if ! is-active manual-sync@sync.service; then + systemctl enable --now manual-sync@sync.service + fi + fi + + if is-enabled xochitl.service && ! is-enabled launcher.service; then + # This package changes xochitl.service to alias it to launcher.service + # when enabled. If xochitl was previously enabled, force the creation + # of this alias by re-enabling the service + systemctl enable xochitl.service 2> /dev/null + fi + ;; + rmpp | rmppm) ;; + *) + echo "Unhandled arch: $arch" + exit 1 + ;; + esac } preremove() { @@ -102,19 +125,29 @@ preremove() { } postremove() { - systemctl daemon-reload - - if [ -f /usr/bin/sync ] && is-masked sync.service; then - systemctl unmask sync.service - fi - if [ -f /usr/bin/rm-sync ] && is-masked rm-sync.service; then - systemctl unmask rm-sync.service - fi - - if is-enabled xochitl.service && is-enabled launcher.service; then - # If xochitl is currently the active launcher, make sure the - # launcher.service alias is removed - systemctl disable xochitl.service 2> /dev/null - systemctl enable xochitl.service 2> /dev/null - fi + case $arch in + rm1 | rm2) + systemctl daemon-reload + + if [ -f /usr/bin/sync ] && is-masked sync.service; then + systemctl unmask sync.service + fi + if [ -f /usr/bin/rm-sync ] && is-masked rm-sync.service; then + systemctl unmask rm-sync.service + fi + + if is-enabled xochitl.service && is-enabled launcher.service; then + # If xochitl is currently the active launcher, make sure the + # launcher.service alias is removed + systemctl disable xochitl.service 2> /dev/null + systemctl enable xochitl.service 2> /dev/null + fi + ;; + rmpp | rmppm) ;; + *) + echo "Unhandled arch: $arch" + exit 1 + ;; + esac + } diff --git a/package/xochitl/xochitl b/package/xochitl/xochitl index 4a2eb95f2..8aa44f77c 100644 --- a/package/xochitl/xochitl +++ b/package/xochitl/xochitl @@ -13,11 +13,11 @@ done # If for some reason, sync.service is no longer masked, re-mask it # The package install should have handled this, but something may # have changed it. -if [[ "x$(systemctl is-enabled sync.service)" != "xmasked" ]]; then +if [[ "$(systemctl is-enabled sync.service)" != "masked" ]]; then systemctl mask sync.service fi -if [[ "x$(systemctl is-enabled rm-sync.service)" != "xmasked" ]]; then +if [[ "$(systemctl is-enabled rm-sync.service)" != "masked" ]]; then systemctl mask rm-sync.service fi diff --git a/package/yaft/package b/package/yaft/package index 5a635896a..044f9d73d 100644 --- a/package/yaft/package +++ b/package/yaft/package @@ -2,17 +2,19 @@ # Copyright (c) 2022 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(yaft) pkgdesc="Yet another framebuffer terminal" url=https://github.com/timower/rM2-stuff/tree/master/apps/yaft _tag=0.1.2 -pkgver=${_tag}-1 +pkgver=${_tag}-2 timestamp=2024-05-29T17:05:56Z maintainer="Mattéo Delabre " license=GPL-3.0 section="admin" image=base:v3.1 installdepends=(display terminfo) +preparedepends=(build:git build:git-lfs) flags=(nostrip) source=() diff --git a/package/zerotier-one/package b/package/zerotier-one/package index f0a3530f9..a1fb65c61 100644 --- a/package/zerotier-one/package +++ b/package/zerotier-one/package @@ -2,15 +2,16 @@ # Copyright (c) 2023 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(zerotier zerotier-one zerotier-one-doc zerotier-selftest) url=https://github.com/zerotier/ZeroTierOne _upver=1.14.2 -pkgver=${_upver}-1 +pkgver=${_upver}-2 timestamp=2024-10-29T16:17:48Z maintainer="Eeems " license=BUSL-1.1 section="utils" -image=base:v3.0 +image=base:v3.2 source=("https://github.com/zerotier/ZeroTierOne/archive/refs/tags/${_upver}.zip") sha256sums=(529dd6d246f51ca7cb0b14794ba68560c0134409f94fcc61a3ee7f5c173c301f) @@ -34,12 +35,12 @@ build() { # Disable SSO as the rust build is broken in rust:v3.0 due to issues with dependencies export ZT_SSO_SUPPORTED=0 export ZT_EMBEDDED=1 - export CC=arm-linux-gnueabihf-gcc - export CXX=arm-linux-gnueabihf-g++ - export AR=arm-linux-gnueabihf-ar - export STRIP=arm-linux-gnueabihf-strip - make - make selftest + export CC="${CROSS_COMPILE}gcc" + export CXX="${CROSS_COMPILE}g++" + export AR="${CROSS_COMPILE}ar" + export STRIP="${CROSS_COMPILE}strip" + make -j"$(nproc)" + make -j"$(nproc)" selftest } zerotier() { diff --git a/package/zoneinfo-utils/package b/package/zoneinfo-utils/package index 8caab1ce8..a67fc4a75 100644 --- a/package/zoneinfo-utils/package +++ b/package/zoneinfo-utils/package @@ -4,11 +4,12 @@ # Inspired by https://github.com/archlinux/svntogit-packages/blob/packages/tzdata/trunk/PKGBUILD +archs=(rm1 rm2 rmpp rmppm) pkgnames=(zoneinfo-utils) pkgdesc="Utilities for interacting with zoneinfo files" url=https://www.iana.org/time-zones _tzver=2023c -pkgver="$_tzver"-1 +pkgver="$_tzver"-2 timestamp=2023-03-28T00:00Z section=utils maintainer="Eeems " @@ -17,7 +18,7 @@ installdepends=(zoneinfo-core) makedepends=(build:gawk) flags=(nostrip) -image=base:v3.0 +image=base:v4.0 source=( "https://www.iana.org/time-zones/repository/releases/tzcode${_tzver}.tar.gz" "https://www.iana.org/time-zones/repository/releases/tzdata${_tzver}.tar.gz" @@ -42,7 +43,7 @@ build() { popd > /dev/null rm -r .x86 - make VERSION="$_tzver" CC=arm-linux-gnueabihf-cc + make VERSION="$_tzver" CC="${CROSS_COMPILE}cc" "${CROSS_COMPILE}strip" --strip-all zic zdump } @@ -58,13 +59,16 @@ package() { popd > /dev/null mv "${pkgdir}"/usr/{lib,share/man} "${pkgdir}"/opt/usr - mv "${pkgdir}"/usr/{s,}bin "${pkgdir}"/opt + mv "${pkgdir}"/usr/bin "${pkgdir}"/opt install -D -m 644 -t "$pkgdir"/opt/share/zoneinfo "$srcdir"/iso3166.tab install -D -m 644 -t "$pkgdir"/opt/share/zoneinfo "$srcdir"/zone1970.tab # cleanup - rm -rf "${pkgdir:?}"/{etc,usr} + rm "${pkgdir}"/etc/localtime + rmdir "${pkgdir}"/etc + rm -rf "${pkgdir:?}"/usr/share + rmdir "${pkgdir}"/usr } configure() { diff --git a/package/zshelf/package b/package/zshelf/package index 473626868..86743b63b 100644 --- a/package/zshelf/package +++ b/package/zshelf/package @@ -2,10 +2,11 @@ # Copyright (c) 2021 The Toltec Contributors # SPDX-License-Identifier: MIT +archs=(rm1 rm2) pkgnames=(zshelf) pkgdesc="Z-Library browser and downloader" url=https://github.com/khanhas/zshelf -pkgver=0.3.1-5 +pkgver=0.3.1-6 section=utils timestamp=2021-02-20T01:45Z maintainer="khanhas " diff --git a/requirements.txt b/requirements.txt index c0321f1b8..946fd7b1a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,7 +8,7 @@ mypy-extensions==1.0.0 mypy==1.7.1 pylint==3.0.3 six==1.16.0 -toltecmk==0.3.7 +toltecmk==0.5.5 toml==0.10.2 types-python-dateutil==2.8.19.14 types-requests==2.31.0.2 diff --git a/scripts/bootstrap/bootstrap b/scripts/bootstrap/bootstrap index 9586b887d..c3800e64f 100755 --- a/scripts/bootstrap/bootstrap +++ b/scripts/bootstrap/bootstrap @@ -25,9 +25,9 @@ case "$(uname -m)" in "armv7l") arch="armv7sf-k3.2" ;; - #"aarch64) - # arch="aarch64-k3.10" - # ;; + "aarch64") + arch="aarch64-k3.10" + ;; *) echo "Unsupported device architecture" exit 1 @@ -120,8 +120,23 @@ check-installed() { # Install a local wget binary which supports TLS (the original one # installed on the reMarkable does not) in the PATH wget-bootstrap() { - local wget_remote=http://toltec-dev.org/thirdparty/bin/wget-v1.21.1-2 - local wget_checksum=3130886a020a56b7471ed60f3742db26acdced4b27fed5be22f9892b77589bc5 + local wget_remote + local wget_checksum + + case "$(uname -m)" in + "armv7l") + wget_remote=http://toltec-dev.org/thirdparty/bin/wget-v1.21.1-3 + wget_checksum=3130886a020a56b7471ed60f3742db26acdced4b27fed5be22f9892b77589bc5 + ;; + "aarch64") + wget_remote=http://toltec-dev.org/thirdparty/bin/wget-aarch64-v1.21.1-3 + wget_checksum=5480e42cd48bafa5d9a4276fa1359c9c6d79ceed3ea0eb8e4a06c0e61fa34cf0 + ;; + *) + echo "ERROR: Unsupported device architecture" + exit 1 + ;; + esac if [[ ! -x $wget_path ]]; then if [[ -e $wget_path ]]; then @@ -158,7 +173,7 @@ wget-bootstrap() { # Install a temporary Opkg binary in PATH to be able to install # bootstrapping packages opkg-bootstrap() { - log "Bootstrapping Opkg" + log "Bootstrapping opkg" mkdir -p /opt/tmp if [[ ! -x $opkg_path ]]; then @@ -189,6 +204,16 @@ main() { # (otherwise it could get wiped out by the error-cleanup hook below) check-installed + # Make sure root partition and /etc are editable, and that changes will persist + if ! [ -w / ]; then + log "Remounting / as rw" + mount -o remount,rw / + fi + if mountpoint -q /etc && grep ' /etc ' /proc/mounts | grep -q overlay; then + log "Unmounting overlay on /etc" + umount -R /etc + fi + # Fetch temporary wget and opkg binaries used for bootstrapping wget-bootstrap opkg-bootstrap @@ -220,6 +245,9 @@ main() { exit 1 fi fi + if [[ "$1" == "--force" ]]; then + shift + fi log "Installing Toltec and Entware" diff --git a/scripts/build/repo.py b/scripts/build/repo.py index d8dac134d..c5fabe5df 100644 --- a/scripts/build/repo.py +++ b/scripts/build/repo.py @@ -3,6 +3,7 @@ """ Build the package repository. """ + import logging import os import pathlib @@ -11,12 +12,8 @@ from datetime import datetime from enum import auto from enum import Enum -from typing import ( - Dict, - Iterable, - List, - Optional, -) +from typing import Iterable +from collections import defaultdict, deque import requests from jinja2 import ( @@ -54,7 +51,7 @@ class PackageStatus(Enum): # pylint: enable=invalid-name -GroupedPackages = Dict[PackageStatus, Dict[str, Dict[str, List[Package]]]] +GroupedPackages = dict[PackageStatus, dict[str, dict[str, list[Package]]]] class Repo: @@ -67,9 +64,9 @@ def __init__(self, recipe_dir: str, repo_dir: str) -> None: :param recipe_dir: directory where recipe definitions are stored :param repo_dir: directory where built packages are stored """ - self.recipe_dir = recipe_dir - self.repo_dir = repo_dir - self.generic_recipes = {} + self.recipe_dir: str = recipe_dir + self.repo_dir: str = repo_dir + self.generic_recipes: dict[str, dict[str, Recipe]] = {} for name in os.listdir(self.recipe_dir): path = pathlib.Path(self.recipe_dir) / name @@ -82,7 +79,9 @@ def __init__(self, recipe_dir: str, repo_dir: str) -> None: os.path.join(self.recipe_dir, name) ) - def fetch_packages(self, remote: Optional[str]) -> GroupedPackages: + def fetch_packages( + self, remote: str | None, recipe_filter: list[str] | None = None + ) -> GroupedPackages: """ Fetch locally missing packages from a remote server and report which packages are missing from the remote and need to be built locally. @@ -101,6 +100,9 @@ def fetch_packages(self, remote: Optional[str]) -> GroupedPackages: } for name, generic_recipe in self.generic_recipes.items(): + if recipe_filter is not None and name not in recipe_filter: + continue + fetched_generic = {} missing_generic = {} @@ -135,7 +137,7 @@ def fetch_packages(self, remote: Optional[str]) -> GroupedPackages: return results - def fetch_package(self, package: Package, remote: Optional[str]) -> PackageStatus: + def fetch_package(self, package: Package, remote: str | None) -> PackageStatus: """ Check if a package exists locally and fetch it otherwise. @@ -178,7 +180,7 @@ def fetch_package(self, package: Package, remote: Optional[str]) -> PackageStatu def order_dependencies( self, - generic_recipes: List[Dict[str, Recipe]], + generic_recipes: list[dict[str, Recipe]], ) -> Iterable[dict[str, Recipe]]: """ Order a list of recipes so that all recipes that a recipe needs @@ -249,4 +251,110 @@ def make_compatibility(self) -> None: logger.info("Generating compatibility info") compat_source = os.path.join(self.recipe_dir, "Compatibility") compat_dest = self.repo_dir - shutil.copy2(compat_source, compat_dest) + _ = shutil.copy2(compat_source, compat_dest) + + def dependency_chains( # pylint:disable=R0914, R0912, R0915 + self, + recipes: list[str], + ) -> list[list[str]]: + """ + Generate dependency chains where each chain contains recipes in build order. + Recipes that share dependencies are grouped into the same chain. + """ + package_to_recipe: dict[str, str] = {} + for recipe_name in recipes: + recipe = self.generic_recipes[recipe_name] + for arch_recipe in recipe.values(): + for package_name in arch_recipe.packages.keys(): + if package_name in package_to_recipe: + logger.warning("Duplicate %s package found", package_name) + + package_to_recipe[package_name] = recipe_name + + reverse_graph: dict[str, set[str]] = defaultdict(set) + forward_graph: dict[str, set[str]] = defaultdict(set) + indegree: dict[str, int] = defaultdict(int) + + for name in recipes: + recipe = self.generic_recipes[name] + host_dep_packages: set[str] = { + dep.package + for arch_recipe in recipe.values() + for dep in arch_recipe.makedepends + if dep.kind == DependencyKind.HOST + } + + recipe_deps: set[str] = set() + for package_name in host_dep_packages: + if package_name not in package_to_recipe: + continue + + dep_recipe = package_to_recipe[package_name] + if dep_recipe in recipes: + recipe_deps.add(dep_recipe) + + forward_graph[name] = recipe_deps + for dep_recipe in recipe_deps: + reverse_graph[dep_recipe].add(name) + indegree[name] += 1 + + if name not in indegree: + indegree[name] = 0 + + visited: set[str] = set() + components: list[list[str]] = [] + + def dfs(node: str, component: list[str]) -> None: + if node in visited: + return + visited.add(node) + component.append(node) + + for neighbor in reverse_graph[node]: + dfs(neighbor, component) + + for neighbor in forward_graph[node]: + dfs(neighbor, component) + + for name in recipes: + if name in visited: + continue + + component: list[str] = [] + dfs(name, component) + components.append(component) + + result_chains: list[list[str]] = [] + + for component in components: + if not component: + continue + + local_indegree = {node: 0 for node in component} + for node in component: + for dep in forward_graph[node]: + if dep in component: + local_indegree[node] += 1 + + queue: deque[str] = deque( + [node for node in component if local_indegree[node] == 0] + ) + order: list[str] = [] + + while queue: + curr = queue.popleft() + order.append(curr) + for dependent in reverse_graph[curr]: + if dependent not in component: + continue + + local_indegree[dependent] -= 1 + if local_indegree[dependent] == 0: + queue.append(dependent) + + if len(order) != len(component): + order = component[:] + + result_chains.append(order) + + return result_chains diff --git a/scripts/dependency_chain.py b/scripts/dependency_chain.py new file mode 100755 index 000000000..690b6122d --- /dev/null +++ b/scripts/dependency_chain.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python3 +# Copyright (c) 2021 The Toltec Contributors +# SPDX-License-Identifier: MIT +"""Build all packages and create a package index.""" + +import argparse +import logging +import json +from repo_build import parse_args_and_fetch_packages, argparse_add_cleanup +from build.repo import PackageStatus + +logger = logging.getLogger(__name__) + + +def main() -> None: # pylint: disable=R0914 + """Build the repo""" + + parser = argparse.ArgumentParser(description=__doc__) + + _ = parser.add_argument( + "-v", + "--verbose", + action="store_const", + const=logging.DEBUG, + default=logging.ERROR, + help="show debugging information", + ) + argparse_add_cleanup(parser) + _, repo, results = parse_args_and_fetch_packages(parser) + missing = list(results[PackageStatus.Missing].keys()) + + print( + json.dumps( + [ + {"recipes": " ".join(names)} + for names in repo.dependency_chains(missing) + ], + indent=2, + ) + ) + + +if __name__ == "__main__": + main() diff --git a/scripts/package_build.py b/scripts/package_build.py index 8f70f891f..744575260 100755 --- a/scripts/package_build.py +++ b/scripts/package_build.py @@ -12,62 +12,81 @@ List, Optional, ) +from shutil import rmtree +from repo_build import print_disk_usage, cleanup, argparse_add_cleanup from build import paths -from build.repo import Repo from toltec import parse_recipe # type: ignore from toltec.builder import Builder # type: ignore from toltec.recipe import Package # type: ignore from toltec.repo import make_index # type: ignore from toltec.util import argparse_add_verbose, LOGGING_FORMAT # type: ignore -parser = argparse.ArgumentParser(description=__doc__) +logger = logging.getLogger(__name__) -parser.add_argument( - "recipe_name", - metavar="RECIPENAME", - help="name of the recipe to build", -) -parser.add_argument( - "-a", - "--arch-name", - metavar="ARCHNAME", - action="append", - help="""only build for the given architecture (can - be repeated)""", -) +def main() -> None: + """Build a package""" + parser = argparse.ArgumentParser(description=__doc__) + + _ = parser.add_argument( + "recipe_name", + metavar="RECIPENAME", + help="name of the recipe to build", + ) + + _ = parser.add_argument( + "-a", + "--arch-name", + metavar="ARCHNAME", + action="append", + help="""only build for the given architecture (can + be repeated)""", + ) + + _ = parser.add_argument( + "packages_names", + nargs="*", + metavar="PACKAGENAME", + help="list of packages to build (default: all packages from the recipe)", + ) + + argparse_add_verbose(parser) + argparse_add_cleanup(parser) + args = parser.parse_args() + logging.basicConfig(format=LOGGING_FORMAT, level=args.verbose) + builder = Builder(paths.WORK_DIR, paths.REPO_DIR) + + with Builder( + os.path.join(paths.WORK_DIR, args.recipe_name), paths.REPO_DIR + ) as builder: + recipe_bundle = parse_recipe(f"package/{args.recipe_name}") + build_matrix: Optional[Dict[str, Optional[List[Package]]]] = None + if args.arch_name or args.packages_names: + build_matrix = {} + for arch, recipes in recipe_bundle.items(): + if args.package_name: + build_matrix[arch] = [ + recipes.packages[pkg_name] + for pkg_name in args.package_name + ] + else: + build_matrix[arch] = None + + rmtree(builder.work_dir, ignore_errors=True) + try: + success: bool = builder.make(recipe_bundle, build_matrix, False) + + finally: + print_disk_usage() + + if args.cleanup: + cleanup(builder, recipe_bundle) + + if not success: + sys.exit(1) + + make_index(paths.REPO_DIR) -parser.add_argument( - "packages_names", - nargs="*", - metavar="PACKAGENAME", - help="list of packages to build (default: all packages from the recipe)", -) -argparse_add_verbose(parser) - -args = parser.parse_args() -logging.basicConfig(format=LOGGING_FORMAT, level=args.verbose) -repo = Repo(paths.RECIPE_DIR, paths.REPO_DIR) -builder = Builder(paths.WORK_DIR, paths.REPO_DIR) -arch_packages: Optional[Dict[str, Optional[List[Package]]]] = None - -with Builder( - os.path.join(paths.WORK_DIR, args.recipe_name), paths.REPO_DIR -) as builder: - recipe_bundle = parse_recipe(f"package/{args.recipe_name}") - build_matrix: Optional[Dict[str, Optional[List[Package]]]] = None - if args.arch_name or args.packages_names: - build_matrix = {} - for arch, recipes in recipe_bundle.items(): - if args.package_name: - build_matrix[arch] = [ - recipes.packages[pkg_name] for pkg_name in args.package_name - ] - else: - build_matrix[arch] = None - - if not builder.make(recipe_bundle, build_matrix, False): - sys.exit(1) - - make_index(paths.REPO_DIR) +if __name__ == "__main__": + main() diff --git a/scripts/repo_build.py b/scripts/repo_build.py index f1787def2..0f2ff81be 100755 --- a/scripts/repo_build.py +++ b/scripts/repo_build.py @@ -11,9 +11,10 @@ List, Optional, ) +from shutil import disk_usage, rmtree from build import paths -from build.repo import Repo, PackageStatus -from toltec.recipe import Package # type: ignore +from build.repo import GroupedPackages, Repo, PackageStatus +from toltec.recipe import Package, RecipeBundle # type: ignore from toltec import parse_recipe # type: ignore from toltec.builder import Builder # type: ignore from toltec.repo import make_index # type: ignore @@ -21,87 +22,164 @@ logger = logging.getLogger(__name__) -parser = argparse.ArgumentParser(description=__doc__) -parser.add_argument( - "-d", - "--diff", - action="store_true", - help="only keep new packages that do not exist on the remote repository", -) - -argparse_add_verbose(parser) - -group = parser.add_mutually_exclusive_group() - -group.add_argument( - "-l", - "--local", - action="store_true", - help="""by default, packages missing from the local repository are not - rebuilt if they already exist on the remote repository — pass this flag to - disable this behavior""", -) - -group.add_argument( - "-r", - "--remote-repo", - default="https://toltec-dev.org/testing", - metavar="URL", - help="""root of a remote repository used to know which packages - are already built (default: %(default)s)""", -) - -args = parser.parse_args() -remote = args.remote_repo if not args.local else None -logging.basicConfig(format=LOGGING_FORMAT, level=args.verbose) - -repo = Repo(paths.RECIPE_DIR, paths.REPO_DIR) -results = repo.fetch_packages(remote) - -os.makedirs(paths.REPO_DIR, exist_ok=True) -make_index(paths.REPO_DIR) - -fetched = results[PackageStatus.Fetched] -missing = results[PackageStatus.Missing] -ordered_missing = repo.order_dependencies( - [repo.generic_recipes[name] for name in missing] -) - -for generic_recipe in ordered_missing: - # Will need to rework toltec_old.repo into something inline and actually easy to work - # with Currently generic_recipe is a Dict[str, Recipe] where the index is the arch. Every - # single entry will have the same path, so we can use that for the name of the generic - # recipe we are actually building. - name = os.path.basename(next(iter(generic_recipe.values())).path) - if missing[name]: - with Builder( - os.path.join(paths.WORK_DIR, name), paths.REPO_DIR - ) as builder: - recipe_bundle = parse_recipe(os.path.join(paths.RECIPE_DIR, name)) - build_matrix: Optional[Dict[str, Optional[List[Package]]]] = None - old_build_matrix = missing[name] - if old_build_matrix: - build_matrix = {} - - for arch, recipes in old_build_matrix.items(): - build_matrix[arch] = [ - recipe_bundle[arch].packages[pkg_name] - for pkg_name in recipe_bundle[arch].packages - ] - logger.info("Building %s", name) - builder.make(recipe_bundle, build_matrix, False) - - make_index(paths.REPO_DIR) - -if args.diff: - for name in fetched: - for packages in fetched[name].values(): - for package in packages: - filename = package.filename() - local_path = os.path.join(repo.repo_dir, filename) - os.remove(local_path) - -make_index(paths.REPO_DIR) -repo.make_listing() -repo.make_compatibility() +def sizeof_fmt(num: float, suffix: str = "B") -> str: + """Output human readable string for size in bytes""" + for unit in ("", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"): + if abs(num) < 1024.0: + return f"{num:3.1f}{unit}{suffix}" + + num /= 1024.0 + return f"{num:.1f}Yi{suffix}" + + +def cleanup(builder: Builder, recipe_bundle: RecipeBundle) -> None: + """Perform cleanup to reduce space usage""" + rmtree(builder.work_dir, ignore_errors=True) + for image in {x.image for x in recipe_bundle.values() if x.image}: + builder.docker.images.remove(builder.IMAGE_PREFIX + image) + + +def print_disk_usage() -> None: + """Print the current disk usage for important paths""" + usage = disk_usage(paths.WORK_DIR) + logger.info( + "work_dir: %s/%s", + sizeof_fmt(usage.used), + sizeof_fmt(usage.total), + ) + usage = disk_usage(paths.REPO_DIR) + logger.info( + "repo_dir: %s/%s", + sizeof_fmt(usage.used), + sizeof_fmt(usage.total), + ) + + +def argparse_add_cleanup(parser: argparse.ArgumentParser) -> None: + """Add --cleanup flag""" + _ = parser.add_argument( + "--cleanup", + action="store_true", + help="Remove the work folder after finishing building the recipe", + ) + + +def parse_args_and_fetch_packages( + parser: argparse.ArgumentParser, +) -> tuple[argparse.Namespace, Repo, GroupedPackages]: + """Handle local/remote arguments, fetch packages, and return args, repo, and results""" + _ = parser.add_argument( + "--filter", + default=None, + metavar="RECIPE...", + help="List of recipe names to limit build to", + ) + group = parser.add_mutually_exclusive_group() + _ = group.add_argument( + "-l", + "--local", + action="store_true", + help="""by default, packages missing from the local repository are not + rebuilt if they already exist on the remote repository — pass this flag to + disable this behavior""", + ) + _ = group.add_argument( + "-r", + "--remote-repo", + default="https://toltec-dev.org/testing", + metavar="URL", + help="""root of a remote repository used to know which packages + are already built (default: %(default)s)""", + ) + args = parser.parse_args() + remote = args.remote_repo if not args.local else None + logging.basicConfig(format=LOGGING_FORMAT, level=args.verbose) + repo = Repo(paths.RECIPE_DIR, paths.REPO_DIR) + recipe_filter: str | None | list[str] = args.filter + if recipe_filter is not None: + assert isinstance(recipe_filter, str) + recipe_filter = recipe_filter.split(" ") + + results = repo.fetch_packages(remote, recipe_filter=recipe_filter) + return args, repo, results + + +def main() -> None: # pylint: disable=R0914,R0912 + """Build the repo""" + + parser = argparse.ArgumentParser(description=__doc__) + + _ = parser.add_argument( + "-d", + "--diff", + action="store_true", + help="only keep new packages that do not exist on the remote repository", + ) + + argparse_add_verbose(parser) + argparse_add_cleanup(parser) + + args, repo, results = parse_args_and_fetch_packages(parser) + + os.makedirs(paths.REPO_DIR, exist_ok=True) + make_index(paths.REPO_DIR) + + fetched = results[PackageStatus.Fetched] + missing = results[PackageStatus.Missing] + ordered_missing = repo.order_dependencies( + [repo.generic_recipes[name] for name in missing] + ) + + for generic_recipe in ordered_missing: + # Will need to rework toltec_old.repo into something inline and actually easy to work + # with Currently generic_recipe is a Dict[str, Recipe] where the index is the arch. Every + # single entry will have the same path, so we can use that for the name of the generic + # recipe we are actually building. + name = os.path.basename(next(iter(generic_recipe.values())).path) + if missing[name]: + with Builder( + os.path.join(paths.WORK_DIR, name), paths.REPO_DIR + ) as builder: + recipe_bundle = parse_recipe( + os.path.join(paths.RECIPE_DIR, name) + ) + build_matrix: Optional[Dict[str, Optional[List[Package]]]] = ( + None + ) + old_build_matrix = missing[name] + if old_build_matrix: + build_matrix = {} + + for arch in old_build_matrix.keys(): + build_matrix[arch] = [ + recipe_bundle[arch].packages[pkg_name] + for pkg_name in recipe_bundle[arch].packages + ] + logger.info("Building %s", name) + try: + builder.make(recipe_bundle, build_matrix, False) + + finally: + print_disk_usage() + + if args.cleanup: + cleanup(builder, recipe_bundle) + + make_index(paths.REPO_DIR) + + if args.diff: + for name in fetched: + for packages in fetched[name].values(): + for package in packages: + filename = package.filename() + local_path = os.path.join(repo.repo_dir, filename) + os.remove(local_path) + + make_index(paths.REPO_DIR) + repo.make_listing() + repo.make_compatibility() + + +if __name__ == "__main__": + main()