From bbbe218ac39f9baac32932aac09f241dfa7863bd Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Mon, 12 Jan 2026 15:42:32 +0530 Subject: [PATCH 01/20] build: add Rust to CI docker image, cross-compile targets --- .github/workflows/build-container.yml | 4 +++ contrib/containers/ci/ci.Dockerfile | 31 +++++++++++++++++++ contrib/containers/ci/config.toml | 28 +++++++++++++++++ contrib/containers/develop/docker-compose.yml | 2 ++ rust-toolchain.toml | 2 ++ 5 files changed, 67 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..e59fb9369b9c 100644 --- a/contrib/containers/ci/ci.Dockerfile +++ b/contrib/containers/ci/ci.Dockerfile @@ -58,6 +58,37 @@ 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" + +# Install IWYU 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..caa3405606bb --- /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" + +# Windows +[target.x86_64-pc-windows-gnu] +linker = "x86_64-w64-mingw32-gcc" + +# macOS +# [target.aarch64-apple-darwin] +# linker = "aarch64-apple-darwin-gcc" + +# [target.x86_64-apple-darwin] +# linker = "x86_64-apple-darwin-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 f6d237e3538465f7b687f810457c94aa008a933e Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Fri, 16 Jan 2026 17:15:01 +0530 Subject: [PATCH 02/20] 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..fd9b62a4a9aa --- /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 e1197027f62a9a61919112e88ffa2fcaf8e5e666 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Sat, 28 Feb 2026 22:46:35 +0530 Subject: [PATCH 03/20] 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 | 3 ++- test/lint/lint-includes.py | 3 ++- test/lint/lint-locale-dependence.py | 1 + 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 | 2 +- test/lint/lint-whitespace.py | 1 + 11 files changed, 15 insertions(+), 9 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..24b6a6f4821a 100755 --- a/test/lint/lint-include-guards.py +++ b/test/lint/lint-include-guards.py @@ -17,7 +17,8 @@ HEADER_ID_PREFIX = 'BITCOIN_' HEADER_ID_SUFFIX = '_H' -EXCLUDE_FILES_WITH_PREFIX = ['src/crypto/ctaes', +EXCLUDE_FILES_WITH_PREFIX = ['rust/', + 'src/crypto/ctaes', 'src/leveldb', 'src/crc32c', 'src/secp256k1', diff --git a/test/lint/lint-includes.py b/test/lint/lint-includes.py index 9a0cfa127dde..ea31465f218e 100755 --- a/test/lint/lint-includes.py +++ b/test/lint/lint-includes.py @@ -15,7 +15,8 @@ from subprocess import check_output, CalledProcessError -EXCLUDED_DIRS = ["src/leveldb/", +EXCLUDED_DIRS = ["rust/", + "src/leveldb/", "src/crc32c/", "src/secp256k1/", "src/minisketch/", diff --git a/test/lint/lint-locale-dependence.py b/test/lint/lint-locale-dependence.py index 32cef3cb1248..ed93c9586ccf 100755 --- a/test/lint/lint-locale-dependence.py +++ b/test/lint/lint-locale-dependence.py @@ -57,6 +57,7 @@ ] REGEXP_EXTERNAL_DEPENDENCIES_EXCLUSIONS = [ + "rust/", "src/crypto/ctaes/", "src/leveldb/", "src/secp256k1/", 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 fb4d2495c691..dac24b5612b8 100755 --- a/test/lint/lint-spelling.py +++ b/test/lint/lint-spelling.py @@ -12,7 +12,7 @@ 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/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", ":(exclude)src/wallet/bip39_english.h"] +FILES_ARGS = ['git', 'ls-files', '--', ":(exclude)build-aux/m4/", ":(exclude)contrib/seeds/*.txt", ":(exclude)depends/", ":(exclude)doc/release-notes/", ":(exclude)rust/", ":(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", ":(exclude)src/wallet/bip39_english.h"] def check_codespell_install(): diff --git a/test/lint/lint-whitespace.py b/test/lint/lint-whitespace.py index 78c145bd004e..3d9208425720 100755 --- a/test/lint/lint-whitespace.py +++ b/test/lint/lint-whitespace.py @@ -18,6 +18,7 @@ EXCLUDED_DIRS = ["depends/patches/", "contrib/guix/patches/", + "rust/", "src/crypto/x11/", "src/leveldb/", "src/crc32c/", From a03afd69ac1a89a9ac49ba944ab7b3206aed7876 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Sun, 25 Jan 2026 00:40:53 +0530 Subject: [PATCH 04/20] build: introduce barebones Autotools integration with Rust --- Makefile.am | 2 +- configure.ac | 72 +++++++++++++++++++++++++++++++++++- contrib/guix/symbol-check.py | 2 + rust/Makefile.am | 32 ++++++++++++++++ rust/Makefile.chirp.include | 49 ++++++++++++++++++++++++ rust/Makefile.libs.include | 50 +++++++++++++++++++++++++ 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, 255 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 31951e1f7c47..092e7798b569 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)])], @@ -1709,6 +1736,38 @@ if test "$use_zmq" = "yes"; then esac fi +RUST_LIBS="" +case $host in + *mingw*) + RUST_LIBS="$RUST_LIBS -luserenv -lntdll" + ;; + *) + 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" @@ -1999,6 +2058,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) @@ -2054,7 +2116,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]) @@ -2146,3 +2208,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 b2dc20cb5266..95d9d24bf724 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..b84eba45bddf --- /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..40772ba7b572 --- /dev/null +++ b/rust/Makefile.libs.include @@ -0,0 +1,50 @@ +# 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 8b269a3d9bdb..510c54b92c2b 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 @@ -1056,9 +1065,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) @@ -1087,8 +1098,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 # @@ -1108,9 +1121,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 # @@ -1129,11 +1144,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 @@ -1157,9 +1175,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 # @@ -1168,7 +1188,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 @@ -1177,6 +1197,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 04652688dbef..efe6b1990e8d 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -463,8 +463,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 5d9b40b32cfd62509ebf60fe269c1eca9c8f8ad0 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 05/20] 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 092e7798b569..311ff4075651 100644 --- a/configure.ac +++ b/configure.ac @@ -1746,6 +1746,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 @@ -2059,6 +2068,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) @@ -2213,4 +2223,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 b84eba45bddf..e9cf2a8c1af3 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 a82d0b53b1ddb6197080d8bb1d6360705488f0a8 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 06/20] 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 311ff4075651..93c77795e1db 100644 --- a/configure.ac +++ b/configure.ac @@ -1777,6 +1777,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" @@ -2069,6 +2083,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) @@ -2224,4 +2239,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 e9cf2a8c1af3..1b5e6927f9da 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 696e35c48edf99852f1682fdd8e149fee398f922 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 07/20] 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 93c77795e1db..6d9d3e5c387b 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 1b5e6927f9da..1286ab37c4cc 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 40772ba7b572..f74839887523 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 92143276171b3d8bb3ec290c4867a1191b6ea326 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 08/20] 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 1286ab37c4cc..daf1c3d52577 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 259542a96c0972c3ed975edd1ac6d90b29c7795f 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 09/20] 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 6d9d3e5c387b..3b3446ae3d31 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]) @@ -1756,26 +1757,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="" @@ -1792,6 +1797,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" @@ -2082,8 +2125,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) @@ -2237,8 +2284,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 daf1c3d52577..10a5bd8d241a 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 f135570399ad8d8a67db47ebfb486ff1a834fd3f 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 10/20] 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 5c2a0bcf0ec2..bd23f23bf364 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -113,6 +113,8 @@ #include #endif // ENABLE_WALLET +#include + #include #include #include @@ -1505,6 +1507,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 7103cd4aba8017d506952bfc1c5e325797214a0f Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Sat, 17 Jan 2026 17:16:54 +0530 Subject: [PATCH 11/20] depends: integrate Rust and `cxxbridge` into depends --- contrib/devtools/update-native-cxxbridge.py | 93 ++++ contrib/devtools/update-rust-hashes.py | 107 ++++ 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 | 17 + depends/patches/native_cxxbridge/Cargo.lock | 584 ++++++++++++++++++++ 10 files changed, 960 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..2628912612e0 --- /dev/null +++ b/contrib/devtools/update-native-cxxbridge.py @@ -0,0 +1,93 @@ +#!/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 re +import shutil +import subprocess +import sys +import tarfile +import tempfile +from pathlib import Path + +def get_cxx_version(makefile_path: Path) -> str: + content = makefile_path.read_text() + match = re.search(r"\$\(package\)_version:=(.+)", content) + if not match: + raise RuntimeError("Could not find cxx version in makefile") + return match.group(1).strip() + + +def main() -> int: + script_dir = Path(__file__).resolve().parent + repo_root = script_dir / "../.." + repo_root = repo_root.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_cxx_version(makefile_path) + print(f"cxx version: {version}") + + tarball_path = repo_root / f"depends/sources/native_cxxbridge-{version}.tar.gz" + if not tarball_path.exists(): + print(f"Error: {tarball_path} not found", file=sys.stderr) + print("Run 'make -C depends download-one PKG=native_cxxbridge' first", file=sys.stderr) + return 1 + + 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: + tar.extractall(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..87f0d4d53263 --- /dev/null +++ b/contrib/devtools/update-rust-hashes.py @@ -0,0 +1,107 @@ +#!/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_rust_version(makefile_path: Path) -> str: + content = makefile_path.read_text() + match = re.search(r"\$\(package\)_version:=(.+)", content) + if not match: + raise RuntimeError("Could not find Rust version in makefile") + return match.group(1).strip() + + +def compute_sha256(url: str) -> str: + hasher = hashlib.sha256() + with urllib.request.urlopen(url) as response: + while chunk := response.read(8192): + hasher.update(chunk) + return hasher.hexdigest() + + +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 {pattern} in makefile") + new_content = regex.sub(rf"\g<1>{new_hash}", content) + makefile_path.write_text(new_content) + + +def update_rust_hash(makefile_path: Path, rust_version: str, rust_target: str, makefile_id: str) -> None: + url = f"https://static.rust-lang.org/dist/rust-{rust_version}-{rust_target}.tar.gz" + hash_value = compute_sha256(url) + update_hash_in_file(makefile_path, f"sha256_hash_{makefile_id}", hash_value) + print(f" Updated sha256_hash_{makefile_id}") + + +def update_stdlib_hash(makefile_path: Path, rust_version: str, rust_target: str) -> None: + url = f"https://static.rust-lang.org/dist/rust-std-{rust_version}-{rust_target}.tar.gz" + hash_value = compute_sha256(url) + update_hash_in_file(makefile_path, f"rust_std_sha256_hash_{rust_target}", hash_value) + print(f" Updated rust_std_sha256_hash_{rust_target}") + + +def main() -> int: + script_dir = Path(__file__).resolve().parent + makefile_path = script_dir / "../../depends/packages/native_rust.mk" + makefile_path = makefile_path.resolve() + + if not makefile_path.exists(): + print(f"Error: {makefile_path} not found", file=sys.stderr) + return 1 + + rust_version = get_rust_version(makefile_path) + + print(f"Rust version: {rust_version}\n") + print("Updating native compiler hashes:") + + for rust_target, makefile_id in NATIVE_TARGETS: + update_rust_hash(makefile_path, rust_version, rust_target, makefile_id) + + for rust_target in CROSS_TARGETS: + update_stdlib_hash(makefile_path, rust_version, 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..13125507f290 --- /dev/null +++ b/depends/packages/rustcxx.mk @@ -0,0 +1,17 @@ +# 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)_file_name:=$(native_cxxbridge_file_name) +$(package)_sha256_hash:=$(native_cxxbridge_sha256_hash) + +define $(package)_fetch_cmds + $(call native_cxxbridge_fetch_cmds,native_cxxbridge) +endef + +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 f154293fafdf330d493db5a989c1dfb09ea6a5cb 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 12/20] 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 caa3405606bb..ed69fb10e6a1 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 e59fb9369b9c..49e6dc608940 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" - # Install IWYU RUN set -ex; \ git clone --depth=1 "https://github.com/include-what-you-use/include-what-you-use" -b "clang_${LLVM_VERSION}" /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 271c288f1ea92979eaf93d58b0a72dd69e818f5c Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Sat, 21 Feb 2026 16:29:22 +0530 Subject: [PATCH 13/20] 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 | 9 ++++ contrib/guix/guix-build | 5 +- depends/Makefile | 52 +++++++++++++++++-- depends/config.site.in | 1 + depends/funcs.mk | 37 +++++++++++++ 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, 166 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 ed69fb10e6a1..df54e6e30c49 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml.offline @@ -24,3 +24,9 @@ linker = "x86_64-w64-mingw32-gcc" # [target.x86_64-apple-darwin] # linker = "x86_64-apple-darwin-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 3b3446ae3d31..04224608bd14 100644 --- a/configure.ac +++ b/configure.ac @@ -152,6 +152,13 @@ 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"]) + AC_ARG_ENABLE([wallet], [AS_HELP_STRING([--disable-wallet], [disable wallet (enabled by default)])], @@ -2133,6 +2140,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) @@ -2293,4 +2301,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..65ffbdfa2ed6 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-std 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..1b1bf8e47107 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,21 @@ 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: download-osx download-linux download-win download-rust-std $(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-std 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..777290cc7b02 100644 --- a/depends/funcs.mk +++ b/depends/funcs.mk @@ -279,6 +279,28 @@ $(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) $($(1)_fetched) + @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 + # 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 +318,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) 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 +341,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 10a5bd8d241a..cf47dce453f7 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 1ce44ff0bbd284ad89a548506ee3dd919ec1b85c 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 14/20] 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 04224608bd14..d93b7c7ad2f2 100644 --- a/configure.ac +++ b/configure.ac @@ -1842,6 +1842,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" @@ -2141,6 +2146,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 cf47dce453f7..c01b61e07773 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 63ab3636a2d4772280862c41ea537e559ebbfc6a 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 15/20] 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 1b1bf8e47107..e0c5b7c80131 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 777290cc7b02..b9289bc4977a 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) $($(1)_fetched) @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 - @@ -323,7 +323,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) xf $(SOURCES_PATH)/$($(1)_vendored_file_name) && \ + $(build_TAR) -P -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 eb18f0c22fb0ce54bca209cdf85c8fb4327a0470 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 16/20] 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 a04c4ff7ba6ee4c09f8eb6821716defdde6b5053 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Fri, 23 Jan 2026 01:17:47 +0530 Subject: [PATCH 17/20] fix: patch loader paths to Guix store locations --- contrib/guix/manifest.scm | 2 + depends/packages/native_cxxbridge.mk | 5 +- depends/packages/native_rust.mk | 14 +++- .../native_rust/fix-elf-interpreter.sh | 77 +++++++++++++++++++ 4 files changed, 95 insertions(+), 3 deletions(-) create mode 100755 depends/patches/native_rust/fix-elf-interpreter.sh 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/packages/native_cxxbridge.mk b/depends/packages/native_cxxbridge.mk index e13d61cdba41..4f18d05fd8d6 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 && \ + bash $(BASEDIR)/patches/native_rust/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..60379e8abca7 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/ && \ + 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 endif diff --git a/depends/patches/native_rust/fix-elf-interpreter.sh b/depends/patches/native_rust/fix-elf-interpreter.sh new file mode 100755 index 000000000000..b25f30db3c52 --- /dev/null +++ b/depends/patches/native_rust/fix-elf-interpreter.sh @@ -0,0 +1,77 @@ +#!/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. + +LIBDIR="$1" +shift + +if ! command -v patchelf >/dev/null 2>&1; then + echo "patchelf not found, skipping ELF fix" + exit 0 +fi + +# Get the interpreter from a known working binary (ls) +LS_PATH=$(command -v ls) +GUIX_INTERP=$(patchelf --print-interpreter "$LS_PATH" 2>/dev/null) + +if [ -z "$GUIX_INTERP" ]; then + echo "Could not detect interpreter, skipping" + exit 0 +fi + +echo "Detected interpreter: $GUIX_INTERP" + +# Find and copy libgcc_s.so.1 into our lib directory +LIBGCC_SRC="" + +# Method 1: Use gcc to find it +if command -v gcc >/dev/null 2>&1; then + GCC_LIBDIR=$(dirname "$(gcc -print-libgcc-file-name)" 2>/dev/null) + if [ -f "$GCC_LIBDIR/libgcc_s.so.1" ]; then + LIBGCC_SRC="$GCC_LIBDIR/libgcc_s.so.1" + else + GCC_PATH=$(command -v gcc) + GCC_PREFIX=$(dirname "$(dirname "$GCC_PATH")") + if [ -f "$GCC_PREFIX/lib/libgcc_s.so.1" ]; then + LIBGCC_SRC="$GCC_PREFIX/lib/libgcc_s.so.1" + fi + fi +fi + +# Method 2: Search LIBRARY_PATH +if [ -z "$LIBGCC_SRC" ] && [ -n "$LIBRARY_PATH" ]; then + 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 + +if [ -n "$LIBGCC_SRC" ]; then + # Resolve symlinks and copy the actual file + LIBGCC_REAL=$(readlink -f "$LIBGCC_SRC") + echo "Copying libgcc_s.so.1 from: $LIBGCC_REAL" + cp "$LIBGCC_REAL" "$LIBDIR/libgcc_s.so.1" +else + echo "WARNING: Could not find libgcc_s.so.1 to copy" +fi + +# RPATH just needs $ORIGIN/../lib - everything is self-contained +GUIX_RPATH="\$ORIGIN/../lib" +echo "Using RPATH: $GUIX_RPATH" + +for binary in "$@"; do + if [ -f "$binary" ]; then + echo "Patching: $binary" + patchelf --set-interpreter "$GUIX_INTERP" "$binary" + patchelf --set-rpath "$GUIX_RPATH" "$binary" + fi +done + +echo "Verifying first binary:" +patchelf --print-interpreter "$1" +patchelf --print-rpath "$1" From fe986e8425db03db040479debc7a09d433fbbdc7 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Sun, 18 Jan 2026 12:06:50 +0530 Subject: [PATCH 18/20] refactor: split rust runner (builder) and standard library (cross) --- contrib/devtools/update-rust-hashes.py | 25 ++++--- depends/Makefile | 11 +--- depends/funcs.mk | 8 +++ depends/packages/native_rust.mk | 90 ++------------------------ depends/packages/packages.mk | 2 +- depends/packages/rust_stdlib.mk | 77 ++++++++++++++++++++++ 6 files changed, 110 insertions(+), 103 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 87f0d4d53263..5e8dd0bb83d5 100755 --- a/contrib/devtools/update-rust-hashes.py +++ b/contrib/devtools/update-rust-hashes.py @@ -75,29 +75,36 @@ def update_rust_hash(makefile_path: Path, rust_version: str, rust_target: str, m def update_stdlib_hash(makefile_path: Path, rust_version: str, rust_target: str) -> None: url = f"https://static.rust-lang.org/dist/rust-std-{rust_version}-{rust_target}.tar.gz" hash_value = compute_sha256(url) - update_hash_in_file(makefile_path, f"rust_std_sha256_hash_{rust_target}", hash_value) - print(f" Updated rust_std_sha256_hash_{rust_target}") + update_hash_in_file(makefile_path, f"sha256_hash_{rust_target}", hash_value) + print(f" Updated sha256_hash_{rust_target}") def main() -> int: script_dir = Path(__file__).resolve().parent - makefile_path = script_dir / "../../depends/packages/native_rust.mk" - makefile_path = makefile_path.resolve() + native_rust_path = script_dir / "../../depends/packages/native_rust.mk" + native_rust_path = native_rust_path.resolve() + rust_stdlib_path = script_dir / "../../depends/packages/rust_stdlib.mk" + rust_stdlib_path = rust_stdlib_path.resolve() - 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_rust_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_rust_version(native_rust_path) print(f"Rust version: {rust_version}\n") print("Updating native compiler hashes:") for rust_target, makefile_id in NATIVE_TARGETS: - update_rust_hash(makefile_path, rust_version, rust_target, makefile_id) + update_rust_hash(native_rust_path, rust_version, rust_target, makefile_id) + print("\nUpdating stdlib hashes:") for rust_target in CROSS_TARGETS: - update_stdlib_hash(makefile_path, rust_version, rust_target) + update_stdlib_hash(rust_stdlib_path, rust_version, rust_target) print("\nDone!") return 0 diff --git a/depends/Makefile b/depends/Makefile index e0c5b7c80131..ce65dece076e 100644 --- a/depends/Makefile +++ b/depends/Makefile @@ -343,15 +343,8 @@ 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: download-osx download-linux download-win download-rust-std $(foreach package,$(all_packages),$(eval $(call ext_add_stages,$(package)))) diff --git a/depends/funcs.mk b/depends/funcs.mk index b9289bc4977a..fae39a1491e8 100644 --- a/depends/funcs.mk +++ b/depends/funcs.mk @@ -301,6 +301,14 @@ vendor-$(1)-crates: $(native_rust_cached) $($(1)_fetched) 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)/download-stamps/.stamp_fetched-rust_stdlib-$(rust_stdlib_version)-$(rust_stdlib_sha256_hash_$(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 diff --git a/depends/packages/native_rust.mk b/depends/packages/native_rust.mk index 60379e8abca7..c48787da63f8 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)))) -### +$(package)_file_name=$($(package)_file_name_$(build_arch)_$(build_os)) +$(package)_sha256_hash=$($(package)_sha256_hash_$(build_arch)_$(build_os)) 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..bebe886948af --- /dev/null +++ b/depends/packages/rust_stdlib.mk @@ -0,0 +1,77 @@ +# 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 +$(package)_target=$(or \ + $($(package)_target_$(canonical_host)),\ + $($(package)_target_$(subst -pc-,-unknown-,$(canonical_host))),\ + $($(package)_target_$(subst -unknown-,-pc-,$(canonical_host))),\ + $($(package)_target_$(subst -linux-,-unknown-linux-,$(canonical_host)))) + +# 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)_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 1b6145e11f67f9f47771afd774fef75c3b21a970 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Sun, 18 Jan 2026 11:59:24 +0530 Subject: [PATCH 19/20] 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 df54e6e30c49..82e141e0bcc4 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" # Windows diff --git a/configure.ac b/configure.ac index d93b7c7ad2f2..ac4fe40ab09c 100644 --- a/configure.ac +++ b/configure.ac @@ -1768,12 +1768,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" ;; @@ -1783,7 +1783,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]) @@ -1805,7 +1805,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 5e8dd0bb83d5..04fef67f9513 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 c48787da63f8..961517b96ff1 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 bebe886948af..16e47c439434 100644 --- a/depends/packages/rust_stdlib.mk +++ b/depends/packages/rust_stdlib.mk @@ -7,7 +7,7 @@ # ./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 $(package)_target=$(or \ @@ -19,50 +19,50 @@ $(package)_target=$(or \ # 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)_file_name=rust-std-$($(package)_version)-$($(package)_target).tar.gz $(package)_sha256_hash=$($(package)_sha256_hash_$($(package)_target)) 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 3582e9c1417a770c20a55e0ace59cd5ba1f1ee4e Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Sun, 25 Jan 2026 00:30:04 +0530 Subject: [PATCH 20/20] fix: resolve issues with dist builds --- Makefile.am | 7 ++++++- rust/Makefile.am | 3 +++ rust/Makefile.chirp.include | 28 ++++++++++++++++++++++++++-- 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 c01b61e07773..247add8b3219 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 diff --git a/rust/Makefile.chirp.include b/rust/Makefile.chirp.include index 8e575a1c9704..42820ce6c98d 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; then \ + cp $(LIBRUST_CHIRP_GEN_SRCDIR)/src/lib.cpp $@; \ + else \ + $(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; then \ + cp $(LIBRUST_CHIRP_GEN_SRCDIR)/include/rust/chirp/lib.h $@; \ + else \ + $(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) @@ -46,4 +64,10 @@ cxxbridge-clean-chirp: cxxbridge-chirp: $(LIBRUST_CHIRP_CPP) $(LIBRUST_CHIRP_H) +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-chirp cargo-clean-chirp cxxbridge-chirp cxxbridge-clean-chirp diff --git a/src/Makefile.am b/src/Makefile.am index 510c54b92c2b..61e3d29770d0 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1201,7 +1201,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) #