From 44a6875823b3dd4507bc18a47c9f664c9ea975b9 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Fri, 23 Jan 2026 01:08:25 +0530 Subject: [PATCH 01/25] build: make list of cross compilers more explicit, switch to ARMv8 Since the container image could be run on different architectures we can't implicitly assume that the x86_64 compiler is available, it needs to be made explicit. Additionally, we stopped releasing ARMv7 (32-bit) binaries a long time ago, we should test against ARMv8 (64-bit) instead. --- .github/workflows/build.yml | 20 +++++++++---------- .github/workflows/guix-build.yml | 2 +- ci/dash/matrix.sh | 4 ++-- ...tup_env_arm.sh => 00_setup_env_aarch64.sh} | 15 ++++++-------- contrib/containers/ci/ci.Dockerfile | 3 ++- .../deploy/Dockerfile.GitHubActions.Dispatch | 8 ++++---- 6 files changed, 25 insertions(+), 27 deletions(-) rename ci/test/{00_setup_env_arm.sh => 00_setup_env_aarch64.sh} (51%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0228e46af380..b5d486d32327 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -63,13 +63,13 @@ jobs: file: ./contrib/containers/ci/ci-slim.Dockerfile name: dashcore-ci-slim - depends-arm-linux: - name: arm-linux-gnueabihf + depends-aarch64-linux: + name: aarch64-linux-gnu uses: ./.github/workflows/build-depends.yml needs: [container, cache-sources] if: ${{ vars.SKIP_ARM_LINUX == '' }} with: - build-target: arm-linux + build-target: aarch64-linux container-path: ${{ needs.container.outputs.path }} depends-linux64: @@ -131,16 +131,16 @@ jobs: with: container-path: ${{ needs.container-slim.outputs.path }} - src-arm-linux: - name: arm-linux-build + src-aarch64-linux: + name: aarch64-linux-build uses: ./.github/workflows/build-src.yml - needs: [container, depends-arm-linux] + needs: [container, depends-aarch64-linux] with: - build-target: arm-linux + build-target: aarch64-linux container-path: ${{ needs.container.outputs.path }} - depends-key: ${{ needs.depends-arm-linux.outputs.key }} - depends-host: ${{ needs.depends-arm-linux.outputs.host }} - depends-dep-opts: ${{ needs.depends-arm-linux.outputs.dep-opts }} + depends-key: ${{ needs.depends-aarch64-linux.outputs.key }} + depends-host: ${{ needs.depends-aarch64-linux.outputs.host }} + depends-dep-opts: ${{ needs.depends-aarch64-linux.outputs.dep-opts }} src-linux64: name: linux64-build diff --git a/.github/workflows/guix-build.yml b/.github/workflows/guix-build.yml index ba2f0a35e268..5156614bbee8 100644 --- a/.github/workflows/guix-build.yml +++ b/.github/workflows/guix-build.yml @@ -71,7 +71,7 @@ jobs: runs-on: ubuntu-24.04-arm strategy: matrix: - build_target: [x86_64-linux-gnu, arm-linux-gnueabihf, aarch64-linux-gnu, riscv64-linux-gnu, powerpc64-linux-gnu, x86_64-w64-mingw32, x86_64-apple-darwin, arm64-apple-darwin] + build_target: [x86_64-linux-gnu, aarch64-linux-gnu, riscv64-linux-gnu, powerpc64-linux-gnu, x86_64-w64-mingw32, x86_64-apple-darwin, arm64-apple-darwin] timeout-minutes: 480 steps: diff --git a/ci/dash/matrix.sh b/ci/dash/matrix.sh index a5d60838285a..6e249fc476d1 100755 --- a/ci/dash/matrix.sh +++ b/ci/dash/matrix.sh @@ -16,8 +16,8 @@ export LSAN_OPTIONS="suppressions=${BASE_ROOT_DIR}/test/sanitizer_suppressions/l export TSAN_OPTIONS="suppressions=${BASE_ROOT_DIR}/test/sanitizer_suppressions/tsan:halt_on_error=1" export UBSAN_OPTIONS="suppressions=${BASE_ROOT_DIR}/test/sanitizer_suppressions/ubsan:print_stacktrace=1:halt_on_error=1:report_error_type=1" -if [ "$BUILD_TARGET" = "arm-linux" ]; then - source ./ci/test/00_setup_env_arm.sh +if [ "$BUILD_TARGET" = "aarch64-linux" ]; then + source ./ci/test/00_setup_env_aarch64.sh elif [ "$BUILD_TARGET" = "linux64" ]; then source ./ci/test/00_setup_env_native_qt5.sh elif [ "$BUILD_TARGET" = "linux64_asan" ]; then diff --git a/ci/test/00_setup_env_arm.sh b/ci/test/00_setup_env_aarch64.sh similarity index 51% rename from ci/test/00_setup_env_arm.sh rename to ci/test/00_setup_env_aarch64.sh index edbc9334928f..b1c14e764654 100755 --- a/ci/test/00_setup_env_arm.sh +++ b/ci/test/00_setup_env_aarch64.sh @@ -6,23 +6,20 @@ export LC_ALL=C.UTF-8 -export HOST=arm-linux-gnueabihf +export HOST=aarch64-linux-gnu # The host arch is unknown, so we run the tests through qemu. -# If the host is arm and wants to run the tests natively, it can set QEMU_USER_CMD to the empty string. -if [ -z ${QEMU_USER_CMD+x} ]; then export QEMU_USER_CMD="${QEMU_USER_CMD:-"qemu-arm -L /usr/arm-linux-gnueabihf/"}"; fi -export DPKG_ADD_ARCH="armhf" -export PACKAGES="python3-zmq g++-arm-linux-gnueabihf busybox libc6:armhf libstdc++6:armhf libfontconfig1:armhf libxcb1:armhf" +# If the host is arm64 and wants to run the tests natively, it can set QEMU_USER_CMD to the empty string. +if [ -z ${QEMU_USER_CMD+x} ]; then export QEMU_USER_CMD="${QEMU_USER_CMD:-"qemu-aarch64 -L /usr/aarch64-linux-gnu/"}"; fi +export DPKG_ADD_ARCH="arm64" +export PACKAGES="python3-zmq g++-aarch64-linux-gnu busybox libc6:arm64 libstdc++6:arm64 libfontconfig1:arm64 libxcb1:arm64" if [ -n "$QEMU_USER_CMD" ]; then # Likely cross-compiling, so install the needed gcc and qemu-user export PACKAGES="$PACKAGES qemu-user" fi -export CONTAINER_NAME=ci_arm_linux +export CONTAINER_NAME=ci_aarch64_linux # Use debian to avoid 404 apt errors when cross compiling export CHECK_DOC=0 export USE_BUSY_BOX=true export RUN_UNIT_TESTS=false export RUN_FUNCTIONAL_TESTS=false export GOAL="install" -# -Wno-psabi is to disable ABI warnings: "note: parameter passing for argument of type ... changed in GCC 7.1" -# This could be removed once the ABI change warning does not show up by default -export BITCOIN_CONFIG="--enable-reduce-exports CXXFLAGS=-Wno-psabi" diff --git a/contrib/containers/ci/ci.Dockerfile b/contrib/containers/ci/ci.Dockerfile index 2f0659cbf01f..42df9b08018c 100644 --- a/contrib/containers/ci/ci.Dockerfile +++ b/contrib/containers/ci/ci.Dockerfile @@ -19,8 +19,9 @@ RUN set -ex; \ cmake \ g++-11 \ g++-14 \ - g++-arm-linux-gnueabihf \ + g++-aarch64-linux-gnu \ g++-mingw-w64-x86-64 \ + g++-x86-64-linux-gnu \ gawk \ gettext \ libtool \ diff --git a/contrib/containers/deploy/Dockerfile.GitHubActions.Dispatch b/contrib/containers/deploy/Dockerfile.GitHubActions.Dispatch index 4db05ed6c25f..c6452786809b 100644 --- a/contrib/containers/deploy/Dockerfile.GitHubActions.Dispatch +++ b/contrib/containers/deploy/Dockerfile.GitHubActions.Dispatch @@ -9,7 +9,7 @@ RUN apt-get update && \ build-essential \ ca-certificates \ curl \ - g++-arm-linux-gnueabihf \ + g++-aarch64-linux-gnu \ libtool \ pkg-config \ python3 \ @@ -23,14 +23,14 @@ COPY . . ARG TARGETPLATFORM RUN case "$TARGETPLATFORM" in \ - "linux/arm64") make HOST=arm-linux-gnueabihf -C depends -j`nproc | awk '{x=$1/2; print x}'` ;; \ + "linux/arm64") make HOST=aarch64-linux-gnu -C depends -j`nproc | awk '{x=$1/2; print x}'` ;; \ "linux/amd64") make HOST=x86_64-pc-linux-gnu -C depends -j`nproc | awk '{x=$1/2; print x}'` ;; \ *) exit 1 ;; \ esac RUN ./autogen.sh && \ case "$TARGETPLATFORM" in \ - "linux/arm64") ./configure --prefix=`pwd`/depends/arm-linux-gnueabihf ;; \ + "linux/arm64") ./configure --prefix=`pwd`/depends/aarch64-linux-gnu ;; \ "linux/amd64") ./configure --prefix=`pwd`/depends/x86_64-pc-linux-gnu ;; \ esac @@ -38,7 +38,7 @@ RUN make -j`nproc | awk '{x=$1/2; print x}'` && make install RUN mkdir built-target && \ case "$TARGETPLATFORM" in \ - "linux/arm64") cp depends/arm-linux-gnueabihf/bin/dash* /home/dash/built-target ;; \ + "linux/arm64") cp depends/aarch64-linux-gnu/bin/dash* /home/dash/built-target ;; \ "linux/amd64") cp depends/x86_64-pc-linux-gnu/bin/dash* /home/dash/built-target ;; \ esac From 4b3865b9be2c6cc418326b9d53e01a03f26bedea Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Mon, 2 Feb 2026 17:25:19 +0530 Subject: [PATCH 02/25] build: add Rust to CI docker image, cross-compile targets --- .github/workflows/build-container.yml | 4 +++ contrib/containers/ci/ci.Dockerfile | 30 +++++++++++++++++++ contrib/containers/ci/config.toml | 28 +++++++++++++++++ contrib/containers/develop/docker-compose.yml | 2 ++ rust-toolchain.toml | 2 ++ 5 files changed, 66 insertions(+) create mode 100644 contrib/containers/ci/config.toml create mode 100644 rust-toolchain.toml diff --git a/.github/workflows/build-container.yml b/.github/workflows/build-container.yml index 94ef347fbe1e..df568063571b 100644 --- a/.github/workflows/build-container.yml +++ b/.github/workflows/build-container.yml @@ -57,6 +57,8 @@ jobs: uses: docker/build-push-action@v6 with: context: ${{ inputs.context }} + build-contexts: | + docker_root=${{ github.workspace }}/dash/contrib/containers/ci file: ${{ inputs.file }} push: true platforms: linux/amd64 @@ -101,6 +103,8 @@ jobs: uses: docker/build-push-action@v6 with: context: ${{ inputs.context }} + build-contexts: | + docker_root=${{ github.workspace }}/dash/contrib/containers/ci file: ${{ inputs.file }} push: true platforms: linux/arm64 diff --git a/contrib/containers/ci/ci.Dockerfile b/contrib/containers/ci/ci.Dockerfile index 42df9b08018c..ded604401440 100644 --- a/contrib/containers/ci/ci.Dockerfile +++ b/contrib/containers/ci/ci.Dockerfile @@ -58,6 +58,36 @@ RUN set -ex; \ # LD_LIBRARY_PATH is empty by default, this is the first entry ENV LD_LIBRARY_PATH="/usr/lib/llvm-${LLVM_VERSION}/lib" +# Install Rust +ARG RUSTUP_VERSION=1.28.2 \ + RUST_VERSION=1.82.0 +ENV RUSTUP_HOME="/opt/rust/rustup" \ + CARGO_HOME="/opt/rust/cargo" +ENV PATH="${CARGO_HOME}/bin:${PATH}" +RUN dpkgArch="$(dpkg --print-architecture)"; \ + case "${dpkgArch##*-}" in \ + amd64) rustArch='x86_64-unknown-linux-gnu';; \ + armhf) rustArch='armv7-unknown-linux-gnueabihf';; \ + arm64) rustArch='aarch64-unknown-linux-gnu';; \ + *) echo >&2 "unsupported architecture: ${dpkgArch}"; exit 1 ;; \ + esac; \ + curl -fL "https://static.rust-lang.org/rustup/archive/$RUSTUP_VERSION/${rustArch}/rustup-init" -o /tmp/rustup-init; \ + chmod +x /tmp/rustup-init; \ + /tmp/rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION --default-host ${rustArch}; \ + rm /tmp/rustup-init; \ + chmod -R a+w "${RUSTUP_HOME}" "${CARGO_HOME}"; \ + rustup target add \ + # Linux + aarch64-unknown-linux-gnu \ + x86_64-unknown-linux-gnu \ + # Windows + x86_64-pc-windows-gnu; \ + rustup --version; \ + cargo --version; \ + rustc --version; \ + rm -rf "${CARGO_HOME}/registry/cache" +COPY --from=docker_root ./config.toml "${CARGO_HOME}/config.toml" + RUN set -ex; \ git clone --depth=1 "https://github.com/include-what-you-use/include-what-you-use" -b "clang_${LLVM_VERSION}" /opt/iwyu; \ cd /opt/iwyu; \ diff --git a/contrib/containers/ci/config.toml b/contrib/containers/ci/config.toml new file mode 100644 index 000000000000..5148a730e213 --- /dev/null +++ b/contrib/containers/ci/config.toml @@ -0,0 +1,28 @@ +# Commented out entries are not bundled in the container + +# Linux +[target.aarch64-unknown-linux-gnu] +linker = "aarch64-linux-gnu-gcc" + +# [target.armv7-unknown-linux-gnueabihf] +# linker = "arm-linux-gnueabihf-gcc" + +# [target.powerpc64le-unknown-linux-gnu] +# linker = "powerpc64le-linux-gnu-gcc" + +# [target.riscv64gc-unknown-linux-gnu] +# linker = "riscv64-linux-gnu-gcc" + +[target.x86_64-unknown-linux-gnu] +linker = "x86_64-linux-gnu-gcc" + +# macOS +# [target.aarch64-apple-darwin] +# linker = "aarch64-apple-darwin-gcc" + +# [target.x86_64-apple-darwin] +# linker = "x86_64-apple-darwin-gcc" + +# Windows +[target.x86_64-pc-windows-gnu] +linker = "x86_64-w64-mingw32-gcc" diff --git a/contrib/containers/develop/docker-compose.yml b/contrib/containers/develop/docker-compose.yml index c6f2cea70424..39238d6d4d0c 100644 --- a/contrib/containers/develop/docker-compose.yml +++ b/contrib/containers/develop/docker-compose.yml @@ -4,6 +4,8 @@ services: build: context: '..' dockerfile: './develop/Dockerfile' + additional_contexts: + - docker_root=../ci args: USER_ID: 1000 # set this to $(id -u) of the host GROUP_ID: 1000 # set this to $(id -g) of the host diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 000000000000..2e2b8c8521ea --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "1.82.0" From 1ed08e5ac0291af6ca8b4c3ea5502a93dc59c0cb Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Mon, 2 Feb 2026 17:10:47 +0530 Subject: [PATCH 03/25] build: add minimal stub crate to validate Rust integration --- .gitignore | 23 ++++ rust/chirp/Cargo.lock | 297 ++++++++++++++++++++++++++++++++++++++++++ rust/chirp/Cargo.toml | 13 ++ rust/chirp/build.rs | 5 + rust/chirp/src/lib.rs | 19 +++ 5 files changed, 357 insertions(+) create mode 100644 rust/chirp/Cargo.lock create mode 100644 rust/chirp/Cargo.toml create mode 100644 rust/chirp/build.rs create mode 100644 rust/chirp/src/lib.rs diff --git a/.gitignore b/.gitignore index 8c13e82b2289..74ad90f09469 100644 --- a/.gitignore +++ b/.gitignore @@ -175,3 +175,26 @@ test/lint/.cppcheck/* # Editor and tooling .vscode/ compile_commands.json + +# Generated by Cargo +# will have compiled files and executables +debug +target + +# Cargo configuration +.cargo/.configured-for-* +.cargo/config +.cargo/config.toml + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb + +# Generated by cargo mutants +# Contains mutation testing data +**/mutants.out*/ + +# FFI bridge +gen diff --git a/rust/chirp/Cargo.lock b/rust/chirp/Cargo.lock new file mode 100644 index 000000000000..0baf0e1fce0a --- /dev/null +++ b/rust/chirp/Cargo.lock @@ -0,0 +1,297 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "anstyle" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" + +[[package]] +name = "built" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64" + +[[package]] +name = "cc" +version = "1.2.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "chirp" +version = "0.1.0" +dependencies = [ + "built", + "cxx", +] + +[[package]] +name = "clap" +version = "4.5.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.5.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00" +dependencies = [ + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_lex" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" + +[[package]] +name = "codespan-reporting" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" +dependencies = [ + "serde", + "termcolor", + "unicode-width", +] + +[[package]] +name = "cxx" +version = "1.0.192" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbda285ba6e5866529faf76352bdf73801d9b44a6308d7cd58ca2379f378e994" +dependencies = [ + "cc", + "cxx-build", + "cxxbridge-cmd", + "cxxbridge-flags", + "cxxbridge-macro", + "foldhash", + "link-cplusplus", +] + +[[package]] +name = "cxx-build" +version = "1.0.192" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af9efde466c5d532d57efd92f861da3bdb7f61e369128ce8b4c3fe0c9de4fa4d" +dependencies = [ + "cc", + "codespan-reporting", + "indexmap", + "proc-macro2", + "quote", + "scratch", + "syn", +] + +[[package]] +name = "cxxbridge-cmd" +version = "1.0.192" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3efb93799095bccd4f763ca07997dc39a69e5e61ab52d2c407d4988d21ce144d" +dependencies = [ + "clap", + "codespan-reporting", + "indexmap", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.192" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3092010228026e143b32a4463ed9fa8f86dca266af4bf5f3b2a26e113dbe4e45" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.192" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31d72ebfcd351ae404fb00ff378dfc9571827a00722c9e735c9181aec320ba0a" +dependencies = [ + "indexmap", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "find-msvc-tools" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f449e6c6c08c865631d4890cfacf252b3d396c9bcc83adb6623cdb02a8336c41" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "link-cplusplus" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f78c730aaa7d0b9336a299029ea49f9ee53b0ed06e9202e8cb7db9bae7b8c82" +dependencies = [ + "cc", +] + +[[package]] +name = "proc-macro2" +version = "1.0.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "scratch" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d68f2ec51b097e4c1a75b681a8bec621909b5e91f15bb7b840c4f2f7b01148b2" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "2.0.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] diff --git a/rust/chirp/Cargo.toml b/rust/chirp/Cargo.toml new file mode 100644 index 000000000000..5086d5a04658 --- /dev/null +++ b/rust/chirp/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "chirp" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["staticlib"] + +[dependencies] +cxx = "=1.0.192" + +[build-dependencies] +built = "0.8.0" diff --git a/rust/chirp/build.rs b/rust/chirp/build.rs new file mode 100644 index 000000000000..6840529bef3c --- /dev/null +++ b/rust/chirp/build.rs @@ -0,0 +1,5 @@ +fn main() { + built::write_built_file().expect("Failed to write build info"); + cxx_build::bridge("src/lib.rs").compile("chirp"); + println!("cargo::rerun-if-changed=src/lib.rs"); +} diff --git a/rust/chirp/src/lib.rs b/rust/chirp/src/lib.rs new file mode 100644 index 000000000000..1d27c03613f3 --- /dev/null +++ b/rust/chirp/src/lib.rs @@ -0,0 +1,19 @@ +mod built_info { + include!(concat!(env!("OUT_DIR"), "/built.rs")); +} + +#[cxx::bridge(namespace = "chirp")] +mod ffi { + extern "Rust" { + fn chirp() -> String; + } +} + +fn chirp() -> String { + format!( + "{} {} built with {} reports \"cheep cheep\"", + built_info::PKG_NAME, + built_info::PKG_VERSION, + built_info::RUSTC_VERSION, + ) +} From db8e4745ff63c96f013b30297e67fc34994ba90a Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Mon, 12 Jan 2026 03:05:28 +0530 Subject: [PATCH 04/25] lint: exclude `rust/` from linters Eventually, `rust/` will be hosting primarily subtrees, whose contents we cannot directly influence, so linting it makes little sense. --- test/lint/lint-files.py | 2 +- test/lint/lint-format-strings.py | 2 +- test/lint/lint-include-guards.py | 17 +++++++++-------- test/lint/lint-includes.py | 9 +++++---- test/lint/lint-locale-dependence.py | 7 ++++--- test/lint/lint-python-utf8-encoding.py | 3 ++- test/lint/lint-python.py | 3 ++- test/lint/lint-shell-locale.py | 2 +- test/lint/lint-shell.py | 2 +- test/lint/lint-spelling.py | 22 +++++++++++++++++++++- test/lint/lint-whitespace.py | 17 +++++++++-------- 11 files changed, 56 insertions(+), 30 deletions(-) diff --git a/test/lint/lint-files.py b/test/lint/lint-files.py index ee09cea93235..a53a060b550c 100755 --- a/test/lint/lint-files.py +++ b/test/lint/lint-files.py @@ -21,7 +21,7 @@ ALLOWED_FILENAME_REGEXP = "^[a-zA-Z0-9/_.@][a-zA-Z0-9/_.@-]*$" ALLOWED_SOURCE_FILENAME_REGEXP = "^[a-z0-9_./-]+$" ALLOWED_SOURCE_FILENAME_EXCEPTION_REGEXP = ( - "^src/(dashbls/|immer/|secp256k1/|minisketch/|test/fuzz/FuzzedDataProvider.h)" + "^rust/|src/(dashbls/|immer/|secp256k1/|minisketch/|test/fuzz/FuzzedDataProvider.h)" ) ALLOWED_PERMISSION_NON_EXECUTABLES = 0o644 ALLOWED_PERMISSION_EXECUTABLES = 0o755 diff --git a/test/lint/lint-format-strings.py b/test/lint/lint-format-strings.py index 6992343d6cf6..11c5ffd51ed7 100755 --- a/test/lint/lint-format-strings.py +++ b/test/lint/lint-format-strings.py @@ -82,7 +82,7 @@ def main(): matching_files_filtered = [] for matching_file in matching_files: - if not re.search('^src/(dashbls|leveldb|secp256k1|minisketch|tinyformat|test/fuzz/strprintf.cpp|clientversion.cpp)', matching_file): + if not re.search('^rust/|src/(dashbls|leveldb|secp256k1|minisketch|tinyformat|test/fuzz/strprintf.cpp|clientversion.cpp)', matching_file): matching_files_filtered.append(matching_file) matching_files_filtered.sort() diff --git a/test/lint/lint-include-guards.py b/test/lint/lint-include-guards.py index 6e59c83f7dbc..5e65e056831d 100755 --- a/test/lint/lint-include-guards.py +++ b/test/lint/lint-include-guards.py @@ -17,20 +17,21 @@ HEADER_ID_PREFIX = 'BITCOIN_' HEADER_ID_SUFFIX = '_H' -EXCLUDE_FILES_WITH_PREFIX = ['src/crypto/ctaes', - 'src/leveldb', - 'src/crc32c', - 'src/secp256k1', - 'src/minisketch', - 'src/tinyformat.h', +EXCLUDE_FILES_WITH_PREFIX = ['rust/', 'src/bench/nanobench.h', - 'src/test/fuzz/FuzzedDataProvider.h', 'src/bls', + 'src/crc32c', + 'src/crypto/ctaes', 'src/crypto/x11/sph', 'src/ctpl_stl.h', 'src/dashbls', 'src/gsl', - 'src/immer'] + 'src/immer', + 'src/leveldb', + 'src/minisketch', + 'src/secp256k1', + 'src/test/fuzz/FuzzedDataProvider.h', + 'src/tinyformat.h'] def _get_header_file_lst() -> List[str]: diff --git a/test/lint/lint-includes.py b/test/lint/lint-includes.py index 9a0cfa127dde..78f66f36b4a8 100755 --- a/test/lint/lint-includes.py +++ b/test/lint/lint-includes.py @@ -15,13 +15,14 @@ from subprocess import check_output, CalledProcessError -EXCLUDED_DIRS = ["src/leveldb/", +EXCLUDED_DIRS = ["rust/", "src/crc32c/", - "src/secp256k1/", - "src/minisketch/", + "src/crypto/x11/", "src/dashbls/", "src/immer/", - "src/crypto/x11/"] + "src/minisketch/", + "src/secp256k1/", + "src/leveldb/"] EXPECTED_BOOST_INCLUDES = ["boost/date_time/posix_time/posix_time.hpp", "boost/hana/for_each.hpp", diff --git a/test/lint/lint-locale-dependence.py b/test/lint/lint-locale-dependence.py index 32cef3cb1248..4f6cd04068ce 100755 --- a/test/lint/lint-locale-dependence.py +++ b/test/lint/lint-locale-dependence.py @@ -57,13 +57,14 @@ ] REGEXP_EXTERNAL_DEPENDENCIES_EXCLUSIONS = [ + "rust/", "src/crypto/ctaes/", + "src/dashbls/", + "src/immer/", "src/leveldb/", - "src/secp256k1/", "src/minisketch/", + "src/secp256k1/", "src/tinyformat.h", - "src/dashbls/", - "src/immer/" ] LOCALE_DEPENDENT_FUNCTIONS = [ diff --git a/test/lint/lint-python-utf8-encoding.py b/test/lint/lint-python-utf8-encoding.py index 20dc5abea6c9..438e9f71ec23 100755 --- a/test/lint/lint-python-utf8-encoding.py +++ b/test/lint/lint-python-utf8-encoding.py @@ -12,7 +12,8 @@ from subprocess import check_output, CalledProcessError -EXCLUDED_DIRS = ["src/crc32c/", +EXCLUDED_DIRS = ["rust/", + "src/crc32c/", "src/secp256k1/"] diff --git a/test/lint/lint-python.py b/test/lint/lint-python.py index e94c05c7235b..4f79ec79cb5c 100755 --- a/test/lint/lint-python.py +++ b/test/lint/lint-python.py @@ -18,7 +18,8 @@ DEPS = ['flake8', 'lief', 'mypy', 'pyzmq'] MYPY_CACHE_DIR = f"{os.getenv('BASE_ROOT_DIR', '')}/test/.mypy_cache" FILES_ARGS = ['git', 'ls-files', '--','test/functional/*.py', 'contrib/devtools/*.py', ':(exclude)contrib/devtools/github-merge.py'] -EXCLUDE_DIRS = ['src/dashbls/', +EXCLUDE_DIRS = ['rust/', + 'src/dashbls/', 'src/immer/'] ENABLED = ( diff --git a/test/lint/lint-shell-locale.py b/test/lint/lint-shell-locale.py index 77f6d79f3529..5b4ced04cf3a 100755 --- a/test/lint/lint-shell-locale.py +++ b/test/lint/lint-shell-locale.py @@ -41,7 +41,7 @@ def main(): exit_code = 0 shell_files = get_shell_files_list() for file_path in shell_files: - if re.search('src/(dashbls|secp256k1|minisketch)/', file_path): + if re.search('rust/|src/(dashbls|secp256k1|minisketch)/', file_path): continue with open(file_path, 'r', encoding='utf-8') as file_obj: diff --git a/test/lint/lint-shell.py b/test/lint/lint-shell.py index 4be1f297fa11..7c4584f5d062 100755 --- a/test/lint/lint-shell.py +++ b/test/lint/lint-shell.py @@ -68,7 +68,7 @@ def main(): ] files = get_files(files_cmd) # remove everything that doesn't match this regex - reg = re.compile(r'src/[dashbls,immer,leveldb,secp256k1,minisketch]') + reg = re.compile(r'rust|src/[dashbls,immer,leveldb,secp256k1,minisketch]') files[:] = [file for file in files if not reg.match(file)] # build the `shellcheck` command diff --git a/test/lint/lint-spelling.py b/test/lint/lint-spelling.py index 1acc5998d34a..73b2b14b2f7f 100755 --- a/test/lint/lint-spelling.py +++ b/test/lint/lint-spelling.py @@ -12,7 +12,27 @@ from subprocess import check_output, STDOUT, CalledProcessError IGNORE_WORDS_FILE = 'test/lint/spelling.ignore-words.txt' -FILES_ARGS = ['git', 'ls-files', '--', ":(exclude)build-aux/m4/", ":(exclude)contrib/seeds/*.txt", ":(exclude)depends/", ":(exclude)doc/release-notes/", ":(exclude)src/bip39_english.h", ":(exclude)src/dashbls/", ":(exclude)src/crc32c/", ":(exclude)src/crypto/", ":(exclude)src/ctpl_stl.h", ":(exclude)src/cxxtimer.hpp", ":(exclude)src/immer/", ":(exclude)src/leveldb/", ":(exclude)src/qt/locale/", ":(exclude)src/qt/*.qrc", ":(exclude)src/secp256k1/", ":(exclude)src/minisketch/", ":(exclude)contrib/builder-keys/", ":(exclude)contrib/guix/patches", ":(exclude)src/util/subprocess.hpp"] +FILES_ARGS = ['git', 'ls-files', '--', + ":(exclude)build-aux/m4/", + ":(exclude)contrib/builder-keys/", + ":(exclude)contrib/guix/patches", + ":(exclude)contrib/seeds/*.txt", + ":(exclude)depends/", + ":(exclude)doc/release-notes/", + ":(exclude)rust/", + ":(exclude)src/bip39_english.h", + ":(exclude)src/crc32c/", + ":(exclude)src/crypto/", + ":(exclude)src/ctpl_stl.h", + ":(exclude)src/cxxtimer.hpp", + ":(exclude)src/dashbls/", + ":(exclude)src/immer/", + ":(exclude)src/leveldb/", + ":(exclude)src/minisketch/", + ":(exclude)src/qt/*.qrc", + ":(exclude)src/qt/locale/", + ":(exclude)src/secp256k1/", + ":(exclude)src/util/subprocess.hpp"] def check_codespell_install(): diff --git a/test/lint/lint-whitespace.py b/test/lint/lint-whitespace.py index 78c145bd004e..fd264932d628 100755 --- a/test/lint/lint-whitespace.py +++ b/test/lint/lint-whitespace.py @@ -16,17 +16,18 @@ from subprocess import check_output -EXCLUDED_DIRS = ["depends/patches/", - "contrib/guix/patches/", - "src/crypto/x11/", - "src/leveldb/", +EXCLUDED_DIRS = ["contrib/guix/patches/", + "depends/patches/", + "doc/release-notes/", + "rust/", "src/crc32c/", - "src/secp256k1/", - "src/minisketch/", + "src/crypto/x11/", "src/dashbls/", "src/immer/", - "doc/release-notes/", - "src/qt/locale"] + "src/leveldb/", + "src/minisketch/", + "src/qt/locale/", + "src/secp256k1/"] def parse_args(): """Parse command line arguments.""" From be3bde0d7b89fe14e844bdcd8bc6b4e1e17be25b Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Mon, 2 Feb 2026 17:39:04 +0530 Subject: [PATCH 05/25] build: introduce barebones Autotools integration with Rust --- Makefile.am | 2 +- configure.ac | 74 +++++++++++++++++++++++++++++++++++- contrib/guix/symbol-check.py | 2 + rust/Makefile.am | 32 ++++++++++++++++ rust/Makefile.chirp.include | 49 ++++++++++++++++++++++++ rust/Makefile.libs.include | 49 ++++++++++++++++++++++++ rust/chirp/build.rs | 2 - src/Makefile.am | 49 +++++++++++++++++++----- src/Makefile.bench.include | 3 ++ src/Makefile.qt.include | 4 +- src/Makefile.qttest.include | 4 +- src/Makefile.test.include | 7 +++- 12 files changed, 256 insertions(+), 21 deletions(-) create mode 100644 rust/Makefile.am create mode 100644 rust/Makefile.chirp.include create mode 100644 rust/Makefile.libs.include diff --git a/Makefile.am b/Makefile.am index ea2cba9fd2fa..97a2fd35bea0 100644 --- a/Makefile.am +++ b/Makefile.am @@ -8,7 +8,7 @@ print-%: FORCE @echo '$*'='$($*)' ACLOCAL_AMFLAGS = -I build-aux/m4 -SUBDIRS = src +SUBDIRS = rust src if ENABLE_MAN SUBDIRS += doc/man endif diff --git a/configure.ac b/configure.ac index 94047886c671..cbfcf3637d6a 100644 --- a/configure.ac +++ b/configure.ac @@ -59,7 +59,9 @@ AM_INIT_AUTOMAKE([1.13 no-define subdir-objects foreign]) AM_MAINTAINER_MODE([enable]) dnl make the compilation flags quiet unless V=1 is used -AM_SILENT_RULES([yes]) +m4_pattern_allow([AM_DEFAULT_VERBOSITY]) +m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])],[AM_DEFAULT_VERBOSITY=1]) +AM_CONDITIONAL([SILENT_RULES], [test "$AM_DEFAULT_VERBOSITY" = '0']) dnl Compiler checks (here before libtool). if test "${CXXFLAGS+set}" = "set"; then @@ -124,6 +126,31 @@ AC_PATH_TOOL([DSYMUTIL], [dsymutil]) AC_PATH_PROG([DOXYGEN], [doxygen]) AM_CONDITIONAL([HAVE_DOXYGEN], [test -n "$DOXYGEN"]) +dnl Check/return PATH for Rust dependencies +AC_DEFUN( + RS_REQUIRE_PROG, + [ + AC_PATH_PROG($1, $2, $2_notfound) + if test x${$1} = x$2_notfound + then + AC_MSG_ERROR("Required program $2 was not found") + fi + ] +) +RS_REQUIRE_PROG([CARGO], cargo) +RS_REQUIRE_PROG([CXXBRIDGE], cxxbridge) +RS_REQUIRE_PROG([RUSTC], rustc) + +AC_ARG_VAR([CARGO_INCREMENTAL], [Enable incremental compilation for Rust]) +if test "${CARGO_INCREMENTAL+set}" != "set"; then + CARGO_INCREMENTAL="0" +fi + +AC_ARG_VAR([RUSTFLAGS], [Flags for Rust compiler]) +if test "${RUSTFLAGS+set}" != "set"; then + RUSTFLAGS="-C embed-bitcode=yes -C relocation-model=pic" +fi + AC_ARG_ENABLE([wallet], [AS_HELP_STRING([--disable-wallet], [disable wallet (enabled by default)])], @@ -1704,6 +1731,40 @@ if test "$use_zmq" = "yes"; then esac fi +RUST_LIBS="" +case $host in + *mingw*) + RUST_LIBS="$RUST_LIBS -luserenv -lntdll" + ;; + *darwin*) + ;; + *) + RUST_LIBS="$RUST_LIBS -ldl" + ;; +esac + +RUST_TARGET="" +AC_MSG_CHECKING([for Rust target]) +case $host in + x86_64-*-freebsd*) RUST_TARGET="x86_64-unknown-freebsd" ;; + aarch64-*-linux*|arm64-*-linux*) + RUST_TARGET="aarch64-unknown-linux-gnu" ;; + arm-*-linux*) RUST_TARGET="armv7-unknown-linux-gnueabihf" ;; + powerpc64-*-linux*) RUST_TARGET="powerpc64-unknown-linux-gnu" ;; + powerpc64le-*-linux*) RUST_TARGET="powerpc64le-unknown-linux-gnu" ;; + riscv64-*-linux*) RUST_TARGET="riscv64gc-unknown-linux-gnu" ;; + x86_64-*-linux*) RUST_TARGET="x86_64-unknown-linux-gnu" ;; + x86_64-*-darwin*) RUST_TARGET="x86_64-apple-darwin" ;; + aarch64-*-darwin*|arm64-*-darwin*) + RUST_TARGET="aarch64-apple-darwin" ;; + x86_64-*-mingw*) RUST_TARGET="x86_64-pc-windows-gnu" ;; + *) + AC_MSG_RESULT([unknown]) + AC_MSG_ERROR([Unsupported host for Rust: $host]) + ;; +esac +AC_MSG_RESULT([$RUST_TARGET]) + dnl check if libgmp is present TEMP_CPPFLAGS="$CPPFLAGS" TEMP_LDFLAGS="$LDFLAGS" @@ -1994,6 +2055,9 @@ AC_SUBST(BITCOIN_WALLET_TOOL_NAME) AC_SUBST(BITCOIN_MP_NODE_NAME) AC_SUBST(BITCOIN_MP_GUI_NAME) +AC_SUBST(RUST_LIBS) +AC_SUBST(RUST_TARGET) + AC_SUBST(RELDFLAGS) AC_SUBST(CORE_LDFLAGS) AC_SUBST(CORE_CPPFLAGS) @@ -2049,7 +2113,7 @@ AC_SUBST(HAVE_MM_PREFETCH) AC_SUBST(HAVE_STRONG_GETAUXVAL) AC_SUBST(ANDROID_ARCH) AC_SUBST(HAVE_EVHTTP_CONNECTION_GET_PEER_CONST_CHAR) -AC_CONFIG_FILES([Makefile src/Makefile doc/man/Makefile share/setup.nsi share/qt/Info.plist test/config.ini]) +AC_CONFIG_FILES([Makefile rust/Makefile src/Makefile doc/man/Makefile share/setup.nsi share/qt/Info.plist test/config.ini]) AC_CONFIG_FILES([contrib/devtools/split-debug.sh],[chmod +x contrib/devtools/split-debug.sh]) AM_COND_IF([HAVE_DOXYGEN], [AC_CONFIG_FILES([doc/Doxyfile])]) AC_CONFIG_LINKS([contrib/filter-lcov.py:contrib/filter-lcov.py]) @@ -2141,3 +2205,9 @@ echo " LDFLAGS = $PTHREAD_LIBS $HARDENED_LDFLAGS $GPROF_LDFLAGS $CORE_L echo " AR = $AR" echo " ARFLAGS = $ARFLAGS" echo +echo " CARGO = $CARGO" +echo " CARGO_INCREMENTAL = $CARGO_INCREMENTAL" +echo " CXXBRIDGE = $CXXBRIDGE" +echo " RUSTC = $RUSTC" +echo " RUSTFLAGS = $RUSTFLAGS" +echo diff --git a/contrib/guix/symbol-check.py b/contrib/guix/symbol-check.py index bca9029b24d8..b41cf4aaea69 100755 --- a/contrib/guix/symbol-check.py +++ b/contrib/guix/symbol-check.py @@ -150,10 +150,12 @@ PE_ALLOWED_LIBRARIES = { 'ADVAPI32.dll', # legacy security & registry +'api-ms-win-core-synch-l1-2-0.dll', # sync primitives (API set) 'bcrypt.dll', # newer security and identity API 'IPHLPAPI.DLL', # IP helper API 'KERNEL32.dll', # win32 base APIs 'msvcrt.dll', # C standard library for MSVC +'ntdll.dll', # NT kernel API 'SHELL32.dll', # shell API 'WS2_32.dll', # sockets 'dbghelp.dll', # debugging routines diff --git a/rust/Makefile.am b/rust/Makefile.am new file mode 100644 index 000000000000..fb6bd118813d --- /dev/null +++ b/rust/Makefile.am @@ -0,0 +1,32 @@ +# Copyright (c) 2016-2025 The Zcash developers +# Copyright (c) 2026 The Dash Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +CARGO_BUILD_OPTS = --release --locked --target $(RUST_TARGET) +CARGO_ENV = \ + AR="$(AR)" \ + CC="$(CC)" \ + CFLAGS="$(CFLAGS)" \ + CXX="$(CXX)" \ + CXXFLAGS="$(CXXFLAGS)" \ + CARGO_INCREMENTAL="$(CARGO_INCREMENTAL)" \ + RUSTC="$(RUSTC)" \ + RUSTFLAGS="$(RUSTFLAGS)" \ + TERM="dumb" + +if !SILENT_RULES +CARGO_BUILD_OPTS += --verbose +endif # !SILENT_RULES + +include $(top_srcdir)/rust/Makefile.libs.include + +all-local: cargo-build-chirp cxxbridge-chirp + +cargo-build: cargo-build-chirp + +cargo-clean: cargo-clean-chirp + +clean-local: cargo-clean-chirp cxxbridge-clean-chirp clean-librustdeps-la + +.PHONY: cargo-build cargo-clean diff --git a/rust/Makefile.chirp.include b/rust/Makefile.chirp.include new file mode 100644 index 000000000000..44c5af3e49a7 --- /dev/null +++ b/rust/Makefile.chirp.include @@ -0,0 +1,49 @@ +# Copyright (c) 2016-2025 The Zcash developers +# Copyright (c) 2026 The Dash Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +LIBRUST_CHIRP_TARGET_DIR = $(abs_top_builddir)/rust/chirp/target +LIBRUST_CHIRP = $(LIBRUST_CHIRP_TARGET_DIR)/$(RUST_TARGET)/release/libchirp.a + +LIBRUST_CHIRP_CARGO_ENV = $(CARGO_ENV) CARGO_TARGET_DIR="$(LIBRUST_CHIRP_TARGET_DIR)" +LIBRUST_CHIRP_CRATE_DIR = $(top_srcdir)/rust/chirp +LIBRUST_CHIRP_GEN_DIR = $(abs_top_builddir)/rust/chirp/gen +LIBRUST_CHIRP_MANIFEST = $(LIBRUST_CHIRP_CRATE_DIR)/Cargo.toml +LIBRUST_CHIRP_CARGO_BUILD_OPTS = $(CARGO_BUILD_OPTS) --manifest-path $(LIBRUST_CHIRP_MANIFEST) + +LIBRUST_CHIRP_SRCS = \ + $(LIBRUST_CHIRP_CRATE_DIR)/src/lib.rs + +LIBRUST_CHIRP_BUILD = \ + $(LIBRUST_CHIRP_CRATE_DIR)/build.rs + +LIBRUST_CHIRP_CPP = \ + $(LIBRUST_CHIRP_GEN_DIR)/src/lib.cpp + +LIBRUST_CHIRP_H = \ + $(LIBRUST_CHIRP_GEN_DIR)/include/rust/chirp/lib.h + +LIBRUST_CHIRP_INCLUDES = \ + -I$(LIBRUST_CHIRP_GEN_DIR)/include + +$(LIBRUST_CHIRP_SRCS): ; + +$(LIBRUST_CHIRP_H) $(LIBRUST_CHIRP_CPP): $(LIBRUST_CHIRP_SRCS) + $(AM_V_at)$(MKDIR_P) $(@D) + $(AM_V_GEN)$(CXXBRIDGE) $< $(if $(filter %.h,$@),--header) -o $@ + +$(LIBRUST_CHIRP): $(LIBRUST_CHIRP_SRCS) $(LIBRUST_CHIRP_BUILD) $(LIBRUST_CHIRP_MANIFEST) + $(AM_V_GEN)$(LIBRUST_CHIRP_CARGO_ENV) $(CARGO) build $(LIBRUST_CHIRP_CARGO_BUILD_OPTS) + +cargo-build-chirp: $(LIBRUST_CHIRP) + +cargo-clean-chirp: + $(AM_V_at)rm -rf $(LIBRUST_CHIRP_TARGET_DIR) + +cxxbridge-clean-chirp: + $(AM_V_at)rm -rf $(LIBRUST_CHIRP_GEN_DIR) + +cxxbridge-chirp: $(LIBRUST_CHIRP_CPP) $(LIBRUST_CHIRP_H) + +.PHONY: cargo-build-chirp cargo-clean-chirp cxxbridge-chirp cxxbridge-clean-chirp diff --git a/rust/Makefile.libs.include b/rust/Makefile.libs.include new file mode 100644 index 000000000000..c943648e6dae --- /dev/null +++ b/rust/Makefile.libs.include @@ -0,0 +1,49 @@ +# Copyright (c) 2016-2025 The Zcash developers +# Copyright (c) 2026 The Dash Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +include $(top_srcdir)/rust/Makefile.chirp.include + +LIBRUSTDEPS_A = \ + $(LIBRUST_CHIRP) + +LIBRUSTDEPS_INCLUDES = \ + $(LIBRUST_CHIRP_INCLUDES) + +LIBRUSTDEPS_CPP = \ + $(LIBRUST_CHIRP_CPP) + +LIBRUSTDEPS_H = \ + $(LIBRUST_CHIRP_H) + +# Libtool wrapper +LIBRUSTDEPS = $(abs_top_builddir)/rust/librustdeps.la +LIBRUSTDEPS_LIBDIR = $(abs_top_builddir)/rust/.libs + +$(LIBRUSTDEPS): $(LIBRUSTDEPS_A) + $(AM_V_at)$(MKDIR_P) $(LIBRUSTDEPS_LIBDIR) + $(AM_V_at)rm -rf $(LIBRUSTDEPS_LIBDIR)/librustdeps.a $(LIBRUSTDEPS_LIBDIR)/objs + $(AM_V_at)$(MKDIR_P) $(LIBRUSTDEPS_LIBDIR)/objs + $(AM_V_at)for lib in $(LIBRUSTDEPS_A); do \ + cd $(LIBRUSTDEPS_LIBDIR)/objs && $(AR) -x $$lib; \ + done + $(AM_V_at)$(AR) crs $(LIBRUSTDEPS_LIBDIR)/librustdeps.a $(LIBRUSTDEPS_LIBDIR)/objs/*.o + $(AM_V_at)rm -rf $(LIBRUSTDEPS_LIBDIR)/objs + $(AM_V_at)$(RANLIB) $(LIBRUSTDEPS_LIBDIR)/librustdeps.a + $(AM_V_GEN)( \ + echo '# librustdeps.la - a libtool library file'; \ + echo '# Generated by Makefile.libs.include for libtool'; \ + echo "dlname=''"; \ + echo "library_names=''"; \ + echo "old_library='librustdeps.a'"; \ + echo "libdir='$(LIBRUSTDEPS_LIBDIR)'"; \ + echo "inherited_linker_flags=''"; \ + echo "installed=no"; \ + echo "shouldnotlink=no"; \ + ) > $@ + +clean-librustdeps-la: + rm -rf $(abs_top_builddir)/rust/.libs $(abs_top_builddir)/rust/librustdeps.la + +.PHONY: clean-librustdeps-la diff --git a/rust/chirp/build.rs b/rust/chirp/build.rs index 6840529bef3c..e57a97ad2171 100644 --- a/rust/chirp/build.rs +++ b/rust/chirp/build.rs @@ -1,5 +1,3 @@ fn main() { built::write_built_file().expect("Failed to write build info"); - cxx_build::bridge("src/lib.rs").compile("chirp"); - println!("cargo::rerun-if-changed=src/lib.rs"); } diff --git a/src/Makefile.am b/src/Makefile.am index 073e1461db77..fd9063a77862 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,5 +1,6 @@ # Copyright (c) 2013-2016 The Bitcoin Core developers -# Copyright (c) 2014-2018 The Dash Core developers +# Copyright (c) 2016-2025 The Zcash developers +# Copyright (c) 2014-2026 The Dash Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. @@ -7,6 +8,8 @@ print-%: FORCE @echo '$*'='$($*)' +include $(top_srcdir)/rust/Makefile.libs.include + DIST_SUBDIRS = secp256k1 AM_LDFLAGS = $(LIBTOOL_LDFLAGS) $(HARDENED_LDFLAGS) $(GPROF_LDFLAGS) $(SANITIZER_LDFLAGS) $(CORE_LDFLAGS) $(BACKTRACE_LDFLAGS) @@ -17,6 +20,7 @@ AM_CPPFLAGS = $(DEBUG_CPPFLAGS) $(HARDENED_CPPFLAGS) $(CORE_CPPFLAGS) AM_LIBTOOLFLAGS = --preserve-dup-deps PTHREAD_FLAGS = $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) EXTRA_LIBRARIES = +BUILT_SOURCES = $(LIBRUSTDEPS_H) lib_LTLIBRARIES = $(LIBBITCOINCONSENSUS) noinst_LTLIBRARIES = @@ -44,6 +48,7 @@ endif # ENABLE_STACKTRACES BITCOIN_INCLUDES=-I$(builddir) -I$(srcdir)/$(MINISKETCH_INCLUDE_DIR_INT) -I$(srcdir)/secp256k1/include -I$(srcdir)/$(UNIVALUE_INCLUDE_DIR_INT) $(LEVELDB_CPPFLAGS) BITCOIN_INCLUDES+=-isystem$(srcdir)/dashbls/include -isystem$(srcdir)/dashbls/depends/relic/include -isystem$(srcdir)/dashbls/depends/minialloc/include BITCOIN_INCLUDES+=-isystem$(srcdir)/immer +BITCOIN_INCLUDES+=$(LIBRUSTDEPS_INCLUDES) LIBBITCOIN_NODE=libbitcoin_node.a LIBBITCOIN_COMMON=libbitcoin_common.a @@ -109,6 +114,8 @@ $(LIBDASHBLS): $(LIBSECP256K1): $(wildcard secp256k1/src/*.h) $(wildcard secp256k1/src/*.c) $(wildcard secp256k1/include/*) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F) +LIBCXXBRIDGE=libcxxbridge.la + # Make is not made aware of per-object dependencies to avoid limiting building parallelization # But to build the less dependent modules first, we manually select their order here: EXTRA_LIBRARIES += \ @@ -122,6 +129,8 @@ EXTRA_LIBRARIES += \ $(LIBBITCOIN_WALLET_TOOL) \ $(LIBBITCOIN_ZMQ) +noinst_LTLIBRARIES += $(LIBCXXBRIDGE) + if BUILD_BITCOIND bin_PROGRAMS += dashd endif @@ -1053,9 +1062,11 @@ bitcoin_bin_ldadd = \ $(LIBDASHBLS) \ $(LIBLEVELDB) \ $(LIBMEMENV) \ - $(LIBSECP256K1) + $(LIBSECP256K1) \ + $(LIBCXXBRIDGE) \ + $(LIBRUSTDEPS) -bitcoin_bin_ldadd += $(BACKTRACE_LIBS) $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(SQLITE_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(ZMQ_LIBS) $(GMP_LIBS) +bitcoin_bin_ldadd += $(BACKTRACE_LIBS) $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(SQLITE_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(ZMQ_LIBS) $(GMP_LIBS) $(RUST_LIBS) dashd_SOURCES = $(bitcoin_daemon_sources) init/bitcoind.cpp dashd_CPPFLAGS = $(bitcoin_bin_cppflags) @@ -1084,8 +1095,10 @@ dash_cli_LDADD = \ $(LIBUNIVALUE) \ $(LIBBITCOIN_COMMON) \ $(LIBBITCOIN_UTIL) \ - $(LIBBITCOIN_CRYPTO) -dash_cli_LDADD += $(BACKTRACE_LIBS) $(EVENT_LIBS) $(GMP_LIBS) + $(LIBBITCOIN_CRYPTO) \ + $(LIBCXXBRIDGE) \ + $(LIBRUSTDEPS) +dash_cli_LDADD += $(BACKTRACE_LIBS) $(EVENT_LIBS) $(GMP_LIBS) $(RUST_LIBS) # # dash-tx binary # @@ -1105,9 +1118,11 @@ dash_tx_LDADD = \ $(LIBBITCOIN_CONSENSUS) \ $(LIBBITCOIN_CRYPTO) \ $(LIBDASHBLS) \ - $(LIBSECP256K1) + $(LIBSECP256K1) \ + $(LIBCXXBRIDGE) \ + $(LIBRUSTDEPS) -dash_tx_LDADD += $(BACKTRACE_LIBS) $(GMP_LIBS) +dash_tx_LDADD += $(BACKTRACE_LIBS) $(GMP_LIBS) $(RUST_LIBS) # # dash-wallet binary # @@ -1126,11 +1141,14 @@ dash_wallet_LDADD = \ $(LIBBITCOIN_CRYPTO) \ $(LIBDASHBLS) \ $(LIBSECP256K1) \ + $(LIBCXXBRIDGE) \ + $(LIBRUSTDEPS) \ $(BACKTRACE_LIBS) \ $(BOOST_LIBS) \ $(BDB_LIBS) \ $(SQLITE_LIBS) \ - $(GMP_LIBS) + $(GMP_LIBS) \ + $(RUST_LIBS) if TARGET_WINDOWS dash_wallet_SOURCES += dash-wallet-res.rc @@ -1154,9 +1172,11 @@ dash_util_LDADD = \ $(LIBBITCOIN_CONSENSUS) \ $(LIBBITCOIN_CRYPTO) \ $(LIBSECP256K1) \ + $(LIBCXXBRIDGE) \ + $(LIBRUSTDEPS) \ $(BACKTRACE_LIBS) -dash_util_LDADD += $(BOOST_LIBS) +dash_util_LDADD += $(BOOST_LIBS) $(RUST_LIBS) # # dashconsensus library # @@ -1165,7 +1185,7 @@ include_HEADERS = script/bitcoinconsensus.h libdashconsensus_la_SOURCES = support/cleanse.cpp $(crypto_libbitcoin_crypto_base_la_SOURCES) $(crypto_libbitcoin_crypto_sph_la_SOURCES) $(libbitcoin_consensus_a_SOURCES) libdashconsensus_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined $(RELDFLAGS) -libdashconsensus_la_LIBADD = $(LIBDASHBLS) $(LIBSECP256K1) $(GMP_LIBS) +libdashconsensus_la_LIBADD = $(LIBDASHBLS) $(LIBSECP256K1) $(LIBCXXBRIDGE) $(LIBRUSTDEPS) $(GMP_LIBS) $(RUST_LIBS) libdashconsensus_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(builddir)/obj -I$(srcdir)/secp256k1/include -DBUILD_BITCOIN_INTERNAL -DDISABLE_OPTIMIZED_SHA256 libdashconsensus_la_CPPFLAGS += -isystem$(srcdir)/dashbls/include -isystem$(srcdir)/dashbls/depends/relic/include -isystem$(srcdir)/dashbls/depends/minialloc/include libdashconsensus_la_CPPFLAGS += -isystem$(srcdir)/immer @@ -1174,6 +1194,15 @@ libdashconsensus_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) endif # +# CXX bridge library # +libcxxbridge_la_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(PIC_FLAGS) +libcxxbridge_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) $(PIC_FLAGS) -static +libcxxbridge_la_LDFLAGS = $(AM_LDFLAGS) -static +libcxxbridge_la_SOURCES = $(LIBRUSTDEPS_CPP) + +$(libcxxbridge_la_OBJECTS): $(LIBRUSTDEPS_H) +# + CTAES_DIST = crypto/ctaes/bench.c CTAES_DIST += crypto/ctaes/ctaes.c CTAES_DIST += crypto/ctaes/ctaes.h diff --git a/src/Makefile.bench.include b/src/Makefile.bench.include index be7bfe2d2dcc..2d74a9574315 100644 --- a/src/Makefile.bench.include +++ b/src/Makefile.bench.include @@ -75,12 +75,15 @@ bench_bench_dash_LDADD = \ $(LIBLEVELDB) \ $(LIBMEMENV) \ $(LIBSECP256K1) \ + $(LIBCXXBRIDGE) \ + $(LIBRUSTDEPS) \ $(LIBUNIVALUE) \ $(EVENT_PTHREADS_LIBS) \ $(EVENT_LIBS) \ $(MINIUPNPC_LIBS) \ $(NATPMP_LIBS) \ $(GMP_LIBS) \ + $(RUST_LIBS) \ $(BACKTRACE_LIBS) if ENABLE_ZMQ diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index 582f293ad853..86f173aa9b9e 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -419,8 +419,8 @@ if ENABLE_ZMQ bitcoin_qt_ldadd += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS) endif bitcoin_qt_ldadd += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBDASHBLS) $(LIBUNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \ - $(BACKTRACE_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(SQLITE_LIBS) $(LIBSECP256K1) \ - $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(GMP_LIBS) + $(BACKTRACE_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(SQLITE_LIBS) $(LIBSECP256K1) $(LIBCXXBRIDGE) $(LIBRUSTDEPS) \ + $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(GMP_LIBS) $(RUST_LIBS) bitcoin_qt_ldflags = $(LDFLAGS_WRAP_EXCEPTIONS) $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS) bitcoin_qt_libtoolflags = $(AM_LIBTOOLFLAGS) --tag CXX diff --git a/src/Makefile.qttest.include b/src/Makefile.qttest.include index 62071d40e5a5..535f466f26ec 100644 --- a/src/Makefile.qttest.include +++ b/src/Makefile.qttest.include @@ -60,8 +60,8 @@ qt_test_test_dash_qt_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS) endif qt_test_test_dash_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBDASHBLS) $(LIBUNIVALUE) $(LIBLEVELDB) \ $(LIBMEMENV) $(BACKTRACE_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QT_TEST_LIBS) \ - $(QR_LIBS) $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(SQLITE_LIBS) $(LIBSECP256K1) \ - $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(GMP_LIBS) + $(QR_LIBS) $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(SQLITE_LIBS) $(LIBSECP256K1) $(LIBCXXBRIDGE) $(LIBRUSTDEPS) \ + $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(GMP_LIBS) $(RUST_LIBS) qt_test_test_dash_qt_LDFLAGS = $(LDFLAGS_WRAP_EXCEPTIONS) $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS) qt_test_test_dash_qt_CXXFLAGS = $(AM_CXXFLAGS) $(QT_PIE_FLAGS) diff --git a/src/Makefile.test.include b/src/Makefile.test.include index dd6dda7178c3..8211363860d3 100644 --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -56,10 +56,13 @@ FUZZ_SUITE_LD_COMMON = \ $(LIBLEVELDB) \ $(LIBMEMENV) \ $(LIBSECP256K1) \ + $(LIBCXXBRIDGE) \ + $(LIBRUSTDEPS) \ $(MINISKETCH_LIBS) \ $(EVENT_LIBS) \ $(EVENT_PTHREADS_LIBS) \ $(GMP_LIBS) \ + $(RUST_LIBS) \ $(BACKTRACE_LIBS) if USE_UPNP @@ -257,10 +260,10 @@ test_test_dash_LDADD += $(LIBBITCOIN_WALLET) test_test_dash_CPPFLAGS += $(BDB_CPPFLAGS) endif test_test_dash_LDADD += $(LIBBITCOIN_NODE) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) \ - $(LIBDASHBLS) $(LIBLEVELDB) $(LIBMEMENV) $(BACKTRACE_LIBS) $(LIBSECP256K1) $(EVENT_LIBS) $(EVENT_PTHREADS_LIBS) $(MINISKETCH_LIBS) + $(LIBDASHBLS) $(LIBLEVELDB) $(LIBMEMENV) $(BACKTRACE_LIBS) $(LIBSECP256K1) $(LIBCXXBRIDGE) $(LIBRUSTDEPS) $(EVENT_LIBS) $(EVENT_PTHREADS_LIBS) $(MINISKETCH_LIBS) test_test_dash_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) -test_test_dash_LDADD += $(BDB_LIBS) $(MINIUPNPC_LIBS) $(SQLITE_LIBS) $(NATPMP_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(GMP_LIBS) +test_test_dash_LDADD += $(BDB_LIBS) $(MINIUPNPC_LIBS) $(SQLITE_LIBS) $(NATPMP_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(GMP_LIBS) $(RUST_LIBS) test_test_dash_LDFLAGS = $(LDFLAGS_WRAP_EXCEPTIONS) $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS) -static if ENABLE_ZMQ From 731cc7bb693c96ca06dd3226cac493e91fe79d85 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Fri, 16 Jan 2026 04:14:16 +0530 Subject: [PATCH 06/25] build: propagate SDK version to Rust compiler --- configure.ac | 11 +++++++++++ depends/Makefile | 1 + depends/config.site.in | 4 ++++ rust/Makefile.am | 1 + 4 files changed, 17 insertions(+) diff --git a/configure.ac b/configure.ac index cbfcf3637d6a..1384272391ba 100644 --- a/configure.ac +++ b/configure.ac @@ -1743,6 +1743,15 @@ case $host in ;; esac +RUST_MACOS_DEPLOYMENT_TARGET="" +case $host in + *darwin*) + AC_MSG_CHECKING([for target macOS version]) + RUST_MACOS_DEPLOYMENT_TARGET="${OSX_MIN_VERSION:-$(sw_vers -productVersion)}" + AC_MSG_RESULT([$RUST_MACOS_DEPLOYMENT_TARGET]) + ;; +esac + RUST_TARGET="" AC_MSG_CHECKING([for Rust target]) case $host in @@ -2056,6 +2065,7 @@ AC_SUBST(BITCOIN_MP_NODE_NAME) AC_SUBST(BITCOIN_MP_GUI_NAME) AC_SUBST(RUST_LIBS) +AC_SUBST(RUST_MACOS_DEPLOYMENT_TARGET) AC_SUBST(RUST_TARGET) AC_SUBST(RELDFLAGS) @@ -2210,4 +2220,5 @@ echo " CARGO_INCREMENTAL = $CARGO_INCREMENTAL" echo " CXXBRIDGE = $CXXBRIDGE" echo " RUSTC = $RUSTC" echo " RUSTFLAGS = $RUSTFLAGS" +echo " RUST_MACOS_DEPLOYMENT_TARGET = $RUST_MACOS_DEPLOYMENT_TARGET" echo diff --git a/depends/Makefile b/depends/Makefile index c8510f4cc010..3f76f049fc6c 100644 --- a/depends/Makefile +++ b/depends/Makefile @@ -239,6 +239,7 @@ $(host_prefix)/share/config.site : config.site.in $(host_prefix)/.stamp_$(final_ -e 's|@STRIP@|$(host_STRIP)|' \ -e 's|@OBJDUMP@|$(host_OBJDUMP)|' \ -e 's|@DSYMUTIL@|$(host_DSYMUTIL)|' \ + -e 's|@OSX_MIN_VERSION@|$(OSX_MIN_VERSION)|' \ -e 's|@WINDRES@|$(host_WINDRES)|' \ -e 's|@build_os@|$(build_os)|' \ -e 's|@host_os@|$(host_os)|' \ diff --git a/depends/config.site.in b/depends/config.site.in index 398a09b74c63..f5bf6312fdbb 100644 --- a/depends/config.site.in +++ b/depends/config.site.in @@ -129,6 +129,10 @@ if test "@host_os@" = darwin; then DSYMUTIL="@DSYMUTIL@" ac_cv_path_DSYMUTIL="${DSYMUTIL}" fi + + if test -n "@OSX_MIN_VERSION@"; then + OSX_MIN_VERSION="@OSX_MIN_VERSION@" + fi fi if test "@host_os@" = mingw32; then diff --git a/rust/Makefile.am b/rust/Makefile.am index fb6bd118813d..e86b3b636f06 100644 --- a/rust/Makefile.am +++ b/rust/Makefile.am @@ -10,6 +10,7 @@ CARGO_ENV = \ CFLAGS="$(CFLAGS)" \ CXX="$(CXX)" \ CXXFLAGS="$(CXXFLAGS)" \ + MACOSX_DEPLOYMENT_TARGET="$(RUST_MACOS_DEPLOYMENT_TARGET)" \ CARGO_INCREMENTAL="$(CARGO_INCREMENTAL)" \ RUSTC="$(RUSTC)" \ RUSTFLAGS="$(RUSTFLAGS)" \ From b36de5d3b81b0ad3d14f41208464f68c6b35c806 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Sun, 18 Jan 2026 09:23:15 +0530 Subject: [PATCH 07/25] build: propagate macOS SDK path to Rust compiler --- configure.ac | 16 ++++++++++++++++ depends/Makefile | 1 + depends/config.site.in | 4 ++++ rust/Makefile.am | 3 ++- 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 1384272391ba..48fb74b1a078 100644 --- a/configure.ac +++ b/configure.ac @@ -1774,6 +1774,20 @@ case $host in esac AC_MSG_RESULT([$RUST_TARGET]) +RUST_OSX_SDK="" +case $host in + *darwin*) + AC_MSG_CHECKING([for Xcode SDK]) + if test -z "$OSX_SDK"; then + if test "$cross_compiling" = "yes"; then + AC_MSG_ERROR([Cross-compilation requires OSX_SDK to be set to path of Xcode SDK, cannot continue!]) + fi + fi + RUST_OSX_SDK="${OSX_SDK:-$(xcrun --sdk macosx --show-sdk-path)}" + AC_MSG_RESULT([$RUST_OSX_SDK]) + ;; +esac + dnl check if libgmp is present TEMP_CPPFLAGS="$CPPFLAGS" TEMP_LDFLAGS="$LDFLAGS" @@ -2066,6 +2080,7 @@ AC_SUBST(BITCOIN_MP_GUI_NAME) AC_SUBST(RUST_LIBS) AC_SUBST(RUST_MACOS_DEPLOYMENT_TARGET) +AC_SUBST(RUST_OSX_SDK) AC_SUBST(RUST_TARGET) AC_SUBST(RELDFLAGS) @@ -2221,4 +2236,5 @@ echo " CXXBRIDGE = $CXXBRIDGE" echo " RUSTC = $RUSTC" echo " RUSTFLAGS = $RUSTFLAGS" echo " RUST_MACOS_DEPLOYMENT_TARGET = $RUST_MACOS_DEPLOYMENT_TARGET" +echo " RUST_OSX_SDK = $RUST_OSX_SDK" echo diff --git a/depends/Makefile b/depends/Makefile index 3f76f049fc6c..bc86d7243f53 100644 --- a/depends/Makefile +++ b/depends/Makefile @@ -240,6 +240,7 @@ $(host_prefix)/share/config.site : config.site.in $(host_prefix)/.stamp_$(final_ -e 's|@OBJDUMP@|$(host_OBJDUMP)|' \ -e 's|@DSYMUTIL@|$(host_DSYMUTIL)|' \ -e 's|@OSX_MIN_VERSION@|$(OSX_MIN_VERSION)|' \ + -e 's|@OSX_SDK@|$(OSX_SDK)|' \ -e 's|@WINDRES@|$(host_WINDRES)|' \ -e 's|@build_os@|$(build_os)|' \ -e 's|@host_os@|$(host_os)|' \ diff --git a/depends/config.site.in b/depends/config.site.in index f5bf6312fdbb..6fdad01f5624 100644 --- a/depends/config.site.in +++ b/depends/config.site.in @@ -133,6 +133,10 @@ if test "@host_os@" = darwin; then if test -n "@OSX_MIN_VERSION@"; then OSX_MIN_VERSION="@OSX_MIN_VERSION@" fi + + if test -n "@OSX_SDK@"; then + OSX_SDK="@OSX_SDK@" + fi fi if test "@host_os@" = mingw32; then diff --git a/rust/Makefile.am b/rust/Makefile.am index e86b3b636f06..b8e7a98b038e 100644 --- a/rust/Makefile.am +++ b/rust/Makefile.am @@ -14,7 +14,8 @@ CARGO_ENV = \ CARGO_INCREMENTAL="$(CARGO_INCREMENTAL)" \ RUSTC="$(RUSTC)" \ RUSTFLAGS="$(RUSTFLAGS)" \ - TERM="dumb" + TERM="dumb" \ + ${RUST_OSX_SDK+SDKROOT="$(RUST_OSX_SDK)"} if !SILENT_RULES CARGO_BUILD_OPTS += --verbose From 972bf2e30bde4e02dd99c11d908195515a0c34b1 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Fri, 16 Jan 2026 16:00:33 +0530 Subject: [PATCH 08/25] build: use debug profile for Rust components if `--enable-debug` set --- configure.ac | 1 + rust/Makefile.am | 6 +++++- rust/Makefile.chirp.include | 2 +- rust/Makefile.libs.include | 6 ++++++ 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 48fb74b1a078..c5bccc9d2b8b 100644 --- a/configure.ac +++ b/configure.ac @@ -301,6 +301,7 @@ AC_ARG_ENABLE([debug], [use compiler flags and macros suited for debugging (default is no)])], [enable_debug=$enableval], [enable_debug=no]) +AM_CONDITIONAL([ENABLE_DEBUG], [test "$enable_debug" = "yes"]) dnl Enable exception stacktraces AC_ARG_ENABLE([stacktraces], diff --git a/rust/Makefile.am b/rust/Makefile.am index b8e7a98b038e..54ea8c1741f3 100644 --- a/rust/Makefile.am +++ b/rust/Makefile.am @@ -3,7 +3,7 @@ # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. -CARGO_BUILD_OPTS = --release --locked --target $(RUST_TARGET) +CARGO_BUILD_OPTS = --locked --target $(RUST_TARGET) CARGO_ENV = \ AR="$(AR)" \ CC="$(CC)" \ @@ -17,6 +17,10 @@ CARGO_ENV = \ TERM="dumb" \ ${RUST_OSX_SDK+SDKROOT="$(RUST_OSX_SDK)"} +if !ENABLE_DEBUG +CARGO_BUILD_OPTS += --release +endif # !ENABLE_DEBUG + if !SILENT_RULES CARGO_BUILD_OPTS += --verbose endif # !SILENT_RULES diff --git a/rust/Makefile.chirp.include b/rust/Makefile.chirp.include index 44c5af3e49a7..8e575a1c9704 100644 --- a/rust/Makefile.chirp.include +++ b/rust/Makefile.chirp.include @@ -4,7 +4,7 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. LIBRUST_CHIRP_TARGET_DIR = $(abs_top_builddir)/rust/chirp/target -LIBRUST_CHIRP = $(LIBRUST_CHIRP_TARGET_DIR)/$(RUST_TARGET)/release/libchirp.a +LIBRUST_CHIRP = $(LIBRUST_CHIRP_TARGET_DIR)/$(RUST_TARGET)/$(CARGO_PROFILE)/libchirp.a LIBRUST_CHIRP_CARGO_ENV = $(CARGO_ENV) CARGO_TARGET_DIR="$(LIBRUST_CHIRP_TARGET_DIR)" LIBRUST_CHIRP_CRATE_DIR = $(top_srcdir)/rust/chirp diff --git a/rust/Makefile.libs.include b/rust/Makefile.libs.include index c943648e6dae..0d0fa898388a 100644 --- a/rust/Makefile.libs.include +++ b/rust/Makefile.libs.include @@ -3,6 +3,12 @@ # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. +if ENABLE_DEBUG +CARGO_PROFILE=debug +else +CARGO_PROFILE=release +endif + include $(top_srcdir)/rust/Makefile.chirp.include LIBRUSTDEPS_A = \ From 778b92437f4638f4c26949304630fb269cc177a0 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Sat, 17 Jan 2026 16:21:39 +0530 Subject: [PATCH 09/25] build: propagate target build variables to Rust components Co-authored-by: pasta --- rust/Makefile.am | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/rust/Makefile.am b/rust/Makefile.am index 54ea8c1741f3..70ca06dfb9cc 100644 --- a/rust/Makefile.am +++ b/rust/Makefile.am @@ -4,12 +4,20 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. CARGO_BUILD_OPTS = --locked --target $(RUST_TARGET) + +# 'cc' needs preserved case +RUST_TARGET_ENV_LOWER = $(shell echo '$(RUST_TARGET)' | tr '-' '_') CARGO_ENV = \ AR="$(AR)" \ + AR_$(RUST_TARGET_ENV_LOWER)="$(AR)" \ CC="$(CC)" \ + CC_$(RUST_TARGET_ENV_LOWER)="$(CC)" \ CFLAGS="$(CFLAGS)" \ + CFLAGS_$(RUST_TARGET_ENV_LOWER)="$(CFLAGS)" \ CXX="$(CXX)" \ + CXX_$(RUST_TARGET_ENV_LOWER)="$(CXX)" \ CXXFLAGS="$(CXXFLAGS)" \ + CXXFLAGS_$(RUST_TARGET_ENV_LOWER)="$(CXXFLAGS)" \ MACOSX_DEPLOYMENT_TARGET="$(RUST_MACOS_DEPLOYMENT_TARGET)" \ CARGO_INCREMENTAL="$(CARGO_INCREMENTAL)" \ RUSTC="$(RUSTC)" \ From c45e735d1af0c80663faf7738eea56f347637917 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Fri, 23 Jan 2026 01:07:43 +0530 Subject: [PATCH 10/25] build: propagate host build variables to Rust components Needed for cross-compilation to work correctly --- configure.ac | 90 +++++++++++++++++++++++++++-------- contrib/guix/libexec/build.sh | 5 ++ depends/Makefile | 3 ++ depends/config.site.in | 11 +++++ rust/Makefile.am | 31 +++++++----- 5 files changed, 109 insertions(+), 31 deletions(-) diff --git a/configure.ac b/configure.ac index c5bccc9d2b8b..660054269fb1 100644 --- a/configure.ac +++ b/configure.ac @@ -47,6 +47,7 @@ if test "${ARFLAGS+set}" != "set"; then ARFLAGS="cr" fi +AC_CANONICAL_BUILD AC_CANONICAL_HOST AH_TOP([#ifndef DASH_CONFIG_H]) @@ -1753,26 +1754,30 @@ case $host in ;; esac -RUST_TARGET="" +AC_DEFUN([RS_SET_TRIPLE], [ + case $2 in + x86_64-*-freebsd*) $1="x86_64-unknown-freebsd" ;; + aarch64-*-linux*|arm64-*-linux*) + $1="aarch64-unknown-linux-gnu" ;; + arm-*-linux*) $1="armv7-unknown-linux-gnueabihf" ;; + powerpc64-*-linux*) $1="powerpc64-unknown-linux-gnu" ;; + powerpc64le-*-linux*) $1="powerpc64le-unknown-linux-gnu" ;; + riscv64-*-linux*) $1="riscv64gc-unknown-linux-gnu" ;; + x86_64-*-linux*) $1="x86_64-unknown-linux-gnu" ;; + x86_64-*-darwin*) $1="x86_64-apple-darwin" ;; + aarch64-*-darwin*|arm64-*-darwin*) + $1="aarch64-apple-darwin" ;; + x86_64-*-mingw*) $1="x86_64-pc-windows-gnu" ;; + *) $1="" ;; + esac +]) + AC_MSG_CHECKING([for Rust target]) -case $host in - x86_64-*-freebsd*) RUST_TARGET="x86_64-unknown-freebsd" ;; - aarch64-*-linux*|arm64-*-linux*) - RUST_TARGET="aarch64-unknown-linux-gnu" ;; - arm-*-linux*) RUST_TARGET="armv7-unknown-linux-gnueabihf" ;; - powerpc64-*-linux*) RUST_TARGET="powerpc64-unknown-linux-gnu" ;; - powerpc64le-*-linux*) RUST_TARGET="powerpc64le-unknown-linux-gnu" ;; - riscv64-*-linux*) RUST_TARGET="riscv64gc-unknown-linux-gnu" ;; - x86_64-*-linux*) RUST_TARGET="x86_64-unknown-linux-gnu" ;; - x86_64-*-darwin*) RUST_TARGET="x86_64-apple-darwin" ;; - aarch64-*-darwin*|arm64-*-darwin*) - RUST_TARGET="aarch64-apple-darwin" ;; - x86_64-*-mingw*) RUST_TARGET="x86_64-pc-windows-gnu" ;; - *) - AC_MSG_RESULT([unknown]) - AC_MSG_ERROR([Unsupported host for Rust: $host]) - ;; -esac +RS_SET_TRIPLE([RUST_TARGET], [$host]) +if test "$RUST_TARGET" = ""; then + AC_MSG_RESULT([unknown]) + AC_MSG_ERROR([Unsupported target for Rust: $host]) +fi AC_MSG_RESULT([$RUST_TARGET]) RUST_OSX_SDK="" @@ -1789,6 +1794,44 @@ case $host in ;; esac +AC_MSG_CHECKING([for Rust host]) +RS_SET_TRIPLE([RUST_NATIVE], [$build]) +if test "$RUST_NATIVE" = ""; then + if test "$cross_compiling" = "yes"; then + AC_MSG_RESULT([unknown]) + AC_MSG_ERROR([Unsupported host for Rust: $build]) + fi + RUST_NATIVE="$RUST_TARGET" +fi +AC_MSG_RESULT([$RUST_NATIVE]) + +AC_MSG_CHECKING([for host archiver]) +if test -z "$NATIVE_AR"; then + if test "$cross_compiling" = "yes"; then + AC_MSG_ERROR([Cross-compilation requires NATIVE_AR to be set to host archiver, cannot continue!]) + fi + NATIVE_AR="$AR" +fi +AC_MSG_RESULT([$NATIVE_AR]) + +AC_MSG_CHECKING([for host C compiler]) +if test -z "$NATIVE_CC"; then + if test "$cross_compiling" = "yes"; then + AC_MSG_ERROR([Cross-compilation requires NATIVE_CC to be set to host C compiler, cannot continue!]) + fi + NATIVE_CC="$CC" +fi +AC_MSG_RESULT([$NATIVE_CC]) + +AC_MSG_CHECKING([for host C++ compiler]) +if test -z "$NATIVE_CXX"; then + if test "$cross_compiling" = "yes"; then + AC_MSG_ERROR([Cross-compilation requires NATIVE_CXX to be set to host C++ compiler, cannot continue!]) + fi + NATIVE_CXX="$CXX" +fi +AC_MSG_RESULT([$NATIVE_CXX]) + dnl check if libgmp is present TEMP_CPPFLAGS="$CPPFLAGS" TEMP_LDFLAGS="$LDFLAGS" @@ -2079,8 +2122,12 @@ AC_SUBST(BITCOIN_WALLET_TOOL_NAME) AC_SUBST(BITCOIN_MP_NODE_NAME) AC_SUBST(BITCOIN_MP_GUI_NAME) +AC_SUBST(NATIVE_AR) +AC_SUBST(NATIVE_CC) +AC_SUBST(NATIVE_CXX) AC_SUBST(RUST_LIBS) AC_SUBST(RUST_MACOS_DEPLOYMENT_TARGET) +AC_SUBST(RUST_NATIVE) AC_SUBST(RUST_OSX_SDK) AC_SUBST(RUST_TARGET) @@ -2234,8 +2281,13 @@ echo echo " CARGO = $CARGO" echo " CARGO_INCREMENTAL = $CARGO_INCREMENTAL" echo " CXXBRIDGE = $CXXBRIDGE" +echo " NATIVE_AR = $NATIVE_AR" +echo " NATIVE_CC = $NATIVE_CC" +echo " NATIVE_CXX = $NATIVE_CXX" echo " RUSTC = $RUSTC" echo " RUSTFLAGS = $RUSTFLAGS" echo " RUST_MACOS_DEPLOYMENT_TARGET = $RUST_MACOS_DEPLOYMENT_TARGET" +echo " RUST_NATIVE = $RUST_NATIVE" echo " RUST_OSX_SDK = $RUST_OSX_SDK" +echo " RUST_TARGET = $RUST_TARGET" echo diff --git a/contrib/guix/libexec/build.sh b/contrib/guix/libexec/build.sh index 8c517368d17a..c5db880776ae 100755 --- a/contrib/guix/libexec/build.sh +++ b/contrib/guix/libexec/build.sh @@ -243,6 +243,11 @@ case "$HOST" in *linux*) HOST_LDFLAGS+=" -static-libstdc++ -static-libgcc" ;; esac +case "$HOST" in + *darwin*) export NATIVE_AR="llvm-ar" NATIVE_CC="clang" NATIVE_CXX="clang++" ;; + *) export NATIVE_AR="ar" NATIVE_CC="gcc" NATIVE_CXX="g++" ;; +esac + mkdir -p "$DISTSRC" ( cd "$DISTSRC" diff --git a/depends/Makefile b/depends/Makefile index bc86d7243f53..8c3b0dc4362a 100644 --- a/depends/Makefile +++ b/depends/Makefile @@ -232,8 +232,11 @@ $(host_prefix)/share/config.site : config.site.in $(host_prefix)/.stamp_$(final_ @mkdir -p $(@D) sed -e 's|@HOST@|$(host)|' \ -e 's|@CC@|$(host_CC)|' \ + -e 's|@NATIVE_CC@|$(build_CC)|' \ -e 's|@CXX@|$(host_CXX)|' \ + -e 's|@NATIVE_CXX@|$(build_CXX)|' \ -e 's|@AR@|$(host_AR)|' \ + -e 's|@NATIVE_AR@|$(build_AR)|' \ -e 's|@RANLIB@|$(host_RANLIB)|' \ -e 's|@NM@|$(host_NM)|' \ -e 's|@STRIP@|$(host_STRIP)|' \ diff --git a/depends/config.site.in b/depends/config.site.in index 6fdad01f5624..f27691228ab1 100644 --- a/depends/config.site.in +++ b/depends/config.site.in @@ -95,14 +95,25 @@ LDFLAGS="-L${depends_prefix}/lib ${LDFLAGS}" if test -n "@CC@" -a -z "${CC}"; then CC="@CC@" fi +if test -n "@NATIVE_CC@" -a -z "${NATIVE_CC}"; then + NATIVE_CC="@NATIVE_CC@" +fi + if test -n "@CXX@" -a -z "${CXX}"; then CXX="@CXX@" fi +if test -n "@NATIVE_CXX@" -a -z "${NATIVE_CXX}"; then + NATIVE_CXX="@NATIVE_CXX@" +fi if test -n "@AR@"; then AR="@AR@" ac_cv_path_AR="${AR}" fi +if test -n "@NATIVE_AR@"; then + NATIVE_AR="@NATIVE_AR@" + ac_cv_path_NATIVE_AR="${NATIVE_AR}" +fi if test -n "@RANLIB@"; then RANLIB="@RANLIB@" diff --git a/rust/Makefile.am b/rust/Makefile.am index 70ca06dfb9cc..5c2dca765026 100644 --- a/rust/Makefile.am +++ b/rust/Makefile.am @@ -4,26 +4,33 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. CARGO_BUILD_OPTS = --locked --target $(RUST_TARGET) +CARGO_ENV = \ + MACOSX_DEPLOYMENT_TARGET="$(RUST_MACOS_DEPLOYMENT_TARGET)" \ + CARGO_INCREMENTAL="$(CARGO_INCREMENTAL)" \ + RUSTC="$(RUSTC)" \ + RUSTFLAGS="$(RUSTFLAGS)" \ + TERM="dumb" \ + ${RUST_OSX_SDK+SDKROOT="$(RUST_OSX_SDK)"} + +# 'cargo' needs uppercase +RUST_NATIVE_ENV_UPPER = $(shell echo '$(RUST_NATIVE)' | tr 'a-z-' 'A-Z_') +CARGO_ENV += \ + AR="$(NATIVE_AR)" \ + CC="$(NATIVE_CC)" \ + CXX="$(NATIVE_CXX)" \ + CARGO_TARGET_$(RUST_NATIVE_ENV_UPPER)_LINKER="$(NATIVE_CC)" # 'cc' needs preserved case RUST_TARGET_ENV_LOWER = $(shell echo '$(RUST_TARGET)' | tr '-' '_') -CARGO_ENV = \ - AR="$(AR)" \ +# 'cargo' needs uppercase +RUST_TARGET_ENV_UPPER = $(shell echo '$(RUST_TARGET_ENV_LOWER)' | tr 'a-z' 'A-Z') +CARGO_ENV += \ AR_$(RUST_TARGET_ENV_LOWER)="$(AR)" \ - CC="$(CC)" \ CC_$(RUST_TARGET_ENV_LOWER)="$(CC)" \ - CFLAGS="$(CFLAGS)" \ CFLAGS_$(RUST_TARGET_ENV_LOWER)="$(CFLAGS)" \ - CXX="$(CXX)" \ CXX_$(RUST_TARGET_ENV_LOWER)="$(CXX)" \ - CXXFLAGS="$(CXXFLAGS)" \ CXXFLAGS_$(RUST_TARGET_ENV_LOWER)="$(CXXFLAGS)" \ - MACOSX_DEPLOYMENT_TARGET="$(RUST_MACOS_DEPLOYMENT_TARGET)" \ - CARGO_INCREMENTAL="$(CARGO_INCREMENTAL)" \ - RUSTC="$(RUSTC)" \ - RUSTFLAGS="$(RUSTFLAGS)" \ - TERM="dumb" \ - ${RUST_OSX_SDK+SDKROOT="$(RUST_OSX_SDK)"} + CARGO_TARGET_$(RUST_TARGET_ENV_UPPER)_LINKER="$(CC)" if !ENABLE_DEBUG CARGO_BUILD_OPTS += --release From 62c01c71131463da31c60dff0179c3ae8c6c9a5f Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Fri, 16 Jan 2026 02:53:18 +0530 Subject: [PATCH 11/25] debug: Add log that validates successful FFI invocation at init This can be removed alongside the whole minimal crate when we have actual crates to slot in. --- src/init.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/init.cpp b/src/init.cpp index f97d98f8a766..cbf74b97bb60 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -112,6 +112,8 @@ #include #endif // ENABLE_WALLET +#include + #include #include #include @@ -1506,6 +1508,8 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) return false; } + LogPrintf("%s\n", std::string(chirp::chirp())); + LogPrintf("Using at most %i automatic connections (%i file descriptors available)\n", nMaxConnections, nFD); // Warn about relative -datadir path. From 19a15a86aabc7bc8c989cf09e38005efced335d4 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Fri, 6 Feb 2026 15:54:51 +0530 Subject: [PATCH 12/25] depends: integrate Rust and `cxxbridge` into depends --- contrib/devtools/update-native-cxxbridge.py | 148 +++++ contrib/devtools/update-rust-hashes.py | 124 +++++ depends/Makefile | 1 + depends/config.site.in | 10 + depends/funcs.mk | 12 + depends/packages/native_cxxbridge.mk | 28 + depends/packages/native_rust.mk | 105 ++++ depends/packages/packages.mk | 4 +- depends/packages/rustcxx.mk | 15 + depends/patches/native_cxxbridge/Cargo.lock | 584 ++++++++++++++++++++ 10 files changed, 1030 insertions(+), 1 deletion(-) create mode 100755 contrib/devtools/update-native-cxxbridge.py create mode 100755 contrib/devtools/update-rust-hashes.py create mode 100644 depends/packages/native_cxxbridge.mk create mode 100644 depends/packages/native_rust.mk create mode 100644 depends/packages/rustcxx.mk create mode 100644 depends/patches/native_cxxbridge/Cargo.lock diff --git a/contrib/devtools/update-native-cxxbridge.py b/contrib/devtools/update-native-cxxbridge.py new file mode 100755 index 000000000000..2f6df4dd1c56 --- /dev/null +++ b/contrib/devtools/update-native-cxxbridge.py @@ -0,0 +1,148 @@ +#!/usr/bin/env python3 +# Copyright (c) 2026 The Dash Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +import hashlib +import os +import re +import shutil +import subprocess +import sys +import tarfile +import tempfile +import urllib.request +from pathlib import Path + + +def get_version(makefile_path: Path) -> str: + content = makefile_path.read_text() + match = re.search(r"\$\(package\)_version:=(.+)", content) + if not match: + raise RuntimeError(f"Could not find version in {makefile_path.name}") + return match.group(1).strip() + + +def download_and_hash(url: str, dest: Path) -> str: + hasher = hashlib.sha256() + if dest.exists(): + print(f" Using existing {dest.name}") + with open(dest, "rb") as f: + while chunk := f.read(8192): + hasher.update(chunk) + return hasher.hexdigest() + + print(f" Downloading {dest.name}") + dest.parent.mkdir(parents=True, exist_ok=True) + with urllib.request.urlopen(url) as response: + with open(dest, "wb") as f: + while chunk := response.read(8192): + hasher.update(chunk) + f.write(chunk) + return hasher.hexdigest() + + +def write_stamp(stamps_dir: Path, pkg: str, version: str, sha256: str, file_name: str) -> None: + stamps_dir.mkdir(parents=True, exist_ok=True) + stamp_path = stamps_dir / f".stamp_fetched-{pkg}-{version}-{sha256}.hash" + stamp_path.write_text(f"{sha256} {file_name}\n") + + +def update_hash_in_file(makefile_path: Path, pattern: str, new_hash: str) -> None: + content = makefile_path.read_text() + regex = re.compile(rf"^(\$\(package\)_{pattern}:=).*$", re.MULTILINE) + if not regex.search(content): + raise RuntimeError(f"Could not find {pattern} in {makefile_path.name}") + new_content = regex.sub(rf"\g<1>{new_hash}", content) + makefile_path.write_text(new_content) + + +def main() -> int: + script_dir = Path(__file__).resolve().parent + repo_root = (script_dir / "../..").resolve() + + makefile_path = repo_root / "depends/packages/native_cxxbridge.mk" + if not makefile_path.exists(): + print(f"Error: {makefile_path} not found", file=sys.stderr) + return 1 + + version = get_version(makefile_path) + print(f"cxx version: {version}") + + # Download tarball and compute hash + sources_dir = repo_root / "depends/sources" + stamps_dir = sources_dir / "download-stamps" + file_name = f"native_cxxbridge-{version}.tar.gz" + tarball_path = sources_dir / file_name + url = f"https://github.com/dtolnay/cxx/archive/refs/tags/{version}.tar.gz" + + hash_value = download_and_hash(url, tarball_path) + print(f"sha256: {hash_value}") + + # Update hash in makefile + update_hash_in_file(makefile_path, "sha256_hash", hash_value) + print(f"Updated sha256_hash in {makefile_path.name}") + + # Write stamp + write_stamp(stamps_dir, "native_cxxbridge", version, hash_value, file_name) + print(f"Wrote stamp for {file_name}") + + # Generate Cargo.lock + toolchain_path = repo_root / "rust-toolchain.toml" + if not toolchain_path.exists(): + print(f"Error: {toolchain_path} not found", file=sys.stderr) + return 1 + + with tempfile.TemporaryDirectory() as tmp_dir: + tmp_path = Path(tmp_dir) + print(f"Working in {tmp_path}") + + # Copy rust-toolchain.toml + shutil.copy(toolchain_path, tmp_path / "rust-toolchain.toml") + + # Extract tarball + print(f"Extracting {tarball_path}") + with tarfile.open(tarball_path, "r:gz") as tar: + tmp_path_real = os.path.realpath(tmp_path) + for member in tar.getmembers(): + member_dest = os.path.join(tmp_path, member.name) + if not os.path.realpath(member_dest).startswith(tmp_path_real + os.sep): + print(f"Error: Path traversal detected in tarball '{member.name}'") + return 1 + tar.extract(member, tmp_path) + + cxx_dir = tmp_path / f"cxx-{version}" + if not cxx_dir.exists(): + print(f"Error: Expected directory {cxx_dir} not found after extraction", file=sys.stderr) + return 1 + + # Copy rust-toolchain.toml into cxx directory + shutil.copy(toolchain_path, cxx_dir / "rust-toolchain.toml") + + # Run 'cargo check' + print("Running cargo check --release --package=cxxbridge-cmd --bin=cxxbridge") + result = subprocess.run( + ["cargo", "check", "--release", "--package=cxxbridge-cmd", "--bin=cxxbridge"], + cwd=cxx_dir, + ) + if result.returncode != 0: + print("Error: cargo check failed", file=sys.stderr) + return 1 + + # Copy Cargo.lock to patches directory + cargo_lock_src = cxx_dir / "Cargo.lock" + cargo_lock_dst = repo_root / "depends/patches/native_cxxbridge/Cargo.lock" + if not cargo_lock_src.exists(): + print(f"Error: {cargo_lock_src} not found after cargo check", file=sys.stderr) + return 1 + + cargo_lock_dst.parent.mkdir(parents=True, exist_ok=True) + shutil.copy(cargo_lock_src, cargo_lock_dst) + print(f"Copied Cargo.lock to {cargo_lock_dst}") + + print("\nDone!") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/contrib/devtools/update-rust-hashes.py b/contrib/devtools/update-rust-hashes.py new file mode 100755 index 000000000000..9f7ceca02b4c --- /dev/null +++ b/contrib/devtools/update-rust-hashes.py @@ -0,0 +1,124 @@ +#!/usr/bin/env python3 +# Copyright (c) 2021-2022 The Zcash developers +# Copyright (c) 2026 The Dash Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +import hashlib +import re +import sys +import urllib.request +from pathlib import Path + + +# Corresponds to 'hosts/*.mk' +CROSS_TARGETS = [ + # FreeBSD + "x86_64-unknown-freebsd", + # Linux + "aarch64-unknown-linux-gnu", + "armv7-unknown-linux-gnueabihf", + "powerpc64le-unknown-linux-gnu", + "riscv64gc-unknown-linux-gnu", + "x86_64-unknown-linux-gnu", + # Windows + "x86_64-pc-windows-gnu", + # macOS + "aarch64-apple-darwin", + "x86_64-apple-darwin", +] + + +# Corresponds to 'builders/*.mk' +NATIVE_TARGETS = [ + # FreeBSD + ("x86_64-unknown-freebsd", "x86_64_freebsd"), + # Linux + ("aarch64-unknown-linux-gnu", "aarch64_linux"), + ("x86_64-unknown-linux-gnu", "x86_64_linux"), + # macOS + ("aarch64-apple-darwin", "aarch64_darwin"), + ("x86_64-apple-darwin", "x86_64_darwin"), +] + + +def get_version(makefile_path: Path) -> str: + content = makefile_path.read_text() + match = re.search(r"\$\(package\)_version:=(.+)", content) + if not match: + raise RuntimeError(f"Could not find version in {makefile_path.name}") + return match.group(1).strip() + + +def download_and_hash(url: str, dest: Path) -> str: + hasher = hashlib.sha256() + if dest.exists(): + print(f" Using existing {dest.name}") + with open(dest, "rb") as f: + while chunk := f.read(8192): + hasher.update(chunk) + return hasher.hexdigest() + + print(f" Downloading {dest.name}") + dest.parent.mkdir(parents=True, exist_ok=True) + with urllib.request.urlopen(url) as response: + with open(dest, "wb") as f: + while chunk := response.read(8192): + hasher.update(chunk) + f.write(chunk) + return hasher.hexdigest() + + +def write_stamp(stamps_dir: Path, pkg: str, version: str, sha256: str, file_name: str) -> None: + stamps_dir.mkdir(parents=True, exist_ok=True) + stamp_path = stamps_dir / f".stamp_fetched-{pkg}-{version}-{sha256}.hash" + stamp_path.write_text(f"{sha256} {file_name}\n") + + +def update_hash_in_file(makefile_path: Path, pattern: str, new_hash: str) -> None: + content = makefile_path.read_text() + regex = re.compile(rf"^(\$\(package\)_{pattern}:=).*$", re.MULTILINE) + if not regex.search(content): + raise RuntimeError(f"Could not find {pattern} in {makefile_path.name}") + new_content = regex.sub(rf"\g<1>{new_hash}", content) + makefile_path.write_text(new_content) + + +def main() -> int: + script_dir = Path(__file__).resolve().parent + depends_dir = (script_dir / "../../depends").resolve() + makefile_path = depends_dir / "packages/native_rust.mk" + sources_dir = depends_dir / "sources" + stamps_dir = sources_dir / "download-stamps" + + if not makefile_path.exists(): + print(f"Error: {makefile_path} not found", file=sys.stderr) + return 1 + + rust_version = get_version(makefile_path) + + print(f"Rust version: {rust_version}\n") + print("Updating native compiler hashes:") + + for rust_target, makefile_id in NATIVE_TARGETS: + file_name = f"rust-{rust_version}-{rust_target}.tar.gz" + url = f"https://static.rust-lang.org/dist/{file_name}" + hash_value = download_and_hash(url, sources_dir / file_name) + update_hash_in_file(makefile_path, f"sha256_hash_{makefile_id}", hash_value) + write_stamp(stamps_dir, "native_rust", rust_version, hash_value, file_name) + print(f" Updated sha256_hash_{makefile_id}") + + for rust_target in CROSS_TARGETS: + file_name = f"rust-std-{rust_version}-{rust_target}.tar.gz" + url = f"https://static.rust-lang.org/dist/{file_name}" + hash_value = download_and_hash(url, sources_dir / file_name) + update_hash_in_file(makefile_path, f"rust_std_sha256_hash_{rust_target}", hash_value) + write_stamp(stamps_dir, "native_rust", rust_version, hash_value, file_name) + print(f" Updated rust_std_sha256_hash_{rust_target}") + + print("\nDone!") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/depends/Makefile b/depends/Makefile index 8c3b0dc4362a..ff7b7bf98c64 100644 --- a/depends/Makefile +++ b/depends/Makefile @@ -179,6 +179,7 @@ usdt_packages_$(NO_USDT) = $(usdt_$(host_os)_packages) packages += $($(host_arch)_$(host_os)_packages) $($(host_os)_packages) $(boost_packages_) $(libevent_packages_) $(qt_packages_) $(wallet_packages_) $(upnp_packages_) $(natpmp_packages_) $(usdt_packages_) native_packages += $($(host_arch)_$(host_os)_native_packages) $($(host_os)_native_packages) +native_packages += $(rust_native_packages) ifneq ($(zmq_packages_),) packages += $(zmq_packages) diff --git a/depends/config.site.in b/depends/config.site.in index f27691228ab1..6eb88d8aaeb1 100644 --- a/depends/config.site.in +++ b/depends/config.site.in @@ -173,3 +173,13 @@ fi if test -n "@LDFLAGS@"; then LDFLAGS="@LDFLAGS@ ${LDFLAGS}" fi + +if test -x "${depends_prefix}/native/bin/cargo"; then + CARGO="${depends_prefix}/native/bin/cargo" +fi +if test -x "${depends_prefix}/native/bin/rustc"; then + RUSTC="${depends_prefix}/native/bin/rustc" +fi +if test -x "${depends_prefix}/native/bin/cxxbridge"; then + CXXBRIDGE="${depends_prefix}/native/bin/cxxbridge" +fi diff --git a/depends/funcs.mk b/depends/funcs.mk index ec514600b7fb..e0cc1153316c 100644 --- a/depends/funcs.mk +++ b/depends/funcs.mk @@ -195,6 +195,18 @@ $(1)_cmake += -DCMAKE_C_COMPILER_TARGET=$(host) $(1)_cmake += -DCMAKE_CXX_COMPILER_TARGET=$(host) endif endif + +$(1)_cargo=env CC="$$($(1)_cc)" \ + CXX="$$($(1)_cxx)" \ + CFLAGS="$$($(1)_cppflags) $$($(1)_cflags)" \ + CXXFLAGS="$$($(1)_cppflags) $$($(1)_cxxflags)" \ + LDFLAGS="$$($(1)_ldflags)" \ + RUSTFLAGS="-C linker=$$(firstword $($(1)_cc))" \ + LD_LIBRARY_PATH="$$($($(1)_type)_prefix)/lib" +ifeq ($(host_os),darwin) +$(1)_cargo += SDKROOT="$(OSX_SDK)" +endif +$(1)_cargo += cargo endef define int_add_cmds diff --git a/depends/packages/native_cxxbridge.mk b/depends/packages/native_cxxbridge.mk new file mode 100644 index 000000000000..ca3580c38dff --- /dev/null +++ b/depends/packages/native_cxxbridge.mk @@ -0,0 +1,28 @@ +# Copyright (c) 2022-2025 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +# To update the package, change the version below and then run the script +# ./contrib/devtools/update-native-cxxbridge.py + +package:=native_cxxbridge +$(package)_version:=1.0.192 +$(package)_download_path:=https://github.com/dtolnay/cxx/archive/refs/tags +$(package)_file_name:=native_cxxbridge-$($(package)_version).tar.gz +$(package)_download_file:=$($(package)_version).tar.gz +$(package)_sha256_hash:=d242dbfb6deb362c5a95fcb69aeb5f25228de75af3cced94c9f6c8e11019d30e +$(package)_build_subdir:=gen/cmd +$(package)_dependencies:=native_rust +$(package)_patches:=Cargo.lock + +define $(package)_preprocess_cmds + cp $($(package)_patch_dir)/Cargo.lock . +endef + +define $(package)_build_cmds + $($(package)_cargo) build --locked --release --package=cxxbridge-cmd --bin=cxxbridge +endef + +define $(package)_stage_cmds + $($(package)_cargo) install --locked --path=. --bin=cxxbridge --root=$($(package)_staging_prefix_dir) +endef diff --git a/depends/packages/native_rust.mk b/depends/packages/native_rust.mk new file mode 100644 index 000000000000..54c293fe6508 --- /dev/null +++ b/depends/packages/native_rust.mk @@ -0,0 +1,105 @@ +# Copyright (c) 2016-2025 The Zcash developers +# Copyright (c) 2026 The Dash Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +# To update the Rust compiler, change the version below and then run the script +# ./contrib/devtools/update-rust-hashes.py + +package:=native_rust +$(package)_version:=1.82.0 +$(package)_download_path:=https://static.rust-lang.org/dist + +# FreeBSD (x86_64) +$(package)_rust_target_x86_64-unknown-freebsd:=x86_64-unknown-freebsd +$(package)_file_name_x86_64_freebsd:=rust-$($(package)_version)-x86_64-unknown-freebsd.tar.gz +$(package)_sha256_hash_x86_64_freebsd:=f7b51943dbed0af3387e3269c1767fee916fb22b8e7897b3594bf5e422403137 +$(package)_rust_std_sha256_hash_x86_64-unknown-freebsd:=be1acaf3c2f15d42b05b1f032db5ac3b11a0ac5a91c0efef26f2d8135d68a829 + +# Linux (ARMv8) +$(package)_rust_target_aarch64-unknown-linux-gnu:=aarch64-unknown-linux-gnu +$(package)_file_name_aarch64_linux:=rust-$($(package)_version)-aarch64-unknown-linux-gnu.tar.gz +$(package)_sha256_hash_aarch64_linux:=d7db04fce65b5f73282941f3f1df5893be9810af17eb7c65b2e614461fe31a48 +$(package)_rust_std_sha256_hash_aarch64-unknown-linux-gnu:=82b2308ee531775bf4d1faa57bddfae85f363bec43ca36ba6db4ebad7c1450d4 + +# Linux (x86_64) +$(package)_rust_target_x86_64-unknown-linux-gnu:=x86_64-unknown-linux-gnu +$(package)_file_name_x86_64_linux:=rust-$($(package)_version)-x86_64-unknown-linux-gnu.tar.gz +$(package)_sha256_hash_x86_64_linux:=0265c08ae997c4de965048a244605fb1f24a600bbe35047b811c638b8fcf676b +$(package)_rust_std_sha256_hash_x86_64-unknown-linux-gnu:=e7e808b8745298369fa3bbc3c0b7af9ca0fb995661bd684a7022d14bc9ae0057 + +# macOS (x86_64) +$(package)_rust_target_x86_64-apple-darwin:=x86_64-apple-darwin +$(package)_file_name_x86_64_darwin:=rust-$($(package)_version)-x86_64-apple-darwin.tar.gz +$(package)_sha256_hash_x86_64_darwin:=b1a289cabc523f259f65116a41374ac159d72fbbf6c373bd5e545c8e835ceb6a +$(package)_rust_std_sha256_hash_x86_64-apple-darwin:=52084c8cdb34ca139a00f9f03f1a582d96b677e9f223a8d1aa31ae575a06cc16 + +# macOS (ARMv8) +$(package)_rust_target_aarch64-apple-darwin:=aarch64-apple-darwin +$(package)_rust_target_arm64-apple-darwin:=aarch64-apple-darwin +$(package)_file_name_aarch64_darwin:=rust-$($(package)_version)-aarch64-apple-darwin.tar.gz +$(package)_sha256_hash_aarch64_darwin:=49b6d36b308addcfd21ae56c94957688338ba7b8985bff57fc626c8e1b32f62c +$(package)_rust_std_sha256_hash_aarch64-apple-darwin:=5ec28e75ed8715efaa2490d76ae026a34b13df6899d98b14d0a6995556f4e6b4 + +# Linux (ARMv7) - Cross only +$(package)_rust_target_arm-unknown-linux-gnueabihf:=armv7-unknown-linux-gnueabihf +$(package)_rust_target_armv7-unknown-linux-gnueabihf:=armv7-unknown-linux-gnueabihf +$(package)_rust_std_sha256_hash_armv7-unknown-linux-gnueabihf:=5dd8b36467e03ba47bfa7ea5d7578c66bccb648dd2129d7cec6fb3ff00f81ca3 + +# Linux (PowerPC 64-bit) - Cross only +$(package)_rust_target_powerpc64le-unknown-linux-gnu:=powerpc64le-unknown-linux-gnu +$(package)_rust_std_sha256_hash_powerpc64le-unknown-linux-gnu:=142c7c2896fa4596b5c4c35d9d5e4d80acd5a699e5fa0560d92a89eda035ece3 + +# Linux (RISCV64 GC) - Cross only +$(package)_rust_target_riscv64-unknown-linux-gnu:=riscv64gc-unknown-linux-gnu +$(package)_rust_target_riscv64gc-unknown-linux-gnu:=riscv64gc-unknown-linux-gnu +$(package)_rust_std_sha256_hash_riscv64gc-unknown-linux-gnu:=7b35c8207c77e3fc2f7f7a26dea989cc2cdc13a955851ff74d4882f96f4e14dd + +# Windows (x86_64) - Cross only +$(package)_rust_target_x86_64-w64-mingw32:=x86_64-pc-windows-gnu +$(package)_rust_target_x86_64-pc-windows-gnu:=x86_64-pc-windows-gnu +$(package)_rust_std_sha256_hash_x86_64-pc-windows-gnu:=32d42270b114c9341e5bc9b1d24f336024889ddd32a7d22e4700cc3c45fe9d3d + +### +$(package)_file_name:=$($(package)_file_name_$(build_arch)_$(build_os)) +$(package)_sha256_hash:=$($(package)_sha256_hash_$(build_arch)_$(build_os)) +$(package)_rust_target:=$(or $($(package)_rust_target_$(canonical_host)),$($(package)_rust_target_$(subst -pc-,-unknown-,$(canonical_host))),$($(package)_rust_target_$(subst -unknown-,-pc-,$(canonical_host)))) +### + +define $(package)_set_vars +$(package)_stage_opts=--disable-ldconfig +$(package)_stage_build_opts=--without=rust-docs-json-preview,rust-docs +endef + +ifneq ($(canonical_host),$(build)) +$(package)_exact_file_name:=rust-std-$($(package)_version)-$($(package)_rust_target).tar.gz +$(package)_exact_sha256_hash:=$($(package)_rust_std_sha256_hash_$($(package)_rust_target)) +$(package)_build_subdir:=buildos +$(package)_extra_sources:=$($(package)_exact_file_name) + +define $(package)_fetch_cmds +$(call fetch_file,$(package),$($(package)_download_path),$($(package)_exact_file_name),$($(package)_exact_file_name),$($(package)_exact_sha256_hash)) && \ +$(call fetch_file,$(package),$($(package)_download_path),$($(package)_file_name_$(build_arch)_$(build_os)),$($(package)_file_name_$(build_arch)_$(build_os)),$($(package)_sha256_hash_$(build_arch)_$(build_os))) +endef + +define $(package)_extract_cmds + mkdir -p $($(package)_extract_dir) && \ + echo "$($(package)_exact_sha256_hash) $($(package)_source_dir)/$($(package)_exact_file_name)" > $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + echo "$($(package)_sha256_hash_$(build_arch)_$(build_os)) $($(package)_source_dir)/$($(package)_file_name_$(build_arch)_$(build_os))" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + $(build_SHA256SUM) -c $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + mkdir $(canonical_host) && \ + $(build_TAR) --no-same-owner --strip-components=1 -xf $($(package)_source_dir)/$($(package)_exact_file_name) -C $(canonical_host) && \ + mkdir buildos && \ + $(build_TAR) --no-same-owner --strip-components=1 -xf $($(package)_source_dir)/$($(package)_file_name_$(build_arch)_$(build_os)) -C buildos +endef + +define $(package)_stage_cmds + bash ./install.sh --destdir=$($(package)_staging_dir) --prefix=$(build_prefix) $($(package)_stage_opts) $($(package)_stage_build_opts) && \ + bash ../$(canonical_host)/install.sh --destdir=$($(package)_staging_dir) --prefix=$(build_prefix) $($(package)_stage_opts) +endef +else + +define $(package)_stage_cmds + bash ./install.sh --destdir=$($(package)_staging_dir) --prefix=$(build_prefix) $($(package)_stage_opts) $($(package)_stage_build_opts) +endef +endif diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk index 7e0bb2633219..1062b6c6bbe5 100644 --- a/depends/packages/packages.mk +++ b/depends/packages/packages.mk @@ -1,7 +1,9 @@ -packages:=gmp backtrace +packages:=gmp backtrace rustcxx boost_packages = boost +rust_native_packages = native_rust native_cxxbridge + libevent_packages = libevent qrencode_linux_packages = qrencode diff --git a/depends/packages/rustcxx.mk b/depends/packages/rustcxx.mk new file mode 100644 index 000000000000..98eec4fa837a --- /dev/null +++ b/depends/packages/rustcxx.mk @@ -0,0 +1,15 @@ +# Copyright (c) 2022-2023 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +package:=rustcxx +$(package)_version:=$(native_cxxbridge_version) +$(package)_download_path:=$(native_cxxbridge_download_path) +$(package)_file_name:=$(native_cxxbridge_file_name) +$(package)_download_file:=$(native_cxxbridge_download_file) +$(package)_sha256_hash:=$(native_cxxbridge_sha256_hash) + +define $(package)_stage_cmds + mkdir -p $($(package)_staging_prefix_dir)/include/rust && \ + cp include/cxx.h $($(package)_staging_prefix_dir)/include/rust +endef diff --git a/depends/patches/native_cxxbridge/Cargo.lock b/depends/patches/native_cxxbridge/Cargo.lock new file mode 100644 index 000000000000..4a9a074e7d3c --- /dev/null +++ b/depends/patches/native_cxxbridge/Cargo.lock @@ -0,0 +1,584 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "anstyle" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" + +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + +[[package]] +name = "cc" +version = "1.2.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "clap" +version = "4.5.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.5.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00" +dependencies = [ + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_lex" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" + +[[package]] +name = "codespan-reporting" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" +dependencies = [ + "serde", + "termcolor", + "unicode-width", +] + +[[package]] +name = "cxx" +version = "1.0.192" +dependencies = [ + "cc", + "cxx-build", + "cxx-gen", + "cxx-test-suite", + "cxxbridge-cmd", + "cxxbridge-flags", + "cxxbridge-macro", + "foldhash", + "indoc", + "link-cplusplus", + "proc-macro2", + "quote", + "rustversion", + "scratch", + "target-triple", + "tempfile", + "trybuild", +] + +[[package]] +name = "cxx-build" +version = "1.0.192" +dependencies = [ + "cc", + "codespan-reporting", + "cxx", + "cxx-gen", + "indexmap", + "pkg-config", + "proc-macro2", + "quote", + "scratch", + "syn", +] + +[[package]] +name = "cxx-gen" +version = "0.7.192" +dependencies = [ + "codespan-reporting", + "indexmap", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "cxx-test-suite" +version = "0.0.0" +dependencies = [ + "cxx", + "cxx-build", + "cxxbridge-flags", + "serde", +] + +[[package]] +name = "cxxbridge-cmd" +version = "1.0.192" +dependencies = [ + "clap", + "codespan-reporting", + "indexmap", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.192" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.192" +dependencies = [ + "cxx", + "indexmap", + "prettyplease", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "demo" +version = "0.0.0" +dependencies = [ + "cxx", + "cxx-build", +] + +[[package]] +name = "dissimilar" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8975ffdaa0ef3661bfe02dbdcc06c9f829dfafe6a3c474de366a8d5e44276921" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "find-msvc-tools" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f449e6c6c08c865631d4890cfacf252b3d396c9bcc83adb6623cdb02a8336c41" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "indoc" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" +dependencies = [ + "rustversion", +] + +[[package]] +name = "itoa" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom", + "libc", +] + +[[package]] +name = "libc" +version = "0.2.180" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" + +[[package]] +name = "link-cplusplus" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f78c730aaa7d0b9336a299029ea49f9ee53b0ed06e9202e8cb7db9bae7b8c82" +dependencies = [ + "cc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rustix" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "scratch" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d68f2ec51b097e4c1a75b681a8bec621909b5e91f15bb7b840c4f2f7b01148b2" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_spanned" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" +dependencies = [ + "serde_core", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "2.0.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "target-triple" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "591ef38edfb78ca4771ee32cf494cb8771944bee237a9b91fc9c1424ac4b777b" + +[[package]] +name = "tempfile" +version = "3.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c" +dependencies = [ + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "toml" +version = "0.9.11+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3afc9a848309fe1aaffaed6e1546a7a14de1f935dc9d89d32afd9a44bab7c46" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned", + "toml_datetime", + "toml_parser", + "toml_writer", + "winnow", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_parser" +version = "1.0.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" +dependencies = [ + "winnow", +] + +[[package]] +name = "toml_writer" +version = "1.0.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" + +[[package]] +name = "trybuild" +version = "1.0.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e17e807bff86d2a06b52bca4276746584a78375055b6e45843925ce2802b335" +dependencies = [ + "dissimilar", + "glob", + "serde", + "serde_derive", + "serde_json", + "target-triple", + "termcolor", + "toml", +] + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "winnow" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "zmij" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac93432f5b761b22864c774aac244fa5c0fd877678a4c37ebf6cf42208f9c9ec" From 8bec48e85a1529666e7658fba6843b221b2adb2f Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Mon, 12 Jan 2026 18:32:05 +0530 Subject: [PATCH 13/25] build: drop Rust from CI docker image We're using `depends` to provide us with the Rust compiler and `cxxbridge`, we can drop it from the CI container and save some space. --- {contrib/containers/ci => .cargo}/config.toml | 14 ++++----- .github/workflows/build-container.yml | 4 --- contrib/containers/ci/ci.Dockerfile | 30 ------------------- contrib/containers/develop/docker-compose.yml | 2 -- 4 files changed, 6 insertions(+), 44 deletions(-) rename {contrib/containers/ci => .cargo}/config.toml (56%) diff --git a/contrib/containers/ci/config.toml b/.cargo/config.toml similarity index 56% rename from contrib/containers/ci/config.toml rename to .cargo/config.toml index 5148a730e213..8d424cf904ea 100644 --- a/contrib/containers/ci/config.toml +++ b/.cargo/config.toml @@ -1,17 +1,15 @@ -# Commented out entries are not bundled in the container - # Linux [target.aarch64-unknown-linux-gnu] linker = "aarch64-linux-gnu-gcc" -# [target.armv7-unknown-linux-gnueabihf] -# linker = "arm-linux-gnueabihf-gcc" +[target.armv7-unknown-linux-gnueabihf] +linker = "arm-linux-gnueabihf-gcc" -# [target.powerpc64le-unknown-linux-gnu] -# linker = "powerpc64le-linux-gnu-gcc" +[target.powerpc64le-unknown-linux-gnu] +linker = "powerpc64le-linux-gnu-gcc" -# [target.riscv64gc-unknown-linux-gnu] -# linker = "riscv64-linux-gnu-gcc" +[target.riscv64gc-unknown-linux-gnu] +linker = "riscv64-linux-gnu-gcc" [target.x86_64-unknown-linux-gnu] linker = "x86_64-linux-gnu-gcc" diff --git a/.github/workflows/build-container.yml b/.github/workflows/build-container.yml index df568063571b..94ef347fbe1e 100644 --- a/.github/workflows/build-container.yml +++ b/.github/workflows/build-container.yml @@ -57,8 +57,6 @@ jobs: uses: docker/build-push-action@v6 with: context: ${{ inputs.context }} - build-contexts: | - docker_root=${{ github.workspace }}/dash/contrib/containers/ci file: ${{ inputs.file }} push: true platforms: linux/amd64 @@ -103,8 +101,6 @@ jobs: uses: docker/build-push-action@v6 with: context: ${{ inputs.context }} - build-contexts: | - docker_root=${{ github.workspace }}/dash/contrib/containers/ci file: ${{ inputs.file }} push: true platforms: linux/arm64 diff --git a/contrib/containers/ci/ci.Dockerfile b/contrib/containers/ci/ci.Dockerfile index ded604401440..42df9b08018c 100644 --- a/contrib/containers/ci/ci.Dockerfile +++ b/contrib/containers/ci/ci.Dockerfile @@ -58,36 +58,6 @@ RUN set -ex; \ # LD_LIBRARY_PATH is empty by default, this is the first entry ENV LD_LIBRARY_PATH="/usr/lib/llvm-${LLVM_VERSION}/lib" -# Install Rust -ARG RUSTUP_VERSION=1.28.2 \ - RUST_VERSION=1.82.0 -ENV RUSTUP_HOME="/opt/rust/rustup" \ - CARGO_HOME="/opt/rust/cargo" -ENV PATH="${CARGO_HOME}/bin:${PATH}" -RUN dpkgArch="$(dpkg --print-architecture)"; \ - case "${dpkgArch##*-}" in \ - amd64) rustArch='x86_64-unknown-linux-gnu';; \ - armhf) rustArch='armv7-unknown-linux-gnueabihf';; \ - arm64) rustArch='aarch64-unknown-linux-gnu';; \ - *) echo >&2 "unsupported architecture: ${dpkgArch}"; exit 1 ;; \ - esac; \ - curl -fL "https://static.rust-lang.org/rustup/archive/$RUSTUP_VERSION/${rustArch}/rustup-init" -o /tmp/rustup-init; \ - chmod +x /tmp/rustup-init; \ - /tmp/rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION --default-host ${rustArch}; \ - rm /tmp/rustup-init; \ - chmod -R a+w "${RUSTUP_HOME}" "${CARGO_HOME}"; \ - rustup target add \ - # Linux - aarch64-unknown-linux-gnu \ - x86_64-unknown-linux-gnu \ - # Windows - x86_64-pc-windows-gnu; \ - rustup --version; \ - cargo --version; \ - rustc --version; \ - rm -rf "${CARGO_HOME}/registry/cache" -COPY --from=docker_root ./config.toml "${CARGO_HOME}/config.toml" - RUN set -ex; \ git clone --depth=1 "https://github.com/include-what-you-use/include-what-you-use" -b "clang_${LLVM_VERSION}" /opt/iwyu; \ cd /opt/iwyu; \ diff --git a/contrib/containers/develop/docker-compose.yml b/contrib/containers/develop/docker-compose.yml index 39238d6d4d0c..c6f2cea70424 100644 --- a/contrib/containers/develop/docker-compose.yml +++ b/contrib/containers/develop/docker-compose.yml @@ -4,8 +4,6 @@ services: build: context: '..' dockerfile: './develop/Dockerfile' - additional_contexts: - - docker_root=../ci args: USER_ID: 1000 # set this to $(id -u) of the host GROUP_ID: 1000 # set this to $(id -g) of the host From 689a910433800b98fcc7cdc9e2a4e074d328b5cd Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Fri, 6 Feb 2026 15:41:40 +0530 Subject: [PATCH 14/25] depends: add support for vendored crates for offline builds --- .cargo/{config.toml => config.toml.offline} | 6 ++ rust/chirp/Cargo.lock => Cargo.lock | 0 Cargo.toml | 14 +++++ configure.ac | 14 +++++ contrib/guix/guix-build | 5 +- depends/Makefile | 56 +++++++++++++++++-- depends/config.site.in | 1 + depends/funcs.mk | 46 +++++++++++++++ depends/packages/native_cxxbridge.mk | 4 +- depends/packages/native_rust.mk | 9 +++ depends/packages/packages.mk | 2 +- .../native_cxxbridge/cargo-config.toml | 5 ++ rust/Makefile.am | 34 +++++++++-- 13 files changed, 184 insertions(+), 12 deletions(-) rename .cargo/{config.toml => config.toml.offline} (78%) rename rust/chirp/Cargo.lock => Cargo.lock (100%) create mode 100644 Cargo.toml create mode 100644 depends/patches/native_cxxbridge/cargo-config.toml diff --git a/.cargo/config.toml b/.cargo/config.toml.offline similarity index 78% rename from .cargo/config.toml rename to .cargo/config.toml.offline index 8d424cf904ea..b50eda6bfe86 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml.offline @@ -24,3 +24,9 @@ linker = "x86_64-linux-gnu-gcc" # Windows [target.x86_64-pc-windows-gnu] linker = "x86_64-w64-mingw32-gcc" + +[source.crates-io] +replace-with = "vendored-sources" + +[source.vendored-sources] +# The directory for this source is set to RUST_VENDORED_SOURCES by rust/Makefile.am diff --git a/rust/chirp/Cargo.lock b/Cargo.lock similarity index 100% rename from rust/chirp/Cargo.lock rename to Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 000000000000..68133a4d0d6d --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "rust/chirp", +] +resolver = "2" + +[profile.release] +codegen-units = 1 +lto = true +panic = "abort" + +[profile.dev] +codegen-units = 1 +panic = "abort" diff --git a/configure.ac b/configure.ac index 660054269fb1..73aa688bf2ec 100644 --- a/configure.ac +++ b/configure.ac @@ -152,6 +152,18 @@ if test "${RUSTFLAGS+set}" != "set"; then RUSTFLAGS="-C embed-bitcode=yes -C relocation-model=pic" fi +AC_ARG_ENABLE([online-rust], + [AS_HELP_STRING([--enable-online-rust], + [allow Cargo to fetch Rust dependencies from the internet (default is no, using vendored dependencies offline)])], + [enable_online_rust=$enableval], + [enable_online_rust=no]) +AM_CONDITIONAL([ENABLE_ONLINE_RUST], [test "$enable_online_rust" != "no"]) +if test "$enable_online_rust" = "no"; then + if test -z "$RUST_VENDORED_SOURCES"; then + AC_MSG_ERROR([Offline Rust builds require RUST_VENDORED_SOURCES to be specified, otherwise enable online builds with --enable-online-rust]) + fi +fi + AC_ARG_ENABLE([wallet], [AS_HELP_STRING([--disable-wallet], [disable wallet (enabled by default)])], @@ -2130,6 +2142,7 @@ AC_SUBST(RUST_MACOS_DEPLOYMENT_TARGET) AC_SUBST(RUST_NATIVE) AC_SUBST(RUST_OSX_SDK) AC_SUBST(RUST_TARGET) +AC_SUBST(RUST_VENDORED_SOURCES) AC_SUBST(RELDFLAGS) AC_SUBST(CORE_LDFLAGS) @@ -2290,4 +2303,5 @@ echo " RUST_MACOS_DEPLOYMENT_TARGET = $RUST_MACOS_DEPLOYMENT_TARGET" echo " RUST_NATIVE = $RUST_NATIVE" echo " RUST_OSX_SDK = $RUST_OSX_SDK" echo " RUST_TARGET = $RUST_TARGET" +echo " RUST_VENDORED_SOURCES = $RUST_VENDORED_SOURCES" echo diff --git a/contrib/guix/guix-build b/contrib/guix/guix-build index 80b719eb29d8..fb8a6e5fa740 100755 --- a/contrib/guix/guix-build +++ b/contrib/guix/guix-build @@ -301,9 +301,12 @@ mkdir -p "$OUTDIR_BASE" # Download the depends sources now as we won't have internet access in the build # container +depends_cmds="download-rust vendor-crates" for host in $HOSTS; do - make -C "${PWD}/depends" -j"$JOBS" download-"$(host_to_commonname "$host")" ${V:+V=1} ${SOURCES_PATH:+SOURCES_PATH="$SOURCES_PATH"} + depends_cmds+=" download-$(host_to_commonname "$host")" done +# shellcheck disable=SC2086 +make -C "${PWD}/depends" -j"$JOBS" ${depends_cmds} ${V:+V=1} ${SOURCES_PATH:+SOURCES_PATH="$SOURCES_PATH"} # Usage: outdir_for_host HOST SUFFIX # diff --git a/depends/Makefile b/depends/Makefile index ff7b7bf98c64..4bc34e766c32 100644 --- a/depends/Makefile +++ b/depends/Makefile @@ -60,6 +60,9 @@ DOWNLOAD_RETRIES:=3 HOST_ID_SALT ?= salt BUILD_ID_SALT ?= salt +CRATE_REGISTRY := vendored-sources +CRATE_ARCHIVE = $(SOURCES_PATH)/vendored-crates.tar.gz + ifneq ($(DEBUG),) release_type=debug else @@ -179,7 +182,7 @@ usdt_packages_$(NO_USDT) = $(usdt_$(host_os)_packages) packages += $($(host_arch)_$(host_os)_packages) $($(host_os)_packages) $(boost_packages_) $(libevent_packages_) $(qt_packages_) $(wallet_packages_) $(upnp_packages_) $(natpmp_packages_) $(usdt_packages_) native_packages += $($(host_arch)_$(host_os)_native_packages) $($(host_os)_native_packages) -native_packages += $(rust_native_packages) +native_packages += native_rust $(native_cargo_packages) ifneq ($(zmq_packages_),) packages += $(zmq_packages) @@ -203,9 +206,37 @@ $(host_prefix)/.stamp_$(final_build_id): $(native_packages) $(packages) mkdir -p $(@D) echo copying packages: $^ echo to: $(@D) - cd $(@D); $(foreach package,$^, $(build_TAR) xf $($(package)_cached); ) + cd $(@D); $(foreach package,$^, $(build_TAR) --no-same-owner -xf $($(package)_cached); ) touch $@ +# Vendors Rust crate dependencies for offline builds +# Uses pre-built archive if available, otherwise runs 'cargo vendor' +$(host_prefix)/$(CRATE_REGISTRY): $(host_prefix)/.stamp_$(final_build_id) + @if test -f $(CRATE_ARCHIVE); \ + then echo Extracting pre-vendored crates from $(CRATE_ARCHIVE)...; \ + $(build_TAR) --no-same-owner -xf $(CRATE_ARCHIVE) -C $(@D); \ + else echo Vendoring crates...; \ + $(@D)/native/bin/cargo vendor --locked --manifest-path $(BASEDIR)/../Cargo.toml $@; \ + fi + @touch $@ + +# Vendors crates for cargo packages +vendor-dep-crates: $(foreach package,$(native_cargo_packages),vendor-$(package)-crates) + +# Vendors project-wide cargo packages +vendor-all-crates: $(native_rust_cached) + @rm -rf $(WORK_PATH)/vendor-main + @mkdir -p $(WORK_PATH)/vendor-main + @$(build_TAR) --no-same-owner -xf $(native_rust_cached) -C $(WORK_PATH)/vendor-main + @echo "Vendoring main project crates..." + @$(WORK_PATH)/vendor-main/native/bin/cargo vendor --locked --manifest-path $(BASEDIR)/../Cargo.toml $(WORK_PATH)/vendor-main/$(CRATE_REGISTRY) + @cd $(WORK_PATH)/vendor-main; find $(CRATE_REGISTRY) | sort | $(build_TAR) --no-recursion -czf $(CRATE_ARCHIVE) -T - + @rm -rf $(WORK_PATH)/vendor-main + @echo "Created $(CRATE_ARCHIVE)" + +# Vendors everything +vendor-crates: vendor-dep-crates vendor-all-crates + # $PATH is not preserved between ./configure and make by convention. Its # modification and overriding at ./configure time is (as I understand it) # supposed to be captured by the AC_{PROG_{,OBJ}CXX,PATH_{PROG,TOOL}} macros, @@ -299,7 +330,7 @@ clean-all: clean clean: @rm -rf $(WORK_PATH) $(BASE_CACHE) $(BUILD) *.log -install: check-packages $(host_prefix)/share/config.site +install: check-packages $(host_prefix)/share/config.site $(host_prefix)/$(CRATE_REGISTRY) download-one: check-sources $(all_sources) @@ -310,10 +341,25 @@ download-linux: @$(MAKE) -s HOST=x86_64-unknown-linux-gnu download-one download-win: @$(MAKE) -s HOST=x86_64-w64-mingw32 download-one -download: download-osx download-linux download-win +download-rust-std: + @mkdir -p $(SOURCES_PATH) + @for target in $(native_rust_rust_std_targets); do \ + file="rust-std-$(native_rust_version)-$${target}.tar.gz"; \ + if [ ! -f "$(SOURCES_PATH)/$${file}" ]; then \ + echo "Downloading $${file}..."; \ + curl -L -o "$(SOURCES_PATH)/$${file}" "$(native_rust_download_path)/$${file}" || exit 1; \ + else \ + echo "Already have $${file}"; \ + fi; \ + done +download-rust-src: + @mkdir -p $(SOURCES_PATH) + @$(foreach package,$(native_cargo_packages),$(call download_rust_src_package,$(package)) && ) true +download-rust: download-rust-std download-rust-src +download: download-osx download-linux download-win download-rust $(foreach package,$(all_packages),$(eval $(call ext_add_stages,$(package)))) -.PHONY: install cached clean clean-all download-one download-osx download-linux download-win download check-packages check-sources +.PHONY: install cached clean clean-all download-one download-osx download-linux download-win download download-rust download-rust-std download-rust-src check-packages check-sources vendor-crates vendor-dep-crates vendor-all-crates .PHONY: FORCE $(V).SILENT: diff --git a/depends/config.site.in b/depends/config.site.in index 6eb88d8aaeb1..a1ccdbcbd7bf 100644 --- a/depends/config.site.in +++ b/depends/config.site.in @@ -183,3 +183,4 @@ fi if test -x "${depends_prefix}/native/bin/cxxbridge"; then CXXBRIDGE="${depends_prefix}/native/bin/cxxbridge" fi +RUST_VENDORED_SOURCES="${depends_prefix}/vendored-sources" diff --git a/depends/funcs.mk b/depends/funcs.mk index e0cc1153316c..d0c7f4d39f10 100644 --- a/depends/funcs.mk +++ b/depends/funcs.mk @@ -279,6 +279,37 @@ $(foreach stage,$(stages), .PHONY: $(1)_$(stage)) endef +# Template for vendoring a native package's Rust crate dependencies +# Packages opt-in by defining $(package)_vendored_file_name and $(package)_cargo_manifest +define int_vendor_crates +ifneq ($($(1)_vendored_file_name),) +$(1)_vendored_archive = $(SOURCES_PATH)/$($(1)_vendored_file_name) + +vendor-$(1)-crates: $(native_rust_cached) $(SOURCES_PATH)/$($(1)_file_name) + @rm -rf $(WORK_PATH)/vendor-$(1) + @mkdir -p $(WORK_PATH)/vendor-$(1) + @$(build_TAR) --no-same-owner -xf $(native_rust_cached) -C $(WORK_PATH)/vendor-$(1) + @echo "Vendoring $(1) crates..." + @mkdir -p $(WORK_PATH)/vendor-$(1)/src + @cd $(WORK_PATH)/vendor-$(1)/src && $(build_TAR) --no-same-owner --strip-components=1 -xf $(SOURCES_PATH)/$($(1)_file_name) + @cp $(PATCHES_PATH)/$(1)/Cargo.lock $(WORK_PATH)/vendor-$(1)/src/ + @$(WORK_PATH)/vendor-$(1)/native/bin/cargo vendor --locked --manifest-path $(WORK_PATH)/vendor-$(1)/src/$($(1)_cargo_manifest) $(WORK_PATH)/vendor-$(1)/src/vendored + @cd $(WORK_PATH)/vendor-$(1)/src; find vendored | sort | $(build_TAR) --no-recursion -czf $$($(1)_vendored_archive) -T - + @rm -rf $(WORK_PATH)/vendor-$(1) + @echo "Created $$($(1)_vendored_archive)" +.PHONY: vendor-$(1)-crates +endif +endef + +define download_rust_src_package +([ -f "$(SOURCES_PATH)/$($(1)_file_name)" ] && \ + echo "Already have $($(1)_file_name)" || \ + (echo "Downloading $($(1)_file_name)..." && \ + $(build_DOWNLOAD) "$(SOURCES_PATH)/$($(1)_file_name)" "$($(1)_download_path)/$(or $($(1)_download_file),$($(1)_file_name))")) && \ +echo "$($(1)_sha256_hash) $($(1)_file_name)" > "$(SOURCES_PATH)/.$(1).hash" && \ +cd "$(SOURCES_PATH)" && $(build_SHA256SUM) -c ".$(1).hash" && rm -f ".$(1).hash" +endef + # These functions create the build targets for each package. They must be # broken down into small steps so that each part is done for all packages # before moving on to the next step. Otherwise, a package's info @@ -296,6 +327,18 @@ $(foreach package,$(all_packages),$(eval $(call int_vars,$(package)))) $(foreach native_package,$(native_packages),$(eval include packages/$(native_package).mk)) $(foreach package,$(packages),$(eval include packages/$(package).mk)) +# Extend preprocess_cmds for cargo packages to extract vendored crates +define int_cargo_preprocess_ext +$(1)_preprocess_cmds += && \ + if test -f $(SOURCES_PATH)/$($(1)_vendored_file_name); then \ + echo "Extracting vendored crates for $(1)..." && \ + $(build_TAR) --no-same-owner -xf $(SOURCES_PATH)/$($(1)_vendored_file_name) && \ + mkdir -p .cargo && \ + cp $(PATCHES_PATH)/$(1)/cargo-config.toml .cargo/config.toml; \ + fi +endef +$(foreach cargo_package,$(native_cargo_packages),$(eval $(call int_cargo_preprocess_ext,$(cargo_package)))) + #compute a hash of all files that comprise this package's build recipe $(foreach package,$(all_packages),$(eval $(call int_get_build_recipe_hash,$(package)))) @@ -307,3 +350,6 @@ $(foreach package,$(all_packages),$(eval $(call int_config_attach_build_config,$ #create build targets $(foreach package,$(all_packages),$(eval $(call int_add_cmds,$(package)))) + +#create vendor targets for cargo packages +$(foreach cargo_package,$(native_cargo_packages),$(eval $(call int_vendor_crates,$(cargo_package)))) diff --git a/depends/packages/native_cxxbridge.mk b/depends/packages/native_cxxbridge.mk index ca3580c38dff..c0d9963382c1 100644 --- a/depends/packages/native_cxxbridge.mk +++ b/depends/packages/native_cxxbridge.mk @@ -13,7 +13,9 @@ $(package)_download_file:=$($(package)_version).tar.gz $(package)_sha256_hash:=d242dbfb6deb362c5a95fcb69aeb5f25228de75af3cced94c9f6c8e11019d30e $(package)_build_subdir:=gen/cmd $(package)_dependencies:=native_rust -$(package)_patches:=Cargo.lock +$(package)_patches:=Cargo.lock cargo-config.toml +$(package)_vendored_file_name:=native_cxxbridge-$($(package)_version)-vendored.tar.gz +$(package)_cargo_manifest:=gen/cmd/Cargo.toml define $(package)_preprocess_cmds cp $($(package)_patch_dir)/Cargo.lock . diff --git a/depends/packages/native_rust.mk b/depends/packages/native_rust.mk index 54c293fe6508..63170d040ab1 100644 --- a/depends/packages/native_rust.mk +++ b/depends/packages/native_rust.mk @@ -11,30 +11,35 @@ $(package)_version:=1.82.0 $(package)_download_path:=https://static.rust-lang.org/dist # FreeBSD (x86_64) +$(package)_rust_std_targets += x86_64-unknown-freebsd $(package)_rust_target_x86_64-unknown-freebsd:=x86_64-unknown-freebsd $(package)_file_name_x86_64_freebsd:=rust-$($(package)_version)-x86_64-unknown-freebsd.tar.gz $(package)_sha256_hash_x86_64_freebsd:=f7b51943dbed0af3387e3269c1767fee916fb22b8e7897b3594bf5e422403137 $(package)_rust_std_sha256_hash_x86_64-unknown-freebsd:=be1acaf3c2f15d42b05b1f032db5ac3b11a0ac5a91c0efef26f2d8135d68a829 # Linux (ARMv8) +$(package)_rust_std_targets += aarch64-unknown-linux-gnu $(package)_rust_target_aarch64-unknown-linux-gnu:=aarch64-unknown-linux-gnu $(package)_file_name_aarch64_linux:=rust-$($(package)_version)-aarch64-unknown-linux-gnu.tar.gz $(package)_sha256_hash_aarch64_linux:=d7db04fce65b5f73282941f3f1df5893be9810af17eb7c65b2e614461fe31a48 $(package)_rust_std_sha256_hash_aarch64-unknown-linux-gnu:=82b2308ee531775bf4d1faa57bddfae85f363bec43ca36ba6db4ebad7c1450d4 # Linux (x86_64) +$(package)_rust_std_targets += x86_64-unknown-linux-gnu $(package)_rust_target_x86_64-unknown-linux-gnu:=x86_64-unknown-linux-gnu $(package)_file_name_x86_64_linux:=rust-$($(package)_version)-x86_64-unknown-linux-gnu.tar.gz $(package)_sha256_hash_x86_64_linux:=0265c08ae997c4de965048a244605fb1f24a600bbe35047b811c638b8fcf676b $(package)_rust_std_sha256_hash_x86_64-unknown-linux-gnu:=e7e808b8745298369fa3bbc3c0b7af9ca0fb995661bd684a7022d14bc9ae0057 # macOS (x86_64) +$(package)_rust_std_targets += x86_64-apple-darwin $(package)_rust_target_x86_64-apple-darwin:=x86_64-apple-darwin $(package)_file_name_x86_64_darwin:=rust-$($(package)_version)-x86_64-apple-darwin.tar.gz $(package)_sha256_hash_x86_64_darwin:=b1a289cabc523f259f65116a41374ac159d72fbbf6c373bd5e545c8e835ceb6a $(package)_rust_std_sha256_hash_x86_64-apple-darwin:=52084c8cdb34ca139a00f9f03f1a582d96b677e9f223a8d1aa31ae575a06cc16 # macOS (ARMv8) +$(package)_rust_std_targets += aarch64-apple-darwin $(package)_rust_target_aarch64-apple-darwin:=aarch64-apple-darwin $(package)_rust_target_arm64-apple-darwin:=aarch64-apple-darwin $(package)_file_name_aarch64_darwin:=rust-$($(package)_version)-aarch64-apple-darwin.tar.gz @@ -42,20 +47,24 @@ $(package)_sha256_hash_aarch64_darwin:=49b6d36b308addcfd21ae56c94957688338ba7b89 $(package)_rust_std_sha256_hash_aarch64-apple-darwin:=5ec28e75ed8715efaa2490d76ae026a34b13df6899d98b14d0a6995556f4e6b4 # Linux (ARMv7) - Cross only +$(package)_rust_std_targets += armv7-unknown-linux-gnueabihf $(package)_rust_target_arm-unknown-linux-gnueabihf:=armv7-unknown-linux-gnueabihf $(package)_rust_target_armv7-unknown-linux-gnueabihf:=armv7-unknown-linux-gnueabihf $(package)_rust_std_sha256_hash_armv7-unknown-linux-gnueabihf:=5dd8b36467e03ba47bfa7ea5d7578c66bccb648dd2129d7cec6fb3ff00f81ca3 # Linux (PowerPC 64-bit) - Cross only +$(package)_rust_std_targets += powerpc64le-unknown-linux-gnu $(package)_rust_target_powerpc64le-unknown-linux-gnu:=powerpc64le-unknown-linux-gnu $(package)_rust_std_sha256_hash_powerpc64le-unknown-linux-gnu:=142c7c2896fa4596b5c4c35d9d5e4d80acd5a699e5fa0560d92a89eda035ece3 # Linux (RISCV64 GC) - Cross only +$(package)_rust_std_targets += riscv64gc-unknown-linux-gnu $(package)_rust_target_riscv64-unknown-linux-gnu:=riscv64gc-unknown-linux-gnu $(package)_rust_target_riscv64gc-unknown-linux-gnu:=riscv64gc-unknown-linux-gnu $(package)_rust_std_sha256_hash_riscv64gc-unknown-linux-gnu:=7b35c8207c77e3fc2f7f7a26dea989cc2cdc13a955851ff74d4882f96f4e14dd # Windows (x86_64) - Cross only +$(package)_rust_std_targets += x86_64-pc-windows-gnu $(package)_rust_target_x86_64-w64-mingw32:=x86_64-pc-windows-gnu $(package)_rust_target_x86_64-pc-windows-gnu:=x86_64-pc-windows-gnu $(package)_rust_std_sha256_hash_x86_64-pc-windows-gnu:=32d42270b114c9341e5bc9b1d24f336024889ddd32a7d22e4700cc3c45fe9d3d diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk index 1062b6c6bbe5..ac4c9224c9c5 100644 --- a/depends/packages/packages.mk +++ b/depends/packages/packages.mk @@ -2,7 +2,7 @@ packages:=gmp backtrace rustcxx boost_packages = boost -rust_native_packages = native_rust native_cxxbridge +native_cargo_packages = native_cxxbridge libevent_packages = libevent diff --git a/depends/patches/native_cxxbridge/cargo-config.toml b/depends/patches/native_cxxbridge/cargo-config.toml new file mode 100644 index 000000000000..01ab67f3bd1f --- /dev/null +++ b/depends/patches/native_cxxbridge/cargo-config.toml @@ -0,0 +1,5 @@ +[source.crates-io] +replace-with = "vendored-sources" + +[source.vendored-sources] +directory = "vendored" diff --git a/rust/Makefile.am b/rust/Makefile.am index 5c2dca765026..7acf00abb33b 100644 --- a/rust/Makefile.am +++ b/rust/Makefile.am @@ -40,14 +40,40 @@ if !SILENT_RULES CARGO_BUILD_OPTS += --verbose endif # !SILENT_RULES +if ENABLE_ONLINE_RUST +CARGO_CONFIGURED = $(top_srcdir)/.cargo/.configured-for-online + +$(CARGO_CONFIGURED): + $(AM_V_at)rm -f $(top_srcdir)/.cargo/.configured-for-offline + $(AM_V_at)rm -f $(top_srcdir)/.cargo/config.toml + $(AM_V_at)rm -f $(top_srcdir)/.cargo/config + $(AM_V_at)touch $@ +else +CARGO_BUILD_OPTS += --offline +CARGO_CONFIGURED = $(top_srcdir)/.cargo/.configured-for-offline + +$(CARGO_CONFIGURED): $(top_srcdir)/.cargo/config.toml.offline + $(AM_V_at)rm -f $(top_srcdir)/.cargo/.configured-for-online + $(AM_V_at)rm -f $(top_srcdir)/.cargo/config + $(AM_V_at)cp $< $(top_srcdir)/.cargo/config.toml + $(AM_V_at)echo "directory = \"$(RUST_VENDORED_SOURCES)\"" >> $(top_srcdir)/.cargo/config.toml + $(AM_V_at)touch $@ +endif # ENABLE_ONLINE_RUST + include $(top_srcdir)/rust/Makefile.libs.include -all-local: cargo-build-chirp cxxbridge-chirp +all-local: $(CARGO_CONFIGURED) cargo-build-chirp cxxbridge-chirp -cargo-build: cargo-build-chirp +cargo-build: $(CARGO_CONFIGURED) cargo-build-chirp cargo-clean: cargo-clean-chirp -clean-local: cargo-clean-chirp cxxbridge-clean-chirp clean-librustdeps-la +cargo-clean-config: + $(AM_V_at)rm -f $(top_srcdir)/.cargo/.configured-for-online + $(AM_V_at)rm -f $(top_srcdir)/.cargo/.configured-for-offline + $(AM_V_at)rm -f $(top_srcdir)/.cargo/config.toml + $(AM_V_at)rm -f $(top_srcdir)/.cargo/config + +clean-local: cargo-clean-chirp cxxbridge-clean-chirp clean-librustdeps-la cargo-clean-config -.PHONY: cargo-build cargo-clean +.PHONY: cargo-build cargo-clean cargo-clean-config From 321604587ccbac5a6095a64c5ea4e445d3ab508a Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Fri, 16 Jan 2026 15:58:41 +0530 Subject: [PATCH 15/25] fix: avoid triggering `rustup` if building from depends --- configure.ac | 6 ++++++ rust/Makefile.am | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 73aa688bf2ec..a6468940e312 100644 --- a/configure.ac +++ b/configure.ac @@ -1844,6 +1844,11 @@ if test -z "$NATIVE_CXX"; then fi AC_MSG_RESULT([$NATIVE_CXX]) +if test -n "$depends_prefix"; then + RUSTUP_TOOLCHAIN="" +fi +AC_SUBST(RUSTUP_TOOLCHAIN) + dnl check if libgmp is present TEMP_CPPFLAGS="$CPPFLAGS" TEMP_LDFLAGS="$LDFLAGS" @@ -2143,6 +2148,7 @@ AC_SUBST(RUST_NATIVE) AC_SUBST(RUST_OSX_SDK) AC_SUBST(RUST_TARGET) AC_SUBST(RUST_VENDORED_SOURCES) +AC_SUBST(RUSTUP_TOOLCHAIN) AC_SUBST(RELDFLAGS) AC_SUBST(CORE_LDFLAGS) diff --git a/rust/Makefile.am b/rust/Makefile.am index 7acf00abb33b..7c60b83ac621 100644 --- a/rust/Makefile.am +++ b/rust/Makefile.am @@ -10,7 +10,8 @@ CARGO_ENV = \ RUSTC="$(RUSTC)" \ RUSTFLAGS="$(RUSTFLAGS)" \ TERM="dumb" \ - ${RUST_OSX_SDK+SDKROOT="$(RUST_OSX_SDK)"} + ${RUST_OSX_SDK+SDKROOT="$(RUST_OSX_SDK)"} \ + ${RUSTUP_TOOLCHAIN+RUSTUP_TOOLCHAIN="$(RUSTUP_TOOLCHAIN)"} # 'cargo' needs uppercase RUST_NATIVE_ENV_UPPER = $(shell echo '$(RUST_NATIVE)' | tr 'a-z-' 'A-Z_') From 925c2a6b62ff3de8d491b736915c3fae4e9f1ed4 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Fri, 16 Jan 2026 06:40:45 +0530 Subject: [PATCH 16/25] fix: workaround `Directory renamed before its status could be extracted` --- depends/Makefile | 6 +++--- depends/funcs.mk | 8 ++++---- depends/packages/native_rust.mk | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/depends/Makefile b/depends/Makefile index 4bc34e766c32..45d43bd16180 100644 --- a/depends/Makefile +++ b/depends/Makefile @@ -206,7 +206,7 @@ $(host_prefix)/.stamp_$(final_build_id): $(native_packages) $(packages) mkdir -p $(@D) echo copying packages: $^ echo to: $(@D) - cd $(@D); $(foreach package,$^, $(build_TAR) --no-same-owner -xf $($(package)_cached); ) + cd $(@D); $(foreach package,$^, $(build_TAR) -P --no-same-owner -xf $($(package)_cached); ) touch $@ # Vendors Rust crate dependencies for offline builds @@ -214,7 +214,7 @@ $(host_prefix)/.stamp_$(final_build_id): $(native_packages) $(packages) $(host_prefix)/$(CRATE_REGISTRY): $(host_prefix)/.stamp_$(final_build_id) @if test -f $(CRATE_ARCHIVE); \ then echo Extracting pre-vendored crates from $(CRATE_ARCHIVE)...; \ - $(build_TAR) --no-same-owner -xf $(CRATE_ARCHIVE) -C $(@D); \ + $(build_TAR) -P --no-same-owner -xf $(CRATE_ARCHIVE) -C $(@D); \ else echo Vendoring crates...; \ $(@D)/native/bin/cargo vendor --locked --manifest-path $(BASEDIR)/../Cargo.toml $@; \ fi @@ -227,7 +227,7 @@ vendor-dep-crates: $(foreach package,$(native_cargo_packages),vendor-$(package)- vendor-all-crates: $(native_rust_cached) @rm -rf $(WORK_PATH)/vendor-main @mkdir -p $(WORK_PATH)/vendor-main - @$(build_TAR) --no-same-owner -xf $(native_rust_cached) -C $(WORK_PATH)/vendor-main + @$(build_TAR) -P --no-same-owner -xf $(native_rust_cached) -C $(WORK_PATH)/vendor-main @echo "Vendoring main project crates..." @$(WORK_PATH)/vendor-main/native/bin/cargo vendor --locked --manifest-path $(BASEDIR)/../Cargo.toml $(WORK_PATH)/vendor-main/$(CRATE_REGISTRY) @cd $(WORK_PATH)/vendor-main; find $(CRATE_REGISTRY) | sort | $(build_TAR) --no-recursion -czf $(CRATE_ARCHIVE) -T - diff --git a/depends/funcs.mk b/depends/funcs.mk index d0c7f4d39f10..148c649c7aa7 100644 --- a/depends/funcs.mk +++ b/depends/funcs.mk @@ -83,7 +83,7 @@ $(1)_download_path_fixed=$(subst :,\:,$$($(1)_download_path)) #default commands # The default behavior for tar will try to set ownership when running as uid 0 and may not succeed, --no-same-owner disables this behavior $(1)_fetch_cmds ?= $(call fetch_file,$(1),$(subst \:,:,$$($(1)_download_path_fixed)),$$($(1)_download_file),$($(1)_file_name),$($(1)_sha256_hash)) -$(1)_extract_cmds ?= mkdir -p $$($(1)_extract_dir) && echo "$$($(1)_sha256_hash) $$($(1)_source)" > $$($(1)_extract_dir)/.$$($(1)_file_name).hash && $(build_SHA256SUM) -c $$($(1)_extract_dir)/.$$($(1)_file_name).hash && $(build_TAR) --no-same-owner --strip-components=1 -xf $$($(1)_source) +$(1)_extract_cmds ?= mkdir -p $$($(1)_extract_dir) && echo "$$($(1)_sha256_hash) $$($(1)_source)" > $$($(1)_extract_dir)/.$$($(1)_file_name).hash && $(build_SHA256SUM) -c $$($(1)_extract_dir)/.$$($(1)_file_name).hash && $(build_TAR) -P --no-same-owner --strip-components=1 -xf $$($(1)_source) $(1)_preprocess_cmds ?= true $(1)_build_cmds ?= true $(1)_config_cmds ?= true @@ -288,10 +288,10 @@ $(1)_vendored_archive = $(SOURCES_PATH)/$($(1)_vendored_file_name) vendor-$(1)-crates: $(native_rust_cached) $(SOURCES_PATH)/$($(1)_file_name) @rm -rf $(WORK_PATH)/vendor-$(1) @mkdir -p $(WORK_PATH)/vendor-$(1) - @$(build_TAR) --no-same-owner -xf $(native_rust_cached) -C $(WORK_PATH)/vendor-$(1) + @$(build_TAR) -P --no-same-owner -xf $(native_rust_cached) -C $(WORK_PATH)/vendor-$(1) @echo "Vendoring $(1) crates..." @mkdir -p $(WORK_PATH)/vendor-$(1)/src - @cd $(WORK_PATH)/vendor-$(1)/src && $(build_TAR) --no-same-owner --strip-components=1 -xf $(SOURCES_PATH)/$($(1)_file_name) + @cd $(WORK_PATH)/vendor-$(1)/src && $(build_TAR) -P --no-same-owner --strip-components=1 -xf $(SOURCES_PATH)/$($(1)_file_name) @cp $(PATCHES_PATH)/$(1)/Cargo.lock $(WORK_PATH)/vendor-$(1)/src/ @$(WORK_PATH)/vendor-$(1)/native/bin/cargo vendor --locked --manifest-path $(WORK_PATH)/vendor-$(1)/src/$($(1)_cargo_manifest) $(WORK_PATH)/vendor-$(1)/src/vendored @cd $(WORK_PATH)/vendor-$(1)/src; find vendored | sort | $(build_TAR) --no-recursion -czf $$($(1)_vendored_archive) -T - @@ -332,7 +332,7 @@ define int_cargo_preprocess_ext $(1)_preprocess_cmds += && \ if test -f $(SOURCES_PATH)/$($(1)_vendored_file_name); then \ echo "Extracting vendored crates for $(1)..." && \ - $(build_TAR) --no-same-owner -xf $(SOURCES_PATH)/$($(1)_vendored_file_name) && \ + $(build_TAR) -P --no-same-owner -xf $(SOURCES_PATH)/$($(1)_vendored_file_name) && \ mkdir -p .cargo && \ cp $(PATCHES_PATH)/$(1)/cargo-config.toml .cargo/config.toml; \ fi diff --git a/depends/packages/native_rust.mk b/depends/packages/native_rust.mk index 63170d040ab1..32d044d91b75 100644 --- a/depends/packages/native_rust.mk +++ b/depends/packages/native_rust.mk @@ -97,9 +97,9 @@ define $(package)_extract_cmds echo "$($(package)_sha256_hash_$(build_arch)_$(build_os)) $($(package)_source_dir)/$($(package)_file_name_$(build_arch)_$(build_os))" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ $(build_SHA256SUM) -c $($(package)_extract_dir)/.$($(package)_file_name).hash && \ mkdir $(canonical_host) && \ - $(build_TAR) --no-same-owner --strip-components=1 -xf $($(package)_source_dir)/$($(package)_exact_file_name) -C $(canonical_host) && \ + $(build_TAR) -P --no-same-owner --strip-components=1 -xf $($(package)_source_dir)/$($(package)_exact_file_name) -C $(canonical_host) && \ mkdir buildos && \ - $(build_TAR) --no-same-owner --strip-components=1 -xf $($(package)_source_dir)/$($(package)_file_name_$(build_arch)_$(build_os)) -C buildos + $(build_TAR) -P --no-same-owner --strip-components=1 -xf $($(package)_source_dir)/$($(package)_file_name_$(build_arch)_$(build_os)) -C buildos endef define $(package)_stage_cmds From e011d455175ccd5d45cc73ea936521aafd768460 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Sat, 17 Jan 2026 16:26:26 +0530 Subject: [PATCH 17/25] fix: copy native binaries for access within Guix context --- contrib/guix/libexec/build.sh | 6 ++++++ depends/packages/native_cxxbridge.mk | 3 ++- depends/packages/native_rust.mk | 18 +++++++++++++++--- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/contrib/guix/libexec/build.sh b/contrib/guix/libexec/build.sh index c5db880776ae..2d574d4c1bbf 100755 --- a/contrib/guix/libexec/build.sh +++ b/contrib/guix/libexec/build.sh @@ -86,6 +86,9 @@ case "$HOST" in ;; esac +# Rust build scripts need LD_LIBRARY_PATH to find libgcc_s.so.1 at runtime +export LD_LIBRARY_PATH="${LIBRARY_PATH}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" + # Set environment variables to point the CROSS toolchain to the right # includes/libs for $HOST case "$HOST" in @@ -192,6 +195,9 @@ case "$HOST" in ;; esac +# Make $HOST-specific native binaries from depends available in $PATH +export PATH="${BASEPREFIX}/${HOST}/native/bin:${PATH}" + ########################### # Source Tarball Building # ########################### diff --git a/depends/packages/native_cxxbridge.mk b/depends/packages/native_cxxbridge.mk index c0d9963382c1..e13d61cdba41 100644 --- a/depends/packages/native_cxxbridge.mk +++ b/depends/packages/native_cxxbridge.mk @@ -26,5 +26,6 @@ define $(package)_build_cmds endef define $(package)_stage_cmds - $($(package)_cargo) install --locked --path=. --bin=cxxbridge --root=$($(package)_staging_prefix_dir) + $($(package)_cargo) install --locked --path=. --bin=cxxbridge --root=$($(package)_staging_prefix_dir) && \ + mkdir -p $($(package)_staging_prefix_dir)/lib endef diff --git a/depends/packages/native_rust.mk b/depends/packages/native_rust.mk index 32d044d91b75..7a81d9be9d2c 100644 --- a/depends/packages/native_rust.mk +++ b/depends/packages/native_rust.mk @@ -103,12 +103,24 @@ define $(package)_extract_cmds endef define $(package)_stage_cmds - bash ./install.sh --destdir=$($(package)_staging_dir) --prefix=$(build_prefix) $($(package)_stage_opts) $($(package)_stage_build_opts) && \ - bash ../$(canonical_host)/install.sh --destdir=$($(package)_staging_dir) --prefix=$(build_prefix) $($(package)_stage_opts) + mkdir -p $($(package)_staging_dir)/$(host_prefix)/native/bin && \ + mkdir -p $($(package)_staging_dir)/$(host_prefix)/native/lib/rustlib && \ + cp cargo/bin/cargo $($(package)_staging_dir)/$(host_prefix)/native/bin/ && \ + cp rustc/bin/rustc $($(package)_staging_dir)/$(host_prefix)/native/bin/ && \ + cp rustc/bin/rustdoc $($(package)_staging_dir)/$(host_prefix)/native/bin/ && \ + cp -r rustc/lib/* $($(package)_staging_dir)/$(host_prefix)/native/lib/ && \ + cp -r rust-std-*/lib/rustlib/* $($(package)_staging_dir)/$(host_prefix)/native/lib/rustlib/ && \ + cp -r ../$(canonical_host)/rust-std-$($(package)_rust_target)/lib/rustlib/$($(package)_rust_target) $($(package)_staging_dir)/$(host_prefix)/native/lib/rustlib/ endef else define $(package)_stage_cmds - bash ./install.sh --destdir=$($(package)_staging_dir) --prefix=$(build_prefix) $($(package)_stage_opts) $($(package)_stage_build_opts) + mkdir -p $($(package)_staging_dir)/$(host_prefix)/native/bin && \ + mkdir -p $($(package)_staging_dir)/$(host_prefix)/native/lib/rustlib && \ + cp cargo/bin/cargo $($(package)_staging_dir)/$(host_prefix)/native/bin/ && \ + cp rustc/bin/rustc $($(package)_staging_dir)/$(host_prefix)/native/bin/ && \ + cp rustc/bin/rustdoc $($(package)_staging_dir)/$(host_prefix)/native/bin/ && \ + cp -r rustc/lib/* $($(package)_staging_dir)/$(host_prefix)/native/lib/ && \ + cp -r rust-std-*/lib/rustlib/* $($(package)_staging_dir)/$(host_prefix)/native/lib/rustlib/ endef endif From 8908b57ab60ea53b0e75e7405051bf424507f916 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Thu, 29 Jan 2026 18:09:20 +0530 Subject: [PATCH 18/25] fix: patch loader paths to Guix store locations --- contrib/guix/guix-build | 1 + contrib/guix/libexec/fix-elf-interpreter.sh | 90 +++++++++++++++++++++ contrib/guix/manifest.scm | 2 + depends/funcs.mk | 4 + depends/packages/native_cxxbridge.mk | 5 +- depends/packages/native_rust.mk | 14 +++- 6 files changed, 113 insertions(+), 3 deletions(-) create mode 100755 contrib/guix/libexec/fix-elf-interpreter.sh diff --git a/contrib/guix/guix-build b/contrib/guix/guix-build index fb8a6e5fa740..e71a5bc72a51 100755 --- a/contrib/guix/guix-build +++ b/contrib/guix/guix-build @@ -472,6 +472,7 @@ EOF DISTSRC="$(DISTSRC_BASE=/distsrc-base && distsrc_for_host "$HOST")" \ OUTDIR="$(OUTDIR_BASE=/outdir-base && outdir_for_host "$HOST")" \ DIST_ARCHIVE_BASE=/outdir-base/dist-archive \ + GUIX_BUILD_CONTAINER=1 \ bash -c "cd /dash && bash contrib/guix/libexec/build.sh" ) diff --git a/contrib/guix/libexec/fix-elf-interpreter.sh b/contrib/guix/libexec/fix-elf-interpreter.sh new file mode 100755 index 000000000000..4fcbcc10a692 --- /dev/null +++ b/contrib/guix/libexec/fix-elf-interpreter.sh @@ -0,0 +1,90 @@ +#!/usr/bin/env bash +# Copyright (c) 2026 The Dash Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +export LC_ALL=C + +SH_NAME="$(basename "${0}")" +SH_LS="$(command -v ls)" +SH_PATCHELF="$(command -v patchelf)" +LIBDIR="${1}" +shift + +if [ -z "${GUIX_BUILD_CONTAINER}" ]; then + echo "${SH_NAME}: not in expected environment, goodbye!"; + exit 0; +elif [ ! "${SH_LS}" ]; then + echo "${SH_NAME}: ls not found, cannot continue!"; + exit 1; +elif [ ! "${SH_PATCHELF}" ]; then + echo "${SH_NAME}: patchelf not found, cannot continue!"; + exit 1; +elif [ -z "${LIBDIR}" ] || [ $# -eq 0 ]; then + echo "Usage: ${SH_NAME} [binary2] ..."; + exit 1; +fi + +# Get the interpreter from a known working binary +GUIX_INTERP="$("${SH_PATCHELF}" --print-interpreter "${SH_LS}" 2>/dev/null)" +if [ -z "${GUIX_INTERP}" ]; then + echo "${SH_NAME}: could not detect interpreter, skipping"; + exit 1; +else + echo "${SH_NAME}: detected interpreter ${GUIX_INTERP}" +fi + + +# Find and copy libgcc_s.so.1 into our lib directory +SH_GCC="$(command -v gcc)" +LIBGCC_SRC="" +if [ "${SH_GCC}" ]; then + # Method 1: Ask gcc directly for the library path + LIBGCC_PATH="$(gcc -print-file-name=libgcc_s.so.1 2>/dev/null)" + if [ -f "${LIBGCC_PATH}" ]; then + LIBGCC_SRC="${LIBGCC_PATH}"; + else + # Method 2: Search relative to the gcc prefix + GCC_PREFIX="$(dirname "$(dirname "${SH_GCC}")")" + if [ -f "${GCC_PREFIX}/lib/libgcc_s.so.1" ]; then + LIBGCC_SRC="${GCC_PREFIX}/lib/libgcc_s.so.1"; + fi + fi +fi + +if [ -z "${LIBGCC_SRC}" ] && [ -n "${LIBRARY_PATH}" ]; then + # Method 3: Search LIBRARY_PATH + IFS=':' read -ra LIB_PATHS <<< "${LIBRARY_PATH}" + for libpath in "${LIB_PATHS[@]}" + do + if [ -f "${libpath}/libgcc_s.so.1" ]; then + LIBGCC_SRC="${libpath}/libgcc_s.so.1"; + break; + fi + done +fi + +# Resolve symlinks and copy it +if [ -n "${LIBGCC_SRC}" ]; then + LIBGCC_REAL="$(readlink -f "${LIBGCC_SRC}")" + echo "${SH_NAME}: copying libgcc_s.so.1 from ${LIBGCC_REAL}"; + cp "${LIBGCC_REAL}" "${LIBDIR}/libgcc_s.so.1"; +else + echo "${SH_NAME}: libgcc_s.so.1 not found, cannot continue!"; + exit 1; +fi + +# RPATH just needs $ORIGIN/../lib as everything is self-contained +GUIX_RPATH="\$ORIGIN/../lib" +echo "${SH_NAME}: using RPATH ${GUIX_RPATH}" + +for binary in "${@}" +do + if [ -f "${binary}" ]; then + echo "${SH_NAME}: patching ${binary}"; + "${SH_PATCHELF}" --set-interpreter "${GUIX_INTERP}" "${binary}"; + "${SH_PATCHELF}" --print-interpreter "${binary}" + "${SH_PATCHELF}" --set-rpath "${GUIX_RPATH}" "${binary}"; + "${SH_PATCHELF}" --print-rpath "${binary}" + fi +done diff --git a/contrib/guix/manifest.scm b/contrib/guix/manifest.scm index 2f21f5b58801..cc39854319b1 100644 --- a/contrib/guix/manifest.scm +++ b/contrib/guix/manifest.scm @@ -8,6 +8,7 @@ (gnu packages commencement) (gnu packages compression) (gnu packages cross-base) + ((gnu packages elf) #:select (patchelf)) (gnu packages file) (gnu packages gawk) (gnu packages gcc) @@ -533,6 +534,7 @@ inspecting signatures in Mach-O binaries.") libtool autoconf-2.71 automake + patchelf pkg-config ;; Scripting python-minimal ;; (3.10) diff --git a/depends/funcs.mk b/depends/funcs.mk index 148c649c7aa7..5cb5e6508af6 100644 --- a/depends/funcs.mk +++ b/depends/funcs.mk @@ -38,6 +38,10 @@ define fetch_file $(call fetch_file_inner,$(1),$(FALLBACK_DOWNLOAD_PATH),$(4),$(4),$(5))) endef +define run_if_exists + (test ! -f $(1) || bash $(1) $(2)) +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)_recipe_hash:=$(shell echo -n "$($(1)_all_file_checksums)" | $(build_SHA256SUM) | cut -d" " -f1)) diff --git a/depends/packages/native_cxxbridge.mk b/depends/packages/native_cxxbridge.mk index e13d61cdba41..31e24a91772a 100644 --- a/depends/packages/native_cxxbridge.mk +++ b/depends/packages/native_cxxbridge.mk @@ -27,5 +27,8 @@ endef define $(package)_stage_cmds $($(package)_cargo) install --locked --path=. --bin=cxxbridge --root=$($(package)_staging_prefix_dir) && \ - mkdir -p $($(package)_staging_prefix_dir)/lib + mkdir -p $($(package)_staging_prefix_dir)/lib && \ + $(call run_if_exists,$(BASEDIR)/../contrib/guix/libexec/fix-elf-interpreter.sh,\ + $($(package)_staging_prefix_dir)/lib \ + $($(package)_staging_prefix_dir)/bin/cxxbridge) endef diff --git a/depends/packages/native_rust.mk b/depends/packages/native_rust.mk index 7a81d9be9d2c..e9dcd86be431 100644 --- a/depends/packages/native_rust.mk +++ b/depends/packages/native_rust.mk @@ -110,7 +110,12 @@ define $(package)_stage_cmds cp rustc/bin/rustdoc $($(package)_staging_dir)/$(host_prefix)/native/bin/ && \ cp -r rustc/lib/* $($(package)_staging_dir)/$(host_prefix)/native/lib/ && \ cp -r rust-std-*/lib/rustlib/* $($(package)_staging_dir)/$(host_prefix)/native/lib/rustlib/ && \ - cp -r ../$(canonical_host)/rust-std-$($(package)_rust_target)/lib/rustlib/$($(package)_rust_target) $($(package)_staging_dir)/$(host_prefix)/native/lib/rustlib/ + cp -r ../$(canonical_host)/rust-std-$($(package)_rust_target)/lib/rustlib/$($(package)_rust_target) $($(package)_staging_dir)/$(host_prefix)/native/lib/rustlib/ && \ + bash $(BASEDIR)/patches/native_rust/fix-elf-interpreter.sh \ + $($(package)_staging_dir)/$(host_prefix)/native/lib \ + $($(package)_staging_dir)/$(host_prefix)/native/bin/cargo \ + $($(package)_staging_dir)/$(host_prefix)/native/bin/rustc \ + $($(package)_staging_dir)/$(host_prefix)/native/bin/rustdoc endef else @@ -121,6 +126,11 @@ define $(package)_stage_cmds cp rustc/bin/rustc $($(package)_staging_dir)/$(host_prefix)/native/bin/ && \ cp rustc/bin/rustdoc $($(package)_staging_dir)/$(host_prefix)/native/bin/ && \ cp -r rustc/lib/* $($(package)_staging_dir)/$(host_prefix)/native/lib/ && \ - cp -r rust-std-*/lib/rustlib/* $($(package)_staging_dir)/$(host_prefix)/native/lib/rustlib/ + cp -r rust-std-*/lib/rustlib/* $($(package)_staging_dir)/$(host_prefix)/native/lib/rustlib/ && \ + $(call run_if_exists,$(BASEDIR)/../contrib/guix/libexec/fix-elf-interpreter.sh,\ + $($(package)_staging_dir)/$(host_prefix)/native/lib \ + $($(package)_staging_dir)/$(host_prefix)/native/bin/cargo \ + $($(package)_staging_dir)/$(host_prefix)/native/bin/rustc \ + $($(package)_staging_dir)/$(host_prefix)/native/bin/rustdoc) endef endif From e2d983962a528bd24496b430f83088370385d6a8 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Fri, 6 Feb 2026 15:39:54 +0530 Subject: [PATCH 19/25] refactor: split rust runner (builder) and standard library (cross) --- contrib/devtools/update-rust-hashes.py | 22 ++++--- depends/Makefile | 12 +--- depends/funcs.mk | 10 +++ depends/packages/native_rust.mk | 86 ++------------------------ depends/packages/packages.mk | 2 +- depends/packages/rust_stdlib.mk | 79 +++++++++++++++++++++++ 6 files changed, 110 insertions(+), 101 deletions(-) create mode 100644 depends/packages/rust_stdlib.mk diff --git a/contrib/devtools/update-rust-hashes.py b/contrib/devtools/update-rust-hashes.py index 9f7ceca02b4c..f336d41a59db 100755 --- a/contrib/devtools/update-rust-hashes.py +++ b/contrib/devtools/update-rust-hashes.py @@ -87,15 +87,20 @@ def update_hash_in_file(makefile_path: Path, pattern: str, new_hash: str) -> Non def main() -> int: script_dir = Path(__file__).resolve().parent depends_dir = (script_dir / "../../depends").resolve() - makefile_path = depends_dir / "packages/native_rust.mk" + native_rust_path = depends_dir / "packages/native_rust.mk" + rust_stdlib_path = depends_dir / "packages/rust_stdlib.mk" sources_dir = depends_dir / "sources" stamps_dir = sources_dir / "download-stamps" - if not makefile_path.exists(): - print(f"Error: {makefile_path} not found", file=sys.stderr) + if not native_rust_path.exists(): + print(f"Error: {native_rust_path} not found", file=sys.stderr) return 1 - rust_version = get_version(makefile_path) + if not rust_stdlib_path.exists(): + print(f"Error: {rust_stdlib_path} not found", file=sys.stderr) + return 1 + + rust_version = get_version(native_rust_path) print(f"Rust version: {rust_version}\n") print("Updating native compiler hashes:") @@ -104,17 +109,18 @@ def main() -> int: file_name = f"rust-{rust_version}-{rust_target}.tar.gz" url = f"https://static.rust-lang.org/dist/{file_name}" hash_value = download_and_hash(url, sources_dir / file_name) - update_hash_in_file(makefile_path, f"sha256_hash_{makefile_id}", hash_value) + update_hash_in_file(native_rust_path, f"sha256_hash_{makefile_id}", hash_value) write_stamp(stamps_dir, "native_rust", rust_version, hash_value, file_name) print(f" Updated sha256_hash_{makefile_id}") + print("\nUpdating stdlib hashes:") for rust_target in CROSS_TARGETS: file_name = f"rust-std-{rust_version}-{rust_target}.tar.gz" url = f"https://static.rust-lang.org/dist/{file_name}" hash_value = download_and_hash(url, sources_dir / file_name) - update_hash_in_file(makefile_path, f"rust_std_sha256_hash_{rust_target}", hash_value) - write_stamp(stamps_dir, "native_rust", rust_version, hash_value, file_name) - print(f" Updated rust_std_sha256_hash_{rust_target}") + update_hash_in_file(rust_stdlib_path, f"sha256_hash_{rust_target}", hash_value) + write_stamp(stamps_dir, "rust_stdlib", rust_version, hash_value, file_name) + print(f" Updated sha256_hash_{rust_target}") print("\nDone!") return 0 diff --git a/depends/Makefile b/depends/Makefile index 45d43bd16180..cc82344b01de 100644 --- a/depends/Makefile +++ b/depends/Makefile @@ -342,16 +342,8 @@ download-linux: download-win: @$(MAKE) -s HOST=x86_64-w64-mingw32 download-one download-rust-std: - @mkdir -p $(SOURCES_PATH) - @for target in $(native_rust_rust_std_targets); do \ - file="rust-std-$(native_rust_version)-$${target}.tar.gz"; \ - if [ ! -f "$(SOURCES_PATH)/$${file}" ]; then \ - echo "Downloading $${file}..."; \ - curl -L -o "$(SOURCES_PATH)/$${file}" "$(native_rust_download_path)/$${file}" || exit 1; \ - else \ - echo "Already have $${file}"; \ - fi; \ - done + @mkdir -p $(SOURCES_PATH)/download-stamps + @$(foreach target,$(rust_stdlib_targets),$(call download_rust_std_target,$(target)) && ) true download-rust-src: @mkdir -p $(SOURCES_PATH) @$(foreach package,$(native_cargo_packages),$(call download_rust_src_package,$(package)) && ) true diff --git a/depends/funcs.mk b/depends/funcs.mk index 5cb5e6508af6..727d965fd648 100644 --- a/depends/funcs.mk +++ b/depends/funcs.mk @@ -305,6 +305,16 @@ vendor-$(1)-crates: $(native_rust_cached) $(SOURCES_PATH)/$($(1)_file_name) endif endef +define download_rust_std_target +([ -f "$(SOURCES_PATH)/rust-std-$(rust_stdlib_version)-$(1).tar.gz" ] && \ + echo "Already have rust-std-$(rust_stdlib_version)-$(1).tar.gz" || \ + (echo "Downloading rust-std-$(rust_stdlib_version)-$(1).tar.gz..." && \ + $(build_DOWNLOAD) "$(SOURCES_PATH)/rust-std-$(rust_stdlib_version)-$(1).tar.gz" "$(rust_stdlib_download_path)/rust-std-$(rust_stdlib_version)-$(1).tar.gz")) && \ +echo "$(rust_stdlib_sha256_hash_$(1)) rust-std-$(rust_stdlib_version)-$(1).tar.gz" > "$(SOURCES_PATH)/.rust-std-$(1).hash" && \ +cd "$(SOURCES_PATH)" && $(build_SHA256SUM) -c ".rust-std-$(1).hash" && rm -f ".rust-std-$(1).hash" && \ +echo "$(rust_stdlib_sha256_hash_$(1)) rust-std-$(rust_stdlib_version)-$(1).tar.gz" > "$(SOURCES_PATH)/download-stamps/.stamp_fetched-rust_stdlib-$(rust_stdlib_version)-$(rust_stdlib_sha256_hash_$(1)).hash" +endef + define download_rust_src_package ([ -f "$(SOURCES_PATH)/$($(1)_file_name)" ] && \ echo "Already have $($(1)_file_name)" || \ diff --git a/depends/packages/native_rust.mk b/depends/packages/native_rust.mk index e9dcd86be431..bad525e211cc 100644 --- a/depends/packages/native_rust.mk +++ b/depends/packages/native_rust.mk @@ -11,113 +11,36 @@ $(package)_version:=1.82.0 $(package)_download_path:=https://static.rust-lang.org/dist # FreeBSD (x86_64) -$(package)_rust_std_targets += x86_64-unknown-freebsd -$(package)_rust_target_x86_64-unknown-freebsd:=x86_64-unknown-freebsd $(package)_file_name_x86_64_freebsd:=rust-$($(package)_version)-x86_64-unknown-freebsd.tar.gz $(package)_sha256_hash_x86_64_freebsd:=f7b51943dbed0af3387e3269c1767fee916fb22b8e7897b3594bf5e422403137 -$(package)_rust_std_sha256_hash_x86_64-unknown-freebsd:=be1acaf3c2f15d42b05b1f032db5ac3b11a0ac5a91c0efef26f2d8135d68a829 # Linux (ARMv8) -$(package)_rust_std_targets += aarch64-unknown-linux-gnu -$(package)_rust_target_aarch64-unknown-linux-gnu:=aarch64-unknown-linux-gnu $(package)_file_name_aarch64_linux:=rust-$($(package)_version)-aarch64-unknown-linux-gnu.tar.gz $(package)_sha256_hash_aarch64_linux:=d7db04fce65b5f73282941f3f1df5893be9810af17eb7c65b2e614461fe31a48 -$(package)_rust_std_sha256_hash_aarch64-unknown-linux-gnu:=82b2308ee531775bf4d1faa57bddfae85f363bec43ca36ba6db4ebad7c1450d4 # Linux (x86_64) -$(package)_rust_std_targets += x86_64-unknown-linux-gnu -$(package)_rust_target_x86_64-unknown-linux-gnu:=x86_64-unknown-linux-gnu $(package)_file_name_x86_64_linux:=rust-$($(package)_version)-x86_64-unknown-linux-gnu.tar.gz $(package)_sha256_hash_x86_64_linux:=0265c08ae997c4de965048a244605fb1f24a600bbe35047b811c638b8fcf676b -$(package)_rust_std_sha256_hash_x86_64-unknown-linux-gnu:=e7e808b8745298369fa3bbc3c0b7af9ca0fb995661bd684a7022d14bc9ae0057 - -# macOS (x86_64) -$(package)_rust_std_targets += x86_64-apple-darwin -$(package)_rust_target_x86_64-apple-darwin:=x86_64-apple-darwin -$(package)_file_name_x86_64_darwin:=rust-$($(package)_version)-x86_64-apple-darwin.tar.gz -$(package)_sha256_hash_x86_64_darwin:=b1a289cabc523f259f65116a41374ac159d72fbbf6c373bd5e545c8e835ceb6a -$(package)_rust_std_sha256_hash_x86_64-apple-darwin:=52084c8cdb34ca139a00f9f03f1a582d96b677e9f223a8d1aa31ae575a06cc16 # macOS (ARMv8) -$(package)_rust_std_targets += aarch64-apple-darwin -$(package)_rust_target_aarch64-apple-darwin:=aarch64-apple-darwin -$(package)_rust_target_arm64-apple-darwin:=aarch64-apple-darwin $(package)_file_name_aarch64_darwin:=rust-$($(package)_version)-aarch64-apple-darwin.tar.gz $(package)_sha256_hash_aarch64_darwin:=49b6d36b308addcfd21ae56c94957688338ba7b8985bff57fc626c8e1b32f62c -$(package)_rust_std_sha256_hash_aarch64-apple-darwin:=5ec28e75ed8715efaa2490d76ae026a34b13df6899d98b14d0a6995556f4e6b4 - -# Linux (ARMv7) - Cross only -$(package)_rust_std_targets += armv7-unknown-linux-gnueabihf -$(package)_rust_target_arm-unknown-linux-gnueabihf:=armv7-unknown-linux-gnueabihf -$(package)_rust_target_armv7-unknown-linux-gnueabihf:=armv7-unknown-linux-gnueabihf -$(package)_rust_std_sha256_hash_armv7-unknown-linux-gnueabihf:=5dd8b36467e03ba47bfa7ea5d7578c66bccb648dd2129d7cec6fb3ff00f81ca3 - -# Linux (PowerPC 64-bit) - Cross only -$(package)_rust_std_targets += powerpc64le-unknown-linux-gnu -$(package)_rust_target_powerpc64le-unknown-linux-gnu:=powerpc64le-unknown-linux-gnu -$(package)_rust_std_sha256_hash_powerpc64le-unknown-linux-gnu:=142c7c2896fa4596b5c4c35d9d5e4d80acd5a699e5fa0560d92a89eda035ece3 - -# Linux (RISCV64 GC) - Cross only -$(package)_rust_std_targets += riscv64gc-unknown-linux-gnu -$(package)_rust_target_riscv64-unknown-linux-gnu:=riscv64gc-unknown-linux-gnu -$(package)_rust_target_riscv64gc-unknown-linux-gnu:=riscv64gc-unknown-linux-gnu -$(package)_rust_std_sha256_hash_riscv64gc-unknown-linux-gnu:=7b35c8207c77e3fc2f7f7a26dea989cc2cdc13a955851ff74d4882f96f4e14dd -# Windows (x86_64) - Cross only -$(package)_rust_std_targets += x86_64-pc-windows-gnu -$(package)_rust_target_x86_64-w64-mingw32:=x86_64-pc-windows-gnu -$(package)_rust_target_x86_64-pc-windows-gnu:=x86_64-pc-windows-gnu -$(package)_rust_std_sha256_hash_x86_64-pc-windows-gnu:=32d42270b114c9341e5bc9b1d24f336024889ddd32a7d22e4700cc3c45fe9d3d +# macOS (x86_64) +$(package)_file_name_x86_64_darwin:=rust-$($(package)_version)-x86_64-apple-darwin.tar.gz +$(package)_sha256_hash_x86_64_darwin:=b1a289cabc523f259f65116a41374ac159d72fbbf6c373bd5e545c8e835ceb6a -### $(package)_file_name:=$($(package)_file_name_$(build_arch)_$(build_os)) $(package)_sha256_hash:=$($(package)_sha256_hash_$(build_arch)_$(build_os)) -$(package)_rust_target:=$(or $($(package)_rust_target_$(canonical_host)),$($(package)_rust_target_$(subst -pc-,-unknown-,$(canonical_host))),$($(package)_rust_target_$(subst -unknown-,-pc-,$(canonical_host)))) -### define $(package)_set_vars $(package)_stage_opts=--disable-ldconfig $(package)_stage_build_opts=--without=rust-docs-json-preview,rust-docs endef -ifneq ($(canonical_host),$(build)) -$(package)_exact_file_name:=rust-std-$($(package)_version)-$($(package)_rust_target).tar.gz -$(package)_exact_sha256_hash:=$($(package)_rust_std_sha256_hash_$($(package)_rust_target)) -$(package)_build_subdir:=buildos -$(package)_extra_sources:=$($(package)_exact_file_name) - define $(package)_fetch_cmds -$(call fetch_file,$(package),$($(package)_download_path),$($(package)_exact_file_name),$($(package)_exact_file_name),$($(package)_exact_sha256_hash)) && \ -$(call fetch_file,$(package),$($(package)_download_path),$($(package)_file_name_$(build_arch)_$(build_os)),$($(package)_file_name_$(build_arch)_$(build_os)),$($(package)_sha256_hash_$(build_arch)_$(build_os))) -endef - -define $(package)_extract_cmds - mkdir -p $($(package)_extract_dir) && \ - echo "$($(package)_exact_sha256_hash) $($(package)_source_dir)/$($(package)_exact_file_name)" > $($(package)_extract_dir)/.$($(package)_file_name).hash && \ - echo "$($(package)_sha256_hash_$(build_arch)_$(build_os)) $($(package)_source_dir)/$($(package)_file_name_$(build_arch)_$(build_os))" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ - $(build_SHA256SUM) -c $($(package)_extract_dir)/.$($(package)_file_name).hash && \ - mkdir $(canonical_host) && \ - $(build_TAR) -P --no-same-owner --strip-components=1 -xf $($(package)_source_dir)/$($(package)_exact_file_name) -C $(canonical_host) && \ - mkdir buildos && \ - $(build_TAR) -P --no-same-owner --strip-components=1 -xf $($(package)_source_dir)/$($(package)_file_name_$(build_arch)_$(build_os)) -C buildos -endef - -define $(package)_stage_cmds - mkdir -p $($(package)_staging_dir)/$(host_prefix)/native/bin && \ - mkdir -p $($(package)_staging_dir)/$(host_prefix)/native/lib/rustlib && \ - cp cargo/bin/cargo $($(package)_staging_dir)/$(host_prefix)/native/bin/ && \ - cp rustc/bin/rustc $($(package)_staging_dir)/$(host_prefix)/native/bin/ && \ - cp rustc/bin/rustdoc $($(package)_staging_dir)/$(host_prefix)/native/bin/ && \ - cp -r rustc/lib/* $($(package)_staging_dir)/$(host_prefix)/native/lib/ && \ - cp -r rust-std-*/lib/rustlib/* $($(package)_staging_dir)/$(host_prefix)/native/lib/rustlib/ && \ - cp -r ../$(canonical_host)/rust-std-$($(package)_rust_target)/lib/rustlib/$($(package)_rust_target) $($(package)_staging_dir)/$(host_prefix)/native/lib/rustlib/ && \ - bash $(BASEDIR)/patches/native_rust/fix-elf-interpreter.sh \ - $($(package)_staging_dir)/$(host_prefix)/native/lib \ - $($(package)_staging_dir)/$(host_prefix)/native/bin/cargo \ - $($(package)_staging_dir)/$(host_prefix)/native/bin/rustc \ - $($(package)_staging_dir)/$(host_prefix)/native/bin/rustdoc +$(call fetch_file,$(package),$($(package)_download_path),$($(package)_file_name),$($(package)_file_name),$($(package)_sha256_hash)) endef -else define $(package)_stage_cmds mkdir -p $($(package)_staging_dir)/$(host_prefix)/native/bin && \ @@ -133,4 +56,3 @@ define $(package)_stage_cmds $($(package)_staging_dir)/$(host_prefix)/native/bin/rustc \ $($(package)_staging_dir)/$(host_prefix)/native/bin/rustdoc) endef -endif diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk index ac4c9224c9c5..66ffa913b07c 100644 --- a/depends/packages/packages.mk +++ b/depends/packages/packages.mk @@ -1,4 +1,4 @@ -packages:=gmp backtrace rustcxx +packages:=gmp backtrace rustcxx rust_stdlib boost_packages = boost diff --git a/depends/packages/rust_stdlib.mk b/depends/packages/rust_stdlib.mk new file mode 100644 index 000000000000..3d62398a91bf --- /dev/null +++ b/depends/packages/rust_stdlib.mk @@ -0,0 +1,79 @@ +# Copyright (c) 2016-2025 The Zcash developers +# Copyright (c) 2026 The Dash Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +# To update the Rust stdlib, change the version below and then run the script +# ./contrib/devtools/update-rust-hashes.py + +package:=rust_stdlib +$(package)_version:=1.82.0 +$(package)_download_path:=https://static.rust-lang.org/dist +$(package)_dependencies:=native_rust + +# FreeBSD (x86_64) +$(package)_targets += x86_64-unknown-freebsd +$(package)_target_x86_64-unknown-freebsd:=x86_64-unknown-freebsd +$(package)_sha256_hash_x86_64-unknown-freebsd:=be1acaf3c2f15d42b05b1f032db5ac3b11a0ac5a91c0efef26f2d8135d68a829 + +# Linux (ARMv7) +$(package)_targets += armv7-unknown-linux-gnueabihf +$(package)_target_arm-unknown-linux-gnueabihf:=armv7-unknown-linux-gnueabihf +$(package)_target_armv7-unknown-linux-gnueabihf:=armv7-unknown-linux-gnueabihf +$(package)_sha256_hash_armv7-unknown-linux-gnueabihf:=5dd8b36467e03ba47bfa7ea5d7578c66bccb648dd2129d7cec6fb3ff00f81ca3 + +# Linux (ARMv8) +$(package)_targets += aarch64-unknown-linux-gnu +$(package)_target_aarch64-unknown-linux-gnu:=aarch64-unknown-linux-gnu +$(package)_sha256_hash_aarch64-unknown-linux-gnu:=82b2308ee531775bf4d1faa57bddfae85f363bec43ca36ba6db4ebad7c1450d4 + +# Linux (PowerPC 64-bit little-endian) +$(package)_targets += powerpc64le-unknown-linux-gnu +$(package)_target_powerpc64le-unknown-linux-gnu:=powerpc64le-unknown-linux-gnu +$(package)_sha256_hash_powerpc64le-unknown-linux-gnu:=142c7c2896fa4596b5c4c35d9d5e4d80acd5a699e5fa0560d92a89eda035ece3 + +# Linux (RISCV64GC) +$(package)_targets += riscv64gc-unknown-linux-gnu +$(package)_target_riscv64-unknown-linux-gnu:=riscv64gc-unknown-linux-gnu +$(package)_target_riscv64gc-unknown-linux-gnu:=riscv64gc-unknown-linux-gnu +$(package)_sha256_hash_riscv64gc-unknown-linux-gnu:=7b35c8207c77e3fc2f7f7a26dea989cc2cdc13a955851ff74d4882f96f4e14dd + +# Linux (x86_64) +$(package)_targets += x86_64-unknown-linux-gnu +$(package)_target_x86_64-unknown-linux-gnu:=x86_64-unknown-linux-gnu +$(package)_sha256_hash_x86_64-unknown-linux-gnu:=e7e808b8745298369fa3bbc3c0b7af9ca0fb995661bd684a7022d14bc9ae0057 + +# macOS (ARMv8) +$(package)_targets += aarch64-apple-darwin +$(package)_target_aarch64-apple-darwin:=aarch64-apple-darwin +$(package)_target_arm64-apple-darwin:=aarch64-apple-darwin +$(package)_sha256_hash_aarch64-apple-darwin:=5ec28e75ed8715efaa2490d76ae026a34b13df6899d98b14d0a6995556f4e6b4 + +# macOS (x86_64) +$(package)_targets += x86_64-apple-darwin +$(package)_target_x86_64-apple-darwin:=x86_64-apple-darwin +$(package)_sha256_hash_x86_64-apple-darwin:=52084c8cdb34ca139a00f9f03f1a582d96b677e9f223a8d1aa31ae575a06cc16 + +# Windows (x86_64) +$(package)_targets += x86_64-pc-windows-gnu +$(package)_target_x86_64-w64-mingw32:=x86_64-pc-windows-gnu +$(package)_sha256_hash_x86_64-pc-windows-gnu:=32d42270b114c9341e5bc9b1d24f336024889ddd32a7d22e4700cc3c45fe9d3d + +$(package)_target:=$(or \ + $($(package)_target_$(canonical_host)),\ + $($(package)_target_$(host_arch)-$(host_vendor)-$(host_os)),\ + $($(package)_target_$(subst -pc-,-unknown-,$(canonical_host))),\ + $($(package)_target_$(subst -unknown-,-pc-,$(canonical_host))),\ + $($(package)_target_$(subst -linux-,-unknown-linux-,$(canonical_host)))) + +$(package)_file_name:=rust-std-$($(package)_version)-$($(package)_target).tar.gz +$(package)_sha256_hash:=$($(package)_sha256_hash_$($(package)_target)) + +define $(package)_fetch_cmds + $(call fetch_file,$(package),$($(package)_download_path),$($(package)_file_name),$($(package)_file_name),$($(package)_sha256_hash)) +endef + +define $(package)_stage_cmds + mkdir -p $($(package)_staging_dir)/$(host_prefix)/native/lib/rustlib && \ + cp -r rust-std-$($(package)_target)/lib/rustlib/$($(package)_target) $($(package)_staging_dir)/$(host_prefix)/native/lib/rustlib/ +endef From e15d8408ba432184b4cb6b00471e616b89fca6f5 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Thu, 29 Jan 2026 03:15:09 +0530 Subject: [PATCH 20/25] build: switch to Rust 1.85.1, use musl stdlib to avoid Guix glibc issues The conflict occurs due a difference in glibc version between the Guix environment and the targets compiled, this is only a problem for Linux targets so the issue doesn't extend to Windows --- .cargo/config.toml.offline | 10 +++--- configure.ac | 16 +++++----- contrib/devtools/update-rust-hashes.py | 10 +++--- depends/packages/native_rust.mk | 12 +++---- depends/packages/rust_stdlib.mk | 44 +++++++++++++------------- rust-toolchain.toml | 2 +- 6 files changed, 47 insertions(+), 47 deletions(-) diff --git a/.cargo/config.toml.offline b/.cargo/config.toml.offline index b50eda6bfe86..5300839c221f 100644 --- a/.cargo/config.toml.offline +++ b/.cargo/config.toml.offline @@ -1,17 +1,17 @@ # Linux -[target.aarch64-unknown-linux-gnu] +[target.aarch64-unknown-linux-musl] linker = "aarch64-linux-gnu-gcc" -[target.armv7-unknown-linux-gnueabihf] +[target.armv7-unknown-linux-musleabihf] linker = "arm-linux-gnueabihf-gcc" -[target.powerpc64le-unknown-linux-gnu] +[target.powerpc64le-unknown-linux-musl] linker = "powerpc64le-linux-gnu-gcc" -[target.riscv64gc-unknown-linux-gnu] +[target.riscv64gc-unknown-linux-musl] linker = "riscv64-linux-gnu-gcc" -[target.x86_64-unknown-linux-gnu] +[target.x86_64-unknown-linux-musl] linker = "x86_64-linux-gnu-gcc" # macOS diff --git a/configure.ac b/configure.ac index a6468940e312..d16040d9d687 100644 --- a/configure.ac +++ b/configure.ac @@ -1770,12 +1770,12 @@ AC_DEFUN([RS_SET_TRIPLE], [ case $2 in x86_64-*-freebsd*) $1="x86_64-unknown-freebsd" ;; aarch64-*-linux*|arm64-*-linux*) - $1="aarch64-unknown-linux-gnu" ;; - arm-*-linux*) $1="armv7-unknown-linux-gnueabihf" ;; - powerpc64-*-linux*) $1="powerpc64-unknown-linux-gnu" ;; - powerpc64le-*-linux*) $1="powerpc64le-unknown-linux-gnu" ;; - riscv64-*-linux*) $1="riscv64gc-unknown-linux-gnu" ;; - x86_64-*-linux*) $1="x86_64-unknown-linux-gnu" ;; + $1="aarch64-unknown-linux-$3" ;; + arm-*-linux*) $1="armv7-unknown-linux-$3eabihf" ;; + powerpc64-*-linux*) $1="powerpc64-unknown-linux-$3" ;; + powerpc64le-*-linux*) $1="powerpc64le-unknown-linux-$3" ;; + riscv64-*-linux*) $1="riscv64gc-unknown-linux-$3" ;; + x86_64-*-linux*) $1="x86_64-unknown-linux-$3" ;; x86_64-*-darwin*) $1="x86_64-apple-darwin" ;; aarch64-*-darwin*|arm64-*-darwin*) $1="aarch64-apple-darwin" ;; @@ -1785,7 +1785,7 @@ AC_DEFUN([RS_SET_TRIPLE], [ ]) AC_MSG_CHECKING([for Rust target]) -RS_SET_TRIPLE([RUST_TARGET], [$host]) +RS_SET_TRIPLE([RUST_TARGET], [$host], [musl]) if test "$RUST_TARGET" = ""; then AC_MSG_RESULT([unknown]) AC_MSG_ERROR([Unsupported target for Rust: $host]) @@ -1807,7 +1807,7 @@ case $host in esac AC_MSG_CHECKING([for Rust host]) -RS_SET_TRIPLE([RUST_NATIVE], [$build]) +RS_SET_TRIPLE([RUST_NATIVE], [$build], [gnu]) if test "$RUST_NATIVE" = ""; then if test "$cross_compiling" = "yes"; then AC_MSG_RESULT([unknown]) diff --git a/contrib/devtools/update-rust-hashes.py b/contrib/devtools/update-rust-hashes.py index f336d41a59db..93248d2e6ccc 100755 --- a/contrib/devtools/update-rust-hashes.py +++ b/contrib/devtools/update-rust-hashes.py @@ -16,11 +16,11 @@ # FreeBSD "x86_64-unknown-freebsd", # Linux - "aarch64-unknown-linux-gnu", - "armv7-unknown-linux-gnueabihf", - "powerpc64le-unknown-linux-gnu", - "riscv64gc-unknown-linux-gnu", - "x86_64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "armv7-unknown-linux-musleabihf", + "powerpc64le-unknown-linux-musl", + "riscv64gc-unknown-linux-musl", + "x86_64-unknown-linux-musl", # Windows "x86_64-pc-windows-gnu", # macOS diff --git a/depends/packages/native_rust.mk b/depends/packages/native_rust.mk index bad525e211cc..2772c0b473b8 100644 --- a/depends/packages/native_rust.mk +++ b/depends/packages/native_rust.mk @@ -7,28 +7,28 @@ # ./contrib/devtools/update-rust-hashes.py package:=native_rust -$(package)_version:=1.82.0 +$(package)_version:=1.85.1 $(package)_download_path:=https://static.rust-lang.org/dist # FreeBSD (x86_64) $(package)_file_name_x86_64_freebsd:=rust-$($(package)_version)-x86_64-unknown-freebsd.tar.gz -$(package)_sha256_hash_x86_64_freebsd:=f7b51943dbed0af3387e3269c1767fee916fb22b8e7897b3594bf5e422403137 +$(package)_sha256_hash_x86_64_freebsd:=f905730e22a9a8a2dfce1ab0c50d427b7978c5b235c33018b09552041b6f6329 # Linux (ARMv8) $(package)_file_name_aarch64_linux:=rust-$($(package)_version)-aarch64-unknown-linux-gnu.tar.gz -$(package)_sha256_hash_aarch64_linux:=d7db04fce65b5f73282941f3f1df5893be9810af17eb7c65b2e614461fe31a48 +$(package)_sha256_hash_aarch64_linux:=d2609d8cd965060f0b4a8c509131066369e8d3d31a92fedce177b42b32af6b4d # Linux (x86_64) $(package)_file_name_x86_64_linux:=rust-$($(package)_version)-x86_64-unknown-linux-gnu.tar.gz -$(package)_sha256_hash_x86_64_linux:=0265c08ae997c4de965048a244605fb1f24a600bbe35047b811c638b8fcf676b +$(package)_sha256_hash_x86_64_linux:=b7202563a52b47f575b284a5a4794fafd688e39bfe8fd855b5e80129e671cb7f # macOS (ARMv8) $(package)_file_name_aarch64_darwin:=rust-$($(package)_version)-aarch64-apple-darwin.tar.gz -$(package)_sha256_hash_aarch64_darwin:=49b6d36b308addcfd21ae56c94957688338ba7b8985bff57fc626c8e1b32f62c +$(package)_sha256_hash_aarch64_darwin:=64b0341a47e684d648c9b7defd0b7ff9d5397a64718cf803c1e114544f94bbe9 # macOS (x86_64) $(package)_file_name_x86_64_darwin:=rust-$($(package)_version)-x86_64-apple-darwin.tar.gz -$(package)_sha256_hash_x86_64_darwin:=b1a289cabc523f259f65116a41374ac159d72fbbf6c373bd5e545c8e835ceb6a +$(package)_sha256_hash_x86_64_darwin:=6e321957b7301d48e5ecf61bdeea6560400a5948b3e72830348367a8a9696ad7 $(package)_file_name:=$($(package)_file_name_$(build_arch)_$(build_os)) $(package)_sha256_hash:=$($(package)_sha256_hash_$(build_arch)_$(build_os)) diff --git a/depends/packages/rust_stdlib.mk b/depends/packages/rust_stdlib.mk index 3d62398a91bf..1fcfa81bf300 100644 --- a/depends/packages/rust_stdlib.mk +++ b/depends/packages/rust_stdlib.mk @@ -7,57 +7,57 @@ # ./contrib/devtools/update-rust-hashes.py package:=rust_stdlib -$(package)_version:=1.82.0 +$(package)_version:=1.85.1 $(package)_download_path:=https://static.rust-lang.org/dist $(package)_dependencies:=native_rust # FreeBSD (x86_64) $(package)_targets += x86_64-unknown-freebsd $(package)_target_x86_64-unknown-freebsd:=x86_64-unknown-freebsd -$(package)_sha256_hash_x86_64-unknown-freebsd:=be1acaf3c2f15d42b05b1f032db5ac3b11a0ac5a91c0efef26f2d8135d68a829 +$(package)_sha256_hash_x86_64-unknown-freebsd:=08a691bcdb5bde37178368e9e49dbd822d9e39c68b9371191bd16ab7f8b321c4 # Linux (ARMv7) -$(package)_targets += armv7-unknown-linux-gnueabihf -$(package)_target_arm-unknown-linux-gnueabihf:=armv7-unknown-linux-gnueabihf -$(package)_target_armv7-unknown-linux-gnueabihf:=armv7-unknown-linux-gnueabihf -$(package)_sha256_hash_armv7-unknown-linux-gnueabihf:=5dd8b36467e03ba47bfa7ea5d7578c66bccb648dd2129d7cec6fb3ff00f81ca3 +$(package)_targets += armv7-unknown-linux-musleabihf +$(package)_target_arm-unknown-linux-gnueabihf:=armv7-unknown-linux-musleabihf +$(package)_target_armv7-unknown-linux-gnueabihf:=armv7-unknown-linux-musleabihf +$(package)_sha256_hash_armv7-unknown-linux-musleabihf:=fbdb48968dd7af3a862c29e4e3ff85bcf333d97d21d262f347106542cc08b96d # Linux (ARMv8) -$(package)_targets += aarch64-unknown-linux-gnu -$(package)_target_aarch64-unknown-linux-gnu:=aarch64-unknown-linux-gnu -$(package)_sha256_hash_aarch64-unknown-linux-gnu:=82b2308ee531775bf4d1faa57bddfae85f363bec43ca36ba6db4ebad7c1450d4 +$(package)_targets += aarch64-unknown-linux-musl +$(package)_target_aarch64-unknown-linux-gnu:=aarch64-unknown-linux-musl +$(package)_sha256_hash_aarch64-unknown-linux-musl:=991cc2f78d3db8fa1131ee2bb5807497e93e1efb9f447e2a7def0c4032ba4c54 # Linux (PowerPC 64-bit little-endian) -$(package)_targets += powerpc64le-unknown-linux-gnu -$(package)_target_powerpc64le-unknown-linux-gnu:=powerpc64le-unknown-linux-gnu -$(package)_sha256_hash_powerpc64le-unknown-linux-gnu:=142c7c2896fa4596b5c4c35d9d5e4d80acd5a699e5fa0560d92a89eda035ece3 +$(package)_targets += powerpc64le-unknown-linux-musl +$(package)_target_powerpc64le-unknown-linux-gnu:=powerpc64le-unknown-linux-musl +$(package)_sha256_hash_powerpc64le-unknown-linux-musl:=f6fad3f1c69acdd832ea2f487863f6428ba6e77b16c18e8db7fcd91b88e9e254 # Linux (RISCV64GC) -$(package)_targets += riscv64gc-unknown-linux-gnu -$(package)_target_riscv64-unknown-linux-gnu:=riscv64gc-unknown-linux-gnu -$(package)_target_riscv64gc-unknown-linux-gnu:=riscv64gc-unknown-linux-gnu -$(package)_sha256_hash_riscv64gc-unknown-linux-gnu:=7b35c8207c77e3fc2f7f7a26dea989cc2cdc13a955851ff74d4882f96f4e14dd +$(package)_targets += riscv64gc-unknown-linux-musl +$(package)_target_riscv64-unknown-linux-gnu:=riscv64gc-unknown-linux-musl +$(package)_target_riscv64gc-unknown-linux-gnu:=riscv64gc-unknown-linux-musl +$(package)_sha256_hash_riscv64gc-unknown-linux-musl:=4a85e0c909d6a3202919638c3b95a496acdfec7e1245be1c406b7c1d26c32fba # Linux (x86_64) -$(package)_targets += x86_64-unknown-linux-gnu -$(package)_target_x86_64-unknown-linux-gnu:=x86_64-unknown-linux-gnu -$(package)_sha256_hash_x86_64-unknown-linux-gnu:=e7e808b8745298369fa3bbc3c0b7af9ca0fb995661bd684a7022d14bc9ae0057 +$(package)_targets += x86_64-unknown-linux-musl +$(package)_target_x86_64-unknown-linux-gnu:=x86_64-unknown-linux-musl +$(package)_sha256_hash_x86_64-unknown-linux-musl:=3035f0c3ea9ae10ba1c21871c7a53cdb54a398616febffd42825965627a77216 # macOS (ARMv8) $(package)_targets += aarch64-apple-darwin $(package)_target_aarch64-apple-darwin:=aarch64-apple-darwin $(package)_target_arm64-apple-darwin:=aarch64-apple-darwin -$(package)_sha256_hash_aarch64-apple-darwin:=5ec28e75ed8715efaa2490d76ae026a34b13df6899d98b14d0a6995556f4e6b4 +$(package)_sha256_hash_aarch64-apple-darwin:=5d2fd6b5c3c482750074b6ab04443b1ec41ca824fddc814aab6a1fbcf5cfb53a # macOS (x86_64) $(package)_targets += x86_64-apple-darwin $(package)_target_x86_64-apple-darwin:=x86_64-apple-darwin -$(package)_sha256_hash_x86_64-apple-darwin:=52084c8cdb34ca139a00f9f03f1a582d96b677e9f223a8d1aa31ae575a06cc16 +$(package)_sha256_hash_x86_64-apple-darwin:=b5111b105cfeb2772d92ca54e6f1c01d11def9c675c633f7d1ebdd09b83b0139 # Windows (x86_64) $(package)_targets += x86_64-pc-windows-gnu $(package)_target_x86_64-w64-mingw32:=x86_64-pc-windows-gnu -$(package)_sha256_hash_x86_64-pc-windows-gnu:=32d42270b114c9341e5bc9b1d24f336024889ddd32a7d22e4700cc3c45fe9d3d +$(package)_sha256_hash_x86_64-pc-windows-gnu:=ae5c8942b3ccab5841c9ea65d1ac839c62553a763512799eb4c89de2ffad3d3e $(package)_target:=$(or \ $($(package)_target_$(canonical_host)),\ diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 2e2b8c8521ea..00822fdf5828 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "1.82.0" +channel = "1.85.1" From eac4f6e23363492a16778c8aa17a2fc143a66af6 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Fri, 6 Feb 2026 15:53:12 +0530 Subject: [PATCH 21/25] build: update to macOS 15.2 SDK from Xcode 16.0 --- ci/test/00_setup_env.sh | 2 +- ci/test/00_setup_env_mac.sh | 6 +++--- contrib/containers/guix/scripts/setup-sdk | 18 +++++++++++++++--- contrib/guix/README.md | 2 +- contrib/guix/symbol-check.py | 4 ++-- contrib/macdeploy/README.md | 14 +++++++------- depends/Makefile | 2 +- depends/hosts/darwin.mk | 6 +++--- 8 files changed, 33 insertions(+), 21 deletions(-) diff --git a/ci/test/00_setup_env.sh b/ci/test/00_setup_env.sh index 4207615a1a94..1944c994c993 100755 --- a/ci/test/00_setup_env.sh +++ b/ci/test/00_setup_env.sh @@ -71,7 +71,7 @@ export BASE_OUTDIR=${BASE_OUTDIR:-$BASE_SCRATCH_DIR/out/$HOST} # Folder where the build is done (dist and out-of-tree build). export BASE_BUILD_DIR=${BASE_BUILD_DIR:-$BASE_SCRATCH_DIR/build-ci} export PREVIOUS_RELEASES_DIR=${PREVIOUS_RELEASES_DIR:-$BASE_ROOT_DIR/releases/$HOST} -export SDK_URL=${SDK_URL:-https://bitcoincore.org/depends-sources/sdks} +export SDK_URL=${SDK_URL:-https://dash-depends-sources.s3-us-west-2.amazonaws.com} export DOCKER_PACKAGES=${DOCKER_PACKAGES:-build-essential libtool autotools-dev automake pkg-config bsdmainutils curl ca-certificates ccache python3 rsync git procps} export GOAL=${GOAL:-install} export DIR_QA_ASSETS=${DIR_QA_ASSETS:-${BASE_SCRATCH_DIR}/qa-assets} diff --git a/ci/test/00_setup_env_mac.sh b/ci/test/00_setup_env_mac.sh index ca04e916fc2a..244ec7138044 100755 --- a/ci/test/00_setup_env_mac.sh +++ b/ci/test/00_setup_env_mac.sh @@ -8,9 +8,9 @@ export LC_ALL=C.UTF-8 export CONTAINER_NAME=ci_macos_cross export HOST=x86_64-apple-darwin -export PACKAGES="clang cmake lld llvm zip" -export XCODE_VERSION=15.0 -export XCODE_BUILD_ID=15A240d +export PACKAGES="clang cmake lld llvm zip" +export XCODE_VERSION=16.0 +export XCODE_BUILD_ID=16A242d export RUN_UNIT_TESTS=false export RUN_FUNCTIONAL_TESTS=false export GOAL="all deploy" diff --git a/contrib/containers/guix/scripts/setup-sdk b/contrib/containers/guix/scripts/setup-sdk index 9781ce07285d..044394529526 100755 --- a/contrib/containers/guix/scripts/setup-sdk +++ b/contrib/containers/guix/scripts/setup-sdk @@ -7,13 +7,14 @@ export LC_ALL=C.UTF-8 set -eo pipefail -SDK_URL="${SDK_URL:-https://bitcoincore.org/depends-sources/sdks}" +SDK_URL="${SDK_URL:-https://dash-depends-sources.s3-us-west-2.amazonaws.com}" SDK_PATH="${SDK_PATH:-depends/SDKs}" SDK_SOURCES="${SDK_SOURCES:-depends/sdk-sources}" -XCODE_VERSION="${XCODE_VERSION:-15.0}" -XCODE_RELEASE="${XCODE_RELEASE:-15A240d}" +XCODE_VERSION="${XCODE_VERSION:-16.0}" +XCODE_RELEASE="${XCODE_RELEASE:-16A242d}" XCODE_ARCHIVE="Xcode-${XCODE_VERSION}-${XCODE_RELEASE}-extracted-SDK-with-libcxx-headers" XCODE_AR_PATH="${SDK_SOURCES}/${XCODE_ARCHIVE}.tar.gz" +XCODE_AR_SHA256="bce59aa16560f182e44200a0b9539bd637c8b5c7089fbff13b0712730ce162ff" if [ ! -d "${SDK_PATH}/${XCODE_ARCHIVE}" ]; then if [ ! -f "${XCODE_AR_PATH}" ]; then @@ -21,6 +22,17 @@ if [ ! -d "${SDK_PATH}/${XCODE_ARCHIVE}" ]; then mkdir -p "${SDK_SOURCES}" curl --location --fail "${SDK_URL}/${XCODE_ARCHIVE}.tar.gz" -o "${XCODE_AR_PATH}" fi + + echo "Verifying macOS SDK..." + ACTUAL_HASH=$(sha256sum "${XCODE_AR_PATH}" | cut -d' ' -f1) + if [ "${ACTUAL_HASH}" != "${XCODE_AR_SHA256}" ]; then + echo "Error: Checksum verification failed for ${XCODE_ARCHIVE}.tar.gz" >&2 + echo " Expected: ${XCODE_AR_SHA256}" >&2 + echo " Got: ${ACTUAL_HASH}" >&2 + rm -f "${XCODE_AR_PATH}" + exit 1 + fi + echo "Extracting macOS SDK..." mkdir -p "${SDK_PATH}" tar -C "${SDK_PATH}" -xf "${XCODE_AR_PATH}" diff --git a/contrib/guix/README.md b/contrib/guix/README.md index 5e468c783977..366ba7dfc951 100644 --- a/contrib/guix/README.md +++ b/contrib/guix/README.md @@ -249,7 +249,7 @@ details. Set the path where _extracted_ SDKs can be found. This is passed through to the depends tree. Note that this is should be set to the _parent_ directory of the actual SDK (e.g. `SDK_PATH=$HOME/Downloads/macOS-SDKs` instead of - `$HOME/Downloads/macOS-SDKs/Xcode-12.2-12B45b-extracted-SDK-with-libcxx-headers`). + `$HOME/Downloads/macOS-SDKs/Xcode-16.0-16A242d-extracted-SDK-with-libcxx-headers`). The path that this environment variable points to **must be a directory**, and **NOT a symlink to a directory**. diff --git a/contrib/guix/symbol-check.py b/contrib/guix/symbol-check.py index b41cf4aaea69..95d9d24bf724 100755 --- a/contrib/guix/symbol-check.py +++ b/contrib/guix/symbol-check.py @@ -237,12 +237,12 @@ def check_MACHO_libraries(binary) -> bool: return ok def check_MACHO_min_os(binary) -> bool: - if binary.build_version.minos == [14,0,0]: + if binary.build_version.minos == [14, 0, 0]: return True return False def check_MACHO_sdk(binary) -> bool: - if binary.build_version.sdk == [14, 0, 0]: + if binary.build_version.sdk == [15, 0, 0]: return True return False diff --git a/contrib/macdeploy/README.md b/contrib/macdeploy/README.md index cf32a07602d3..86d122f6dfae 100644 --- a/contrib/macdeploy/README.md +++ b/contrib/macdeploy/README.md @@ -15,14 +15,14 @@ When complete, it will have produced `Dash-Core.zip`. A free Apple Developer Account is required to proceed. Our macOS SDK can be extracted from -[Xcode_15.xip](https://download.developer.apple.com/Developer_Tools/Xcode_15/Xcode_15.xip). +[Xcode_16.xip](https://download.developer.apple.com/Developer_Tools/Xcode_16/Xcode_16.xip). Alternatively, after logging in to your account go to 'Downloads', then 'More' -and search for [`Xcode 15`](https://developer.apple.com/download/all/?q=Xcode%2015). +and search for [`Xcode 16`](https://developer.apple.com/download/all/?q=Xcode%2016). An Apple ID and cookies enabled for the hostname are needed to download this. -The `sha256sum` of the downloaded XIP archive should be `4daaed2ef2253c9661779fa40bfff50655dc7ec45801aba5a39653e7bcdde48e`. +The `sha256sum` of the downloaded XIP archive should be `4a26c3d102a55c7222fb145e0ee1503249c9c26c6e02dc64d783c8810b37b1e3`. To extract the `.xip` on Linux: @@ -33,13 +33,13 @@ git clone https://github.com/bitcoin-core/apple-sdk-tools.git # Unpack the .xip and place the resulting Xcode.app in your current # working directory -python3 apple-sdk-tools/extract_xcode.py -f Xcode_15.xip | cpio -d -i +python3 apple-sdk-tools/extract_xcode.py -f Xcode_16.xip | cpio -d -i ``` On macOS: ```bash -xip -x Xcode_15.xip +xip -x Xcode_16.xip ``` ### Step 2: Generating the SDK tarball from `Xcode.app` @@ -51,8 +51,8 @@ path to `Xcode.app` (extracted in the previous stage) as the first argument. ./contrib/macdeploy/gen-sdk '/path/to/Xcode.app' ``` -The generated archive should be: `Xcode-15.0-15A240d-extracted-SDK-with-libcxx-headers.tar.gz`. -The `sha256sum` should be `c0c2e7bb92c1fee0c4e9f3a485e4530786732d6c6dd9e9f418c282aa6892f55d`. +The generated archive should be: `Xcode-16.0-16A242d-extracted-SDK-with-libcxx-headers.tar.gz`. +The `sha256sum` should be `bce59aa16560f182e44200a0b9539bd637c8b5c7089fbff13b0712730ce162ff`. ## Deterministic macOS App Notes diff --git a/depends/Makefile b/depends/Makefile index cc82344b01de..404345a77117 100644 --- a/depends/Makefile +++ b/depends/Makefile @@ -46,7 +46,7 @@ NO_NATPMP ?= MULTIPROCESS ?= LTO ?= NO_HARDEN ?= -FALLBACK_DOWNLOAD_PATH ?= http://dash-depends-sources.s3-website-us-west-2.amazonaws.com +FALLBACK_DOWNLOAD_PATH ?= https://dash-depends-sources.s3-us-west-2.amazonaws.com C_STANDARD ?= c11 CXX_STANDARD ?= c++20 diff --git a/depends/hosts/darwin.mk b/depends/hosts/darwin.mk index 1b187711bfd8..795a7616bf95 100644 --- a/depends/hosts/darwin.mk +++ b/depends/hosts/darwin.mk @@ -1,7 +1,7 @@ OSX_MIN_VERSION=14.0 -OSX_SDK_VERSION=14.0 -XCODE_VERSION=15.0 -XCODE_BUILD_ID=15A240d +OSX_SDK_VERSION=15.0 +XCODE_VERSION=16.0 +XCODE_BUILD_ID=16A242d LLD_VERSION=711 OSX_SDK=$(SDK_PATH)/Xcode-$(XCODE_VERSION)-$(XCODE_BUILD_ID)-extracted-SDK-with-libcxx-headers From 2572d057de21e018af10b45a5e172009ae4fb700 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Mon, 19 Jan 2026 01:44:34 +0530 Subject: [PATCH 22/25] build: unset `C{,PLUS}_INCLUDE_PATH` to avoid cross-toolchain conflict macOS cross builds need `C{,PLUS}_INCLUDE_PATH` for Qt's native tooling but causes issues when there are conflicting definitions between the native and cross toolchains --- depends/hosts/darwin.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/depends/hosts/darwin.mk b/depends/hosts/darwin.mk index 795a7616bf95..fd811770f71c 100644 --- a/depends/hosts/darwin.mk +++ b/depends/hosts/darwin.mk @@ -51,11 +51,11 @@ darwin_STRIP=$(shell $(SHELL) $(.SHELLFLAGS) "command -v llvm-strip") # Disable adhoc codesigning (for now) when using LLVM tooling, to avoid # non-determinism issues with the Identifier field. -darwin_CC=$(clang_prog) --target=$(host) \ +darwin_CC=env -u C_INCLUDE_PATH -u CPLUS_INCLUDE_PATH $(clang_prog) --target=$(host) \ -isysroot$(OSX_SDK) -nostdlibinc \ -iwithsysroot/usr/include -iframeworkwithsysroot/System/Library/Frameworks -darwin_CXX=$(clangxx_prog) --target=$(host) \ +darwin_CXX=env -u C_INCLUDE_PATH -u CPLUS_INCLUDE_PATH $(clangxx_prog) --target=$(host) \ -isysroot$(OSX_SDK) -nostdlibinc \ -iwithsysroot/usr/include/c++/v1 \ -iwithsysroot/usr/include -iframeworkwithsysroot/System/Library/Frameworks From 30aaf2c771b5ca4528487f49b6565e2004a842af Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Mon, 19 Jan 2026 01:50:30 +0530 Subject: [PATCH 23/25] fix: include resource directory in search path for include resolution This is an issue with more recent SDKs (observed from Xcode 15.3 15E204a shipped SDKs onwards) and explicit inclusion resolves it. We have to use `:=` to force immediate resolution. --- depends/hosts/darwin.mk | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/depends/hosts/darwin.mk b/depends/hosts/darwin.mk index fd811770f71c..eb5e3d15b3d7 100644 --- a/depends/hosts/darwin.mk +++ b/depends/hosts/darwin.mk @@ -13,8 +13,10 @@ OSX_SDK=$(SDK_PATH)/Xcode-$(XCODE_VERSION)-$(XCODE_BUILD_ID)-extracted-SDK-with- # distro releases. # # Source: https://lists.gnu.org/archive/html/bug-make/2017-11/msg00017.html -clang_prog=$(shell $(SHELL) $(.SHELLFLAGS) "command -v clang") -clangxx_prog=$(shell $(SHELL) $(.SHELLFLAGS) "command -v clang++") +clang_prog:=$(shell $(SHELL) $(.SHELLFLAGS) "command -v clang") +clangxx_prog:=$(shell $(SHELL) $(.SHELLFLAGS) "command -v clang++") + +clang_resource_dir:=$(shell $(SHELL) $(.SHELLFLAGS) "$(clang_prog) -print-resource-dir") darwin_AR=$(shell $(SHELL) $(.SHELLFLAGS) "command -v llvm-ar") darwin_DSYMUTIL=$(shell $(SHELL) $(.SHELLFLAGS) "command -v dsymutil") @@ -52,12 +54,14 @@ darwin_STRIP=$(shell $(SHELL) $(.SHELLFLAGS) "command -v llvm-strip") # non-determinism issues with the Identifier field. darwin_CC=env -u C_INCLUDE_PATH -u CPLUS_INCLUDE_PATH $(clang_prog) --target=$(host) \ - -isysroot$(OSX_SDK) -nostdlibinc \ + -isysroot$(OSX_SDK) -nostdinc \ + -isystem$(clang_resource_dir)/include \ -iwithsysroot/usr/include -iframeworkwithsysroot/System/Library/Frameworks darwin_CXX=env -u C_INCLUDE_PATH -u CPLUS_INCLUDE_PATH $(clangxx_prog) --target=$(host) \ - -isysroot$(OSX_SDK) -nostdlibinc \ + -isysroot$(OSX_SDK) -nostdinc -nostdinc++ \ -iwithsysroot/usr/include/c++/v1 \ + -isystem$(clang_resource_dir)/include \ -iwithsysroot/usr/include -iframeworkwithsysroot/System/Library/Frameworks darwin_CFLAGS=-pipe -std=$(C_STANDARD) -mmacos-version-min=$(OSX_MIN_VERSION) From 24568902df50f62091afe0a97c1a32f4d306a264 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Mon, 2 Feb 2026 17:27:12 +0530 Subject: [PATCH 24/25] fix: resolve issues with dist builds --- Makefile.am | 7 ++++++- rust/Makefile.am | 9 +++++++++ rust/Makefile.chirp.include | 22 ++++++++++++++++++++-- src/Makefile.am | 2 +- 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/Makefile.am b/Makefile.am index 97a2fd35bea0..9e7ff1064f30 100644 --- a/Makefile.am +++ b/Makefile.am @@ -65,6 +65,11 @@ WINDOWS_PACKAGING = $(top_srcdir)/share/pixmaps/dash.ico \ OSX_PACKAGING = $(OSX_DEPLOY_SCRIPT) $(OSX_INSTALLER_ICONS) \ $(top_srcdir)/contrib/macdeploy/detached-sig-create.sh +CARGO_FILES = \ + $(top_srcdir)/.cargo/config.toml.offline \ + $(top_srcdir)/Cargo.lock \ + $(top_srcdir)/Cargo.toml + COVERAGE_INFO = $(COV_TOOL_WRAPPER) baseline.info \ test_dash_filtered.info total_coverage.info \ baseline_filtered.info functional_test.info functional_test_filtered.info \ @@ -249,7 +254,7 @@ endif dist_noinst_SCRIPTS = autogen.sh -EXTRA_DIST = $(DIST_SHARE) $(DIST_CONTRIB) $(WINDOWS_PACKAGING) $(OSX_PACKAGING) $(BIN_CHECKS) +EXTRA_DIST = $(DIST_SHARE) $(DIST_CONTRIB) $(WINDOWS_PACKAGING) $(OSX_PACKAGING) $(BIN_CHECKS) $(CARGO_FILES) EXTRA_DIST += \ test/functional \ diff --git a/rust/Makefile.am b/rust/Makefile.am index 7c60b83ac621..bf48d1f8cc86 100644 --- a/rust/Makefile.am +++ b/rust/Makefile.am @@ -63,6 +63,9 @@ endif # ENABLE_ONLINE_RUST include $(top_srcdir)/rust/Makefile.libs.include +EXTRA_DIST = \ + $(LIBRUST_CHIRP_FILES) + all-local: $(CARGO_CONFIGURED) cargo-build-chirp cxxbridge-chirp cargo-build: $(CARGO_CONFIGURED) cargo-build-chirp @@ -77,4 +80,10 @@ cargo-clean-config: clean-local: cargo-clean-chirp cxxbridge-clean-chirp clean-librustdeps-la cargo-clean-config +dist-hook: cxxbridge-chirp + $(MKDIR_P) $(distdir)/chirp/gen/src + $(MKDIR_P) $(distdir)/chirp/gen/include/rust/chirp + cp $(LIBRUST_CHIRP_CPP) $(distdir)/chirp/gen/src/ + cp $(LIBRUST_CHIRP_H) $(distdir)/chirp/gen/include/rust/chirp/ + .PHONY: cargo-build cargo-clean cargo-clean-config diff --git a/rust/Makefile.chirp.include b/rust/Makefile.chirp.include index 8e575a1c9704..c23624c36cdf 100644 --- a/rust/Makefile.chirp.include +++ b/rust/Makefile.chirp.include @@ -9,6 +9,7 @@ LIBRUST_CHIRP = $(LIBRUST_CHIRP_TARGET_DIR)/$(RUST_TARGET)/$(CARGO_PROFILE)/libc LIBRUST_CHIRP_CARGO_ENV = $(CARGO_ENV) CARGO_TARGET_DIR="$(LIBRUST_CHIRP_TARGET_DIR)" LIBRUST_CHIRP_CRATE_DIR = $(top_srcdir)/rust/chirp LIBRUST_CHIRP_GEN_DIR = $(abs_top_builddir)/rust/chirp/gen +LIBRUST_CHIRP_GEN_SRCDIR = $(top_srcdir)/rust/chirp/gen LIBRUST_CHIRP_MANIFEST = $(LIBRUST_CHIRP_CRATE_DIR)/Cargo.toml LIBRUST_CHIRP_CARGO_BUILD_OPTS = $(CARGO_BUILD_OPTS) --manifest-path $(LIBRUST_CHIRP_MANIFEST) @@ -27,11 +28,28 @@ LIBRUST_CHIRP_H = \ LIBRUST_CHIRP_INCLUDES = \ -I$(LIBRUST_CHIRP_GEN_DIR)/include +LIBRUST_CHIRP_FILES = \ + $(LIBRUST_CHIRP_BUILD) \ + $(LIBRUST_CHIRP_MANIFEST) \ + $(LIBRUST_CHIRP_SRCS) + $(LIBRUST_CHIRP_SRCS): ; -$(LIBRUST_CHIRP_H) $(LIBRUST_CHIRP_CPP): $(LIBRUST_CHIRP_SRCS) +$(LIBRUST_CHIRP_CPP): $(LIBRUST_CHIRP_SRCS) + $(AM_V_at)$(MKDIR_P) $(@D) + $(AM_V_GEN)if test -f $(LIBRUST_CHIRP_GEN_SRCDIR)/src/lib.cpp && ! test $(LIBRUST_CHIRP_GEN_SRCDIR)/src/lib.cpp -ef $@; then \ + cp $(LIBRUST_CHIRP_GEN_SRCDIR)/src/lib.cpp $@; \ + elif ! test -f $@; then \ + $(CXXBRIDGE) $< -o $@; \ + fi + +$(LIBRUST_CHIRP_H): $(LIBRUST_CHIRP_SRCS) $(AM_V_at)$(MKDIR_P) $(@D) - $(AM_V_GEN)$(CXXBRIDGE) $< $(if $(filter %.h,$@),--header) -o $@ + $(AM_V_GEN)if test -f $(LIBRUST_CHIRP_GEN_SRCDIR)/include/rust/chirp/lib.h && ! test $(LIBRUST_CHIRP_GEN_SRCDIR)/include/rust/chirp/lib.h -ef $@; then \ + cp $(LIBRUST_CHIRP_GEN_SRCDIR)/include/rust/chirp/lib.h $@; \ + elif ! test -f $@; then \ + $(CXXBRIDGE) $< --header -o $@; \ + fi $(LIBRUST_CHIRP): $(LIBRUST_CHIRP_SRCS) $(LIBRUST_CHIRP_BUILD) $(LIBRUST_CHIRP_MANIFEST) $(AM_V_GEN)$(LIBRUST_CHIRP_CARGO_ENV) $(CARGO) build $(LIBRUST_CHIRP_CARGO_BUILD_OPTS) diff --git a/src/Makefile.am b/src/Makefile.am index fd9063a77862..db63a528ef91 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1198,7 +1198,7 @@ endif libcxxbridge_la_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(PIC_FLAGS) libcxxbridge_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) $(PIC_FLAGS) -static libcxxbridge_la_LDFLAGS = $(AM_LDFLAGS) -static -libcxxbridge_la_SOURCES = $(LIBRUSTDEPS_CPP) +nodist_libcxxbridge_la_SOURCES = $(LIBRUSTDEPS_CPP) $(libcxxbridge_la_OBJECTS): $(LIBRUSTDEPS_H) # From 409e205ab5fe6cfb697f064460d99b96bac20591 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Fri, 6 Feb 2026 15:37:22 +0530 Subject: [PATCH 25/25] contrib: add `Cargo.lock` update script --- contrib/devtools/update-cargo-lock.py | 54 +++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100755 contrib/devtools/update-cargo-lock.py diff --git a/contrib/devtools/update-cargo-lock.py b/contrib/devtools/update-cargo-lock.py new file mode 100755 index 000000000000..d533cfd8e310 --- /dev/null +++ b/contrib/devtools/update-cargo-lock.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +# Copyright (c) 2026 The Dash Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +import atexit +import os +import shutil +import subprocess +import sys + +PY_NAME = os.path.basename(sys.argv[0]) +ROOT_DIR = os.path.normpath(os.path.join(os.path.dirname(__file__), '..', '..')) + +CARGO_DIR = os.path.join(ROOT_DIR, '.cargo') +CARGO_CONFIG = os.path.join(CARGO_DIR, 'config.toml') +CARGO_CONFIG_BAK = CARGO_CONFIG + '.bak' +CARGO_LOCK = os.path.join(ROOT_DIR, 'Cargo.lock') + +def main(): + if not shutil.which('cargo'): + print(f'{PY_NAME}: cargo not found in PATH', file=sys.stderr) + return 1 + + had_config = os.path.exists(CARGO_CONFIG) + cargo_lock_bak = None + + if had_config: + shutil.copy2(CARGO_CONFIG, CARGO_CONFIG_BAK) + os.remove(CARGO_CONFIG) + atexit.register(lambda: shutil.move(CARGO_CONFIG_BAK, CARGO_CONFIG) if os.path.exists(CARGO_CONFIG_BAK) else None) + + if os.path.exists(CARGO_LOCK): + cargo_lock_bak = CARGO_LOCK + '.bak' + shutil.copy2(CARGO_LOCK, cargo_lock_bak) + + try: + subprocess.check_call(['cargo', 'generate-lockfile'], cwd=ROOT_DIR) + except Exception: + if cargo_lock_bak: + shutil.move(cargo_lock_bak, CARGO_LOCK) + raise + finally: + if had_config: + shutil.move(CARGO_CONFIG_BAK, CARGO_CONFIG) + + if cargo_lock_bak and os.path.exists(cargo_lock_bak): + os.remove(cargo_lock_bak) + + return 0 + + +if __name__ == '__main__': + sys.exit(main())