From 3aba4e8522fdcfd90ab0ef361b6cba48da993b29 Mon Sep 17 00:00:00 2001 From: cyan Date: Fri, 11 Jul 2025 06:27:24 +0200 Subject: [PATCH] feat: jenkins CI initial (#142) * feat: jenkins CI initial * feat: publish over SSH * feat: more details regarding build-id generation * feat: prebuild download logic * feat: force fast_builds on GitHub CI runs * feat: add make clean to contrib/depends and invoke it on CI to reduce SSH upload step time * fix: correct linux save path * revert: make clean * separate builds * enhance sshPublisher * fix: github CI: depracate GitHub cache, fix DEPENDS_UNTRUSTED_FAST_BUILDS * fix: sha256sum logic * chore: refactor github actions and Jenkinsfile to only execute when required * ci: update ci to 15 and xcode to 16.4 * ci: cleanup builddir before starting --- .github/workflows/full_check.yaml | 488 +++++++----------- build_single.sh | 2 +- contrib/depends/Jenkinsfile | 208 ++++++++ contrib/depends/Makefile | 50 +- contrib/depends/funcs.mk | 154 +++++- .../monero.dart/lib/src/checksum_monero.dart | 2 +- impls/monero.ts/checksum_monero.ts | 2 +- .../src/main/cpp/monero_checksum.h | 2 +- 8 files changed, 588 insertions(+), 320 deletions(-) create mode 100644 contrib/depends/Jenkinsfile diff --git a/.github/workflows/full_check.yaml b/.github/workflows/full_check.yaml index 8f54c8a..bca32d6 100644 --- a/.github/workflows/full_check.yaml +++ b/.github/workflows/full_check.yaml @@ -7,6 +7,9 @@ jobs: lib_mingw: strategy: fail-fast: false + matrix: + coin: [monero, wownero] + target: [x86_64-w64-mingw32, i686-w64-mingw32] runs-on: ubuntu-latest container: image: ubuntu:24.04 @@ -30,32 +33,16 @@ jobs: - name: ccache uses: hendrikmuhs/ccache-action@v1.2 with: - key: ${{ github.job }} - - name: Cache built - if: ${{ !startsWith(github.ref, 'refs/tags/v') }} - uses: actions/cache@v4 - with: - path: | - contrib/depends/built/* - key: depends-${{ github.job }}-${{ hashFiles('contrib/depends/packages/*.mk') }} - - name: x86_64-w64-mingw32 + key: ${{ github.job }}-${{ matrix.coin }}-${{ matrix.target }} + - name: Build ${{ matrix.coin }} for ${{ matrix.target }} run: | - ./build_single.sh monero x86_64-w64-mingw32 -j$(nproc) - ./build_single.sh wownero x86_64-w64-mingw32 -j$(nproc) - - name: i686-w64-mingw32 - run: | - ./build_single.sh monero i686-w64-mingw32 -j$(nproc) - ./build_single.sh wownero i686-w64-mingw32 -j$(nproc) + env DEPENDS_UNTRUSTED_FAST_BUILDS=forced ./build_single.sh ${{ matrix.coin }} ${{ matrix.target }} -j$(nproc) - name: rename artifacts run: | - mkdir release/gh/ - for i in release/monero/* + mkdir -p release/gh/ + for i in release/${{ matrix.coin }}/* do - cp "$i" "release/gh/monero_$(basename $i)" - done - for i in release/wownero/* - do - cp "$i" "release/gh/wownero_$(basename $i)" + cp "$i" "release/gh/${{ matrix.coin }}_$(basename $i)" done - name: Release uses: softprops/action-gh-release@v2 @@ -66,19 +53,16 @@ jobs: - name: Upload lib uses: actions/upload-artifact@v4 with: - name: mingw monero - path: release/monero - - name: Upload lib wownero - uses: actions/upload-artifact@v4 - with: - name: mingw wownero - path: release/wownero + name: mingw-${{ matrix.coin }}-${{ matrix.target }} + path: release/${{ matrix.coin }} + lib_android: strategy: fail-fast: false + matrix: + coin: [monero, wownero, zano] + target: [x86_64-linux-android, armv7a-linux-androideabi, aarch64-linux-android] runs-on: ubuntu-22.04 - # container: - # image: debian:bookworm steps: - name: Free Disk Space if: ${{ !startsWith(github.ref, 'refs/tags/v') }} @@ -110,43 +94,16 @@ jobs: - name: ccache uses: hendrikmuhs/ccache-action@v1.2 with: - key: ${{ github.job }} - - name: Cache built - if: ${{ !startsWith(github.ref, 'refs/tags/v') }} - uses: actions/cache@v4 - with: - path: | - contrib/depends/built/* - key: depends-${{ github.job }}-${{ hashFiles('contrib/depends/packages/*.mk') }} - - name: monero + key: ${{ github.job }}-${{ matrix.coin }}-${{ matrix.target }} + - name: Build ${{ matrix.coin }} for ${{ matrix.target }} run: | - ./build_single.sh monero x86_64-linux-android -j$(nproc) - ./build_single.sh monero armv7a-linux-androideabi -j$(nproc) - ./build_single.sh monero aarch64-linux-android -j$(nproc) - - name: wownero - run: | - ./build_single.sh wownero aarch64-linux-android -j$(nproc) - ./build_single.sh wownero x86_64-linux-android -j$(nproc) - ./build_single.sh wownero armv7a-linux-androideabi -j$(nproc) - - name: zano - run: | - ./build_single.sh zano x86_64-linux-android -j$(nproc) - ./build_single.sh zano aarch64-linux-android -j$(nproc) - ./build_single.sh zano armv7a-linux-androideabi -j$(nproc) + env DEPENDS_UNTRUSTED_FAST_BUILDS=forced ./build_single.sh ${{ matrix.coin }} ${{ matrix.target }} -j$(nproc) - name: rename artifacts run: | - mkdir release/gh/ - for i in release/monero/* + mkdir -p release/gh/ + for i in release/${{ matrix.coin }}/* do - cp "$i" "release/gh/monero_$(basename $i)" - done - for i in release/wownero/* - do - cp "$i" "release/gh/wownero_$(basename $i)" - done - for i in release/zano/* - do - cp "$i" "release/gh/zano_$(basename $i)" + cp "$i" "release/gh/${{ matrix.coin }}_$(basename $i)" done - name: Release uses: softprops/action-gh-release@v2 @@ -154,28 +111,22 @@ jobs: with: files: release/gh/* token: ${{ secrets.CUSTOM_GITHUB_TOKEN }} - - name: Upload lib monero + - name: Upload lib uses: actions/upload-artifact@v4 with: - name: android monero - path: release/monero - - name: Upload lib wownero - uses: actions/upload-artifact@v4 - with: - name: android wownero - path: release/wownero - - name: Upload lib zano - uses: actions/upload-artifact@v4 - with: - name: android zano - path: release/zano + name: android-${{ matrix.coin }}-${{ matrix.target }} + path: release/${{ matrix.coin }} - name: remove android_ndk run: | rm -rf contrib/depends/built/*/android_ndk rm -rf contrib/depends/sources/android-ndk-r26d-linux.zip + lib_linux: strategy: fail-fast: false + matrix: + coin: [monero, wownero, zano] + target: [x86_64-linux-gnu, aarch64-linux-gnu, i686-linux-gnu] runs-on: ubuntu-latest container: image: debian:bullseye @@ -199,43 +150,16 @@ jobs: - name: ccache uses: hendrikmuhs/ccache-action@v1.2 with: - key: ${{ github.job }} - - name: Cache built - if: ${{ !startsWith(github.ref, 'refs/tags/v') }} - uses: actions/cache@v4 - with: - path: | - contrib/depends/built/* - key: depends-${{ github.job }}-${{ hashFiles('contrib/depends/packages/*.mk') }} - - name: x86_64-linux-gnu + key: ${{ github.job }}-${{ matrix.coin }}-${{ matrix.target }} + - name: Build ${{ matrix.coin }} for ${{ matrix.target }} run: | - ./build_single.sh monero x86_64-linux-gnu -j$(nproc) - ./build_single.sh wownero x86_64-linux-gnu -j$(nproc) - ./build_single.sh zano x86_64-linux-gnu -j$(nproc) - - name: aarch64-linux-gnu - run: | - ./build_single.sh monero aarch64-linux-gnu -j$(nproc) - ./build_single.sh wownero aarch64-linux-gnu -j$(nproc) - ./build_single.sh zano aarch64-linux-gnu -j$(nproc) - - name: i686-linux-gnu - run: | - ./build_single.sh monero i686-linux-gnu -j$(nproc) - ./build_single.sh wownero i686-linux-gnu -j$(nproc) - ./build_single.sh zano i686-linux-gnu -j$(nproc) + env DEPENDS_UNTRUSTED_FAST_BUILDS=forced ./build_single.sh ${{ matrix.coin }} ${{ matrix.target }} -j$(nproc) - name: rename artifacts run: | - mkdir release/gh/ - for i in release/monero/* + mkdir -p release/gh/ + for i in release/${{ matrix.coin }}/* do - cp "$i" "release/gh/monero_$(basename $i)" - done - for i in release/wownero/* - do - cp "$i" "release/gh/wownero_$(basename $i)" - done - for i in release/zano/* - do - cp "$i" "release/gh/zano_$(basename $i)" + cp "$i" "release/gh/${{ matrix.coin }}_$(basename $i)" done - name: Release uses: softprops/action-gh-release@v2 @@ -246,23 +170,17 @@ jobs: - name: Upload lib uses: actions/upload-artifact@v4 with: - name: linux monero - path: release/monero - - name: Upload lib wownero - uses: actions/upload-artifact@v4 - with: - name: linux wownero - path: release/wownero - - name: Upload lib zano - uses: actions/upload-artifact@v4 - with: - name: linux zano - path: release/zano + name: linux-${{ matrix.coin }}-${{ matrix.target }} + path: release/${{ matrix.coin }} + lib_macos: strategy: fail-fast: false + matrix: + coin: [monero, wownero, zano] + target: [aarch64-apple-darwin, x86_64-apple-darwin] name: macos build - runs-on: macos-14 + runs-on: macos-15 steps: - name: Checkout monero_c repo uses: actions/checkout@v4 @@ -272,7 +190,7 @@ jobs: submodules: recursive - uses: maxim-lobanov/setup-xcode@v1 with: - xcode-version: '16.2' + xcode-version: '16.4' - name: install dependencies run: | brew install ccache binutils pigz autoconf automake libtool pkg-config @@ -287,38 +205,16 @@ jobs: - name: ccache uses: hendrikmuhs/ccache-action@v1.2 with: - key: ${{ github.job }} - - name: Cache built - if: ${{ !startsWith(github.ref, 'refs/tags/v') }} - uses: actions/cache@v4 - with: - path: | - contrib/depends/built/* - key: depends-${{ github.job }}-${{ hashFiles('contrib/depends/packages/*.mk') }} - - name: build (aarch64-apple-darwin) + key: ${{ github.job }}-${{ matrix.coin }}-${{ matrix.target }} + - name: Build ${{ matrix.coin }} for ${{ matrix.target }} run: | - ./build_single.sh monero aarch64-apple-darwin -j$(sysctl -n hw.logicalcpu) - ./build_single.sh wownero aarch64-apple-darwin -j$(sysctl -n hw.logicalcpu) - ./build_single.sh zano aarch64-apple-darwin -j$(sysctl -n hw.logicalcpu) - - name: build (x86_64-apple-darwin) - run: | - ./build_single.sh monero x86_64-apple-darwin -j$(sysctl -n hw.logicalcpu) - ./build_single.sh wownero x86_64-apple-darwin -j$(sysctl -n hw.logicalcpu) - ./build_single.sh zano x86_64-apple-darwin -j$(sysctl -n hw.logicalcpu) + env DEPENDS_UNTRUSTED_FAST_BUILDS=forced ./build_single.sh ${{ matrix.coin }} ${{ matrix.target }} -j$(sysctl -n hw.logicalcpu) - name: rename artifacts run: | - mkdir release/gh/ - for i in release/monero/* + mkdir -p release/gh/ + for i in release/${{ matrix.coin }}/* do - cp "$i" "release/gh/monero_$(basename $i)" - done - for i in release/wownero/* - do - cp "$i" "release/gh/wownero_$(basename $i)" - done - for i in release/zano/* - do - cp "$i" "release/gh/zano_$(basename $i)" + cp "$i" "release/gh/${{ matrix.coin }}_$(basename $i)" done - name: Release uses: softprops/action-gh-release@v2 @@ -329,21 +225,15 @@ jobs: - name: Upload lib uses: actions/upload-artifact@v4 with: - name: macos monero - path: release/monero - - name: Upload lib wownero - uses: actions/upload-artifact@v4 - with: - name: macos wownero - path: release/wownero - - name: Upload lib zano - uses: actions/upload-artifact@v4 - with: - name: macos zano - path: release/zano + name: macos-${{ matrix.coin }}-${{ matrix.target }} + path: release/${{ matrix.coin }} + lib_ios: strategy: fail-fast: false + matrix: + coin: [monero, wownero, zano] + target: [aarch64-apple-ios, aarch64-apple-iossimulator] name: ios build runs-on: macos-15 steps: @@ -355,7 +245,7 @@ jobs: submodules: recursive - uses: maxim-lobanov/setup-xcode@v1 with: - xcode-version: '16.2' + xcode-version: '16.4' - name: install dependencies run: | brew install ccache cmake autoconf automake libtool @@ -370,40 +260,16 @@ jobs: - name: ccache uses: hendrikmuhs/ccache-action@v1.2 with: - key: ${{ github.job }} - - name: Cache built - if: ${{ !startsWith(github.ref, 'refs/tags/v') }} - uses: actions/cache@v4 - with: - path: | - contrib/depends/built/* - key: depends-${{ github.job }}-${{ hashFiles('contrib/depends/packages/*.mk') }} - - name: build (aarch64-apple-ios) + key: ${{ github.job }}-${{ matrix.coin }}-${{ matrix.target }} + - name: Build ${{ matrix.coin }} for ${{ matrix.target }} run: | - ./build_single.sh monero aarch64-apple-ios -j$(sysctl -n hw.logicalcpu) - ./build_single.sh wownero aarch64-apple-ios -j$(sysctl -n hw.logicalcpu) - ./build_single.sh zano aarch64-apple-ios -j$(sysctl -n hw.logicalcpu) - - - name: build (aarch64-apple-iossimulator) - run: | - ./build_single.sh monero aarch64-apple-iossimulator -j$(sysctl -n hw.logicalcpu) - ./build_single.sh wownero aarch64-apple-iossimulator -j$(sysctl -n hw.logicalcpu) - ./build_single.sh zano aarch64-apple-iossimulator -j$(sysctl -n hw.logicalcpu) - + env DEPENDS_UNTRUSTED_FAST_BUILDS=forced ./build_single.sh ${{ matrix.coin }} ${{ matrix.target }} -j$(sysctl -n hw.logicalcpu) - name: rename artifacts run: | - mkdir release/gh/ - for i in release/monero/* + mkdir -p release/gh/ + for i in release/${{ matrix.coin }}/* do - cp "$i" "release/gh/monero_$(basename $i)" - done - for i in release/wownero/* - do - cp "$i" "release/gh/wownero_$(basename $i)" - done - for i in release/zano/* - do - cp "$i" "release/gh/zano_$(basename $i)" + cp "$i" "release/gh/${{ matrix.coin }}_$(basename $i)" done - name: Release uses: softprops/action-gh-release@v2 @@ -414,100 +280,123 @@ jobs: - name: Upload lib uses: actions/upload-artifact@v4 with: - name: ios monero - path: release/monero - - name: Upload lib wownero - uses: actions/upload-artifact@v4 - with: - name: ios wownero - path: release/wownero - - name: Upload lib zano - uses: actions/upload-artifact@v4 - with: - name: ios zano - path: release/zano + name: ios-${{ matrix.coin }}-${{ matrix.target }} + path: release/${{ matrix.coin }} + bulk_lib_release: name: create single release file runs-on: ubuntu-latest - needs: [ - lib_mingw, lib_android, lib_linux, lib_macos, lib_ios - ] + needs: [lib_mingw, lib_android, lib_linux, lib_macos, lib_ios] + strategy: + matrix: + coin: [monero, wownero, zano] + platform: [android, ios, linux, macos] + include: + - coin: monero + platform: mingw + - coin: wownero + platform: mingw steps: - - uses: actions/download-artifact@v4 + - name: Create release directory + run: mkdir -p release/${{ matrix.coin }} + + - name: Download Android artifacts + if: matrix.platform == 'android' + uses: actions/download-artifact@v4 with: - name: android monero - path: release/monero - - uses: actions/download-artifact@v4 + pattern: android-${{ matrix.coin }}-* + path: temp-android + merge-multiple: true + + - name: Download iOS artifacts + if: matrix.platform == 'ios' + uses: actions/download-artifact@v4 with: - name: android wownero - path: release/wownero - - uses: actions/download-artifact@v4 + pattern: ios-${{ matrix.coin }}-* + path: temp-ios + merge-multiple: true + + - name: Download Linux artifacts + if: matrix.platform == 'linux' + uses: actions/download-artifact@v4 with: - name: android zano - path: release/zano - - uses: actions/download-artifact@v4 + pattern: linux-${{ matrix.coin }}-* + path: temp-linux + merge-multiple: true + + - name: Download macOS artifacts + if: matrix.platform == 'macos' + uses: actions/download-artifact@v4 with: - name: ios monero - path: release/monero - - uses: actions/download-artifact@v4 + pattern: macos-${{ matrix.coin }}-* + path: temp-macos + merge-multiple: true + + - name: Download MinGW artifacts + if: matrix.platform == 'mingw' && (matrix.coin == 'monero' || matrix.coin == 'wownero') + uses: actions/download-artifact@v4 with: - name: ios wownero - path: release/wownero - - uses: actions/download-artifact@v4 + pattern: mingw-${{ matrix.coin }}-* + path: temp-mingw + merge-multiple: true + + - name: Copy artifacts to release directory + run: | + if [ -d "temp-${{ matrix.platform }}" ]; then + cp -r temp-${{ matrix.platform }}/* release/${{ matrix.coin }}/ + fi + + - name: Upload consolidated artifacts + uses: actions/upload-artifact@v4 with: - name: ios zano - path: release/zano - - uses: actions/download-artifact@v4 + name: ${{ matrix.platform }}-${{ matrix.coin }}-all + path: release/${{ matrix.coin }} + + final_bulk_release: + name: create final release bundle + runs-on: ubuntu-latest + needs: [bulk_lib_release] + steps: + - name: Create release directory + run: mkdir -p release/{monero,wownero,zano} + + - name: Download all consolidated artifacts + uses: actions/download-artifact@v4 with: - name: linux monero - path: release/monero - - uses: actions/download-artifact@v4 - with: - name: linux wownero - path: release/wownero - - uses: actions/download-artifact@v4 - with: - name: linux zano - path: release/zano - - uses: actions/download-artifact@v4 - with: - name: macos monero - path: release/monero - - uses: actions/download-artifact@v4 - with: - name: macos wownero - path: release/wownero - - uses: actions/download-artifact@v4 - with: - name: macos zano - path: release/zano - - uses: actions/download-artifact@v4 - with: - name: mingw monero - path: release/monero - - uses: actions/download-artifact@v4 - with: - name: mingw wownero - path: release/wownero + pattern: "*-all" + path: temp-all + + - name: Reorganize artifacts + run: | + # Move all artifacts to their respective coin directories + for coin in monero wownero zano; do + find temp-all -name "*-${coin}-all" -type d | while read dir; do + if [ -d "$dir" ]; then + cp -r "$dir"/* "release/${coin}/" 2>/dev/null || true + fi + done + done + - name: zip release dir run: zip -r release-bundle.zip release + - name: Release uses: softprops/action-gh-release@v2 if: startsWith(github.ref, 'refs/tags/') with: files: release-bundle.zip token: ${{ secrets.CUSTOM_GITHUB_TOKEN }} - - name: Upload lib + + - name: Upload final bundle uses: actions/upload-artifact@v4 with: name: release-bulk path: release + deno_monerots_test_linux: name: test ts library runs-on: ubuntu-24.04 - needs: [ - lib_linux - ] + needs: [lib_linux] steps: - uses: actions/checkout@v4 with: @@ -515,10 +404,13 @@ jobs: submodules: recursive - uses: actions/download-artifact@v4 with: - name: linux monero - path: release/monero + pattern: linux-monero-x86_64-linux-gnu + path: temp-linux-monero + merge-multiple: true - name: unpack and move monero_c run: | + mkdir -p release/monero + cp -r temp-linux-monero/* release/monero/ unxz -f -k release/*/*.xz - uses: denoland/setup-deno@v1 with: @@ -542,9 +434,7 @@ jobs: fail-fast: false matrix: coin: [monero, wownero] - needs: [ - lib_linux - ] + needs: [lib_linux] runs-on: ubuntu-24.04 steps: - uses: denoland/setup-deno@v2 @@ -558,8 +448,14 @@ jobs: - uses: actions/download-artifact@v4 with: - name: linux ${{ matrix.coin }} - path: release/${{ matrix.coin }} + pattern: linux-${{ matrix.coin }}-* + path: temp-linux-${{ matrix.coin }} + merge-multiple: true + + - name: Setup release directory + run: | + mkdir -p release/${{ matrix.coin }} + cp -r temp-linux-${{ matrix.coin }}/* release/${{ matrix.coin }}/ - name: Run regression tests run: COIN="${{ matrix.coin }}" deno test -A tests/regression.test.ts @@ -569,10 +465,8 @@ jobs: strategy: matrix: coin: [monero, wownero] - needs: [ - lib_macos - ] - runs-on: macos-14 + needs: [lib_macos] + runs-on: macos-15 steps: - uses: denoland/setup-deno@v2 with: @@ -585,8 +479,14 @@ jobs: - uses: actions/download-artifact@v4 with: - name: macos ${{ matrix.coin }} - path: release/${{ matrix.coin }} + pattern: macos-${{ matrix.coin }}-* + path: temp-macos-${{ matrix.coin }} + merge-multiple: true + + - name: Setup release directory + run: | + mkdir -p release/${{ matrix.coin }} + cp -r temp-macos-${{ matrix.coin }}/* release/${{ matrix.coin }}/ - name: Run regression tests run: COIN="${{ matrix.coin }}" deno test -A tests/regression.test.ts @@ -596,9 +496,7 @@ jobs: strategy: matrix: coin: [monero, wownero] - needs: [ - lib_linux - ] + needs: [lib_linux] runs-on: ubuntu-24.04 steps: - uses: denoland/setup-deno@v2 @@ -612,8 +510,14 @@ jobs: - uses: actions/download-artifact@v4 with: - name: linux ${{ matrix.coin }} - path: release/${{ matrix.coin }} + pattern: linux-${{ matrix.coin }}-* + path: temp-linux-${{ matrix.coin }} + merge-multiple: true + + - name: Setup release directory + run: | + mkdir -p release/${{ matrix.coin }} + cp -r temp-linux-${{ matrix.coin }}/* release/${{ matrix.coin }}/ - name: Run integration tests run: COIN="${{ matrix.coin }}" deno test -A tests/integration.test.ts @@ -622,16 +526,13 @@ jobs: SECRET_WALLET_MNEMONIC: ${{ secrets.SECRET_WALLET_MNEMONIC }} SECRET_WALLET_RESTORE_HEIGHT: ${{ secrets.SECRET_WALLET_RESTORE_HEIGHT }} - integration_tests_macos: name: macos integration tests strategy: matrix: coin: [monero, wownero] - needs: [ - lib_macos - ] - runs-on: macos-14 + needs: [lib_macos] + runs-on: macos-15 steps: - uses: denoland/setup-deno@v2 with: @@ -644,8 +545,14 @@ jobs: - uses: actions/download-artifact@v4 with: - name: macos ${{ matrix.coin }} - path: release/${{ matrix.coin }} + pattern: macos-${{ matrix.coin }}-* + path: temp-macos-${{ matrix.coin }} + merge-multiple: true + + - name: Setup release directory + run: | + mkdir -p release/${{ matrix.coin }} + cp -r temp-macos-${{ matrix.coin }}/* release/${{ matrix.coin }}/ - name: Run integration tests run: COIN="${{ matrix.coin }}" deno test -A tests/integration.test.ts @@ -654,13 +561,10 @@ jobs: SECRET_WALLET_MNEMONIC: ${{ secrets.SECRET_WALLET_MNEMONIC }} SECRET_WALLET_RESTORE_HEIGHT: ${{ secrets.SECRET_WALLET_RESTORE_HEIGHT }} - comment_pr: name: comment on pr runs-on: ubuntu-latest - needs: [ - lib_mingw, lib_android, lib_linux, lib_macos, lib_ios, - ] + needs: [lib_mingw, lib_android, lib_linux, lib_macos, lib_ios] steps: - uses: actions/github-script@v7 continue-on-error: true diff --git a/build_single.sh b/build_single.sh index 9e5545f..f1bff2f 100755 --- a/build_single.sh +++ b/build_single.sh @@ -59,7 +59,7 @@ pushd contrib/depends then echo "Not building depends, directory exists" else - env -i PATH="$PATH" CC=gcc CXX=g++ make "$NPROC" HOST="$HOST_ABI" + env -i PATH="$PATH" CC=gcc CXX=g++ make "$NPROC" HOST="$HOST_ABI" DEPENDS_UNTRUSTED_FAST_BUILDS=$DEPENDS_UNTRUSTED_FAST_BUILDS fi popd diff --git a/contrib/depends/Jenkinsfile b/contrib/depends/Jenkinsfile new file mode 100644 index 0000000..5f364ac --- /dev/null +++ b/contrib/depends/Jenkinsfile @@ -0,0 +1,208 @@ +pipeline { + agent none + + parameters { + string( + name: 'LINUX_TARGETS', + defaultValue: 'x86_64-linux-gnu,aarch64-linux-gnu,i686-linux-gnu', + description: 'Comma-separated list of Linux targets to build' + ) + string( + name: 'ANDROID_TARGETS', + defaultValue: 'x86_64-linux-android,armv7a-linux-androideabi,aarch64-linux-android', + description: 'Comma-separated list of Android targets to build' + ) + string( + name: 'MINGW_TARGETS', + defaultValue: 'x86_64-w64-mingw32,i686-w64-mingw32', + description: 'Comma-separated list of MinGW targets to build' + ) + string( + name: 'DARWIN_TARGETS', + defaultValue: 'aarch64-apple-darwin,x86_64-apple-darwin,aarch64-apple-ios,aarch64-apple-iossimulator', + description: 'Comma-separated list of Darwin targets to build' + ) + } + + stages { + stage('Check Changes') { + agent any + steps { + script { + def changes = sh( + script: "git diff --name-only HEAD~1 HEAD | grep '^contrib/depends' || echo 'NO_CHANGES'", + returnStdout: true + ).trim() + + if (changes == 'NO_CHANGES') { + echo "No changes detected in contrib/depends directory. Skipping build." + currentBuild.result = 'NOT_BUILT' + return + } else { + echo "Changes detected in contrib/depends directory:" + echo changes + } + } + } + } + + stage('Build Dependencies') { + when { + not { + equals expected: 'NOT_BUILT', actual: currentBuild.result + } + } + parallel { + stage('Linux Builds') { + agent { + dockerfile { + filename '.devcontainer/Dockerfile' + args '-v /opt/builds:/opt/builds' + label 'linux && amd64' + } + } + steps { + script { + def targets = params.LINUX_TARGETS.split(',').collect { it.trim() } + + checkout scm + + for (target in targets) { + echo "Building Linux dependencies for ${target}" + + dir('contrib/depends') { + sh "rm -rf built/${target}/*" + sh "make HOST=${target} DEPENDS_UNTRUSTED_FAST_BUILDS=yes" + } + } + } + } + post { + always { + script { + def targets = params.LINUX_TARGETS.split(',').collect { it.trim() } + for (target in targets) { + // archiveArtifacts artifacts: "contrib/depends/built/${target}/*/*.tar.gz*", allowEmptyArchive: true + sshPublisher(publishers: [sshPublisherDesc(configName: 'static.mrcyjanek.net', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'depends', remoteDirectorySDF: false, sourceFiles: "contrib/depends/built/${target}/*/*.tar.gz*")], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) + } + } + } + } + } + + stage('Android Builds') { + agent { + dockerfile { + filename '.devcontainer/Dockerfile' + args '-v /opt/builds:/opt/builds' + label 'linux && amd64' + } + } + steps { + script { + def targets = params.ANDROID_TARGETS.split(',').collect { it.trim() } + + checkout scm + + for (target in targets) { + echo "Building Android dependencies for ${target}" + + dir('contrib/depends') { + sh "rm -rf built/${target}/*" + sh "make HOST=${target} DEPENDS_UNTRUSTED_FAST_BUILDS=yes" + } + } + } + } + post { + always { + script { + def targets = params.ANDROID_TARGETS.split(',').collect { it.trim() } + for (target in targets) { + // archiveArtifacts artifacts: "contrib/depends/built/${target}/*/*.tar.gz*", allowEmptyArchive: true + sshPublisher(publishers: [sshPublisherDesc(configName: 'static.mrcyjanek.net', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'depends', remoteDirectorySDF: false, sourceFiles: "contrib/depends/built/${target}/*/*.tar.gz*")], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) + } + } + } + } + } + + stage('MinGW Builds') { + agent { + dockerfile { + filename '.devcontainer/Dockerfile' + args '-v /opt/builds:/opt/builds' + label 'linux && amd64' + } + } + steps { + script { + def targets = params.MINGW_TARGETS.split(',').collect { it.trim() } + + checkout scm + + for (target in targets) { + echo "Building MinGW dependencies for ${target}" + + dir('contrib/depends') { + sh "rm -rf built/${target}/*" + sh "make HOST=${target} DEPENDS_UNTRUSTED_FAST_BUILDS=yes" + } + } + } + } + post { + always { + script { + def targets = params.MINGW_TARGETS.split(',').collect { it.trim() } + for (target in targets) { + // archiveArtifacts artifacts: "contrib/depends/built/${target}/*/*.tar.gz*", allowEmptyArchive: true + sshPublisher(publishers: [sshPublisherDesc(configName: 'static.mrcyjanek.net', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'depends', remoteDirectorySDF: false, sourceFiles: "contrib/depends/built/${target}/*/*.tar.gz*")], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) + } + } + } + } + } + + stage('Darwin Builds') { + agent { + label 'darwin && arm64' + } + steps { + script { + def targets = params.DARWIN_TARGETS.split(',').collect { it.trim() } + + checkout scm + + for (target in targets) { + echo "Building dependencies for ${target}" + + dir('contrib/depends') { + sh "rm -rf built/${target}/*" + sh "make HOST=${target} DEPENDS_UNTRUSTED_FAST_BUILDS=yes" + } + } + } + } + post { + always { + script { + def targets = params.DARWIN_TARGETS.split(',').collect { it.trim() } + for (target in targets) { + // archiveArtifacts artifacts: "contrib/depends/built/${target}/*/*.tar.gz*", allowEmptyArchive: true + sshPublisher(publishers: [sshPublisherDesc(configName: 'static.mrcyjanek.net', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'depends', remoteDirectorySDF: false, sourceFiles: "contrib/depends/built/${target}/*/*.tar.gz*")], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) + } + } + } + } + } + } + } + } + + post { + always { + echo "Build completed." + } + } +} \ No newline at end of file diff --git a/contrib/depends/Makefile b/contrib/depends/Makefile index dd357c8..7e9f0f4 100644 --- a/contrib/depends/Makefile +++ b/contrib/depends/Makefile @@ -13,6 +13,17 @@ DOWNLOAD_CONNECT_TIMEOUT:=30 DOWNLOAD_RETRIES:=5 HOST_ID_SALT ?= salt BUILD_ID_SALT ?= salt + +DEPENDS_UNTRUSTED_FAST_BUILDS ?= +PREBUILT_BASE_URL ?= https://static.mrcyjanek.net/lfs/depends/contrib/depends/built +ifneq ($(DEPENDS_UNTRUSTED_FAST_BUILDS),) +ifneq ($(DEPENDS_UNTRUSTED_FAST_BUILDS),yes) +ifneq ($(DEPENDS_UNTRUSTED_FAST_BUILDS),forced) +$(error DEPENDS_UNTRUSTED_FAST_BUILDS must be empty, "yes", or "forced", got "$(DEPENDS_UNTRUSTED_FAST_BUILDS)") +endif +endif +endif + # Detect the number of CPU cores ifeq ($(shell uname), Darwin) NUM_CORES := $(shell sysctl -n hw.ncpu) @@ -110,19 +121,34 @@ include builders/$(build_os).mk include builders/default.mk include packages/packages.mk +# Legacy build ID strings (kept for debugging info) +build_id_string_legacy:=$(BUILD_ID_SALT) +build_id_string_legacy+=$(shell $(build_CC) --version 2>/dev/null) +build_id_string_legacy+=$(shell $(build_AR) --version 2>/dev/null) +build_id_string_legacy+=$(shell $(build_CXX) --version 2>/dev/null) +build_id_string_legacy+=$(shell $(build_RANLIB) --version 2>/dev/null) +build_id_string_legacy+=$(shell $(build_STRIP) --version 2>/dev/null) + +$(host_arch)_$(host_os)_id_string_legacy:=$(HOST_ID_SALT) +$(host_arch)_$(host_os)_id_string_legacy+=$(shell $(host_CC) --version 2>/dev/null) +$(host_arch)_$(host_os)_id_string_legacy+=$(shell $(host_AR) --version 2>/dev/null) +$(host_arch)_$(host_os)_id_string_legacy+=$(shell $(host_CXX) --version 2>/dev/null) +$(host_arch)_$(host_os)_id_string_legacy+=$(shell $(host_RANLIB) --version 2>/dev/null) +$(host_arch)_$(host_os)_id_string_legacy+=$(shell $(host_STRIP) --version 2>/dev/null) + build_id_string:=$(BUILD_ID_SALT) -build_id_string+=$(shell $(build_CC) --version 2>/dev/null) -build_id_string+=$(shell $(build_AR) --version 2>/dev/null) -build_id_string+=$(shell $(build_CXX) --version 2>/dev/null) -build_id_string+=$(shell $(build_RANLIB) --version 2>/dev/null) -build_id_string+=$(shell $(build_STRIP) --version 2>/dev/null) +build_id_string+=$(shell basename $(build_CC) 2>/dev/null || echo "unknown") +build_id_string+=$(shell basename $(build_AR) 2>/dev/null || echo "unknown") +build_id_string+=$(shell basename $(build_CXX) 2>/dev/null || echo "unknown") +build_id_string+=$(shell basename $(build_RANLIB) 2>/dev/null || echo "unknown") +build_id_string+=$(shell basename $(build_STRIP) 2>/dev/null || echo "unknown") $(host_arch)_$(host_os)_id_string:=$(HOST_ID_SALT) -$(host_arch)_$(host_os)_id_string+=$(shell $(host_CC) --version 2>/dev/null) -$(host_arch)_$(host_os)_id_string+=$(shell $(host_AR) --version 2>/dev/null) -$(host_arch)_$(host_os)_id_string+=$(shell $(host_CXX) --version 2>/dev/null) -$(host_arch)_$(host_os)_id_string+=$(shell $(host_RANLIB) --version 2>/dev/null) -$(host_arch)_$(host_os)_id_string+=$(shell $(host_STRIP) --version 2>/dev/null) +$(host_arch)_$(host_os)_id_string+=$(shell basename $(host_CC) 2>/dev/null || echo "unknown") +$(host_arch)_$(host_os)_id_string+=$(shell basename $(host_AR) 2>/dev/null || echo "unknown") +$(host_arch)_$(host_os)_id_string+=$(shell basename $(host_CXX) 2>/dev/null || echo "unknown") +$(host_arch)_$(host_os)_id_string+=$(shell basename $(host_RANLIB) 2>/dev/null || echo "unknown") +$(host_arch)_$(host_os)_id_string+=$(shell basename $(host_STRIP) 2>/dev/null || echo "unknown") packages += $($(host_arch)_$(host_os)_packages) $($(host_os)_packages) native_packages += $($(host_arch)_$(host_os)_native_packages) $($(host_os)_native_packages) @@ -204,8 +230,8 @@ $(host_prefix)/share/toolchain.cmake : toolchain.cmake.in $(host_prefix)/.stamp_ define check_or_remove_cached mkdir -p $(BASE_CACHE)/$(host)/$(package) && cd $(BASE_CACHE)/$(host)/$(package); \ $(build_SHA256SUM) -c $($(package)_cached_checksum) >/dev/null 2>/dev/null || \ - ( rm -f $($(package)_cached_checksum); \ - if test -f "$($(package)_cached)"; then echo "Checksum mismatch for $(package). Forcing rebuild.."; rm -f $($(package)_cached_checksum) $($(package)_cached); fi ) + ( rm -f $($(package)_cached_checksum) $($(package)_cached_buildinfo); \ + if test -f "$($(package)_cached)"; then echo "Checksum mismatch for $(package). Forcing rebuild.."; rm -f $($(package)_cached_checksum) $($(package)_cached) $($(package)_cached_buildinfo); fi ) endef define check_or_remove_sources diff --git a/contrib/depends/funcs.mk b/contrib/depends/funcs.mk index 70b592f..757c941 100644 --- a/contrib/depends/funcs.mk +++ b/contrib/depends/funcs.mk @@ -36,7 +36,7 @@ define fetch_file endef define int_get_build_recipe_hash -$(eval $(1)_all_file_checksums:=$(shell $(build_SHA256SUM) $(meta_depends) packages/$(1).mk $(addprefix $(PATCHES_PATH)/$(1)/,$($(1)_patches)) | cut -d" " -f1)) +$(eval $(1)_all_file_checksums:=$(shell cd $(BASEDIR) && $(build_SHA256SUM) $(subst $(BASEDIR)/,,$(meta_depends)) packages/$(1).mk $(addprefix patches/$(1)/,$($(1)_patches)) 2>/dev/null | cut -d" " -f1)) $(eval $(1)_recipe_hash:=$(shell echo -n "$($(1)_all_file_checksums)" | $(build_SHA256SUM) | cut -d" " -f1)) endef @@ -46,6 +46,8 @@ $(eval $(1)_all_dependencies:=$(call int_get_all_dependencies,$(1),$($($(1)_type $(foreach dep,$($(1)_all_dependencies),$(eval $(1)_build_id_deps+=$(dep)-$($(dep)_version)-$($(dep)_recipe_hash))) $(eval $(1)_build_id_long:=$(1)-$($(1)_version)-$($(1)_recipe_hash)-$(release_type) $($(1)_build_id_deps) $($($(1)_type)_id_string)) $(eval $(1)_build_id:=$(shell echo -n "$($(1)_build_id_long)" | $(build_SHA256SUM) | cut -c-$(HASH_LENGTH))) +$(eval $(1)_build_id_long_legacy:=$(1)-$($(1)_version)-$($(1)_recipe_hash)-$(release_type) $($(1)_build_id_deps) $($($(1)_type)_id_string_legacy)) +$(eval $(1)_build_id_legacy:=$(shell echo -n "$($(1)_build_id_long_legacy)" | $(build_SHA256SUM) | cut -c-$(HASH_LENGTH))) final_build_id_long+=$($(package)_build_id_long) #compute package-specific paths @@ -59,10 +61,14 @@ $(1)_extract_dir:=$(base_build_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id $(1)_download_dir:=$(base_download_dir)/$(1)-$($(1)_version) $(1)_build_dir:=$$($(1)_extract_dir)/$$($(1)_build_subdir) $(1)_cached_checksum:=$(BASE_CACHE)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz.hash +$(1)_cached_buildinfo:=$(BASE_CACHE)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz.txt $(1)_patch_dir:=$(base_build_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id)/.patches-$($(1)_build_id) $(1)_prefixbin:=$($($(1)_type)_prefix)/bin/ $(1)_cached:=$(BASE_CACHE)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz $(1)_all_sources=$($(1)_file_name) $($(1)_extra_sources) +$(1)_prebuilt_url:=$(PREBUILT_BASE_URL)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz +$(1)_prebuilt_checksum_url:=$(PREBUILT_BASE_URL)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz.hash +$(1)_prebuilt_buildinfo_url:=$(PREBUILT_BASE_URL)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz.txt #stamps $(1)_fetched=$(SOURCES_PATH)/download-stamps/.stamp_fetched-$(1)-$($(1)_file_name).hash @@ -73,6 +79,8 @@ $(1)_built=$$($(1)_build_dir)/.stamp_built $(1)_configured=$$($(1)_build_dir)/.stamp_configured $(1)_staged=$$($(1)_staging_dir)/.stamp_staged $(1)_postprocessed=$$($(1)_staging_prefix_dir)/.stamp_postprocessed +$(1)_prebuilt_downloaded:=$(BASE_CACHE)/$(host)/$(1)/.stamp_prebuilt_downloaded-$($(1)_build_id) +$(1)_cached_or_prebuilt:=$(BASE_CACHE)/$(host)/$(1)/.stamp_cached_or_prebuilt-$($(1)_build_id) $(1)_download_path_fixed=$(subst :,\:,$$($(1)_download_path)) @@ -198,61 +206,183 @@ COMPRESS_CMD := $(shell if command -v pigz >/dev/null 2>&1; then echo "pigz"; el define int_add_cmds $($(1)_fetched): + $(AT)echo "=== Fetching $(1) v$($(1)_version) ===" + $(AT)echo " Source directory: $($(1)_source_dir)" + $(AT)echo " Download file: $($(1)_download_file)" $(AT)mkdir -p $$(@D) $(SOURCES_PATH) $(AT)rm -f $$@ $(AT)touch $$@ $(AT)cd $$(@D); $(call $(1)_fetch_cmds,$(1)) $(AT)cd $($(1)_source_dir); $(foreach source,$($(1)_all_sources),$(build_SHA256SUM) $(source) >> $$(@);) + $(AT)echo " Fetch completed: $$@" $(AT)touch $$@ $($(1)_extracted): | $($(1)_fetched) - $(AT)echo Extracting $(1)... + $(AT)echo "=== Extracting $(1) v$($(1)_version) ===" + $(AT)echo " Build ID: $($(1)_build_id)" + $(AT)echo " Extract directory: $($(1)_extract_dir)" $(AT)mkdir -p $$(@D) $(AT)cd $$(@D); $(call $(1)_extract_cmds,$(1)) + $(AT)echo " Extract completed: $$@" $(AT)touch $$@ $($(1)_preprocessed): | $($(1)_dependencies) $($(1)_extracted) - $(AT)echo Preprocessing $(1)... + $(AT)echo "=== Preprocessing $(1) v$($(1)_version) ===" + $(AT)echo " Dependencies: $($(1)_dependencies)" + $(AT)echo " Patch directory: $($(1)_patch_dir)" + $(AT)echo " Patches: $($(1)_patches)" $(AT)mkdir -p $$(@D) $($(1)_patch_dir) $(AT)$(foreach patch,$($(1)_patches),cd $(PATCHES_PATH)/$(1); cp $(patch) $($(1)_patch_dir) ;) $(AT)cd $$(@D); $(call $(1)_preprocess_cmds, $(1)) + $(AT)echo " Preprocessing completed: $$@" $(AT)touch $$@ $($(1)_configured): | $($(1)_preprocessed) - $(AT)echo Configuring $(1)... + $(AT)echo "=== Configuring $(1) v$($(1)_version) ===" + $(AT)echo " Build directory: $($(1)_build_dir)" + $(AT)echo " Host prefix: $(host_prefix)" + $(AT)echo " All dependencies: $($(1)_all_dependencies)" $(AT)rm -rf $(host_prefix); mkdir -p $(host_prefix)/lib; cd $(host_prefix); $(foreach package,$($(1)_all_dependencies), tar xf $($(package)_cached); ) $(AT)mkdir -p $$(@D) $(AT)+cd $$(@D); $($(1)_config_env) $(call $(1)_config_cmds, $(1)) + $(AT)echo " Configuration completed: $$@" $(AT)touch $$@ $($(1)_built): | $($(1)_configured) - $(AT)echo Building $(1)... + $(AT)echo "=== Building $(1) v$($(1)_version) ===" + $(AT)echo " Build directory: $($(1)_build_dir)" + $(AT)echo " Build environment: $($(1)_build_env)" $(AT)mkdir -p $$(@D) $(AT)+cd $$(@D); $($(1)_build_env) $(call $(1)_build_cmds, $(1)) + $(AT)echo " Build completed: $$@" $(AT)touch $$@ $($(1)_staged): | $($(1)_built) - $(AT)echo Staging $(1)... + $(AT)echo "=== Staging $(1) v$($(1)_version) ===" + $(AT)echo " Staging directory: $($(1)_staging_dir)" + $(AT)echo " Staging prefix: $($(1)_staging_prefix_dir)" $(AT)mkdir -p $($(1)_staging_dir)/$(host_prefix) $(AT)cd $($(1)_build_dir); $($(1)_stage_env) $(call $(1)_stage_cmds, $(1)) + $(AT)echo " Removing extract directory: $($(1)_extract_dir)" $(AT)rm -rf $($(1)_extract_dir) + $(AT)echo " Staging completed: $$@" $(AT)touch $$@ $($(1)_postprocessed): | $($(1)_staged) - $(AT)echo Postprocessing $(1)... + $(AT)echo "=== Postprocessing $(1) v$($(1)_version) ===" + $(AT)echo " Postprocessing directory: $($(1)_staging_prefix_dir)" $(AT)cd $($(1)_staging_prefix_dir); $(call $(1)_postprocess_cmds) + $(AT)echo " Postprocessing completed: $$@" $(AT)touch $$@ +$($(1)_prebuilt_downloaded): | $($(1)_dependencies) + $(AT)echo "=== Attempting to download prebuilt $(1) v$($(1)_version) ===" + $(AT)echo " Build ID: $($(1)_build_id)" + $(AT)echo " Download URL: $($(1)_prebuilt_url)" + $(AT)mkdir -p $$(@D) + $(AT)mkdir -p $(dir $($(1)_cached)) + $(AT)( \ + echo " Downloading $(1) prebuilt files..." && \ + $(build_DOWNLOAD) "$($(1)_cached).tmp" "$($(1)_prebuilt_url)" && \ + $(build_DOWNLOAD) "$($(1)_cached_checksum).tmp" "$($(1)_prebuilt_checksum_url)" && \ + $(build_DOWNLOAD) "$($(1)_cached_buildinfo).tmp" "$($(1)_prebuilt_buildinfo_url)" && \ + echo " Verifying checksum..." && \ + cd $(dir $($(1)_cached)) && \ + sed 's/$(notdir $($(1)_cached))/$(notdir $($(1)_cached)).tmp/' "$($(1)_cached_checksum).tmp" > "$($(1)_cached_checksum).tmp.verify" && \ + $(build_SHA256SUM) -c "$($(1)_cached_checksum).tmp.verify" && \ + rm -f "$($(1)_cached_checksum).tmp.verify" && \ + echo " Moving files to final location..." && \ + mv "$($(1)_cached).tmp" "$($(1)_cached)" && \ + mv "$($(1)_cached_checksum).tmp" "$($(1)_cached_checksum)" && \ + mv "$($(1)_cached_buildinfo).tmp" "$($(1)_cached_buildinfo)" && \ + echo " Prebuilt download completed: $$@" && \ + touch $$@ \ + ) || ( \ + echo " Download failed for $(1)" && \ + rm -f "$($(1)_cached).tmp" "$($(1)_cached_checksum).tmp" "$($(1)_cached_buildinfo).tmp" && \ + if [ "$(DEPENDS_UNTRUSTED_FAST_BUILDS)" = "forced" ]; then \ + echo " Error: DEPENDS_UNTRUSTED_FAST_BUILDS=forced but prebuilt download failed" && \ + exit 1; \ + else \ + echo " Falling back to building from source..." && \ + exit 1; \ + fi \ + ) $($(1)_cached): | $($(1)_dependencies) $($(1)_postprocessed) - $(AT)echo Caching $(1)... + $(AT)echo "=== Caching $(1) v$($(1)_version) ===" + $(AT)echo " Build ID: $($(1)_build_id)" + $(AT)echo " Cache file: $$@" + $(AT)echo " Compression: $(COMPRESS_CMD)" $(AT)cd $$($(1)_staging_dir)/$(host_prefix); find . | sort | tar --no-recursion --use-compress-program='$(COMPRESS_CMD)' -cf $$($(1)_staging_dir)/$$(@F) -T - $(AT)mkdir -p $$(@D) - $(AT)rm -rf $$(@D) && mkdir -p $$(@D) $(AT)mv $$($(1)_staging_dir)/$$(@F) $$(@) + $(AT)echo " Removing staging directory: $($(1)_staging_dir)" $(AT)rm -rf $($(1)_staging_dir) + $(AT)echo " Caching completed: $$@" $($(1)_cached_checksum): $($(1)_cached) + $(AT)echo "=== Generating checksum for $(1) v$($(1)_version) ===" + $(AT)echo " Checksum file: $$@" $(AT)cd $$(@D); $(build_SHA256SUM) $$( $$(@) + $(AT)echo " Checksum completed: $$@" + $(AT)echo "=== Generating build info for $(1) v$($(1)_version) ===" + $(AT)echo " Build info file: $$($(1)_cached_buildinfo)" + $(AT)echo "# Build Info for $(1) v$($(1)_version)" > $$($(1)_cached_buildinfo) + $(AT)echo "# Generated on: $$(shell date)" >> $$($(1)_cached_buildinfo) + $(AT)echo "" >> $$($(1)_cached_buildinfo) + $(AT)echo "Package: $(1)" >> $$($(1)_cached_buildinfo) + $(AT)echo "Version: $($(1)_version)" >> $$($(1)_cached_buildinfo) + $(AT)echo "Host: $(host)" >> $$($(1)_cached_buildinfo) + $(AT)echo "Release Type: $(release_type)" >> $$($(1)_cached_buildinfo) + $(AT)echo "" >> $$($(1)_cached_buildinfo) + $(AT)echo "Build ID (current): $($(1)_build_id)" >> $$($(1)_cached_buildinfo) + $(AT)echo "Build ID (legacy): $($(1)_build_id_legacy)" >> $$($(1)_cached_buildinfo) + $(AT)echo "" >> $$($(1)_cached_buildinfo) + $(AT)echo "Build ID String (current): $($(1)_build_id_long)" >> $$($(1)_cached_buildinfo) + $(AT)echo "Build ID String (legacy): $($(1)_build_id_long_legacy)" >> $$($(1)_cached_buildinfo) + $(AT)echo "" >> $$($(1)_cached_buildinfo) + $(AT)echo "Dependencies: $($(1)_dependencies)" >> $$($(1)_cached_buildinfo) + $(AT)echo "All Dependencies: $($(1)_all_dependencies)" >> $$($(1)_cached_buildinfo) + $(AT)echo "" >> $$($(1)_cached_buildinfo) + $(AT)echo "Recipe Hash: $($(1)_recipe_hash)" >> $$($(1)_cached_buildinfo) + $(AT)echo "Recipe Files: $($(1)_all_file_checksums)" >> $$($(1)_cached_buildinfo) + $(AT)echo "" >> $$($(1)_cached_buildinfo) + $(AT)echo "Toolchain (current): $($($(1)_type)_id_string)" >> $$($(1)_cached_buildinfo) + $(AT)echo "Toolchain (legacy): $($($(1)_type)_id_string_legacy)" >> $$($(1)_cached_buildinfo) + $(AT)echo "" >> $$($(1)_cached_buildinfo) + $(AT)echo "Build Tools (current):" >> $$($(1)_cached_buildinfo) + $(AT)echo " CC: $$(shell basename $($($(1)_type)_CC) 2>/dev/null || echo "unknown")" >> $$($(1)_cached_buildinfo) + $(AT)echo " CXX: $$(shell basename $($($(1)_type)_CXX) 2>/dev/null || echo "unknown")" >> $$($(1)_cached_buildinfo) + $(AT)echo " AR: $$(shell basename $($($(1)_type)_AR) 2>/dev/null || echo "unknown")" >> $$($(1)_cached_buildinfo) + $(AT)echo " RANLIB: $$(shell basename $($($(1)_type)_RANLIB) 2>/dev/null || echo "unknown")" >> $$($(1)_cached_buildinfo) + $(AT)echo " STRIP: $$(shell basename $($($(1)_type)_STRIP) 2>/dev/null || echo "unknown")" >> $$($(1)_cached_buildinfo) + $(AT)echo "" >> $$($(1)_cached_buildinfo) + $(AT)echo "Build Tools (legacy versions):" >> $$($(1)_cached_buildinfo) + $(AT)echo " CC: $$(shell $($($(1)_type)_CC) --version 2>/dev/null | head -1 || echo "unknown")" >> $$($(1)_cached_buildinfo) + $(AT)echo " CXX: $$(shell $($($(1)_type)_CXX) --version 2>/dev/null | head -1 || echo "unknown")" >> $$($(1)_cached_buildinfo) + $(AT)echo " AR: $$(shell $($($(1)_type)_AR) --version 2>/dev/null | head -1 || echo "unknown")" >> $$($(1)_cached_buildinfo) + $(AT)echo " RANLIB: $$(shell $($($(1)_type)_RANLIB) --version 2>/dev/null | head -1 || echo "unknown")" >> $$($(1)_cached_buildinfo) + $(AT)echo " STRIP: $$(shell $($($(1)_type)_STRIP) --version 2>/dev/null | head -1 || echo "unknown")" >> $$($(1)_cached_buildinfo) + $(AT)echo "" >> $$($(1)_cached_buildinfo) + $(AT)echo "Salt Values:" >> $$($(1)_cached_buildinfo) + $(AT)echo " BUILD_ID_SALT: $(BUILD_ID_SALT)" >> $$($(1)_cached_buildinfo) + $(AT)echo " HOST_ID_SALT: $(HOST_ID_SALT)" >> $$($(1)_cached_buildinfo) + $(AT)echo " Build info completed: $$($(1)_cached_buildinfo)" + +$($(1)_cached_or_prebuilt): + $(AT)mkdir -p $$(@D) + $(AT)if [ "$(DEPENDS_UNTRUSTED_FAST_BUILDS)" = "yes" ]; then \ + echo "=== Trying prebuilt download for $(1) v$($(1)_version) ===" && \ + ($(MAKE) -f $(BASEDIR)/Makefile $($(1)_prebuilt_downloaded) && touch $$@) || \ + (echo " Prebuilt download failed, falling back to building from source..." && \ + $(MAKE) -f $(BASEDIR)/Makefile $($(1)_cached_checksum) && touch $$@); \ + elif [ "$(DEPENDS_UNTRUSTED_FAST_BUILDS)" = "forced" ]; then \ + echo "=== Forced prebuilt download for $(1) v$($(1)_version) ===" && \ + $(MAKE) -f $(BASEDIR)/Makefile $($(1)_prebuilt_downloaded) && touch $$@; \ + else \ + echo "=== Building from source for $(1) v$($(1)_version) ===" && \ + $(MAKE) -f $(BASEDIR)/Makefile $($(1)_cached_checksum) && touch $$@; \ + fi .PHONY: $(1) -$(1): | $($(1)_cached_checksum) -.SECONDARY: $($(1)_cached) $($(1)_postprocessed) $($(1)_staged) $($(1)_built) $($(1)_configured) $($(1)_preprocessed) $($(1)_extracted) $($(1)_fetched) +$(1): | $($(1)_cached_or_prebuilt) +.SECONDARY: $($(1)_cached) $($(1)_postprocessed) $($(1)_staged) $($(1)_built) $($(1)_configured) $($(1)_preprocessed) $($(1)_extracted) $($(1)_fetched) $($(1)_cached_buildinfo) $($(1)_prebuilt_downloaded) $($(1)_cached_or_prebuilt) endef -stages = fetched extracted preprocessed configured built staged postprocessed cached cached_checksum +stages = fetched extracted preprocessed configured built staged postprocessed cached cached_checksum prebuilt_downloaded define ext_add_stages $(foreach stage,$(stages), diff --git a/impls/monero.dart/lib/src/checksum_monero.dart b/impls/monero.dart/lib/src/checksum_monero.dart index fdbfbaa..4d0e459 100644 --- a/impls/monero.dart/lib/src/checksum_monero.dart +++ b/impls/monero.dart/lib/src/checksum_monero.dart @@ -1,4 +1,4 @@ // ignore_for_file: constant_identifier_names const String wallet2_api_c_h_sha256 = "91218f60e937753a606b1db899ee2ed66a1b02144eb2d79b950ce59804397f84"; const String wallet2_api_c_cpp_sha256 = "282128494f3419c128dff7ed67daadd9c2ad0600d10557e829df03d9bc1ad891-0232839913b13cf0ab0bb7ad25fff0c05f37d2fe"; -const String wallet2_api_c_exp_sha256 = "d0f95f1f3bc49f1f59fe4eb0b61826128d7d3bb75405d5a01a252d02db03097d"; +const String wallet2_api_c_exp_sha256 = "b2f2355242f9ad852ccf860a60a5c7a74054f9450ba1fbf9c0f42c58dbfdee9d"; diff --git a/impls/monero.ts/checksum_monero.ts b/impls/monero.ts/checksum_monero.ts index 7ed01a3..0d5549a 100644 --- a/impls/monero.ts/checksum_monero.ts +++ b/impls/monero.ts/checksum_monero.ts @@ -1,5 +1,5 @@ export const moneroChecksum = { wallet2_api_c_h_sha256: "91218f60e937753a606b1db899ee2ed66a1b02144eb2d79b950ce59804397f84", wallet2_api_c_cpp_sha256: "282128494f3419c128dff7ed67daadd9c2ad0600d10557e829df03d9bc1ad891-0232839913b13cf0ab0bb7ad25fff0c05f37d2fe", - wallet2_api_c_exp_sha256: "d0f95f1f3bc49f1f59fe4eb0b61826128d7d3bb75405d5a01a252d02db03097d", + wallet2_api_c_exp_sha256: "b2f2355242f9ad852ccf860a60a5c7a74054f9450ba1fbf9c0f42c58dbfdee9d", } diff --git a/monero_libwallet2_api_c/src/main/cpp/monero_checksum.h b/monero_libwallet2_api_c/src/main/cpp/monero_checksum.h index d3d7414..b4c250a 100644 --- a/monero_libwallet2_api_c/src/main/cpp/monero_checksum.h +++ b/monero_libwallet2_api_c/src/main/cpp/monero_checksum.h @@ -2,5 +2,5 @@ #define MONEROC_CHECKSUMS const char * MONERO_wallet2_api_c_h_sha256 = "91218f60e937753a606b1db899ee2ed66a1b02144eb2d79b950ce59804397f84"; const char * MONERO_wallet2_api_c_cpp_sha256 = "282128494f3419c128dff7ed67daadd9c2ad0600d10557e829df03d9bc1ad891-0232839913b13cf0ab0bb7ad25fff0c05f37d2fe"; -const char * MONERO_wallet2_api_c_exp_sha256 = "d0f95f1f3bc49f1f59fe4eb0b61826128d7d3bb75405d5a01a252d02db03097d"; +const char * MONERO_wallet2_api_c_exp_sha256 = "b2f2355242f9ad852ccf860a60a5c7a74054f9450ba1fbf9c0f42c58dbfdee9d"; #endif