pkgsrc-WIP-changes archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

rust185: make a package for rust 1.85.0.



Module Name:	pkgsrc-wip
Committed By:	Havard Eidnes <he%NetBSD.org@localhost>
Pushed By:	he
Date:		Sun Feb 23 17:01:19 2025 +0000
Changeset:	9eced46b1aac9db84021075026d2535df46fb17d

Added Files:
	rust185/DESCR
	rust185/HOWTO-BOOTSTRAP
	rust185/Makefile
	rust185/buildlink3.mk
	rust185/cargo.mk
	rust185/cross.mk
	rust185/distinfo
	rust185/do-cross.mk
	rust185/files/gcc-wrap
	rust185/options.mk
	rust185/patches/patch-compiler_rustc__codegen__ssa_src_back_linker.rs
	rust185/patches/patch-compiler_rustc__llvm_build.rs
	rust185/patches/patch-compiler_rustc__target_src_spec_base_netbsd.rs
	rust185/patches/patch-compiler_rustc__target_src_spec_mod.rs
	rust185/patches/patch-compiler_rustc__target_src_spec_targets_aarch64__be__unknown__netbsd.rs
	rust185/patches/patch-compiler_rustc__target_src_spec_targets_aarch64__unknown__netbsd.rs
	rust185/patches/patch-compiler_rustc__target_src_spec_targets_mips64el__unknown__netbsd.rs
	rust185/patches/patch-compiler_rustc__target_src_spec_targets_mipsel__unknown__netbsd.rs
	rust185/patches/patch-compiler_rustc__target_src_spec_targets_sparc64__unknown__netbsd.rs
	rust185/patches/patch-library_backtrace_src_symbolize_gimli.rs
	rust185/patches/patch-library_backtrace_src_symbolize_gimli_elf.rs
	rust185/patches/patch-library_std_src_sys_pal_unix_mod.rs
	rust185/patches/patch-library_stdarch_crates_std__detect_tests_cpu-detection.rs
	rust185/patches/patch-src_bootstrap_bootstrap.py
	rust185/patches/patch-src_bootstrap_src_core_build__steps_compile.rs
	rust185/patches/patch-src_bootstrap_src_core_build__steps_install.rs
	rust185/patches/patch-src_bootstrap_src_core_builder_cargo.rs
	rust185/patches/patch-src_bootstrap_src_lib.rs
	rust185/patches/patch-src_llvm-project_llvm_CMakeLists.txt
	rust185/patches/patch-src_llvm-project_llvm_cmake_modules_AddLLVM.cmake
	rust185/patches/patch-src_llvm-project_llvm_include_llvm-c_DataTypes.h
	rust185/patches/patch-src_llvm-project_llvm_include_llvm_Analysis_ConstantFolding.h
	rust185/patches/patch-src_llvm-project_llvm_utils_FileCheck_FileCheck.cpp
	rust185/patches/patch-src_tools_cargo_src_cargo_core_profiles.rs
	rust185/patches/patch-src_tools_cargo_tests_testsuite_build.rs
	rust185/patches/patch-src_tools_rust-installer_install-template.sh
	rust185/patches/patch-tests_assembly_targets_targets-elf.rs
	rust185/patches/patch-tools_rust-analyzer_lib_line-index-src_lib.rs
	rust185/patches/patch-vendor_bytecount-0.6.8_src_lib.rs
	rust185/patches/patch-vendor_crossbeam-utils-0.8.18_no__atomic.rs
	rust185/patches/patch-vendor_libc-0.2.155_src_unix_bsd_netbsdlike_netbsd_mod.rs
	rust185/patches/patch-vendor_libc-0.2.155_src_unix_solarish_mod.rs
	rust185/patches/patch-vendor_libc-0.2.158_src_unix_bsd_netbsdlike_netbsd_mod.rs
	rust185/patches/patch-vendor_libc-0.2.158_src_unix_solarish_mod.rs
	rust185/patches/patch-vendor_libc-0.2.167_src_unix_bsd_netbsdlike_netbsd_mod.rs
	rust185/patches/patch-vendor_libc-0.2.167_src_unix_solarish_mod.rs
	rust185/patches/patch-vendor_libc-0.2.169_src_unix_bsd_netbsdlike_netbsd_mod.rs
	rust185/patches/patch-vendor_libc-0.2.169_src_unix_solarish_mod.rs
	rust185/patches/patch-vendor_line-index-0.1.2_src_lib.rs
	rust185/patches/patch-vendor_lzma-sys-0.1.20_config.h
	rust185/patches/patch-vendor_memchr-2.7.4_src_arch_aarch64_memchr.rs
	rust185/patches/patch-vendor_memchr-2.7.4_src_arch_aarch64_mod.rs
	rust185/patches/patch-vendor_memchr-2.7.4_src_memchr.rs
	rust185/patches/patch-vendor_memchr-2.7.4_src_memmem_searcher.rs
	rust185/patches/patch-vendor_memchr-2.7.4_src_vector.rs
	rust185/patches/patch-vendor_openssl-src-111.28.2+1.1.1w_openssl_Configurations_10-main.conf
	rust185/patches/patch-vendor_openssl-src-111.28.2+1.1.1w_src_lib.rs
	rust185/patches/patch-vendor_openssl-sys-0.9.102_build_find__normal.rs
	rust185/patches/patch-vendor_openssl-sys-0.9.102_build_main.rs
	rust185/patches/patch-vendor_openssl-sys-0.9.92_build_find__normal.rs
	rust185/patches/patch-vendor_openssl-sys-0.9.92_build_main.rs
	rust185/patches/patch-vendor_rustc-ap-rustc__target_src_spec_aarch64__be__unknown__netbsd.rs
	rust185/patches/patch-vendor_zerocopy-0.7.32_src_lib.rs
	rust185/patches/patch-vendor_zerocopy-0.7.35_src_lib.rs
	rust185/platform.mk
	rust185/rust.mk

Log Message:
rust185: make a package for rust 1.85.0.

Pkgsrc changes relative to rust184:

 * patch reorganization to deal with new version
   of upstream vendored crates, checksum updates.

Version 1.85.0 (2025-02-20)
==========================

Language
--------
- [The 2024 Edition is now stable.]
  (https://github.com/rust-lang/rust/pull/133349)
  See [the edition guide]
  (https://doc.rust-lang.org/nightly/edition-guide/rust-2024/index.html)
  for more details.
- [Stabilize async closures]
  (https://github.com/rust-lang/rust/pull/132706)
  See [RFC 3668]
  (https://rust-lang.github.io/rfcs/3668-async-closures.html) for more details.
- [Stabilize `#[diagnostic::do_not_recommend]`]
  (https://github.com/rust-lang/rust/pull/132056)
- [Add `unpredictable_function_pointer_comparisons` lint to warn
  against function pointer comparisons]
  (https://github.com/rust-lang/rust/pull/118833)
- [Lint on combining `#[no_mangle]` and `#[export_name]` attributes.]
  (https://github.com/rust-lang/rust/pull/131558)

Compiler
--------
- [The unstable flag `-Zpolymorphize` has been removed]
  (https://github.com/rust-lang/rust/pull/133883), see
  https://github.com/rust-lang/compiler-team/issues/810 for some
  background.

Platform Support
----------------
- [Promote `powerpc64le-unknown-linux-musl` to tier 2 with host tools]
  (https://github.com/rust-lang/rust/pull/133801)

Refer to Rust's [platform support page][platform-support-doc]
for more information on Rust's tiered platform support.

Libraries
---------
- [Panics in the standard library now have a leading `library/` in their path]
  (https://github.com/rust-lang/rust/pull/132390)
- [`std::env::home_dir()` on Windows now ignores the non-standard
  `$HOME` environment variable]
  (https://github.com/rust-lang/rust/pull/132515)

  It will be un-deprecated in a subsequent release.
- [Add `AsyncFn*` to the prelude in all editions.]
  (https://github.com/rust-lang/rust/pull/132611)

Stabilized APIs
---------------

- [`BuildHasherDefault::new`]
  (https://doc.rust-lang.org/stable/std/hash/struct.BuildHasherDefault.html#method.new)
- [`ptr::fn_addr_eq`]
  (https://doc.rust-lang.org/std/ptr/fn.fn_addr_eq.html)
- [`io::ErrorKind::QuotaExceeded`]
  (https://doc.rust-lang.org/stable/std/io/enum.ErrorKind.html#variant.QuotaExceeded)
- [`io::ErrorKind::CrossesDevices`]
  (https://doc.rust-lang.org/stable/std/io/enum.ErrorKind.html#variant.CrossesDevices)
- [`{float}::midpoint`]
  (https://doc.rust-lang.org/core/primitive.f32.html#method.midpoint)
- [Unsigned `{integer}::midpoint`]
  (https://doc.rust-lang.org/std/primitive.u64.html#method.midpoint)
- [`NonZeroU*::midpoint`]
  (https://doc.rust-lang.org/std/num/type.NonZeroU32.html#method.midpoint)
- [impl `std::iter::Extend` for tuples with arity 1 through 12]
  (https://doc.rust-lang.org/stable/std/iter/trait.Extend.html#impl-Extend%3C(A,)%3E-for-(EA,))
- [`FromIterator<(A, ...)>` for tuples with arity 1 through 12]
  (https://doc.rust-lang.org/stable/std/iter/trait.FromIterator.html#impl-FromIterator%3C(EA,)%3E-for-(A,))
- [`std::task::Waker::noop`]
  (https://doc.rust-lang.org/stable/std/task/struct.Waker.html#method.noop)

These APIs are now stable in const contexts:

- [`mem::size_of_val`]
  (https://doc.rust-lang.org/stable/std/mem/fn.size_of_val.html)
- [`mem::align_of_val`]
  (https://doc.rust-lang.org/stable/std/mem/fn.align_of_val.html)
- [`Layout::for_value`]
  (https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.for_value)
- [`Layout::align_to`]
  (https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.align_to)
- [`Layout::pad_to_align`]
  (https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.pad_to_align)
- [`Layout::extend`]
  (https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.extend)
- [`Layout::array`]
  (https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.array)
- [`std::mem::swap`]
  (https://doc.rust-lang.org/stable/std/mem/fn.swap.html)
- [`std::ptr::swap`]
  (https://doc.rust-lang.org/stable/std/ptr/fn.swap.html)
- [`NonNull::new`]
  (https://doc.rust-lang.org/stable/std/ptr/struct.NonNull.html#method.new)
- [`HashMap::with_hasher`]
  (https://doc.rust-lang.org/stable/std/collections/struct.HashMap.html#method.with_hasher)
- [`HashSet::with_hasher`]
  (https://doc.rust-lang.org/stable/std/collections/struct.HashSet.html#method.with_hasher)
- [`BuildHasherDefault::new`]
  (https://doc.rust-lang.org/stable/std/hash/struct.BuildHasherDefault.html#method.new)
- [`<float>::recip`]
  (https://doc.rust-lang.org/stable/std/primitive.f32.html#method.recip)
- [`<float>::to_degrees`]
  (https://doc.rust-lang.org/stable/std/primitive.f32.html#method.to_degrees)
- [`<float>::to_radians`]
  (https://doc.rust-lang.org/stable/std/primitive.f32.html#method.to_radians)
- [`<float>::max`]
  (https://doc.rust-lang.org/stable/std/primitive.f32.html#method.max)
- [`<float>::min`]
  (https://doc.rust-lang.org/stable/std/primitive.f32.html#method.min)
- [`<float>::clamp`]
  (https://doc.rust-lang.org/stable/std/primitive.f32.html#method.clamp)
- [`<float>::abs`]
  (https://doc.rust-lang.org/stable/std/primitive.f32.html#method.abs)
- [`<float>::signum`]
  (https://doc.rust-lang.org/stable/std/primitive.f32.html#method.signum)
- [`<float>::copysign`]
  (https://doc.rust-lang.org/stable/std/primitive.f32.html#method.copysign)
- [`MaybeUninit::write`]
  (https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#method.write)

Cargo
-----
- [Add future-incompatibility warning against keywords in cfgs and
  add raw-idents] (https://github.com/rust-lang/cargo/pull/14671/)
- [Stabilize higher precedence trailing flags]
  (https://github.com/rust-lang/cargo/pull/14900/)
- [Pass `CARGO_CFG_FEATURE` to build scripts]
  (https://github.com/rust-lang/cargo/pull/14902/)

Rustdoc
-----
- [Doc comment on impl blocks shows the first line, even when the
  impl block is collapsed] (https://github.com/rust-lang/rust/pull/132155)

Compatibility Notes
-------------------
- [`rustc` no longer treats the `test` cfg as a well known
  check-cfg] (https://github.com/rust-lang/rust/pull/131729),
  instead it is up to the build systems and users of
  `--check-cfg`[^check-cfg] to set it as a well known cfg using
  `--check-cfg=cfg(test)`.

  This is done to enable build systems like Cargo to set it
  conditionally, as not all source files are suitable for unit
  tests.

  [Cargo (for now) unconditionally sets the `test` cfg as a well known cfg]
  (https://github.com/rust-lang/cargo/pull/14963).
  [^check-cfg]: https://doc.rust-lang.org/nightly/rustc/check-cfg.html

- [Disable potentially incorrect type inference if there are trivial
  and non-trivial where-clauses]
  (https://github.com/rust-lang/rust/pull/132325)

- `std::env::home_dir()` has been deprecated for years, because it
  can give surprising results in some Windows configurations if the
  `HOME` environment variable is set (which is not the normal
  configuration on Windows). We had previously avoided changing its
  behavior, out of concern for compatibility with code depending on
  this non-standard configuration. Given how long this function has
  been deprecated, we're now fixing its behavior as a bugfix. A
  subsequent release will remove the deprecation for this function.

- [Make `core::ffi::c_char` signedness more closely match that of
  the platform-default `char`]
  (https://github.com/rust-lang/rust/pull/132975)

  This changed `c_char` from an `i8` to `u8` or vice versa on many
  Tier 2 and 3 targets (mostly Arm and RISC-V embedded targets).
  The new definition may result in compilation failures but fixes
  compatibility issues with C.

  The `libc` crate matches this change as of its 0.2.169 release.

- [When compiling a nested `macro_rules` macro from an external
  crate, the content of the inner `macro_rules` is now built with
  the edition of the external crate, not the local crate.]
  (https://github.com/rust-lang/rust/pull/133274)
- [Increase `sparcv9-sun-solaris` and `x86_64-pc-solaris` Solaris
  baseline to 11.4.]
  (https://github.com/rust-lang/rust/pull/133293)
- [Show `abi_unsupported_vector_types` lint in future breakage reports]
  (https://github.com/rust-lang/rust/pull/133374)
- [Error if multiple super-trait instantiations of `dyn Trait` need
  associated types to be specified but only one is provided]
  (https://github.com/rust-lang/rust/pull/133392)
- [Change `powerpc64-ibm-aix` default `codemodel` to large]
  (https://github.com/rust-lang/rust/pull/133811)

Internal Changes
----------------

These changes do not affect any public interfaces of Rust, but they
represent significant improvements to the performance or internals
of rustc and related tools.

- [Build `x86_64-unknown-linux-gnu` with LTO for C/C++ code (e.g., `jemalloc`)]
  (https://github.com/rust-lang/rust/pull/134690)

To see a diff of this commit:
https://wip.pkgsrc.org/cgi-bin/gitweb.cgi?p=pkgsrc-wip.git;a=commitdiff;h=9eced46b1aac9db84021075026d2535df46fb17d

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

diffstat:
 rust185/DESCR                                      |  13 +
 rust185/HOWTO-BOOTSTRAP                            |  85 +++
 rust185/Makefile                                   | 742 +++++++++++++++++++++
 rust185/buildlink3.mk                              |  17 +
 rust185/cargo.mk                                   | 115 ++++
 rust185/cross.mk                                   |  83 +++
 rust185/distinfo                                   | 164 +++++
 rust185/do-cross.mk                                | 107 +++
 rust185/files/gcc-wrap                             | 199 ++++++
 rust185/options.mk                                 |  87 +++
 ...compiler_rustc__codegen__ssa_src_back_linker.rs |  27 +
 .../patches/patch-compiler_rustc__llvm_build.rs    |  50 ++
 ...-compiler_rustc__target_src_spec_base_netbsd.rs |  32 +
 .../patch-compiler_rustc__target_src_spec_mod.rs   |  14 +
 ...rc_spec_targets_aarch64__be__unknown__netbsd.rs |  17 +
 ...et_src_spec_targets_aarch64__unknown__netbsd.rs |  17 +
 ...t_src_spec_targets_mips64el__unknown__netbsd.rs |  35 +
 ...get_src_spec_targets_mipsel__unknown__netbsd.rs |  14 +
 ...et_src_spec_targets_sparc64__unknown__netbsd.rs |  29 +
 .../patch-library_backtrace_src_symbolize_gimli.rs |  14 +
 ...ch-library_backtrace_src_symbolize_gimli_elf.rs |  26 +
 .../patch-library_std_src_sys_pal_unix_mod.rs      |  14 +
 ...darch_crates_std__detect_tests_cpu-detection.rs |  15 +
 rust185/patches/patch-src_bootstrap_bootstrap.py   |  67 ++
 ...-src_bootstrap_src_core_build__steps_compile.rs |  15 +
 ...-src_bootstrap_src_core_build__steps_install.rs |  13 +
 .../patch-src_bootstrap_src_core_builder_cargo.rs  |  42 ++
 rust185/patches/patch-src_bootstrap_src_lib.rs     |  23 +
 .../patch-src_llvm-project_llvm_CMakeLists.txt     |  18 +
 ...c_llvm-project_llvm_cmake_modules_AddLLVM.cmake |  49 ++
 ...rc_llvm-project_llvm_include_llvm-c_DataTypes.h |  34 +
 ...ct_llvm_include_llvm_Analysis_ConstantFolding.h |  17 +
 ...llvm-project_llvm_utils_FileCheck_FileCheck.cpp |  15 +
 ...atch-src_tools_cargo_src_cargo_core_profiles.rs |  17 +
 .../patch-src_tools_cargo_tests_testsuite_build.rs |  39 ++
 ...ch-src_tools_rust-installer_install-template.sh | 179 +++++
 .../patch-tests_assembly_targets_targets-elf.rs    |  16 +
 ...h-tools_rust-analyzer_lib_line-index-src_lib.rs |  47 ++
 .../patch-vendor_bytecount-0.6.8_src_lib.rs        |  45 ++
 ...tch-vendor_crossbeam-utils-0.8.18_no__atomic.rs |  14 +
 ...c-0.2.155_src_unix_bsd_netbsdlike_netbsd_mod.rs |  15 +
 ...ch-vendor_libc-0.2.155_src_unix_solarish_mod.rs |  15 +
 ...c-0.2.158_src_unix_bsd_netbsdlike_netbsd_mod.rs |  15 +
 ...ch-vendor_libc-0.2.158_src_unix_solarish_mod.rs |  15 +
 ...c-0.2.167_src_unix_bsd_netbsdlike_netbsd_mod.rs |  15 +
 ...ch-vendor_libc-0.2.167_src_unix_solarish_mod.rs |  15 +
 ...c-0.2.169_src_unix_bsd_netbsdlike_netbsd_mod.rs |  15 +
 ...ch-vendor_libc-0.2.169_src_unix_solarish_mod.rs |  15 +
 .../patch-vendor_line-index-0.1.2_src_lib.rs       |  42 ++
 .../patches/patch-vendor_lzma-sys-0.1.20_config.h  |  25 +
 ...-vendor_memchr-2.7.4_src_arch_aarch64_memchr.rs |  24 +
 ...tch-vendor_memchr-2.7.4_src_arch_aarch64_mod.rs |  15 +
 .../patch-vendor_memchr-2.7.4_src_memchr.rs        | 128 ++++
 ...atch-vendor_memchr-2.7.4_src_memmem_searcher.rs |  78 +++
 .../patch-vendor_memchr-2.7.4_src_vector.rs        |  15 +
 ...28.2+1.1.1w_openssl_Configurations_10-main.conf |  18 +
 ...h-vendor_openssl-src-111.28.2+1.1.1w_src_lib.rs |  62 ++
 ...endor_openssl-sys-0.9.102_build_find__normal.rs |  30 +
 .../patch-vendor_openssl-sys-0.9.102_build_main.rs |  23 +
 ...vendor_openssl-sys-0.9.92_build_find__normal.rs |  30 +
 .../patch-vendor_openssl-sys-0.9.92_build_main.rs  |  23 +
 ...target_src_spec_aarch64__be__unknown__netbsd.rs |  27 +
 .../patch-vendor_zerocopy-0.7.32_src_lib.rs        |  25 +
 .../patch-vendor_zerocopy-0.7.35_src_lib.rs        |  25 +
 rust185/platform.mk                                |  31 +
 rust185/rust.mk                                    |  56 ++
 66 files changed, 3363 insertions(+)

diffs:
diff --git a/rust185/DESCR b/rust185/DESCR
new file mode 100644
index 0000000000..6dc90a671e
--- /dev/null
+++ b/rust185/DESCR
@@ -0,0 +1,13 @@
+Rust is a systems programming language focused on three goals: safety,
+speed, and concurrency.  It maintains these goals without having a
+garbage collector, making it a useful language for a number of use cases
+other languages aren't good at: embedding in other languages, programs
+with specific space and time requirements, and writing low-level code,
+like device drivers and operating systems.
+
+It improves on current languages targeting this space by having a number
+of compile-time safety checks that produce no runtime overhead, while
+eliminating all data races.  Rust also aims to achieve "zero-cost
+abstractions" even though some of these abstractions feel like those of
+a high-level language.  Even then, Rust still allows precise control
+like a low-level language would.
diff --git a/rust185/HOWTO-BOOTSTRAP b/rust185/HOWTO-BOOTSTRAP
new file mode 100644
index 0000000000..81133db2ec
--- /dev/null
+++ b/rust185/HOWTO-BOOTSTRAP
@@ -0,0 +1,85 @@
+How to build a rust bootstrap kit using pkgsrc
+----------------------------------------------
+
+A rust bootstrap kit is simply a pre-compiled binary of rust and
+the rust standard library, and contains the "rust" and "rust-std"
+build results, found in
+
+   work/rustc-<version>/build/dist/
+as
+   rust-<version>-<target>.tar.xz
+and
+   rust-std-<version>-<target>.tar.xz
+
+These result files are produced when the "dist" build target is
+used, ref. BUILD_TARGET.   For a normal native build of the rust
+pkgsrc package, the default BUILD_TARGET is "build", not "dist".
+
+There are two possible ways to produce a bootstrap kit:
+
+1) a native build.  This requires minimum preparation, except
+   possibly for setting rust.BUILD_TARGET to "dist" via e.g.
+   /etc/mk.conf.  Note that on NetBSD, using the "BUILD_TARGET" ==
+   "dist" results in the "rust-cargo-static" option being set, ref.
+   options.mk.  This is so that the resulting bootstrap kits are
+   built with mostly-static linking, reducing the run-time dependencies
+   of the bootstrap kits.
+
+2) a cross-build.  This requires a bit of preparation:
+
+   For each target you want to cross-build rust for, you need
+     - the cross toolchain resulting from "build.sh tools" for
+       the intended target
+     - an OS distribution extracted, including the comp.tgz
+       set so that the target's include files can be used
+     - for 32-bit ports, the "libatomic" package needs to be
+       available.  I'm sure there's a clever and long-winded
+       use of pkg_install which can be used to effect this;
+       I on my hand have always just extracted the tgz file
+       and done the minimal cleanup of the "cruft" files
+       which are part of the package meta-data.
+     - Pick a root directory for the target, e.g. /u/i386.
+       Below this directory place the "tools" containing
+       the cross-compiler in a "tools" sub-directory.
+       Similarly, the extracted OS distribution in the "dest"
+       sub-directory.
+
+   There are two methods available for doing the cross-compile:
+
+   a) Using the "cross.mk" file.  For an i386 build against i586, the
+      following settings should be active:
+
+CROSS_ROOT=            /u/i386
+MAKE_ENV+=             CROSS_ROOT=${CROSS_ROOT}
+GNU_CROSS_TARGET=      i486--netbsdelf
+MAKE_ENV+=             GNU_CROSS_TARGET=${GNU_CROSS_TARGET}
+TARGET=                i586-unknown-netbsd
+SCRIPTS=               ${WRKDIR}/scripts
+CONFIGURE_ARGS+=       --host=${TARGET}
+CONFIGURE_ARGS+=       --target=${TARGET}
+CONFIGURE_ARGS+=       --set=target.${TARGET}.cc=${SCRIPTS}/gcc-wrap
+CONFIGURE_ARGS+=       --set=target.${TARGET}.cxx=${SCRIPTS}/c++-wrap
+CONFIGURE_ARGS+=       --set=target.${TARGET}.linker=${SCRIPTS}/gcc-wrap
+CONFIGURE_ARGS+=       --set=target.${TARGET}.ar=${CROSS_ROOT}/tools/bin/${GNU_CROSS_TARGET}-ar
+
+      Then doing a "make" will cross-build rust, including the LLVM
+      embedded in the rust distribution, ref. the defaulting of that
+      option when TARGET is defined ref. options.mk.
+
+      Note that when TARGET is set, the default build target for
+      the rust makefile becomes "dist", so there's no need to set
+      rust.BUILD_TARGET for cross-builds.
+
+   b) Using the "do-cross.mk" Makefile.  This will attempt to
+      cross-build rust for all the targets listed in the SHORT_TARGETS
+      variable in that file.  Overriding the root directories for
+      the various targets can be done by making your own "local-roots.mk"
+      file, ref. "do-cross.mk".
+
+      This will create a "dist" subdirectory in the rust pkgsrc
+      directory, and the bootstrap kits for each architecture, plus
+      the library source kit will be placed in this directory.
+
+The bootstrap kits can then be placed in /usr/pkgsrc/distfiles, and
+be used by the "next" rust version, where you can use "make makesum"
+to compute the updated checksums for the bootstrap kits.
diff --git a/rust185/Makefile b/rust185/Makefile
new file mode 100644
index 0000000000..108201f9e5
--- /dev/null
+++ b/rust185/Makefile
@@ -0,0 +1,742 @@
+# $NetBSD: Makefile,v 1.316 2024/07/31 12:30:43 he Exp $
+
+DISTNAME=	rustc-1.85.0-src
+PKGNAME=	${DISTNAME:S/rustc/rust/:S/-src//}
+CATEGORIES=	lang
+MASTER_SITES=	https://static.rust-lang.org/dist/
+
+MAINTAINER=	pkgsrc-users%NetBSD.org@localhost
+HOMEPAGE=	https://www.rust-lang.org/
+COMMENT=	Safe, concurrent, practical language
+LICENSE=	mit OR apache-2.0
+
+CONFLICTS+=	rust-bin-[0-9]*
+
+# LLVM uses -std=c++17
+USE_CXX_FEATURES+=	c++17
+USE_GCC_RUNTIME=	yes
+USE_LANGUAGES=		c c++
+USE_LIBTOOL=		yes
+USE_TOOLS+=		bash grep gmake perl:build pkg-config
+
+# This is a bug:
+#   https://github.com/rust-lang/rust/issues/130708
+# "Building rust 1.81.0 does network access in the "build" phase"
+# but set it for now to allow progress in finding other build issues.
+#ALLOW_NETWORK_ACCESS=	yes
+# Ref. dist.vendor below.
+
+# The NetBSD bootstraps are built for NetBSD 9 (because rust doesn't
+# build on 8 or earlier), or because the target didn't exist in 8
+# or 9 (as in riscv64).  Therefore, mark earlier versions as broken.
+BROKEN_ON_PLATFORM+=	NetBSD-[1-8].*-*
+
+HAS_CONFIGURE=		yes
+PYTHON_FOR_BUILD_ONLY=	tool
+CONFIG_SHELL=		${TOOL_PYTHONBIN}
+CONFIGURE_SCRIPT=	src/bootstrap/configure.py
+CONFIGURE_ARGS+=	--prefix=${PREFIX}
+CONFIGURE_ARGS+=	--mandir=${PREFIX}/${PKGMANDIR}
+CONFIGURE_ARGS+=	--sysconfdir=${PKG_SYSCONFDIR}
+CONFIGURE_ARGS+=	--python=${TOOL_PYTHONBIN}
+CONFIGURE_ARGS+=	--release-channel=stable
+CONFIGURE_ARGS+=	--local-rust-root=${RUST_BOOTSTRAP_PATH}
+CONFIGURE_ARGS+=	--enable-extended	# Build and install cargo too.
+CONFIGURE_ARGS+=	--enable-rpath
+CONFIGURE_ARGS+=	--disable-codegen-tests
+CONFIGURE_ARGS+=	--disable-compiler-docs
+CONFIGURE_ARGS+=	--disable-llvm-static-stdcpp
+CONFIGURE_ARGS+=	--disable-ninja
+CONFIGURE_ARGS+=	--dist-compression-formats=xz
+# Ref. issue #130708 & backport of pull-request 130110
+CONFIGURE_ARGS+=	--set dist.vendor=false
+
+# Include (optional) settings to cross-build rust
+.include "cross.mk"
+
+# optional from do-cross.mk
+CONFIGURE_ARGS+=	${ADD_CONFIGURE_ARGS}
+
+# Getting RPATH with $ORIGIN into bootstrap may be troublesome, so
+# uncommenting the LD_LIBRARY_PATH setting may be required to run
+# the bootstrap
+PKGSRC_MAKE_ENV+=	LD_LIBRARY_PATH=${RUST_BOOTSTRAP_PATH:Q}/lib
+MAKE_ENV+=		LD_LIBRARY_PATH=${RUST_BOOTSTRAP_PATH:Q}/lib
+
+# This should allow us to perform "offline" builds (so cargo doesn't fetch
+# dependencies during the build stage) but this isn't hooked up yet.
+CONFIGURE_ARGS+=	--enable-vendor
+
+# cargo defaults to using the number of available CPUs
+MAKE_ENV+=		CARGO_BUILD_JOBS=${_MAKE_JOBS_N}
+
+# MacOS X 10.7 is the oldest supported version. See
+# ${WRKSRC}/src/bootstrap/lib.rs
+MAKE_ENV.Darwin+=	MACOSX_DEPLOYMENT_TARGET="10.7"
+
+CFLAGS.SunOS+=		-D_POSIX_PTHREAD_SEMANTICS
+MAKE_ENV.SunOS+=	AR=gar
+
+# Debugging of crate resolution
+# Annoyingly, this makes the powerpc build succeed...
+#MAKE_ENV+=		RUSTC_LOG=rustc_metadata
+
+UNLIMIT_RESOURCES+=	cputime stacksize datasize virtualsize
+
+TEST_TARGET=	check
+
+# bin/* lib/*, but names vary
+CHECK_RELRO_SUPPORTED=	no
+CHECK_SSP_SUPPORTED=	no
+
+.include "../../mk/bsd.prefs.mk"
+
+.if ${OPSYS} == "NetBSD"
+TOOL_DEPENDS+=		patchelf-[0-9]*:../../devel/patchelf
+FORCE_RPATH=		--force-rpath
+.endif
+
+# Allow overriding MAKE_JOBS_SAFE
+# some may chose to mostly build faster,
+# and deal with any failures due to deadlocks
+.if !empty(rust.MAKE_JOBS_SAFE)
+.  if ${rust.MAKE_JOBS_SAFE:tl} == "yes"
+MAKE_JOBS_SAFE=		yes
+.  endif
+.endif
+
+.if !empty(rust.BUILD_TARGET)
+BUILD_TARGET=	${rust.BUILD_TARGET}
+.endif
+
+.if !empty(TARGET)
+# Use "dist" build target for cross compile of bootstrap
+BUILD_TARGET?=		dist
+.else
+BUILD_TARGET?=		build
+.endif
+
+.if ${MACHINE_PLATFORM:MNetBSD-*-powerpc} || \
+    ${MACHINE_PLATFORM:MNetBSD-*-earmv[67]hf} || \
+    ${MACHINE_PLATFORM:MNetBSD-*-mipsel} || \
+    !empty(TARGET:Marmv[67]-unknown-netbsd-eabihf) || \
+    !empty(TARGET:Mmipsel-unknown-netbsd)
+# Bootstrapping on NetBSD/powerpc requires no debug-info from rustc
+# (both for amd64->powerpc built and powerpc->powerpc built bootstrap bits)
+# Also try to downsize the armv[67] build.
+CONFIGURE_ARGS+=	--disable-debug
+CONFIGURE_ARGS+=	--disable-debug-assertions
+CONFIGURE_ARGS+=	--disable-llvm-release-debuginfo
+CONFIGURE_ARGS+=	--debuginfo-level=0
+CONFIGURE_ARGS+=	--debuginfo-level-rustc=0
+CONFIGURE_ARGS+=	--debuginfo-level-std=0
+CONFIGURE_ARGS+=	--debuginfo-level-tools=0
+CONFIGURE_ARGS+=	--debuginfo-level-tests=0
+.endif
+
+# Only build the ARM target on/for this host, due to resource constraints
+.if ${MACHINE_PLATFORM:MNetBSD-*-earmv[67]hf}
+CONFIGURE_ARGS+=	--set llvm.targets="ARM"
+.endif
+# When cross-building for ARM on X86, X86 needs to go along due
+# to 2-stage build process
+.if !empty(TARGET:Marmv[67]-unknown-netbsd-eabihf)
+CONFIGURE_ARGS+=	--set llvm.targets="ARM;X86"
+.endif
+# Same for mips:
+.if ${MACHINE_PLATFORM:MNetBSD-*-mipsel}
+CONFIGURE_ARGS+=	--set llvm.targets="Mips"
+.endif
+.if !empty(TARGET:Mmipsel-unknown-netbsd)
+CONFIGURE_ARGS+=	--set llvm.targets="Mips;X86"
+.endif
+
+CHECK_INTERPRETER_SKIP+=	lib/rustlib/src/rust/library/backtrace/ci/*.sh
+CHECK_INTERPRETER_SKIP+=	lib/rustlib/src/rust/library/core/src/unicode/printable.py
+CHECK_INTERPRETER_SKIP+=	lib/rustlib/src/rust/library/stdarch/ci/*.sh
+CHECK_PORTABILITY_SKIP+=	tests/run-make/dump-ice-to-disk/check.sh
+CHECK_PORTABILITY_SKIP+=	vendor/libdbus-sys-0.2.5/vendor/dbus/tools/cmake-format
+
+.if ${OPSYS} == "NetBSD"
+# This block contains information about known trouble on NetBSD and workarounds.
+
+# Parallel builds failed on NetBSD due to dynamic linker locking bugs.
+# \todo Explain if the build is believed to be sound if not parallel,
+# or if a non-parallel build is merely more likely to work.
+#
+# See toolchain/54192 at
+#   http://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=54192
+# which was fixed in -current on 2020-04-19:
+#   http://mail-index.netbsd.org/source-changes/2020/04/16/msg116256.html
+#   http://mail-index.netbsd.org/source-changes/2020/04/19/msg116337.html
+# These  were pulled up to netbsd-9 on 2020-05-13:
+#   http://releng.netbsd.org/cgi-bin/req-9.cgi?show=907
+# This has not been pulled up to netbsd-8
+#   \todo Explain if it's not applicable, shouldn't be pulled up, should be
+#   but hasn't, is too hard, etc.
+#
+# On pkgbuild for 2020Q1 9.0_RELEASE amd64, rust did not build despite
+# MAKE_JOBS_SAFE=no, but setting MAKE_JOBS=1 resulted in success. (No
+# PR is open for this.)  \todo Understand and fix.
+#
+# If we aren't on 9-current, and are on 8.x or 9.x, avoid parallel.
+# Release 9.x and 9.1 or later is OK.
+.  if ${OPSYS} == "NetBSD" && ${OPSYS_VERSION} > 090999 && ${OPSYS_VERSION} < 090900
+MAKE_JOBS_SAFE?=	no
+.  endif
+
+# Open PRs
+#
+# Broken package with PREFIX not /usr/pkg:
+#   http://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=54453
+#
+
+.endif
+
+#
+# Under NetBSD, do not use DT_RUNPATH
+#
+BUILDLINK_TRANSFORM.NetBSD+=	rm:-Wl,--enable-new-dtags
+
+#
+# Somewhere in the LLVM build "-arch x86_64" is passed on macOS/arm64 which
+# breaks linking, see https://github.com/rust-lang/rust/issues/81790.  Until
+# this can be located (proving difficult!) we just force it.
+#
+.if ${MACHINE_PLATFORM:MDarwin-*-aarch64}
+BUILDLINK_TRANSFORM+=	opt:x86_64:arm64
+.endif
+
+#
+# Rust unfortunately requires itself to build.  On platforms which aren't
+# supported by upstream (where they offer binary bootstraps), or where we do
+# not trust random binaries from the Internet, we need to build and provide our
+# own bootstrap.  See the stage0-bootstrap below for more details.
+#
+DISTFILES:=		${DEFAULT_DISTFILES}
+
+.if ${MACHINE_PLATFORM:MDarwin-*-aarch64} || make(distinfo) || make (makesum) || make(mdi)
+RUST_STAGE0_VER=	1.84.1
+RUST_ARCH:=		aarch64-apple-darwin
+RUST_STAGE0:=		rust-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.gz
+RUST_STD_STAGE0:=	rust-std-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.gz
+DISTFILES:=		${DISTFILES} ${RUST_STAGE0} ${RUST_STD_STAGE0}
+.endif
+.if ${MACHINE_PLATFORM:MDarwin-*-x86_64} || make(distinfo) || make (makesum) || make(mdi)
+RUST_STAGE0_VER=	1.84.1
+RUST_ARCH:=		x86_64-apple-darwin
+RUST_STAGE0:=		rust-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.gz
+RUST_STD_STAGE0:=	rust-std-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.gz
+DISTFILES:=		${DISTFILES} ${RUST_STAGE0} ${RUST_STD_STAGE0}
+.endif
+.if ${MACHINE_PLATFORM:MLinux-*-aarch64} || make(distinfo) || make (makesum) || make(mdi)
+RUST_STAGE0_VER=	1.84.1
+RUST_ARCH:=		aarch64-unknown-linux-gnu
+RUST_STAGE0:=		rust-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.gz
+RUST_STD_STAGE0:=	rust-std-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.gz
+DISTFILES:=		${DISTFILES} ${RUST_STAGE0} ${RUST_STD_STAGE0}
+.endif
+.if ${MACHINE_PLATFORM:MLinux-*-earmv6hf} || make(distinfo) || make (makesum) || make(mdi)
+RUST_STAGE0_VER=	1.84.1
+RUST_ARCH:=		arm-unknown-linux-gnueabihf
+RUST_STAGE0:=		rust-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.gz
+RUST_STD_STAGE0:=	rust-std-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.gz
+DISTFILES:=		${DISTFILES} ${RUST_STAGE0} ${RUST_STD_STAGE0}
+.endif
+.if ${MACHINE_PLATFORM:MLinux-*-earmv7hf} || make(distinfo) || make (makesum) || make(mdi)
+RUST_STAGE0_VER=	1.84.1
+RUST_ARCH:=		armv7-unknown-linux-gnueabihf
+RUST_STAGE0:=		rust-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.gz
+RUST_STD_STAGE0:=	rust-std-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.gz
+DISTFILES:=		${DISTFILES} ${RUST_STAGE0} ${RUST_STD_STAGE0}
+.endif
+.if ${MACHINE_PLATFORM:MLinux-*-i386} || make(distinfo) || make (makesum) || make(mdi)
+RUST_STAGE0_VER=	1.84.1
+RUST_ARCH:=		i686-unknown-linux-gnu
+RUST_STAGE0:=		rust-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.gz
+RUST_STD_STAGE0:=	rust-std-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.gz
+DISTFILES:=		${DISTFILES} ${RUST_STAGE0} ${RUST_STD_STAGE0}
+.endif
+.if ${MACHINE_PLATFORM:MLinux-*-x86_64} || make(distinfo) || make (makesum) || make(mdi)
+RUST_STAGE0_VER=	1.84.1
+RUST_ARCH:=		x86_64-unknown-linux-gnu
+RUST_STAGE0:=		rust-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.gz
+RUST_STD_STAGE0:=	rust-std-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.gz
+DISTFILES:=		${DISTFILES} ${RUST_STAGE0} ${RUST_STD_STAGE0}
+.endif
+#
+# The SunOS target defaults to illumos as that's what the current bootstraps
+# are built on.  If you wish to target Oracle Solaris you'll need to create an
+# x86_64-sun-solaris bootstrap and comment out the overrides.
+#
+.if ${MACHINE_PLATFORM:MSunOS-*-x86_64} || make(distinfo) || make (makesum) || make(mdi)
+RUST_STAGE0_VER=	1.84.1
+RUST_ARCH:=		x86_64-unknown-illumos
+RUST_STAGE0:=		rust-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.gz
+SITES.${RUST_STAGE0}=	https://us-central.manta.mnx.io/pkgsrc/public/pkg-bootstraps/
+DISTFILES:=		${DISTFILES} ${RUST_STAGE0}
+RUST_BOOTSTRAP_PATH?=	${WRKDIR}/rust-${RUST_STAGE0_VER}-${RUST_ARCH}
+# Override default "x86_64-sun-solaris" selection
+CONFIGURE_ARGS+=	--set=target.${RUST_ARCH}.llvm-config=${LLVM_CONFIG_PATH}
+CONFIGURE_ARGS+=	--build=${RUST_ARCH}
+CONFIGURE_ARGS+=	--host=${RUST_ARCH}
+CONFIGURE_ARGS+=	--target=${RUST_ARCH}
+.endif
+.if ${MACHINE_PLATFORM:MFreeBSD-*-x86_64} || make(distinfo) || make (makesum) || make(mdi)
+RUST_STAGE0_VER=	1.84.1
+RUST_ARCH:=		x86_64-unknown-freebsd
+RUST_STAGE0:=		rust-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.gz
+RUST_STD_STAGE0:=	rust-std-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.gz
+DISTFILES:=		${DISTFILES} ${RUST_STAGE0} ${RUST_STD_STAGE0}
+.endif
+.if ${MACHINE_PLATFORM:MNetBSD-*-i386} || make(distinfo) || make (makesum) || make(mdi)
+RUST_STAGE0_VER=	1.84.1
+RUST_ARCH=		i586-unknown-netbsd
+RUST_STAGE0:=		rust-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.xz
+RUST_STD_STAGE0:=	rust-std-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.xz
+SITES.${RUST_STAGE0}=	${MASTER_SITE_LOCAL:=rust/}
+SITES.${RUST_STD_STAGE0}=	${MASTER_SITE_LOCAL:=rust/}
+DISTFILES:=		${DISTFILES} ${RUST_STAGE0} ${RUST_STD_STAGE0}
+# Setting this changes it for every distfile, which doesn't match what is
+# currently in distinfo.
+#DIST_SUBDIR=		${PKGNAME}
+# For atomic ops
+CFLAGS+=		-march=i586
+CONFIGURE_ARGS+=	--build=${RUST_ARCH}
+pre-build: pre-build-fix-paxctl
+.PHONY: pre-build-fix-paxctl
+pre-build-fix-paxctl:
+	${TOOLS_PLATFORM.paxctl} +am ${WRKDIR}/rust-bootstrap/bin/cargo
+	${TOOLS_PLATFORM.paxctl} +am ${WRKDIR}/rust-bootstrap/bin/rustc
+.endif
+.if ${MACHINE_PLATFORM:MNetBSD-*-x86_64} || make(distinfo) || make (makesum) || make(mdi)
+RUST_STAGE0_VER=	1.84.1
+RUST_ARCH=		x86_64-unknown-netbsd
+RUST_STAGE0:=		rust-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.xz
+RUST_STD_STAGE0:=	rust-std-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.xz
+DISTFILES:=		${DISTFILES} ${RUST_STAGE0} ${RUST_STD_STAGE0}
+.endif
+.if ${MACHINE_PLATFORM:MNetBSD-*-powerpc} || make(distinfo) || make (makesum) || make(mdi)
+RUST_STAGE0_VER=		1.84.1
+RUST_ARCH=			powerpc-unknown-netbsd
+RUST_STAGE0:=			rust-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.xz
+RUST_STD_STAGE0:=		rust-std-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.xz
+DISTFILES:=			${DISTFILES} ${RUST_STAGE0} ${RUST_STD_STAGE0}
+SITES.${RUST_STAGE0}=		${MASTER_SITE_LOCAL:=rust/}
+SITES.${RUST_STD_STAGE0}=	${MASTER_SITE_LOCAL:=rust/}
+.endif
+.if ${MACHINE_PLATFORM:MNetBSD-*-aarch64} || make(distinfo) || make (makesum) || make(mdi)
+RUST_STAGE0_VER=		1.84.1
+RUST_ARCH=			aarch64-unknown-netbsd
+RUST_STAGE0:=			rust-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.xz
+RUST_STD_STAGE0:=		rust-std-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.xz
+DISTFILES:=			${DISTFILES} ${RUST_STAGE0} ${RUST_STD_STAGE0}
+SITES.${RUST_STAGE0}=		${MASTER_SITE_LOCAL:=rust/}
+SITES.${RUST_STD_STAGE0}=	${MASTER_SITE_LOCAL:=rust/}
+.endif
+.if ${MACHINE_PLATFORM:MNetBSD-*-aarch64eb} || make(distinfo) || make (makesum) || make(mdi)
+RUST_STAGE0_VER=		1.84.1
+RUST_ARCH=			aarch64_be-unknown-netbsd
+RUST_STAGE0:=			rust-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.xz
+RUST_STD_STAGE0:=		rust-std-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.xz
+DISTFILES:=			${DISTFILES} ${RUST_STAGE0} ${RUST_STD_STAGE0}
+SITES.${RUST_STAGE0}=		${MASTER_SITE_LOCAL:=rust/}
+SITES.${RUST_STD_STAGE0}=	${MASTER_SITE_LOCAL:=rust/}
+.endif
+.if ${MACHINE_PLATFORM:MNetBSD-*-sparc64} || make(distinfo) || make (makesum) || make(mdi)
+RUST_STAGE0_VER=		1.84.1
+RUST_ARCH=			sparc64-unknown-netbsd
+RUST_STAGE0:=			rust-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.xz
+RUST_STD_STAGE0:=		rust-std-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.xz
+DISTFILES:=			${DISTFILES} ${RUST_STAGE0} ${RUST_STD_STAGE0}
+SITES.${RUST_STAGE0}=		${MASTER_SITE_LOCAL:=rust/}
+SITES.${RUST_STD_STAGE0}=	${MASTER_SITE_LOCAL:=rust/}
+.endif
+.if ${MACHINE_PLATFORM:MNetBSD-*-earmv7hf} || make(distinfo) || make (makesum) || make(mdi)
+RUST_ARCH=			armv7-unknown-netbsd-eabihf
+RUST_STAGE0_VER=		1.84.1
+RUST_STAGE0:=			rust-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.xz
+RUST_STD_STAGE0:=		rust-std-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.xz
+DISTFILES:=			${DISTFILES} ${RUST_STAGE0} ${RUST_STD_STAGE0}
+SITES.${RUST_STAGE0}=		${MASTER_SITE_LOCAL:=rust/}
+SITES.${RUST_STD_STAGE0}=	${MASTER_SITE_LOCAL:=rust/}
+.endif
+.if ${MACHINE_PLATFORM:MNetBSD-*-earmv6hf} || make(distinfo) || make (makesum) || make(mdi)
+RUST_ARCH=			armv6-unknown-netbsd-eabihf
+RUST_STAGE0_VER=		1.84.1
+RUST_STAGE0:=			rust-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.xz
+RUST_STD_STAGE0:=		rust-std-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.xz
+DISTFILES:=			${DISTFILES} ${RUST_STAGE0} ${RUST_STD_STAGE0}
+SITES.${RUST_STAGE0}=		${MASTER_SITE_LOCAL:=rust/}
+SITES.${RUST_STD_STAGE0}=	${MASTER_SITE_LOCAL:=rust/}
+.endif
+#.if ${MACHINE_PLATFORM:MNetBSD-*-mipsel} || make(distinfo) || make (makesum) || make(mdi)
+#RUST_ARCH=			mipsel-unknown-netbsd
+#RUST_STAGE0_VER=		1.84.1
+#RUST_STAGE0:=			rust-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.xz
+#RUST_STD_STAGE0:=		rust-std-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.xz
+#DISTFILES:=			${DISTFILES} ${RUST_STAGE0} ${RUST_STD_STAGE0}
+#SITES.${RUST_STAGE0}=		${MASTER_SITE_LOCAL:=rust/}
+#SITES.${RUST_STD_STAGE0}=	${MASTER_SITE_LOCAL:=rust/}
+#.endif
+.if ${MACHINE_PLATFORM:MNetBSD-*-riscv64} || make(distinfo) || make (makesum) || make(mdi)
+RUST_ARCH=			riscv64gc-unknown-netbsd
+RUST_STAGE0_VER=		1.84.1
+RUST_STAGE0:=			rust-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.xz
+RUST_STD_STAGE0:=		rust-std-${RUST_STAGE0_VER}-${RUST_ARCH}.tar.xz
+DISTFILES:=			${DISTFILES} ${RUST_STAGE0} ${RUST_STD_STAGE0}
+SITES.${RUST_STAGE0}=		${MASTER_SITE_LOCAL:=rust/}
+SITES.${RUST_STD_STAGE0}=	${MASTER_SITE_LOCAL:=rust/}
+.endif
+
+# You may override RUST_BOOTSTRAP_PATH and RUST_ARCH in mk.conf
+# if you have a local bootstrap compiler.
+.if !defined(RUST_ARCH) && !defined(RUST_BOOTSTRAP_PATH)
+NOT_FOR_PLATFORM+=	${MACHINE_PLATFORM}
+.else
+RUST_BOOTSTRAP_PATH?=	${WRKDIR}/rust-bootstrap
+.endif
+
+.if ${OPSYS} == "SunOS"
+TOOL_DEPENDS+=		coreutils>=0:../../sysutils/coreutils
+TOOL_DEPENDS+=		gzip>=0:../../archivers/gzip
+TOOLS_CREATE+=		md5sum
+TOOLS_PATH.md5sum=	${TOOLBASE}/bin/gmd5sum
+TOOLS_PLATFORM.gzcat=	${TOOLBASE}/bin/gzip -cd
+.endif
+
+SUBST_CLASSES+=		prefix
+SUBST_STAGE.prefix=	pre-configure
+SUBST_FILES.prefix+=	compiler/rustc_codegen_ssa/src/back/linker.rs
+SUBST_FILES.prefix+=	compiler/rustc_target/src/spec/base/netbsd.rs
+SUBST_FILES.prefix+=	src/bootstrap/src/core/build_steps/compile.rs
+SUBST_FILES.prefix+=	src/bootstrap/src/core/builder/cargo.rs
+SUBST_FILES.prefix+=	src/bootstrap/bootstrap.py
+SUBST_VARS.prefix=	PREFIX
+
+#
+# Generate list of subst entries for various .cargo-checksum.json files.  These
+# are all handled together in one big substitution to simplify things rather
+# than one substitution entry per file, but are kept separate below to ease
+# updating and verification.
+#
+
+CKSUM_CRATES+=	vendor/crossbeam-utils-0.8.18
+CKSUMS+=	31a8276afd38e39987a169eeb02e9bed32670de5ca36d7eb74aab7e506cf9dc4
+CKSUMS+=	ead4bda23c322bde8c01e48d4cd19b70e7b7e473a56466218d279f88463ab466
+
+CKSUM_CRATES+=	vendor/openssl-sys-0.9.92
+CKSUMS+=	33f814dba4ac9942266157cbe3dc8eadf5e477090370a92c36c53f916fa45d48
+CKSUMS+=	f78ddd9b03c31a03350aa152d6f707c6cbb21b2ea0b493d05238aa473b80af09
+CKSUMS+=	b2cbaa5bfac5e7d5550aa0eb8e5c65a9f7e86a3692b759fb13330ef6e3b26b30
+CKSUMS+=	b303bf9ceae9fcffa4a0420ea858675d827fc2d75c358f8236e44274d58be1a0
+
+CKSUM_CRATES+=	vendor/openssl-src-111.28.2+1.1.1w
+CKSUMS+=	090744f85cf99a9b8412c23fca1eabb61eb45d830f0f9f0e7309be2572c1e827
+CKSUMS+=	e8ca5ea1808323cd9f0cc9d53c7258bb2f3112e5eafc11dd457e010a80a9c8d8
+CKSUMS+=	cf331474674b6c4fff7e361d592c14131c97918d6f756b36698a7ac8ec845adb
+CKSUMS+=	bec36eddcf41c8639903ea7593751c92251100168241bc5696f8a776a55651fb
+
+CKSUM_CRATES+=	vendor/libc-0.2.155
+CKSUMS+=	3e550d95419169febf094c425451ca86b12821fa17839b4b0ba7520b145a5820
+CKSUMS+=	1cf38d9ddeca5295821b4234e17e1fc749f35b00307bdfdacb24c6892a288ad6
+CKSUMS+=	b8d6f089fc8eb2cb59e45335a26c9ce871b846216c9859b553c6b91982f8de33
+CKSUMS+=	d8c4a979ce9b406fb63c5aaf2827b616689294331341737fec392b8faa2126fa
+
+CKSUM_CRATES+=	vendor/libc-0.2.158
+CKSUMS+=	ab09cea2897ecd27fc7e35822dac23d6dcd53f8577c771db3ee8b015e8d82001
+CKSUMS+=	a7ecf37f62e4756b30c92a063bac4b84d229947f854dc0bae9e8c8eeb1ecd237
+CKSUMS+=	c0c5dfc406d728666010cdc2fe21b0df40547ed20dd7ad0eab65906e103b6d4b
+CKSUMS+=	dd2aa95b38dd9afaac3413f6a1af632de77050adf2fea66b8cdbfc8244d1f07e
+
+CKSUM_CRATES+=	vendor/libc-0.2.167
+CKSUMS+=	2b6c62850c168e7200955ba1f52464fa03c329df7a4e77a30054544280308dc1
+CKSUMS+=	ce9b6fb7a2c7377e6cfbe882f7195736baf20408559d4259f2ef70c160872024
+CKSUMS+=	742d6c0607ee20c81a2184a6378dc2d9c18f7180a0dc93aa91f830a0d1a06878
+CKSUMS+=	4f39616cd4010e5ac122d1162e022af0d0304f361cf718d5997819b666f8eb26
+
+CKSUM_CRATES+=	vendor/libc-0.2.169
+CKSUMS+=	dc216609dfc6b2835e26f8c3e70f4c7c65425933eef04538de603f51e9429ec5
+CKSUMS+=	04004bda0ea97d55c3588a7d82fa1faf0d150c5390250a298216ff3cc899b911
+CKSUMS+=	b5dae853ebfc3355b155f8c20f3a481517bce27e164e304f56dfff172e313098
+CKSUMS+=	55fb7f2c0877231286b2b6515e08eda1d5cac1311a402d0aa162c7eb867ee19b
+
+CKSUM_CRATES+=	vendor/zerocopy-0.7.32
+CKSUMS+=	2f21f18a4ca1d4be2d997f037158cb21a7421b2ba2cc52f3e4c5f9410197ed27
+CKSUMS+=	abe079743c2b2dea5b2c42564f98741a5eb9e24ff019e01742ace5581e53c06f
+
+CKSUM_CRATES+=	vendor/zerocopy-0.7.35
+CKSUMS+=	eb5033d1f2f3d5314625bc63353b1d105cb414d4bc68edf8700b401e4055d669
+CKSUMS+=	bd504cc95f722a296a5f221c3a3068c9eaa946258beff163581d9492de6ccdce
+
+CKSUM_CRATES+=	vendor/memchr-2.7.4
+CKSUMS+=	5bb70f915084e629d940dbc322f5b9096b2e658cf63fea8a2f6e7550412e73a0
+CKSUMS+=	34aaa34eb7048e8bba49d390942ab707990380952f37f388f3cca30970c53450
+CKSUMS+=	7763472d43c66df596ca0697c07db0b4666d38a6a14f64f9f298aaf756c4a715
+CKSUMS+=	1b26fca824c410077780fbc2f4c53c1d195ba3bdf6785b529ceb0a11f039cec2
+CKSUMS+=	3b15d5cb9715f26e655598eacbb8bbba74cbe8ddb2fb969d13aa75f216a118dd
+CKSUMS+=	8844a2cd5e71abb8efdf8fc3ee54d9c66f3fedb529cdaf5984c279177f5f90af
+CKSUMS+=	6ae779ec5d00f443075316e0105edf30b489a38e2e96325bec14ccecd014145b
+CKSUMS+=	28d66e566b73f6f0f7add4092874dc967ce133bfb6dcbd81f03c9a04b6e4e1d0
+CKSUMS+=	44cd1a614bd66f1e66fc86c541d3c3b8d3a14a644c13e8bf816df3f555eac2d4
+CKSUMS+=	27f9bff08b24828e1a611b10a0282f5457d12e9e7254202040144d392297d720
+
+CKSUM_CRATES+=	vendor/bytecount-0.6.8
+CKSUMS+=	01cd755a128d8a5892f3edda195b26bb461be375be17dd72e6e4f061169e6dff
+CKSUMS+=	7c6609685c161ac6b2c667f59bd6476c5c14c7269ec949fb2def5a0238198c25
+
+CKSUM_CRATES+=	vendor/line-index-0.1.2
+CKSUMS+=	c4613b718951cf0b880a3a7829e102a9ec7196591437e3bc0cfd857c717bfb61
+CKSUMS+=	5183e802793932fb980b4e321656c65d1b6231de3febd1ac94dfa73de31245f0
+
+CKSUM_CRATES+=	vendor/lzma-sys-0.1.20
+CKSUMS+=	6fd5e9245db34c6f557b8bfcaf03db82fc88c3b06dbfbb5f03b2bcd138983ef9
+CKSUMS+=	2a68e3e635dce81c7dba25b3d3abfaa894ee729e1604f2d000ae3e201f7739a4
+
+SUBST_CLASSES+=		cksum
+SUBST_STAGE.cksum=	pre-configure
+.for crate in ${CKSUM_CRATES}
+SUBST_FILES.cksum+=	${crate}/.cargo-checksum.json
+.endfor
+.for from to in ${CKSUMS}
+SUBST_SED.cksum+=	-e 's,${from},${to},g'
+.endfor
+
+post-extract:
+	set -e;									\
+	if ${TEST} -e ${WRKDIR}/rust-${RUST_STAGE0_VER}-${RUST_ARCH}/install.sh	\
+	  -a ! -e ${RUST_BOOTSTRAP_PATH}/bin/rustc; then \
+		cd ${WRKDIR}/rust-${RUST_STAGE0_VER}-${RUST_ARCH};	\
+		env ${MAKE_ENV} ${TOOLS_BASH} \
+			./install.sh --prefix=${RUST_BOOTSTRAP_PATH};	\
+		cd ${WRKDIR}/rust-std-${RUST_STAGE0_VER}-${RUST_ARCH};	\
+		env ${MAKE_ENV} ${TOOLS_BASH} \
+			./install.sh --prefix=${RUST_BOOTSTRAP_PATH};	\
+	fi
+.if ${OPSYS} == "NetBSD"
+	SDIR=${WRKDIR}/scripts; \
+	${MKDIR} $${SDIR}; \
+	cd $${SDIR}; \
+	${RM} -f c++-wrap; \
+	${RM} -f clang++-wrap; \
+	${RM} -f clang-wrap; \
+	${RM} -f ar-wrap; \
+	${CP} ${.CURDIR}/files/gcc-wrap .; \
+	${CHMOD} +x gcc-wrap; \
+	${LN} -s gcc-wrap c++-wrap; \
+	${LN} -s gcc-wrap clang++-wrap; \
+	${LN} -s gcc-wrap clang-wrap; \
+	${LN} -s gcc-wrap ar-wrap
+.endif
+
+.if ${OPSYS} == "FreeBSD"
+MAKE_ENV+=		OPENSSL_DIR=${SSLBASE}
+.endif
+
+.if ${OPSYS} == "NetBSD" && !empty(PKGSRC_COMPILER:Mclang) && !exists(/lib/libgcc_s.so)
+BUILDLINK_TRANSFORM+=	rm:-lgcc_s
+MAKE_ENV+=		PKGSRC_HAVE_LIBCPP=yes
+
+pre-build: provide-libgcc-for-bootstrap
+.PHONY: provide-libgcc-for-bootstrap
+provide-libgcc-for-bootstrap:
+.  if exists(${FILESDIR}/libgcc_s.so.1)
+	cp ${FILESDIR}/libgcc_s.so.1 ${RUST_BOOTSTRAP_PATH}/lib/.
+.  endif
+.endif
+
+# Rust builds some bundled components with strict version requirements, ensure
+# that any conflicting packages pulled in via dependencies are not buildlinked.
+BUILDLINK_FILES_CMD.xz=		${TRUE}
+MAKE_ENV+=			LZMA_API_STATIC=1
+pre-configure:
+	${RM} -rf ${BUILDLINK_DIR}/include/libssh2*
+
+#
+# These are essentially copies of the "all", "test", and "install" Makefile
+# targets, but are duplicated here so that we can specify -j.
+#
+do-build:
+	${RUN}${_ULIMIT_CMD}						\
+	cd ${WRKSRC} &&							\
+	${SETENV} ${MAKE_ENV}						\
+	sh -c "if [ \"${BUILD_TARGET}\" = \"dist\" ]; then		\
+		unset DESTDIR;						\
+		${TOOL_PYTHONBIN} ./x.py				\
+		    ${BUILD_TARGET} -j ${_MAKE_JOBS_N};			\
+	else								\
+		${TOOL_PYTHONBIN} ./x.py				\
+		    ${BUILD_TARGET} --stage 2 -j ${_MAKE_JOBS_N} &&	\
+		${TOOL_PYTHONBIN} ./x.py				\
+		    doc --stage 2 -j ${_MAKE_JOBS_N};			\
+	fi"
+
+do-test:
+	${RUN}${_ULIMIT_CMD}						\
+	cd ${WRKSRC} &&							\
+	${SETENV} ${MAKE_ENV}						\
+		${TOOL_PYTHONBIN} ./x.py test -j ${_MAKE_JOBS_N}
+
+PATCH_BINARIES+=	bin/cargo
+PATCH_BINARIES+=	bin/cargo-clippy
+PATCH_BINARIES+=	bin/clippy-driver
+PATCH_BINARIES+=	bin/rust-analyzer
+PATCH_BINARIES+=	bin/rustc
+PATCH_BINARIES+=	bin/rustdoc
+PATCH_BINARIES+=	bin/rustfmt
+PATCH_BINARIES+=	libexec/rust-analyzer-proc-macro-srv
+
+do-install:
+	${RUN}${_ULIMIT_CMD}						\
+	cd ${WRKSRC} &&							\
+	${SETENV} ${MAKE_ENV} ${INSTALL_ENV} 				\
+		${TOOL_PYTHONBIN} ./x.py install -j ${_MAKE_JOBS_N}
+.if ${OPSYS} == "NetBSD"
+	for bin in ${PATCH_BINARIES}; do				\
+		f=${DESTDIR}${PREFIX}/$${bin};				\
+		if [ -f $$f ]; then					\
+cmd="${PREFIX}/bin/patchelf ${FORCE_RPATH} --set-rpath ${PREFIX}/lib $$f"; \
+			echo $$cmd; 					\
+			$$cmd;						\
+		fi; 							\
+	done
+.endif
+
+SUBST_CLASSES+=		destdir
+SUBST_STAGE.destdir=	post-install
+SUBST_FILES.destdir=	${DESTDIR}${PREFIX}/lib/rustlib/manifest-*
+SUBST_SED.destdir=	-e 's|file:${DESTDIR}${PREFIX}|file:${PREFIX}|'
+
+GENERATE_PLIST+=	${FIND} ${DESTDIR}${PREFIX} \( -type f -o -type l \) -print | \
+			${SED} -e 's,${DESTDIR}${PREFIX}/,,' | ${SORT} ;
+
+# Create a relocatable stage2 bootstrap from the bits we just built that can be
+# used to build the next version of rust.  Currently only tested on SmartOS.
+#
+# Use the alternate BOOTSTRAP_NAME when creating a nightly release.
+#
+#BOOTSTRAP_NAME=	${PKGNAME_NOREV:C/rust/rust-nightly/}-${RUST_ARCH}
+BOOTSTRAP_NAME=		${PKGNAME_NOREV}-${RUST_ARCH}
+BOOTSTRAP_TMPDIR=	${WRKDIR}/${BOOTSTRAP_NAME}
+USE_TOOLS+=		gtar
+
+# The NetBSD part is so far untested, because I could not convince
+# the rust build to use the gcc wrapper when building natively,
+# so that I could get a placeholder in the RPATH, because chrpath
+# cannot extend the length of the RPATH...
+ELFEDIT?=	/usr/bin/elfedit
+
+.PHONY: stage0-bootstrap
+stage0-bootstrap: install
+	${RM} -rf ${BOOTSTRAP_TMPDIR}
+	${MKDIR} ${BOOTSTRAP_TMPDIR}
+.if ${OPSYS} == "NetBSD"
+	(cd ${BOOTSTRAP_TMPDIR}; \
+	DISTDIR=${WRKSRC}/bild/dist; \
+	VER_ARCH=${PKGVERSION}-${RUST_ARCH}; \
+	RUSTC=rustc-$${VER_ARCH}; \
+	RUSTC_FILE=$${RUSTC}.tar.gz; \
+	RUST_STD=rust-std-$${VER_ARCH}; \
+	RUST_STD_FILE=$${RUST_STD}.tar.gz; \
+	${GTAR} -xzf $${DISTDIR}/$${RUSTC_FILE}; \
+		(cd ${RUSTC}; \
+	RPATH='/usr/pkg/lib:/lib:/usr/lib:$$ORIGIN/../lib'; \
+	for f in rls-preview/bin/rls rustc/bin/rustc rustc/bin/rustdoc; do \
+		chrpath -r $$RPATH $$f; \
+	done; \
+	RPATH='/usr/pkg/lib:/lib:/usr/lib:$$ORIGIN'; \
+	for f in rustc/lib/*.so*; do \
+		chrpath -r $$RPATH $$f; \
+	done; \
+	RPATH='/usr/pkg/lib:/lib:/usr/lib:$$ORIGIN:$$ORIGIN/../../..'; \
+	for f in rustc/lib/rustlib/*/*/*.so*; do \
+		chrpath -r $$RPATH $$f; \
+	done;); \
+	${GTAR} -czf $${RUSTC_FILE} $${RUSTC}; \
+	${CP} $${DISTDIR}/$${RUST_STD_FILE} .; \
+	${ECHO} "Fixed stage0 bootstrap in ${BOOTSTRAP_TMPDIR}:"; \
+	${ECHO} "$${RUSTC_FILE}"; \
+	${ECHO} "$${RUST_STD_FILE}"; \
+	)
+.endif
+.if ${OS_VARIANT} == "SmartOS"
+	${CP} -R ${DESTDIR}/${PREFIX}/bin ${BOOTSTRAP_TMPDIR}/
+	${CP} -R ${DESTDIR}/${PREFIX}/lib ${BOOTSTRAP_TMPDIR}/
+	${MKDIR} ${BOOTSTRAP_TMPDIR}/lib/pkgsrc
+	set -e; \
+	for lib in libgcc_s.so.1 libstdc++.so.6; do \
+		${CP} `${PKG_CC} -print-file-name=$${lib}` \
+		    ${BOOTSTRAP_TMPDIR}/lib/pkgsrc/; \
+	done; \
+	for lib in libLLVM.so.18.1 libcrypto.so.3 libcurl.so.4 \
+		   libssl.so.3 libz.so.1 libzstd.so.1; do \
+		${CP} ${PREFIX}/lib/$${lib} ${BOOTSTRAP_TMPDIR}/lib/pkgsrc/; \
+	done; \
+	for lib in libiconv.so.2 libidn2.so.0 libintl.so.8 liblber.so.2 \
+		   libldap.so.2 libnghttp2.so.14 libsasl2.so.3 \
+		   libssh2.so.1 libunistring.so.5; do \
+		${CP} ${PREFIX}/lib/$${lib} ${BOOTSTRAP_TMPDIR}/lib/pkgsrc/; \
+	done; \
+	for f in ${BOOTSTRAP_TMPDIR}/bin/*; do \
+		/bin/file -b "$$f" | grep ^ELF >/dev/null || continue; \
+		${ELFEDIT} -e 'dyn:runpath $$ORIGIN/../lib:$$ORIGIN/../lib/pkgsrc' $$f; \
+	done; \
+	for f in ${BOOTSTRAP_TMPDIR}/lib/pkgsrc/*.so*; do \
+		${ELFEDIT} -e 'dyn:runpath $$ORIGIN' $$f; \
+	done; \
+	for f in ${BOOTSTRAP_TMPDIR}/lib/*.so*; do \
+		${ELFEDIT} -e 'dyn:runpath $$ORIGIN:$$ORIGIN/pkgsrc' $$f; \
+	done; \
+	for f in ${BOOTSTRAP_TMPDIR}/lib/rustlib/*/*/*.so* \
+		 ${BOOTSTRAP_TMPDIR}/lib/rustlib/*/bin/*; do \
+		${ELFEDIT} -e 'dyn:runpath $$ORIGIN:$$ORIGIN/../../..:$$ORIGIN/../../../pkgsrc' $$f; \
+	done; \
+	cd ${WRKDIR}; ${GTAR} -zcf ${BOOTSTRAP_NAME}.tar.gz ${BOOTSTRAP_NAME}
+	@${ECHO} ""
+	@${ECHO} "Verify correct library paths using the following:"
+	@${ECHO} ""
+	@${ECHO} "	cd ${BOOTSTRAP_TMPDIR}"
+	@${ECHO} "	find . -type f | xargs ldd 2>/dev/null | egrep 'not.found|${PREFIX}'"
+	@${ECHO} ""
+	@${ECHO} "If there is no output then this bootstrap kit is ready to go:"
+	@${ECHO} ""
+	@${ECHO} "	${WRKDIR}/${BOOTSTRAP_NAME}.tar.gz"
+	@${ECHO} ""
+.endif
+
+.include "options.mk"
+
+# These dependencies currently use the bundled sources as they require
+# development features not yet available in released versions.
+#
+#.include "../../devel/libgit2/buildlink3.mk"
+#.include "../../security/libssh2/buildlink3.mk"
+#.include "../../www/http-parser/buildlink3.mk"
+#.include "../../devel/jemalloc/buildlink3.mk"
+
+## Issues specific to: bootstrap AND NetBSD follow
+
+# rust i386 and sparc64 bootstraps are built for 8.0
+# and still depend on libstdc++.so.8.
+# Pull in compat80 on 9.x and newer.
+.if (${MACHINE_PLATFORM:MNetBSD-*-i386} || \
+     ${MACHINE_PLATFORM:MNetBSD-*-sparc64}) \
+    && empty(OS_VERSION:M8.*)
+TOOL_DEPENDS+=	compat80>=0:../../emulators/compat80
+.endif
+
+.include "../../mk/atomic64.mk"
+# This is for when we build natively:
+.if ${MACHINE_PLATFORM:MNetBSD-*-powerpc} || \
+    ${MACHINE_PLATFORM:MNetBSD-*-i386} || \
+    ${MACHINE_PLATFORM:MNetBSD-*-mipsel} || \
+    ${MACHINE_PLATFORM:MNetBSD-*-riscv64}
+# Make libatomic library available via a unique directory:
+DEPENDS+=	libatomic-links>=0:../../devel/libatomic-links
+.endif
+
+TOOL_DEPENDS+=	cmake-[0-9]*:../../devel/cmake
+
+.include "../../devel/zlib/buildlink3.mk"
+.include "../../lang/python/tool.mk"
+.include "../../mk/bsd.pkg.mk"
diff --git a/rust185/buildlink3.mk b/rust185/buildlink3.mk
new file mode 100644
index 0000000000..b8eeb79834
--- /dev/null
+++ b/rust185/buildlink3.mk
@@ -0,0 +1,17 @@
+# $NetBSD: buildlink3.mk,v 1.14 2023/10/25 05:50:43 pin Exp $
+
+BUILDLINK_TREE+=	rust
+
+#
+# DO NOT include this directly! Use rust.mk instead.
+#
+
+.if !defined(RUST_BUILDLINK3_MK)
+RUST_BUILDLINK3_MK:=
+
+BUILDLINK_API_DEPENDS.rust+=	rust>=1.56.1
+BUILDLINK_PKGSRCDIR.rust?=	../../wip/rust
+BUILDLINK_PASSTHRU_DIRS+=	${PREFIX}/lib/rustlib
+.endif
+
+BUILDLINK_TREE+=	-rust
diff --git a/rust185/cargo.mk b/rust185/cargo.mk
new file mode 100644
index 0000000000..5813c04321
--- /dev/null
+++ b/rust185/cargo.mk
@@ -0,0 +1,115 @@
+# $NetBSD: cargo.mk,v 1.37 2024/05/04 20:06:55 tnn Exp $
+#
+# Common logic that can be used by packages that depend on cargo crates
+# from crates.io. This lets existing pkgsrc infrastructure fetch and verify
+# cargo crates instead of using the rust package manager in the build phase.
+# Inspired by cargo.mk from FreeBSD ports.
+#
+# Usage example:
+#
+# CARGO_CRATE_DEPENDS+=	sha1-0.20
+# .include "../../lang/rust/cargo.mk"
+#
+# If modifying the list of dependencies, re-run the build once without
+# --offline in CARGO_ARGS to generate a new valid Cargo.lock.
+# e.g: make CARGO_ARGS="build --release" build
+#
+# a list of CARGO_CRATE_DEPENDS can be generated via
+#      make print-cargo-depends > cargo-depends.mk
+#
+# See also www/geckodriver for a full example.
+
+MASTER_SITES?=	-${MASTER_SITE_CRATESIO}${PKGBASE}/${PKGVERSION_NOREV}/download
+
+CHECK_SSP_SUPPORTED=	no
+
+.include "../../lang/rust/rust.mk"
+
+USE_TOOLS+=		bsdtar digest
+CARGO_VENDOR_DIR=	${WRKDIR}/vendor
+CARGO_WRKSRC?=		${WRKSRC}
+
+# TODO: some Cargo.lock files include git+https sources which need to be fetched from the URL (not necessarily resolving to a crate.io url)
+DISTFILES?=			${DEFAULT_DISTFILES}
+.for crate in ${CARGO_CRATE_DEPENDS}
+DISTFILES+=			${crate}.crate
+SITES.${crate}.crate+=		-${MASTER_SITE_CRATESIO}${crate:C/-[0-9]+\.[0-9.]+.*$//}/${crate:C/^.*-([0-9]+\.[0-9.]+.*)$/\1/}/download
+EXTRACT_DIR.${crate}.crate?=	${CARGO_VENDOR_DIR}
+.endfor
+
+.include "../../mk/bsd.prefs.mk"
+# Triggers NetBSD ld.so bug (PR toolchain/54192)
+# See Makefile for further information.
+.if ${OPSYS} == "NetBSD" && ${OPSYS_VERSION} < 099957
+MAKE_JOBS_SAFE=	no
+.endif
+
+post-extract: cargo-vendor-crates
+.PHONY: cargo-vendor-crates
+cargo-vendor-crates:
+	@${STEP_MSG} "Extracting local cargo crates"
+	${RUN}${MKDIR} ${WRKDIR}/.cargo
+	${RUN}${PRINTF} "[source.crates-io]\nreplace-with = \"vendored-sources\"\n[source.vendored-sources]\ndirectory = \"${CARGO_VENDOR_DIR}\"\n" > ${WRKDIR}/.cargo/config.toml
+	${RUN}${MKDIR} ${CARGO_VENDOR_DIR}
+.for crate in ${CARGO_CRATE_DEPENDS}
+	${RUN}${PRINTF} '{"package":"%s","files":{}}'	\
+	  `${DIGEST} sha256 < ${_DISTDIR}/${crate}.crate` \
+	  > ${CARGO_VENDOR_DIR}/${crate}/.cargo-checksum.json
+.endfor
+
+# Legacy name
+.PHONY: show-cargo-depends
+show-cargo-depends: print-cargo-depends
+
+.PHONY: print-cargo-depends
+print-cargo-depends:
+	${RUN}${AWK} 'BEGIN {print "# $$Net" "BSD$$"; print;}		\
+		/^name = / { split($$3, a, "\""); name=a[2]; }		\
+		/^version = / { split($$3, a, "\""); vers=a[2]; }	\
+		/^source = / {						\
+			print "CARGO_CRATE_DEPENDS+=\t" name "-" vers;	\
+			}' ${CARGO_WRKSRC}/Cargo.lock
+
+.if ${RUST_TYPE} == "native"
+CARGO=			cargo
+.else
+CARGO=			${PREFIX}/bin/cargo
+.endif
+DEFAULT_CARGO_ARGS=	--offline -j${_MAKE_JOBS_N}	\
+			  ${CARGO_NO_DEFAULT_FEATURES:M[yY][eE][sS]:C/[yY][eE][sS]/--no-default-features/}	\
+			  ${CARGO_FEATURES:C/.*/--features/W}	\
+			  ${CARGO_FEATURES:S/ /,/Wg}
+CARGO_ARGS?=		build --release ${DEFAULT_CARGO_ARGS}
+CARGO_INSTALL_ARGS?=	install --path . --root ${DESTDIR}${PREFIX} ${DEFAULT_CARGO_ARGS}
+
+MAKE_ENV+=		RUSTFLAGS=${RUSTFLAGS:Q}
+ALL_ENV+=		CARGO_HOME=${WRKDIR}
+
+.if !target(do-build)
+do-build: do-cargo-build
+.endif
+
+.PHONY: do-cargo-build
+do-cargo-build:
+	${RUN} cd ${CARGO_WRKSRC} && ${SETENV} ${MAKE_ENV} ${CARGO} ${CARGO_ARGS}
+
+.if !target(do-install) && ${GNU_CONFIGURE:Uno:tl} == no
+do-install: do-cargo-install
+.endif
+
+.PHONY: do-cargo-install
+do-cargo-install:
+	${RUN} cd ${CARGO_WRKSRC} && ${SETENV} ${MAKE_ENV} ${CARGO} ${CARGO_INSTALL_ARGS}
+	# remove files cargo uses for tracking installations
+	${RM} -f ${DESTDIR}${PREFIX}/.crates.toml
+	${RM} -f ${DESTDIR}${PREFIX}/.crates2.json
+
+.if ${OPSYS} == "Darwin"
+.PHONY: do-cargo-post-install-darwin-fix-rpath
+post-install: do-cargo-post-install-darwin-fix-rpath
+do-cargo-post-install-darwin-fix-rpath:
+	${RUN} cd ${DESTDIR};								\
+	for i in $$(${FIND} .${PREFIX}/lib -name '*.so' | ${SED} -e 's|^\./||'); do	\
+	  install_name_tool -id /$$i $$i;						\
+	done
+.endif
diff --git a/rust185/cross.mk b/rust185/cross.mk
new file mode 100644
index 0000000000..47f2b3e006
--- /dev/null
+++ b/rust185/cross.mk
@@ -0,0 +1,83 @@
+# $NetBSD: cross.mk,v 1.11 2023/07/10 12:01:24 he Exp $
+
+# These settings may be used to cross-build rust.
+#
+# They interact with the files/gcc-wrap script to pick the
+# right compiler for the different phases of the build, and
+# use the headers for the target when required.  Note that the
+# cross-root tree will need to have the required binary packages
+# installed (curl etc., see list of buildlink3.mk includes in main
+# Makefile).
+
+# The gcc-wrap / c++-wrap script takes CROSS_ROOT environment variable
+# to do a cross-build.  The wrapper script assumes dest/ and tools/
+# as a result of a cross-build of NetBSD as subdirectories of this root
+#CROSS_ROOT=		/u/evbarm-armv7hf
+#CROSS_ROOT=		/u/evbarm-armv7hf-10.0
+#CROSS_ROOT=		/u/evbarm-armv6hf
+#CROSS_ROOT=		/u/sparc64
+#CROSS_ROOT=		/u/macppc
+#CROSS_ROOT=		/u/evbarm64
+#CROSS_ROOT=		/u/evbarm64eb
+#CROSS_ROOT=		/u/i386
+#CROSS_ROOT=		/u/mipsel
+#CROSS_ROOT=		/u/riscv64
+#CROSS_ROOT=		/
+#MAKE_ENV+=		CROSS_ROOT=${CROSS_ROOT}
+
+# The GNU cross target designation
+#GNU_CROSS_TARGET=	armv7--netbsdelf-eabihf
+#GNU_CROSS_TARGET=	armv6--netbsdelf-eabihf
+#GNU_CROSS_TARGET=	sparc64--netbsd
+#GNU_CROSS_TARGET=	powerpc--netbsd
+#GNU_CROSS_TARGET=	aarch64--netbsd
+#GNU_CROSS_TARGET=	aarch64_be--netbsd
+#GNU_CROSS_TARGET=	i486--netbsdelf
+#GNU_CROSS_TARGET=	mipsel--netbsd
+#GNU_CROSS_TARGET=	riscv64--netbsd
+#MAKE_ENV+=		GNU_CROSS_TARGET=${GNU_CROSS_TARGET}
+
+# To cross-build rust, you need to specify
+# the ultimate target to built for, as well as the
+# host the compiler is supposed to run on.
+# Rust's target designation
+#TARGET=		armv7-unknown-netbsd-eabihf
+#TARGET=		armv6-unknown-netbsd-eabihf
+#TARGET=		sparc64-unknown-netbsd
+#TARGET=		powerpc-unknown-netbsd
+#TARGET=		aarch64-unknown-netbsd
+#TARGET=		aarch64_be-unknown-netbsd
+#TARGET=		i686-unknown-netbsd
+#TARGET=		i586-unknown-netbsd
+#TARGET=		mipsel-unknown-netbsd
+#TARGET=		riscv64gc-unknown-netbsd
+#
+#SCRIPTS=		${WRKDIR}/scripts
+#CONFIGURE_ARGS+=	--host=${TARGET}
+#CONFIGURE_ARGS+=	--target=${TARGET}
+#CONFIGURE_ARGS+=	--set=target.${TARGET}.cc=${SCRIPTS}/gcc-wrap
+#CONFIGURE_ARGS+=	--set=target.${TARGET}.cxx=${SCRIPTS}/c++-wrap
+#CONFIGURE_ARGS+=	--set=target.${TARGET}.linker=${SCRIPTS}/gcc-wrap
+# Pick one:
+#CONFIGURE_ARGS+=	--set=target.${TARGET}.ar=${CROSS_ROOT}/tools/bin/${GNU_CROSS_TARGET}-ar
+#CONFIGURE_ARGS+=	--set=target.${TARGET}.ar=${SCRIPTS}/ar-wrap
+
+# May be required when cross-building on NetBSD
+#MAKE_ENV+=		OPENSSL_DIR=/usr
+
+#
+# Cross-compile illumos target.  The host is identical, it's just the target
+# that is renamed from x86_64-sun-solaris to x86_64-unknown-illumos.
+#
+#TARGET=		x86_64-unknown-illumos
+#
+# Use these variables for "cross-compiling" from x86_64-sun-solaris.
+#
+#CONFIGURE_ARGS+=	--set=target.${TARGET}.llvm-config=${LLVM_CONFIG_PATH}
+#CONFIGURE_ARGS+=	--host=${TARGET}
+#CONFIGURE_ARGS+=	--target=${TARGET}
+#
+# Set this variable when using a native x86_64-unknown-illumos bootstrap, as
+# the build still defaults to x86_64-sun-solaris based on uname.
+#
+#CONFIGURE_ARGS+=	--build=${TARGET}
diff --git a/rust185/distinfo b/rust185/distinfo
new file mode 100644
index 0000000000..a8a633c19f
--- /dev/null
+++ b/rust185/distinfo
@@ -0,0 +1,164 @@
+$NetBSD: distinfo,v 1.159 2023/06/19 14:46:47 bsiegert Exp $
+
+BLAKE2s (rust-1.84.1-aarch64-apple-darwin.tar.gz) = 03cce3a3db081f808d366fe1c2cd6d1dbab5f83f69f27f562cba8e457101352f
+SHA512 (rust-1.84.1-aarch64-apple-darwin.tar.gz) = da1715eb9c0c139e8ab78a288e0d9b46e6f08cd0fe7a3407266a6b3fd53f192a1f041dceefff3b23166fec18d506adabab84f144a22b9b8ef8cfeb6212b37bd2
+Size (rust-1.84.1-aarch64-apple-darwin.tar.gz) = 345901224 bytes
+BLAKE2s (rust-1.84.1-aarch64-unknown-linux-gnu.tar.gz) = e8827ce1bbd7d703825c0cd80a9eb2903ec763d3dc73022407407eb1e73ae83f
+SHA512 (rust-1.84.1-aarch64-unknown-linux-gnu.tar.gz) = 50ac52c40aa8d0849670aecc0797b418ae8062497a4b9066bf023a591aec5e47f4955419197d6b4189d10074847f135a14c40139d59f57c33fb4cc3ecaf8ee70
+Size (rust-1.84.1-aarch64-unknown-linux-gnu.tar.gz) = 492244033 bytes
+BLAKE2s (rust-1.84.1-aarch64-unknown-netbsd.tar.xz) = 4f7eacec5d54e00044e107587cbf05aaaebf006578cccd64187e193f3f8c1863
+SHA512 (rust-1.84.1-aarch64-unknown-netbsd.tar.xz) = ecd587178877f6ae4538e0cb86bc2d650941c11955d2fbcbbaa4af3352c8310cb70b63b43f5a21a38eff6590a62b135f4ad9b66841530359ca3ae6e82054668f
+Size (rust-1.84.1-aarch64-unknown-netbsd.tar.xz) = 207545496 bytes
+BLAKE2s (rust-1.84.1-aarch64_be-unknown-netbsd.tar.xz) = 8d90beeca3acadc79cfa725f1ffafcd0f21a03b481b3b6fdbcc9e929ab725d77
+SHA512 (rust-1.84.1-aarch64_be-unknown-netbsd.tar.xz) = ad5f539e8ad3a12954b490a76f2e232eedfbabfb1791d025a0ce739c988d6a24582314a7ce53128d88b26783b1c4eb258ef7ee80c923c422532537765fe54aed
+Size (rust-1.84.1-aarch64_be-unknown-netbsd.tar.xz) = 205111332 bytes
+BLAKE2s (rust-1.84.1-arm-unknown-linux-gnueabihf.tar.gz) = 8187dfee2b6db35d9cf072f93bab423a02a82b4e9ba920abdb301f3620250b94
+SHA512 (rust-1.84.1-arm-unknown-linux-gnueabihf.tar.gz) = 40be1a405d0e79325e280bdea2153556621bedb8ff19b874afde50544d888a0bab9c5f302a3740272c8a87209d85490146562c68127fbdf7cd81ba039c92e132
+Size (rust-1.84.1-arm-unknown-linux-gnueabihf.tar.gz) = 386795821 bytes
+BLAKE2s (rust-1.84.1-armv6-unknown-netbsd-eabihf.tar.xz) = 5c8fa9d0b8771e5b1097ba760d6f28469e2e26247039538e5380c2998ff054e7
+SHA512 (rust-1.84.1-armv6-unknown-netbsd-eabihf.tar.xz) = f5ce3c864c3bb870546e175bdf766da73d5ee9bae700c037ced933c96a430660b3ad88fb6f5c044f4108b59710e834babe8006eafbab49c3c81293064656ee87
+Size (rust-1.84.1-armv6-unknown-netbsd-eabihf.tar.xz) = 176752044 bytes
+BLAKE2s (rust-1.84.1-armv7-unknown-linux-gnueabihf.tar.gz) = 6bbb27602077c3c80c20e170a6b770d060b9eb777292876902e787248a8c649d
+SHA512 (rust-1.84.1-armv7-unknown-linux-gnueabihf.tar.gz) = 48253cc471828d24542a2110baee522e5bc5f8595d308219588100d3fe5f5d8a7eeab715b0acb1e26b9e2f2dceabc24fe809dd5ddd53f99f8701c54e50f512b2
+Size (rust-1.84.1-armv7-unknown-linux-gnueabihf.tar.gz) = 374492024 bytes
+BLAKE2s (rust-1.84.1-armv7-unknown-netbsd-eabihf.tar.xz) = 52e777f3cea007343d9e471d122ca0d80ef525cb2d34b2e596176c9acb4556b9
+SHA512 (rust-1.84.1-armv7-unknown-netbsd-eabihf.tar.xz) = bd7eebade7bcadf683d7818a7ef98f9b061952049dadbe8a88178304dabd27fce988efba1c90101ba0f7e1f08c09f7ecdeacdcfccd5504bd0bb9c57d0f456f55
+Size (rust-1.84.1-armv7-unknown-netbsd-eabihf.tar.xz) = 177679360 bytes
+BLAKE2s (rust-1.84.1-i586-unknown-netbsd.tar.xz) = 99c3aa68c051f7d7e3991b20af9ca49fe0cd8876917ee5fdac0176085919c88d
+SHA512 (rust-1.84.1-i586-unknown-netbsd.tar.xz) = 0c01a3e5f817f44d3b9e75832be46bc0de07387e0584ad7fe5a7e54d42fd047d40dea9e8fd36b1fa0bf495a77601f89cc4aa33a6f1e9e3fe3ee31c8bd91b7a76
+Size (rust-1.84.1-i586-unknown-netbsd.tar.xz) = 228695868 bytes
+BLAKE2s (rust-1.84.1-i686-unknown-linux-gnu.tar.gz) = fd414d680602d4d14d4d6a2a702a976963c514b9eecd2be94e58cb74c360590f
+SHA512 (rust-1.84.1-i686-unknown-linux-gnu.tar.gz) = d38868010bce512d1d3c57231dacc79d5c845be6604bf8a5742a7b1848a4159d4b008629f739f854101cb00c39de3ff15266902a66ed2dd5129a28677dba5b2f
+Size (rust-1.84.1-i686-unknown-linux-gnu.tar.gz) = 448299058 bytes
+BLAKE2s (rust-1.84.1-powerpc-unknown-netbsd.tar.xz) = 59402d87040896dd45bcea325c35a05603e16da6e2a2c7ccbcb6030c870219e5
+SHA512 (rust-1.84.1-powerpc-unknown-netbsd.tar.xz) = 455fe5c6180d87196a657b68f8ffff6154bae424bb21f86384d46b393008e142a3fe1c8a9b28a9fdb57271c019b00509b4a6920d0340123fa53acc743dbc8cc8
+Size (rust-1.84.1-powerpc-unknown-netbsd.tar.xz) = 240340788 bytes
+BLAKE2s (rust-1.84.1-riscv64gc-unknown-netbsd.tar.xz) = e05c1ba0ba9a385843e4c26ad4731d867283fd872af9ca63d0818e0bf59fc9e6
+SHA512 (rust-1.84.1-riscv64gc-unknown-netbsd.tar.xz) = efcf93b18edb7e6ae480b0c9b6f06c5c433452e6e3bfad9af9aefb266a779463120bc3baba9b480adc1da6551f8acc390203e403e1fe731918bfe18553d30ba9
+Size (rust-1.84.1-riscv64gc-unknown-netbsd.tar.xz) = 223173808 bytes
+BLAKE2s (rust-1.84.1-sparc64-unknown-netbsd.tar.xz) = b4e1a495297a5b0b202ad526e76e6ad2e7336719ef642a536409cd38e4b16c22
+SHA512 (rust-1.84.1-sparc64-unknown-netbsd.tar.xz) = 8d6f14083e230526e334fbd60ec64b783c7a6ef4eb73d85ff5b6ffab21c51ffddc09ce0aa707a2362e38f5da5b521f8dc88e0ce04ebd0e9f2b76144696eb959a
+Size (rust-1.84.1-sparc64-unknown-netbsd.tar.xz) = 204168440 bytes
+BLAKE2s (rust-1.84.1-x86_64-apple-darwin.tar.gz) = 47cf4d7276811e4c174097716486d7fd82f38ab49948caa9a9edd1885a1cdb96
+SHA512 (rust-1.84.1-x86_64-apple-darwin.tar.gz) = 16475689bddcc704d51dbcfc9efefedd458ce7c90797aafa88f94ffd815fb822b5bb265e9c3779faf48d28fb269d5950072e7e15d11b6f8306bdc70a4d348ab2
+Size (rust-1.84.1-x86_64-apple-darwin.tar.gz) = 350673687 bytes
+BLAKE2s (rust-1.84.1-x86_64-unknown-freebsd.tar.gz) = a842e40dbcd0f0366822f9be27ca5e06d0267b9416b4508b46c81fed6333bfc7
+SHA512 (rust-1.84.1-x86_64-unknown-freebsd.tar.gz) = 49472608b393ad76d37ec8711b8428b0cc606c83c660dbfa775410dbcb2edc1c11ecd3d853a667ac8078a05bc99577b960a2fe7745a0ec7146fc6406e4e6d072
+Size (rust-1.84.1-x86_64-unknown-freebsd.tar.gz) = 341896083 bytes
+BLAKE2s (rust-1.84.1-x86_64-unknown-illumos.tar.gz) = ab5f7657ebe58b4d3a1da7cd0b86081f5e91524cf00cbccaba27b55911666d43
+SHA512 (rust-1.84.1-x86_64-unknown-illumos.tar.gz) = f49d42ee3e855f2d0b9c5efb101a23a57686e71ffbae46e44e80e79deeb5ab09ccfceb26bf1045aa73db591b3a5fb6cde75db443076b0fcc6e9fa6ae570e0eb1
+Size (rust-1.84.1-x86_64-unknown-illumos.tar.gz) = 234986557 bytes
+BLAKE2s (rust-1.84.1-x86_64-unknown-linux-gnu.tar.gz) = e8f4f5309b8648146298907c9c3ec2bb62e0cf64dbffac6f5fc637eb0034a1b1
+SHA512 (rust-1.84.1-x86_64-unknown-linux-gnu.tar.gz) = 5d03f47a4b51dad9588f823d9c12537bcbf54f90cd47df6e7cc380e0afa0f18b8e115280cb7827fd021aea4aafe1e402631a7f82d18455f3d996df30d60139d1
+Size (rust-1.84.1-x86_64-unknown-linux-gnu.tar.gz) = 343864493 bytes
+BLAKE2s (rust-1.84.1-x86_64-unknown-netbsd.tar.xz) = da896c25e13da677385afe2cbba7a566a80238018107a4a8a91f395d5e39a8e8
+SHA512 (rust-1.84.1-x86_64-unknown-netbsd.tar.xz) = 936f778eb34a0807d8479d8ea58681c45163a1b6ee574e18e42a9965967107b99956eb3ab8e6e20494eab71b40cb5ac5cdecf0beb48966a02eeebeee0785d4f6
+Size (rust-1.84.1-x86_64-unknown-netbsd.tar.xz) = 202312072 bytes
+BLAKE2s (rust-std-1.84.1-aarch64-apple-darwin.tar.gz) = 0c1db7896558f471357e3d7a84eb719835216520bbd8eecf38d04c568cfba7ee
+SHA512 (rust-std-1.84.1-aarch64-apple-darwin.tar.gz) = 11297995113dda6aff1a49692adb78096f0153cd26c1d53118fa7ee1276f35411c213357c176a1f9aa5b1daaff61a6fb7133a0d5406ee14a7c6326c2075ce98d
+Size (rust-std-1.84.1-aarch64-apple-darwin.tar.gz) = 42525188 bytes
+BLAKE2s (rust-std-1.84.1-aarch64-unknown-linux-gnu.tar.gz) = 97a7e7920d078c654343a159a0e61bfd1e0763d8674a4d1df8f42d2bae19cd26
+SHA512 (rust-std-1.84.1-aarch64-unknown-linux-gnu.tar.gz) = dc9d93a7c0d1435f314dd2395f3a409b40e653f15cd445093859b4809517d9f422054f3b4f90c1643d3efa9fde9fe669b355dbbb1d88df30203f7e9b5ce7c471
+Size (rust-std-1.84.1-aarch64-unknown-linux-gnu.tar.gz) = 58735378 bytes
+BLAKE2s (rust-std-1.84.1-aarch64-unknown-netbsd.tar.xz) = 367a2423da6d2484c440c5f5d25925624d74ac9ef3a77910860c63f5994d0b05
+SHA512 (rust-std-1.84.1-aarch64-unknown-netbsd.tar.xz) = fe870ee8c5b72730156365255a04bcfa5082f2a6236445148555f13ce9c994fcf8725aa77d6eca509864f23ca28b512896ea236b9ef3e5dc597fd163f4ff51b6
+Size (rust-std-1.84.1-aarch64-unknown-netbsd.tar.xz) = 24341816 bytes
+BLAKE2s (rust-std-1.84.1-aarch64_be-unknown-netbsd.tar.xz) = c88c853598710c904a89e18dcd922351e2b01f86620b6f919c09cd63bf92a01c
+SHA512 (rust-std-1.84.1-aarch64_be-unknown-netbsd.tar.xz) = 598e828c00ccb7f5b69ccd398b88b705f69d810ccef27d9308f04d7ae6bd69ddaf1788e634df9b7ffda08b151824b2b865a026dbf8aa022f846dfece47d669cf
+Size (rust-std-1.84.1-aarch64_be-unknown-netbsd.tar.xz) = 22735596 bytes
+BLAKE2s (rust-std-1.84.1-arm-unknown-linux-gnueabihf.tar.gz) = e036f225fed46d2d484e69b61e8a330ae6c3fd43016bf58cfcdcd0371c8e3ef3
+SHA512 (rust-std-1.84.1-arm-unknown-linux-gnueabihf.tar.gz) = 6da3416733f54f05382ad9d3a56c340401e3ccf13c8b4c21d0c4d2968b382774cb7e1a3626bb7913ad1eaaaab372fe633a6d2d0abdf4992c2f19ec5aaf9b705c
+Size (rust-std-1.84.1-arm-unknown-linux-gnueabihf.tar.gz) = 39467433 bytes
+BLAKE2s (rust-std-1.84.1-armv6-unknown-netbsd-eabihf.tar.xz) = e159c44edfe314fd00610b359cf40cd5e21c319f5821b3eb4a0d1f6a20639f88
+SHA512 (rust-std-1.84.1-armv6-unknown-netbsd-eabihf.tar.xz) = 49864f090e4df344f9e3636a5ff9476ad93f60165ee3f507a1c20f3752fa9a2b54ea726c3a459d0762f847cdd6b7ee8dc903d4a4742a48224e853d96eaee0ab7
+Size (rust-std-1.84.1-armv6-unknown-netbsd-eabihf.tar.xz) = 22648616 bytes
+BLAKE2s (rust-std-1.84.1-armv7-unknown-linux-gnueabihf.tar.gz) = 2f0d0106b017d0033ec10834ad352e28fa0849ce4406bc01484136485b943448
+SHA512 (rust-std-1.84.1-armv7-unknown-linux-gnueabihf.tar.gz) = bc0231497a9326dfb82a345065031c379f31db211f12f29ce11a4be94b27808ea39b8808302b76d788cb128270e12238439e7769cade2d03f948208620d0ac71
+Size (rust-std-1.84.1-armv7-unknown-linux-gnueabihf.tar.gz) = 40834306 bytes
+BLAKE2s (rust-std-1.84.1-armv7-unknown-netbsd-eabihf.tar.xz) = 27efa4aafd91e0f12d4f5bcf76c0110767c3714c17a39eefa08bdc1d418e0cb9
+SHA512 (rust-std-1.84.1-armv7-unknown-netbsd-eabihf.tar.xz) = 48a4809eb43881550a05550e570d80e97ef10cc3e64f55080647c57e8d122172cdd7ea1cd73a137a2635ecd078f56aee11ad3fea6f21c72fc5d66df10b6bee08
+Size (rust-std-1.84.1-armv7-unknown-netbsd-eabihf.tar.xz) = 23570804 bytes
+BLAKE2s (rust-std-1.84.1-i586-unknown-netbsd.tar.xz) = c6f1035e9f0ed28540936c38b797307e9d2582ba2662831ad5245e9368df6ee1
+SHA512 (rust-std-1.84.1-i586-unknown-netbsd.tar.xz) = 2e0fd258bc13e7b1ee3a56843a49c89170e5717d585c78fac0b2ce01a0bda462ac6dbac4794c3229cc9ba4f3226bc3f66337e862e12a162c00e10def803ce36c
+Size (rust-std-1.84.1-i586-unknown-netbsd.tar.xz) = 25439480 bytes
+BLAKE2s (rust-std-1.84.1-i686-unknown-linux-gnu.tar.gz) = b2d91b1b84d7e0b882ca2f4e025ce32ba2671cf8ca42eeb9b8fa5b57b0a8cdef
+SHA512 (rust-std-1.84.1-i686-unknown-linux-gnu.tar.gz) = d386f1baeeec79b5d85f2a24f89bad05e2025a73d5938b4aff4d8403f3a5b05cc008b34a64dedbf1ae59b31d62aae527d4a72b01da9234909797f78b1ea8d566
+Size (rust-std-1.84.1-i686-unknown-linux-gnu.tar.gz) = 43606370 bytes
+BLAKE2s (rust-std-1.84.1-powerpc-unknown-netbsd.tar.xz) = b098cc5e304bb3d4b97a6581ea14e2589719a85ab887c1cd3c9af4e5ce98a8d5
+SHA512 (rust-std-1.84.1-powerpc-unknown-netbsd.tar.xz) = 214975d93d7f78b9e1d6a876693a7250a9f82e1470e51914f8f2be2e82376e6da472cd299a07ab051312d031caddae9e3176bad7f23af9d347026fe1a5c53203
+Size (rust-std-1.84.1-powerpc-unknown-netbsd.tar.xz) = 23065944 bytes
+BLAKE2s (rust-std-1.84.1-riscv64gc-unknown-netbsd.tar.xz) = 8b43e506d7cfc35b3d80c4c00bc2cb76ff8923c13dd63dc538dfbbb12fb439f1
+SHA512 (rust-std-1.84.1-riscv64gc-unknown-netbsd.tar.xz) = 4a319ae25238fc1a3d3af8eef3f8f1b9dd79906eacfefac060ae02c64b22945568ef3b39fb7b4182a953926bdf7df00b7548080412c8e53595804f0bc8fefd86
+Size (rust-std-1.84.1-riscv64gc-unknown-netbsd.tar.xz) = 22913380 bytes
+BLAKE2s (rust-std-1.84.1-sparc64-unknown-netbsd.tar.xz) = 06c1821cc94df2245783761be1bc8d8560a6c8c496662f0984d277a56ad0973b
+SHA512 (rust-std-1.84.1-sparc64-unknown-netbsd.tar.xz) = f1d52780ca71b90776fb40aca31c160642f83b34aa708ab116df3d49839b63701e5eda571ac989a0c832cd0fbad19b97a7770e193f73c07bcdd75803240202e7
+Size (rust-std-1.84.1-sparc64-unknown-netbsd.tar.xz) = 22607348 bytes
+BLAKE2s (rust-std-1.84.1-x86_64-apple-darwin.tar.gz) = 2df152504cdc18884febfe09aca6008481bea09454f637eb1f0a13819402bb77
+SHA512 (rust-std-1.84.1-x86_64-apple-darwin.tar.gz) = 2a2a8c15e6e5748627832320c1fae0dd26988cf12389d44efd5a93162e8c32d91cbb43167a114ee1f6212b5074830e1d38f92e02f36898d68be1baa1b32f2716
+Size (rust-std-1.84.1-x86_64-apple-darwin.tar.gz) = 45721567 bytes
+BLAKE2s (rust-std-1.84.1-x86_64-unknown-freebsd.tar.gz) = b650b074b67a75301871eb0d73b3e90691f92da92e9dfcc6104ebc1ed387ae02
+SHA512 (rust-std-1.84.1-x86_64-unknown-freebsd.tar.gz) = 6081f30c4223b2131afba14ad768ed2e433cdb9a5865d04646a406e2377485d184e9a270cb011f76f2d4e8e0e57e16d668c1688dee088ef6c637f98fa99be414
+Size (rust-std-1.84.1-x86_64-unknown-freebsd.tar.gz) = 47135456 bytes
+BLAKE2s (rust-std-1.84.1-x86_64-unknown-linux-gnu.tar.gz) = e0cea2c2ea637da0463d6d49adb27d7acc38b58df06e0120713471478047c1d2
+SHA512 (rust-std-1.84.1-x86_64-unknown-linux-gnu.tar.gz) = 76646b145c9b330b8134b61c7e29a4fef2e06b585b0ebbca46db497a4fbfcdfbd0bd23313452b83e9ec471bccf24d85081f1eff22aad6ed1bf09a264adeb04c0
+Size (rust-std-1.84.1-x86_64-unknown-linux-gnu.tar.gz) = 49493999 bytes
+BLAKE2s (rust-std-1.84.1-x86_64-unknown-netbsd.tar.xz) = 5d07b826b079c482efeef4f32bb64684121736436481b7ec2e463a78c079377f
+SHA512 (rust-std-1.84.1-x86_64-unknown-netbsd.tar.xz) = 2a1418eb553efdce9d6234072c2fc9c8c2923bc9b94383da3cd4c46ce74fd867ead9edc04d6fbda96bc4286a3342f3cd11fefcc9df33e4fa0a0fce428eb3f0df
+Size (rust-std-1.84.1-x86_64-unknown-netbsd.tar.xz) = 28078380 bytes
+BLAKE2s (rustc-1.85.0-src.tar.gz) = 2b7a46d49064743c30bf6541eaee77630fc09063eb79f6f6bfe28a15bbe8617d
+SHA512 (rustc-1.85.0-src.tar.gz) = 05bc1c1ad256f8fe4b1425650887360ec99ebd0e4c619994f66b55d2902f5f08b5dff448ce720fda798a32a44b225e96921e651e2bf6e80654db79f5a75d2be8
+Size (rustc-1.85.0-src.tar.gz) = 593324630 bytes
+SHA1 (patch-compiler_rustc__codegen__ssa_src_back_linker.rs) = f2af6e3b4925e8ca21b7cd783f7831b72700384a
+SHA1 (patch-compiler_rustc__llvm_build.rs) = 3acef995e3038a98b29b31b9bdd43286b1ac29f7
+SHA1 (patch-compiler_rustc__target_src_spec_base_netbsd.rs) = f6805317abaf61fa5e713af0b3599945a93a751a
+SHA1 (patch-compiler_rustc__target_src_spec_mod.rs) = a22b5d28997ed9a5565deec9c34322165d563d00
+SHA1 (patch-compiler_rustc__target_src_spec_targets_aarch64__be__unknown__netbsd.rs) = 620eaf74c1dd030973af53dfe4f9aa998be5b123
+SHA1 (patch-compiler_rustc__target_src_spec_targets_aarch64__unknown__netbsd.rs) = 1a02f2dd61a5f9cc4be1f66ac3404c961810c731
+SHA1 (patch-compiler_rustc__target_src_spec_targets_mips64el__unknown__netbsd.rs) = bbfbac8c4047340fc220e26bfaa8e7d7f5dcb284
+SHA1 (patch-compiler_rustc__target_src_spec_targets_mipsel__unknown__netbsd.rs) = 7deeb7d1d3306e96891dec144ac90398b88c6ad4
+SHA1 (patch-compiler_rustc__target_src_spec_targets_sparc64__unknown__netbsd.rs) = 677c18f5945f22d6142287ceb5f56c563fbfc211
+SHA1 (patch-library_backtrace_src_symbolize_gimli.rs) = 9d5ef634c5a454e474ea5fee76da9bb768f5b3d9
+SHA1 (patch-library_backtrace_src_symbolize_gimli_elf.rs) = 8b18e1dbde59f3e8f20e93c7669618b2c7a13294
+SHA1 (patch-library_std_src_sys_pal_unix_mod.rs) = bfc59ae4568547e3ed71c8b31ba5b5b5363d5d40
+SHA1 (patch-library_stdarch_crates_std__detect_tests_cpu-detection.rs) = 97c3ad8ea39c25d41256fcad80fae1e6e4970124
+SHA1 (patch-src_bootstrap_bootstrap.py) = b2ccb6a2c3ca180a3a39493314d56285a7a6d8ea
+SHA1 (patch-src_bootstrap_src_core_build__steps_compile.rs) = e928203ed4734c93cc33c5a3f7879cf18dcecc83
+SHA1 (patch-src_bootstrap_src_core_build__steps_install.rs) = cc6558df42c9c9ac28fdb2ff180bdaa7f22ce816
+SHA1 (patch-src_bootstrap_src_core_builder_cargo.rs) = 24c809e25e9397840edf044270d487dab5ec1a12
+SHA1 (patch-src_bootstrap_src_lib.rs) = 331f14cee4b89d306122c61a68dfc356c872f4f3
+SHA1 (patch-src_llvm-project_llvm_CMakeLists.txt) = 7abfabb6ec70df229a69355f8c76825610165c37
+SHA1 (patch-src_llvm-project_llvm_cmake_modules_AddLLVM.cmake) = e1b2eb2f0b3cf1cf87b443656ae306b3242f6b12
+SHA1 (patch-src_llvm-project_llvm_include_llvm-c_DataTypes.h) = cb011fc19957883c01725797f7c85ed1b20f96f1
+SHA1 (patch-src_llvm-project_llvm_include_llvm_Analysis_ConstantFolding.h) = 39d76e6659143d154ae690ac70781b698a2023d8
+SHA1 (patch-src_llvm-project_llvm_utils_FileCheck_FileCheck.cpp) = 2587c2f4d11ad8f75bf8a16de625135b26bacc15
+SHA1 (patch-src_tools_cargo_src_cargo_core_profiles.rs) = e1af7fde97416e0a269ee34efd37f4f47fcf7a95
+SHA1 (patch-src_tools_cargo_tests_testsuite_build.rs) = 333ec513b9b94750b2424a7c1b21c809e6ea25b8
+SHA1 (patch-src_tools_rust-installer_install-template.sh) = 6984546c34a2e4d55a6dbe59baa0d4958184e0b7
+SHA1 (patch-tests_assembly_targets_targets-elf.rs) = ee7d036c055ed2a2b3b303f381ad4694327c739b
+SHA1 (patch-tools_rust-analyzer_lib_line-index-src_lib.rs) = 4ed527174447ee23fa81dd6840e18b9949d5a273
+SHA1 (patch-vendor_bytecount-0.6.8_src_lib.rs) = df3641afebac2b06dc9d266524e295c461c441d4
+SHA1 (patch-vendor_crossbeam-utils-0.8.18_no__atomic.rs) = d4d9288cb199af9bc7e321fbd2b42860aed954ec
+SHA1 (patch-vendor_libc-0.2.155_src_unix_bsd_netbsdlike_netbsd_mod.rs) = 36d927a0c3fd6ef8d211da5389a981e077aedc29
+SHA1 (patch-vendor_libc-0.2.155_src_unix_solarish_mod.rs) = 97505b88875aa80fa2b5589b6090237c3786e143
+SHA1 (patch-vendor_libc-0.2.158_src_unix_bsd_netbsdlike_netbsd_mod.rs) = 6ca30a6873bc2ce462a9ed640e72e586b5e7db0b
+SHA1 (patch-vendor_libc-0.2.158_src_unix_solarish_mod.rs) = 194bd1dbbc568cc596ab5c58a7ea3ee5c88a804c
+SHA1 (patch-vendor_libc-0.2.167_src_unix_bsd_netbsdlike_netbsd_mod.rs) = 2cfc335e8ac0855fe04ffb1b870771b085316655
+SHA1 (patch-vendor_libc-0.2.167_src_unix_solarish_mod.rs) = e4304cbfdad03c7da68ab95260af3a07bdde7b64
+SHA1 (patch-vendor_libc-0.2.169_src_unix_bsd_netbsdlike_netbsd_mod.rs) = 02c4efefbf1e9e1bd98eb9524515677250ae7454
+SHA1 (patch-vendor_libc-0.2.169_src_unix_solarish_mod.rs) = e02c56106a092b4f2e27427ea8b5d96bf437c356
+SHA1 (patch-vendor_line-index-0.1.2_src_lib.rs) = 30aa5c82630ea0e8969abb527c11640712efba1e
+SHA1 (patch-vendor_lzma-sys-0.1.20_config.h) = 4849052ddb2f04f539fd7060fc1b43cc3acf99c4
+SHA1 (patch-vendor_memchr-2.7.4_src_arch_aarch64_memchr.rs) = 3e17e9f068afe5e812d10bf57fd3f6d4c21baf0b
+SHA1 (patch-vendor_memchr-2.7.4_src_arch_aarch64_mod.rs) = 24bbd69c8b571e5652d5306989b6598b58ec1966
+SHA1 (patch-vendor_memchr-2.7.4_src_memchr.rs) = 4c2f4fa4911f38acd3b36c311abd14d3c9751672
+SHA1 (patch-vendor_memchr-2.7.4_src_memmem_searcher.rs) = a5038873015004ab0c8769dda84edc16a9c55f24
+SHA1 (patch-vendor_memchr-2.7.4_src_vector.rs) = 50a901d061cf58a745b0c387a1c45ff2f0c54e89
+SHA1 (patch-vendor_openssl-src-111.28.2+1.1.1w_openssl_Configurations_10-main.conf) = ac2963bca8d1dc4e196693d9f5a264f38355314a
+SHA1 (patch-vendor_openssl-src-111.28.2+1.1.1w_src_lib.rs) = c87435bef2899b30b5cdb1b525193489988b2476
+SHA1 (patch-vendor_openssl-sys-0.9.102_build_find__normal.rs) = 2cf1432ed2be79677d41f267f9a08ff3082e9cbc
+SHA1 (patch-vendor_openssl-sys-0.9.102_build_main.rs) = 8861b7d3acc1643f7fe6f494b18d452ac70cf810
+SHA1 (patch-vendor_openssl-sys-0.9.92_build_find__normal.rs) = 91ad0d3e78055a5a205d55cd2c260cde70233bfe
+SHA1 (patch-vendor_openssl-sys-0.9.92_build_main.rs) = a47c0b7144466592aca3b622cb77498d59c5dfc4
+SHA1 (patch-vendor_rustc-ap-rustc__target_src_spec_aarch64__be__unknown__netbsd.rs) = 4e86aec4c89db9a331950a12f8ec7b8aaa50eed7
+SHA1 (patch-vendor_zerocopy-0.7.32_src_lib.rs) = d683e48900f427327f4ed518fe62b593e82c13d7
+SHA1 (patch-vendor_zerocopy-0.7.35_src_lib.rs) = b4b910405172f5653db4bf3286974b9410e77fab
diff --git a/rust185/do-cross.mk b/rust185/do-cross.mk
new file mode 100644
index 0000000000..36d5cd1a7f
--- /dev/null
+++ b/rust185/do-cross.mk
@@ -0,0 +1,107 @@
+# $NetBSD$
+# Do all the NetBSD cross builds
+# Collect the bootstrap kits in dist/
+
+VERSION!=	make show-var VARNAME=PKGVERSION
+V_NOREV!=	make show-var VARNAME=PKGVERSION_NOREV
+
+SHORT_TARGETS+=		armv7
+SHORT_TARGETS+=		armv6
+SHORT_TARGETS+=		sparc64
+SHORT_TARGETS+=		powerpc
+SHORT_TARGETS+=		arm64
+SHORT_TARGETS+=		arm64_be
+SHORT_TARGETS+=		i386
+SHORT_TARGETS+=		riscv64
+SHORT_TARGETS+=		mipsel	# produces mips32 (not mips1) executables
+
+# Conditional local overrides of ROOT.* variables:
+.sinclude "local-roots.mk"
+
+# Root of target directories.
+# Must have dest/ (build.sh's DESTDIR) and tools/ subdirectories
+ROOT.armv7?=		/u/evbarm-armv7hf
+ROOT.armv6?=		/u/evbarm-armv6hf
+ROOT.sparc64?=		/u/sparc64
+ROOT.powerpc?=		/u/macppc
+ROOT.arm64?=		/u/evbarm64
+ROOT.arm64_be?=		/u/evbarm64eb
+ROOT.i386?=		/u/i386
+ROOT.mipsel?=		/u/mipsel
+ROOT.riscv64?=		/u/riscv64
+
+# Mapping to GNU triple
+G_TGT.armv7=		armv7--netbsdelf-eabihf
+G_TGT.armv6=		armv6--netbsdelf-eabihf
+G_TGT.sparc64=		sparc64--netbsd
+G_TGT.powerpc=		powerpc--netbsd
+G_TGT.arm64=		aarch64--netbsd
+G_TGT.arm64_be=		aarch64_be--netbsd
+G_TGT.i386=		i486--netbsdelf
+G_TGT.mipsel=		mipsel--netbsd
+G_TGT.riscv64=		riscv64--netbsd
+
+# Mapping to rust's TARGET specification
+TGT.armv7=		armv7-unknown-netbsd-eabihf
+TGT.armv6=		armv6-unknown-netbsd-eabihf
+TGT.sparc64=		sparc64-unknown-netbsd
+TGT.powerpc=		powerpc-unknown-netbsd
+TGT.arm64=		aarch64-unknown-netbsd
+TGT.arm64_be=		aarch64_be-unknown-netbsd
+TGT.i386=		i586-unknown-netbsd
+TGT.mipsel=		mipsel-unknown-netbsd
+TGT.riscv64=		riscv64gc-unknown-netbsd
+
+# Optional target tweak for bootstrap files
+#TT.powerpc=		powerpc-unknown-netbsd90
+
+WRKDIR=		${.CURDIR}/work
+SCRIPTS=	${WRKDIR}/scripts
+
+#DEBUG=		echo
+
+# Make list of make targets
+.for st in ${SHORT_TARGETS}
+MTGTS+=	do-${st}
+.endfor
+
+all: ${MTGTS}
+
+# Define the individual build targets, used above
+.for st in ${SHORT_TARGETS}
+CA.${st}=--host=${TGT.${st}}
+CA.${st}+=--target=${TGT.${st}}
+CA.${st}+=--set=target.${TGT.${st}}.cc=${SCRIPTS}/gcc-wrap
+CA.${st}+=--set=target.${TGT.${st}}.cxx=${SCRIPTS}/c++-wrap
+CA.${st}+=--set=target.${TGT.${st}}.linker=${SCRIPTS}/gcc-wrap
+CA.${st}+=--set=target.${TGT.${st}}.ar=${ROOT.${st}}/tools/bin/${G_TGT.${st}}-ar
+do-${st}:
+	mkdir -p dist
+	@echo "=======> Cross-building rust for ${st}"
+	${DEBUG} make -f Makefile clean
+	${DEBUG} env \
+		CROSS_ROOT=${ROOT.${st}} \
+		GNU_CROSS_TARGET=${G_TGT.${st}} \
+		make -f Makefile \
+			ADD_CONFIGURE_ARGS="${CA.${st}}" \
+			TARGET=${TGT.${st}}
+	if [ "${TT.${st}}" != "" ]; then \
+		TT=${TT.${st}}; \
+	else \
+		TT=${TGT.${st}}; \
+	fi; \
+	distdir=${WRKDIR}/rustc-${V_NOREV}-src/build/dist; \
+	for comp in rust rust-std; do \
+		src=$${distdir}/$${comp}-${V_NOREV}-${TGT.${st}}.tar.xz; \
+		tgt=dist/$${comp}-${VERSION}-$${TT}.tar.xz; \
+		if [ ! -f "$${tgt}" ]; then \
+			echo ln $${src} $${tgt}; \
+			${DEBUG} ln $${src} $${tgt}; \
+		fi; \
+	done; \
+	src_comp=rust-src-${V_NOREV}.tar.xz; \
+	if [ ! -f dist/$${src_comp} ]; then \
+		echo ln $${distdir}/$${src_comp} dist; \
+		${DEBUG} ln $${distdir}/$${src_comp} dist; \
+	fi
+.endfor
diff --git a/rust185/files/gcc-wrap b/rust185/files/gcc-wrap
new file mode 100644
index 0000000000..957ebfa032
--- /dev/null
+++ b/rust185/files/gcc-wrap
@@ -0,0 +1,199 @@
+#! /bin/sh
+
+# Root of targets tools + dest directories
+# or unset to default to a native build.
+
+# This script assumes target tools in $root/tools 
+# and target's destdir in $root/dest, the result of a NetBSD build.sh.
+# ...or the native root, when we don't cross-compile
+root=${CROSS_ROOT:-/}
+
+incadd=""
+native=false
+if [ $root = "/" ]; then
+	native=true
+else
+	# What's the tools/bin prefix (if we're cross-building)?
+	gnuarch=${GNU_CROSS_TARGET:?}
+
+	# A special hack for netbsd-8 targets.
+	# netbsd-8 has gcc 5.5, but llvm and rust needs >= 7
+	# so we build tools from -9, and try to use that, but
+	# then the include path becomes wrong, and <stdatomic.h>
+	# is no longer picked up automatically by the compiler
+	# from the target destination directory
+	case $gnuarch in
+		sparc64*)	incadd="-I=/usr/include/gcc-5"
+				;;
+
+				# immintrin & from gcc-5 not
+				# compatible with gcc7, apparently
+		i[3456]86*)	incadd="-I=/usr/include/gcc-7"
+				;;
+
+				# mips64 does soft-float
+		mips64*)	madd="-msoft-float"
+				;;
+	esac
+	# We build both for -8 and -9 due to ABI differences,
+	# so can't just test $gnuarch...  Yes, a vile hack.
+	if [ "$root" = "/u/macppc" ]; then
+		incadd="-I=/usr/include/gcc-5"
+	fi
+fi
+
+# Who are we a wrapper for? (Typically either gcc or c++)
+who=$(basename $0 | sed -e 's/-wrap$//')
+
+args=""
+if [ ! -z "$madd" ]; then
+	args="$args $madd"
+fi
+
+# May need to add $linkadd before first -l or fist -L
+linkadd="-Wl,--sysroot=${root}/dest"
+# (perhaps this is overly cautious, other adjustments we do
+# below may be sufficient...)
+# Lib directories to ensure we search and have in run-path
+libs="/lib /usr/lib /usr/pkg/lib"
+
+for d in $libs; do
+	if ! $native; then
+		linkadd="$linkadd -L=$d"
+		linkadd="$linkadd -Wl,-rpath-link=${root}/dest/$d"
+	fi
+	# Run-path is for when we execute on the target,
+	# so no $root prefix
+	linkadd="$linkadd -Wl,-rpath,$d"
+done
+
+# ...and add a placeholder so we can tweak RPATH with chrpath,
+# since chrpath can't extend the length of the run path
+# (This may also not be needed, we use LD_LIBRARY_PATH instead)
+placeholder="placeholder-$(date | openssl dgst -sha1 | \
+	awk '{ print $2 }')"
+linkadd="$linkadd -Wl,-rpath,/$placeholder"
+# the / is a sneaky attempt to let it past cwrapper...
+
+# More debugging
+linkadd="$linkadd -Wl,--verbose"
+
+linktweaked=false
+
+# Step through args, tweak where required
+set -- "$@"
+while [ $# -gt 0 ]; do
+	case "$1" in
+# Insert = at the front of -isystem args.
+# This is to get --sysroot prepended, so that
+# we pick up the correct set of header files.
+# (I thought this wasn't reqired, but apparently it is...)
+		-isystem)
+			shift
+			args="$args -isystem =$1"
+			;;
+# Also doctor -I directives of known paths and
+# redirect them to the --sysroot.
+		-I/usr/include)
+			args="$args -I=/usr/include"
+			;;
+		-I/usr/include/krb5)
+			args="$args -I=/usr/include/krb5"
+			;;
+		-I/usr/pkg/include)
+# Try to drop this...
+			if ! $native; then
+				args="$args -I=/usr/pkg/include"
+			fi
+			;;
+		-I)
+			if [ $2 = "/usr/include" ]; then
+				args="$args -I=/usr/include"
+				shift
+			elif [ $2 = "/usr/include/krb5" ]; then
+				args="$args -I=/usr/include/krb5"
+				shift
+			elif [ $2 = "/usr/pkg/include" ]; then
+# Try to drop this too...
+				if ! $native; then
+					args="$args -I=/usr/pkg/include"
+				fi
+				shift
+			else
+				args="$args -I"
+			fi
+			;;
+		-l*)
+			if ! $linktweaked; then
+				args="$args $linkadd"
+				linktweaked=true
+			fi
+			args="$args $1"
+			;;
+		-L)
+			if ! $linktweaked; then
+				args="$args $linkadd"
+				linktweaked=true
+			fi
+			shift
+			tweaked=false
+			# redirect these to -Wl,--sysroot
+			for d in /lib /usr/lib /usr/pkg/lib; do
+				if [ $1 = $d ]; then
+					args="$args -L =$d"
+					tweaked=true
+				fi
+			done
+			# Not redirected?  If so we need to add
+			if ! $tweaked; then
+				args="$args -L $1"
+			fi
+			;;
+			
+		-L/lib)
+			if ! $linktweaked; then
+				args="$args $linkadd"
+				linktweaked=true
+			fi
+			args="$args -L=/lib"
+			;;
+		-L/usr/lib)
+			if ! $linktweaked; then
+				args="$args $linkadd"
+				linktweaked=true
+			fi
+			args="$args -L=/usr/lib"
+			;;
+		-L/usr/pkg/lib)
+			if ! $linktweaked; then
+				args="$args $linkadd"
+				linktweaked=true
+			fi
+			args="$args -L=/usr/pkg/lib"
+			;;
+		-Wl,--enable-new-dtags)
+			# ignore
+			;;
+		*)
+			args="$args $1"
+			;;
+	esac
+	shift
+done
+
+if $native; then
+	# Try to avoid cwrappers, which does "undocumented magic"
+	# by invoking the compiler "directly".
+	#cmd="/usr/bin/${who} $args"
+	# (however, this wrapper isn't used when buliding natively...)
+	cmd="${who} $args"
+else
+	cmd="${root}/tools/bin/${gnuarch}-${who} \
+		--sysroot=${root}/dest \
+		$incadd \
+		$args"
+fi
+
+# Cannot echo to stdout, messes up e.g. "gcc -print-prog-name=ld" output...
+#echo $cmd >> /tmp/gcc-wrap.log
+exec $cmd
diff --git a/rust185/options.mk b/rust185/options.mk
new file mode 100644
index 0000000000..eb52f22cab
--- /dev/null
+++ b/rust185/options.mk
@@ -0,0 +1,87 @@
+# $NetBSD: options.mk,v 1.26 2022/07/11 20:13:50 jperkin Exp $
+
+PKG_OPTIONS_VAR=	PKG_OPTIONS.rust
+PKG_SUPPORTED_OPTIONS+=	rust-cargo-static rust-docs
+
+.include "../../mk/bsd.fast.prefs.mk"
+
+# The bundled LLVM current has issues building on SunOS.
+.if ${OPSYS} != "SunOS"
+PKG_SUPPORTED_OPTIONS+=		rust-internal-llvm
+# There may be compatibility issues with the base LLVM on e.g. NetBSD.
+.  if !empty(HAVE_LLVM) || ${MACHINE_PLATFORM:MDarwin-*-aarch64}
+PKG_SUGGESTED_OPTIONS+=		rust-internal-llvm
+.  endif
+.endif
+
+# If cross-building, always use the internal LLVM
+.if !empty(TARGET)
+PKG_SUGGESTED_OPTIONS+=		rust-internal-llvm
+.endif
+
+PKG_OPTIONS_LEGACY_OPTS+=	rust-llvm:rust-internal-llvm
+
+# Bundle OpenSSL and curl into the cargo binary when producing
+# bootstraps on NetBSD.
+.if ${OPSYS} == "NetBSD" && ${BUILD_TARGET} == "dist"
+PKG_SUGGESTED_OPTIONS+=	rust-cargo-static
+.endif
+
+.include "../../mk/bsd.options.mk"
+
+# NetBSD/sparc64 when using the internal LLVM needs
+# to not use gcc 10.4 or 10.5 (as found in 10.0_BETA or 10.0), ref.
+# https://github.com/rust-lang/rust/issues/117231
+# (however, gcc from 9.x produces a working LLVM, go figure).
+.if ${MACHINE_PLATFORM:MNetBSD-10.*-sparc64}
+.  if !empty(PKG_OPTIONS:Mrust-internal-llvm)
+# Require GCC 12 (from pkgsrc) to correctly build the embedded LLVM (18.x).
+GCC_REQD+=	12
+.  endif
+.endif
+
+# Fix for problem seen during rust-installer run w/rust 1.84.1 on macppc,
+# "of course" experienced near the end of the build process:
+# assertion "memcmp(mf_ptr(mf) - 1, mf_ptr(mf) - matches[i].dist - 2, matches[i].len) == 0" failed: file "xz-5.2/src/liblzma/lz/lz_encoder_mf.c", line 40, function "lzma_mf_find"
+# The above is seen with both in-tree gcc (10.5.0) and gcc12 from pkgsrc.
+.if ${MACHINE_PLATFORM:MNetBSD-*-powerpc}
+GCC_REQD+=	14
+.endif
+
+#
+# Use the internal copy of LLVM or the external one?
+#
+.if empty(PKG_OPTIONS:Mrust-internal-llvm)
+BUILDLINK_API_DEPENDS.llvm+=	llvm>=18.0.0
+.include "../../lang/libunwind/buildlink3.mk"
+.include "../../lang/llvm/buildlink3.mk"
+CONFIGURE_ARGS+=	--enable-llvm-link-shared
+CONFIGURE_ARGS+=	--llvm-libunwind=system
+CONFIGURE_ARGS+=	--llvm-root=${BUILDLINK_PREFIX.llvm}
+# Also turn off build of the internal LLD, as the external LLVM
+# may be older (e.g. 18) than the internal LLD (now 19.x), ref.
+# https://github.com/rust-lang/rust/issues/131291
+CONFIGURE_ARGS+=	--set rust.lld=false
+.endif
+
+#
+# Link cargo statically against "native" libraries.
+# (openssl and curl specifically).
+#
+.if !empty(PKG_OPTIONS:Mrust-cargo-static)
+CONFIGURE_ARGS+=	--enable-cargo-native-static
+.else
+BUILDLINK_API_DEPENDS.nghttp2+= nghttp2>=1.41.0
+BUILDLINK_API_DEPENDS.curl+= 	curl>=7.67.0
+.include "../../www/curl/buildlink3.mk"
+.include "../../security/openssl/buildlink3.mk"
+.endif
+
+#
+# Install documentation.
+#
+.if !empty(PKG_OPTIONS:Mrust-docs)
+CONFIGURE_ARGS+=	--enable-docs
+.else
+CONFIGURE_ARGS+=	--disable-docs
+.endif
diff --git a/rust185/patches/patch-compiler_rustc__codegen__ssa_src_back_linker.rs b/rust185/patches/patch-compiler_rustc__codegen__ssa_src_back_linker.rs
new file mode 100644
index 0000000000..cb953e761f
--- /dev/null
+++ b/rust185/patches/patch-compiler_rustc__codegen__ssa_src_back_linker.rs
@@ -0,0 +1,27 @@
+$NetBSD: patch-compiler_rustc__codegen__ssa_src_back_linker.rs,v 1.19 2024/11/25 14:37:35 tnn Exp $
+
+Do not use @rpath on Darwin.
+Find external libunwind on Linux.
+
+--- compiler/rustc_codegen_ssa/src/back/linker.rs.orig	2024-09-04 15:07:06.000000000 +0000
++++ compiler/rustc_codegen_ssa/src/back/linker.rs
+@@ -402,7 +402,7 @@ impl<'a> GccLinker<'a> {
+             // principled solution at some point to force the compiler to pass
+             // the right `-Wl,-install_name` with an `@rpath` in it.
+             if self.sess.opts.cg.rpath || self.sess.opts.unstable_opts.osx_rpath_install_name {
+-                let mut rpath = OsString::from("@rpath/");
++                let mut rpath = OsString::from("@PREFIX@/lib/");
+                 rpath.push(out_filename.file_name().unwrap());
+                 self.link_arg("-install_name").link_arg(rpath);
+             }
+@@ -528,6 +528,10 @@ impl<'a> Linker for GccLinker<'a> {
+     }
+ 
+     fn link_dylib_by_name(&mut self, name: &str, verbatim: bool, as_needed: bool) {
++        if self.sess.target.os.contains("linux") && name == "unwind" {
++            self.link_arg("-rpath,@PREFIX@/lib");
++            self.link_arg("-L@PREFIX@/lib");
++        }
+         if self.sess.target.os == "illumos" && name == "c" {
+             // libc will be added via late_link_args on illumos so that it will
+             // appear last in the library search order.
diff --git a/rust185/patches/patch-compiler_rustc__llvm_build.rs b/rust185/patches/patch-compiler_rustc__llvm_build.rs
new file mode 100644
index 0000000000..74346dbe8e
--- /dev/null
+++ b/rust185/patches/patch-compiler_rustc__llvm_build.rs
@@ -0,0 +1,50 @@
+$NetBSD: patch-compiler_rustc__llvm_build.rs,v 1.17 2024/04/18 09:29:42 pin Exp $
+
+Fix build on NetBSD HEAD-llvm. XXX there is probably a better way to do this.
+
+Pick up -latomic tweak from
+https://github.com/rust-lang/rust/issues/104220
+and
+https://github.com/rust-lang/rust/pull/104572
+
+--- compiler/rustc_llvm/build.rs.orig	2023-10-03 02:52:17.000000000 +0000
++++ compiler/rustc_llvm/build.rs
+@@ -249,6 +249,10 @@ fn main() {
+     {
+         // 32-bit targets need to link libatomic.
+         println!("cargo:rustc-link-lib=atomic");
++        if target.contains("netbsd")
++        {
++            println!("cargo:rustc-link-lib=z");
++        }
+     } else if target.contains("windows-gnu") {
+         println!("cargo:rustc-link-lib=shell32");
+         println!("cargo:rustc-link-lib=uuid");
+@@ -261,7 +265,11 @@ fn main() {
+         // On NetBSD/i386, gcc and g++ is built for i486 (to maximize backward compat)
+         // However, LLVM insists on using 64-bit atomics.
+         // This gives rise to a need to link rust itself with -latomic for these targets
+-        if target.starts_with("i586") || target.starts_with("i686") {
++        if target.starts_with("i386")
++           || target.starts_with("i486")
++           || target.starts_with("i586")
++           || target.starts_with("i686")
++        {
+             println!("cargo:rustc-link-lib=atomic");
+         }
+         println!("cargo:rustc-link-lib=z");
+@@ -352,7 +360,13 @@ fn main() {
+         "c++"
+     } else if target.contains("netbsd") && llvm_static_stdcpp.is_some() {
+         // NetBSD uses a separate library when relocation is required
+-        "stdc++_p"
++        if env::var_os("PKGSRC_HAVE_LIBCPP").is_some() {
++            "c++_pic"
++        } else {
++            "stdc++_pic"
++        }
++    } else if env::var_os("PKGSRC_HAVE_LIBCPP").is_some() {
++        "c++"
+     } else if llvm_use_libcxx.is_some() {
+         "c++"
+     } else {
diff --git a/rust185/patches/patch-compiler_rustc__target_src_spec_base_netbsd.rs b/rust185/patches/patch-compiler_rustc__target_src_spec_base_netbsd.rs
new file mode 100644
index 0000000000..93997710be
--- /dev/null
+++ b/rust185/patches/patch-compiler_rustc__target_src_spec_base_netbsd.rs
@@ -0,0 +1,32 @@
+$NetBSD$
+
+For the benefit of powerpc, when libatomic-links is installed,
+search the directory containing the symlinks to -latomic.
+
+--- compiler/rustc_target/src/spec/base/netbsd.rs.orig	2024-01-06 19:57:14.887897867 +0000
++++ compiler/rustc_target/src/spec/base/netbsd.rs
+@@ -1,12 +1,23 @@
+-use crate::spec::{RelroLevel, TargetOptions, cvs};
++use crate::spec::{Cc, Lld, LinkerFlavor, RelroLevel, TargetOptions, cvs};
+ 
+ pub(crate) fn opts() -> TargetOptions {
++    let add_linker_paths =
++        &[
++            // For the benefit of powerpc, when libatomic-links is installed,
++            "-Wl,-R@PREFIX@/lib/libatomic",
++            "-Wl,-L@PREFIX@/lib/libatomic",
++        ];
++    let pre_link_args = TargetOptions::link_args(
++        LinkerFlavor::Gnu(Cc::Yes, Lld::No),
++        add_linker_paths
++    );
+     TargetOptions {
+         os: "netbsd".into(),
+         dynamic_linking: true,
+         families: cvs!["unix"],
+         no_default_libraries: false,
+         has_rpath: true,
++        pre_link_args,
+         position_independent_executables: true,
+         relro_level: RelroLevel::Full,
+         has_thread_local: true,
diff --git a/rust185/patches/patch-compiler_rustc__target_src_spec_mod.rs b/rust185/patches/patch-compiler_rustc__target_src_spec_mod.rs
new file mode 100644
index 0000000000..48bba380a5
--- /dev/null
+++ b/rust185/patches/patch-compiler_rustc__target_src_spec_mod.rs
@@ -0,0 +1,14 @@
+$NetBSD: patch-compiler_rustc__target_src_spec_mod.rs,v 1.17 2024/04/18 09:29:42 pin Exp $
+
+Add entry for NetBSD/mips64el.
+
+--- compiler/rustc_target/src/spec/mod.rs.orig	2024-01-13 14:20:59.236278792 +0000
++++ compiler/rustc_target/src/spec/mod.rs
+@@ -1532,6 +1532,7 @@ supported_targets! {
+     ("armv7-unknown-netbsd-eabihf", armv7_unknown_netbsd_eabihf),
+     ("i586-unknown-netbsd", i586_unknown_netbsd),
+     ("i686-unknown-netbsd", i686_unknown_netbsd),
++    ("mips64el-unknown-netbsd", mips64el_unknown_netbsd),
+     ("mipsel-unknown-netbsd", mipsel_unknown_netbsd),
+     ("powerpc-unknown-netbsd", powerpc_unknown_netbsd),
+     ("riscv64gc-unknown-netbsd", riscv64gc_unknown_netbsd),
diff --git a/rust185/patches/patch-compiler_rustc__target_src_spec_targets_aarch64__be__unknown__netbsd.rs b/rust185/patches/patch-compiler_rustc__target_src_spec_targets_aarch64__be__unknown__netbsd.rs
new file mode 100644
index 0000000000..64f75d7aa0
--- /dev/null
+++ b/rust185/patches/patch-compiler_rustc__target_src_spec_targets_aarch64__be__unknown__netbsd.rs
@@ -0,0 +1,17 @@
+$NetBSD$
+
+NetBSD aarch64 has a bug in the thread-local storage implementation,
+ref. PR#58154.  Turn it off for now.
+Ideally should check whether the version has the fix or not, but
+e.g. __NetBSD_Version__ isn't easily available here that I know...
+
+--- compiler/rustc_target/src/spec/targets/aarch64_be_unknown_netbsd.rs.orig	2024-07-23 19:21:34.344805113 +0000
++++ compiler/rustc_target/src/spec/targets/aarch64_be_unknown_netbsd.rs
+@@ -18,6 +18,7 @@ pub fn target() -> Target {
+             max_atomic_width: Some(128),
+             stack_probes: StackProbeType::Inline,
+             endian: Endian::Big,
++            has_thread_local: false, // ref. NetBSD PR#58154
+             ..base::netbsd::opts()
+         },
+     }
diff --git a/rust185/patches/patch-compiler_rustc__target_src_spec_targets_aarch64__unknown__netbsd.rs b/rust185/patches/patch-compiler_rustc__target_src_spec_targets_aarch64__unknown__netbsd.rs
new file mode 100644
index 0000000000..870b6f0931
--- /dev/null
+++ b/rust185/patches/patch-compiler_rustc__target_src_spec_targets_aarch64__unknown__netbsd.rs
@@ -0,0 +1,17 @@
+$NetBSD$
+
+NetBSD aarch64 has a bug in the thread-local storage implementation,
+ref. PR#58154.  Turn it off for now.
+Ideally should check whether the version has the fix or not, but
+e.g. __NetBSD_Version__ isn't easily available here that I know...
+
+--- compiler/rustc_target/src/spec/targets/aarch64_unknown_netbsd.rs.orig	2024-07-23 19:18:44.116841966 +0000
++++ compiler/rustc_target/src/spec/targets/aarch64_unknown_netbsd.rs
+@@ -17,6 +17,7 @@ pub fn target() -> Target {
+             mcount: "__mcount".into(),
+             max_atomic_width: Some(128),
+             stack_probes: StackProbeType::Inline,
++            has_thread_local: false, // ref. NetBSD PR#58154
+             ..base::netbsd::opts()
+         },
+     }
diff --git a/rust185/patches/patch-compiler_rustc__target_src_spec_targets_mips64el__unknown__netbsd.rs b/rust185/patches/patch-compiler_rustc__target_src_spec_targets_mips64el__unknown__netbsd.rs
new file mode 100644
index 0000000000..e240c13f23
--- /dev/null
+++ b/rust185/patches/patch-compiler_rustc__target_src_spec_targets_mips64el__unknown__netbsd.rs
@@ -0,0 +1,35 @@
+$NetBSD$
+
+Provide a mips64el target with N32, suitable for NetBSD/mips64el.
+
+--- compiler/rustc_target/src/spec/targets/mips64el_unknown_netbsd.rs.orig	2024-01-13 14:16:30.122042614 +0000
++++ compiler/rustc_target/src/spec/targets/mips64el_unknown_netbsd.rs
+@@ -0,0 +1,28 @@
++use crate::abi::Endian;
++use crate::spec::{base, Target, TargetOptions};
++
++pub(crate) fn target() -> Target {
++    let mut base = base::netbsd::opts();
++    base.max_atomic_width = Some(32);
++    base.cpu = "mips32".into();
++
++    Target {
++        llvm_target: "mipsel-unknown-netbsd".into(),
++        metadata: crate::spec::TargetMetadata {
++            description: None,
++            tier: None,
++            host_tools: None,
++            std: None,
++        },
++        pointer_width: 32,
++        data_layout: "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
++        arch: "mips".into(),
++        options: TargetOptions {
++            abi: "n32".into(),
++            features: "+soft-float,+abi=n32".into(),
++            endian: Endian::Little,
++            mcount: "__mcount".into(),
++            ..base
++        },
++    }
++}
diff --git a/rust185/patches/patch-compiler_rustc__target_src_spec_targets_mipsel__unknown__netbsd.rs b/rust185/patches/patch-compiler_rustc__target_src_spec_targets_mipsel__unknown__netbsd.rs
new file mode 100644
index 0000000000..9f9b89dbe0
--- /dev/null
+++ b/rust185/patches/patch-compiler_rustc__target_src_spec_targets_mipsel__unknown__netbsd.rs
@@ -0,0 +1,14 @@
+$NetBSD$
+
+Let's see if turning off thread local storage makes a difference...
+
+--- compiler/rustc_target/src/spec/targets/mipsel_unknown_netbsd.rs.orig	2024-08-05 20:02:56.368978562 +0000
++++ compiler/rustc_target/src/spec/targets/mipsel_unknown_netbsd.rs
+@@ -21,6 +21,7 @@ pub fn target() -> Target {
+             features: "+soft-float".into(),
+             mcount: "__mcount".into(),
+             endian: Endian::Little,
++            has_thread_local: false, // Let's see if there's a difference...
+             ..base
+         },
+     }
diff --git a/rust185/patches/patch-compiler_rustc__target_src_spec_targets_sparc64__unknown__netbsd.rs b/rust185/patches/patch-compiler_rustc__target_src_spec_targets_sparc64__unknown__netbsd.rs
new file mode 100644
index 0000000000..020ca7d981
--- /dev/null
+++ b/rust185/patches/patch-compiler_rustc__target_src_spec_targets_sparc64__unknown__netbsd.rs
@@ -0,0 +1,29 @@
+$NetBSD$
+
+Make more similar to other sparc64 target specs.
+
+--- compiler/rustc_target/src/spec/targets/sparc64_unknown_netbsd.rs.orig	2025-01-27 23:20:59.000000000 +0000
++++ compiler/rustc_target/src/spec/targets/sparc64_unknown_netbsd.rs
+@@ -1,11 +1,13 @@
+ use crate::abi::Endian;
+-use crate::spec::{Cc, LinkerFlavor, Lld, Target, TargetOptions, base};
++use crate::spec::{Cc, LinkerFlavor, Lld, Target, base};
+ 
+ pub(crate) fn target() -> Target {
+     let mut base = base::netbsd::opts();
+     base.cpu = "v9".into();
+     base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]);
+     base.max_atomic_width = Some(64);
++    base.endian = Endian::Big;
++    base.mcount = "__mcount".into();
+ 
+     Target {
+         llvm_target: "sparc64-unknown-netbsd".into(),
+@@ -18,6 +20,6 @@ pub(crate) fn target() -> Target {
+         pointer_width: 64,
+         data_layout: "E-m:e-i64:64-i128:128-n32:64-S128".into(),
+         arch: "sparc64".into(),
+-        options: TargetOptions { endian: Endian::Big, mcount: "__mcount".into(), ..base },
++        options: base,
+     }
+ }
diff --git a/rust185/patches/patch-library_backtrace_src_symbolize_gimli.rs b/rust185/patches/patch-library_backtrace_src_symbolize_gimli.rs
new file mode 100644
index 0000000000..9084324dd8
--- /dev/null
+++ b/rust185/patches/patch-library_backtrace_src_symbolize_gimli.rs
@@ -0,0 +1,14 @@
+$NetBSD$
+
+Add NetBSD to the family who is in the unix class.
+
+--- library/backtrace/src/symbolize/gimli.rs.orig	2006-07-24 01:21:28.000000000 +0000
++++ library/backtrace/src/symbolize/gimli.rs
+@@ -40,6 +40,7 @@ cfg_if::cfg_if! {
+         target_os = "haiku",
+         target_os = "hurd",
+         target_os = "linux",
++        target_os = "netbsd",
+         target_os = "openbsd",
+         target_os = "solaris",
+         target_os = "illumos",
diff --git a/rust185/patches/patch-library_backtrace_src_symbolize_gimli_elf.rs b/rust185/patches/patch-library_backtrace_src_symbolize_gimli_elf.rs
new file mode 100644
index 0000000000..f49e07d14f
--- /dev/null
+++ b/rust185/patches/patch-library_backtrace_src_symbolize_gimli_elf.rs
@@ -0,0 +1,26 @@
+$NetBSD: patch-library_backtrace_src_symbolize_gimli_elf.rs,v 1.8 2024/04/18 09:29:42 pin Exp $
+
+Make NetBSD also find its debug libraries, if present.
+
+--- library/backtrace/src/symbolize/gimli/elf.rs.orig	2022-04-04 09:41:26.000000000 +0000
++++ library/backtrace/src/symbolize/gimli/elf.rs
+@@ -395,11 +395,18 @@ fn decompress_zstd(mut input: &[u8], mut
+     Some(())
+ }
+ 
++#[cfg(target_os = "netbsd")]
++const DEBUG_PATH: &str = "/usr/libdata/debug";
++#[cfg(not(target_os = "netbsd"))]
+ const DEBUG_PATH: &str = "/usr/lib/debug";
+ 
+ fn debug_path_exists() -> bool {
+     cfg_if::cfg_if! {
+-        if #[cfg(any(target_os = "freebsd", target_os = "hurd", target_os = "linux"))] {
++        if #[cfg(any(target_os = "freebsd",
++		     target_os = "netbsd",
++                     target_os = "hurd",
++		     target_os = "linux"
++        ))] {
+             use core::sync::atomic::{AtomicU8, Ordering};
+             static DEBUG_PATH_EXISTS: AtomicU8 = AtomicU8::new(0);
+ 
diff --git a/rust185/patches/patch-library_std_src_sys_pal_unix_mod.rs b/rust185/patches/patch-library_std_src_sys_pal_unix_mod.rs
new file mode 100644
index 0000000000..403ccd725e
--- /dev/null
+++ b/rust185/patches/patch-library_std_src_sys_pal_unix_mod.rs
@@ -0,0 +1,14 @@
+$NetBSD$
+
+Add libexecinfo for backtrace() on NetBSD.
+
+--- library/std/src/sys/pal/unix/mod.rs.orig	2024-03-22 12:47:54.470537834 +0000
++++ library/std/src/sys/pal/unix/mod.rs
+@@ -384,6 +384,7 @@ cfg_if::cfg_if! {
+         #[link(name = "pthread")]
+         extern "C" {}
+     } else if #[cfg(target_os = "netbsd")] {
++        #[link(name = "execinfo")]
+         #[link(name = "pthread")]
+         #[link(name = "rt")]
+         extern "C" {}
diff --git a/rust185/patches/patch-library_stdarch_crates_std__detect_tests_cpu-detection.rs b/rust185/patches/patch-library_stdarch_crates_std__detect_tests_cpu-detection.rs
new file mode 100644
index 0000000000..d57e0bb62a
--- /dev/null
+++ b/rust185/patches/patch-library_stdarch_crates_std__detect_tests_cpu-detection.rs
@@ -0,0 +1,15 @@
+$NetBSD$
+
+On NetBSD/aarch64, do the same as FreeBSD and OpenBSD.
+
+--- library/stdarch/crates/std_detect/tests/cpu-detection.rs.orig	2024-11-10 17:39:05.836052531 +0000
++++ library/stdarch/crates/std_detect/tests/cpu-detection.rs
+@@ -166,7 +166,7 @@ fn aarch64_windows() {
+ #[test]
+ #[cfg(all(
+     target_arch = "aarch64",
+-    any(target_os = "freebsd", target_os = "openbsd")
++    any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd")
+ ))]
+ fn aarch64_bsd() {
+     println!("asimd: {:?}", is_aarch64_feature_detected!("asimd"));
diff --git a/rust185/patches/patch-src_bootstrap_bootstrap.py b/rust185/patches/patch-src_bootstrap_bootstrap.py
new file mode 100644
index 0000000000..7ec9a08b78
--- /dev/null
+++ b/rust185/patches/patch-src_bootstrap_bootstrap.py
@@ -0,0 +1,67 @@
+$NetBSD$
+
+Use `uname -p` on NetBSD, as that is reliable and sensible there.
+Handle earmv[67]hf for NetBSD.
+Also use @PREFIX@ and not $ORIGIN in rpath.
+
+--- src/bootstrap/bootstrap.py.orig	2025-02-17 18:17:27.000000000 +0000
++++ src/bootstrap/bootstrap.py
+@@ -323,6 +323,11 @@ def default_build_triple(verbose):
+         "GNU": "unknown-hurd",
+     }
+ 
++    # For NetBSD, use `uname -p`, as there it is reliable & sensible
++    if kernel == 'NetBSD':
++        cputype = subprocess.check_output(
++            ['uname', '-p']).strip().decode(default_encoding)
++
+     # Consider the direct transformation first and then the special cases
+     if kernel in kerneltype_mapper:
+         kernel = kerneltype_mapper[kernel]
+@@ -427,10 +432,16 @@ def default_build_triple(verbose):
+             kernel = "linux-androideabi"
+         else:
+             kernel += "eabihf"
+-    elif cputype in {"armv7l", "armv8l"}:
++    elif cputype in {"armv6hf", "earmv6hf"}:
++        cputype = "armv6"
++        if kernel == "unknown-netbsd":
++            kernel += "-eabihf"
++    elif cputype in {"armv7l", "earmv7hf", "armv8l"}:
+         cputype = "armv7"
+         if kernel == "linux-android":
+             kernel = "linux-androideabi"
++        elif kernel == "unknown-netbsd":
++            kernel += "-eabihf"
+         else:
+             kernel += "eabihf"
+     elif cputype == "mips":
+@@ -688,11 +699,11 @@ class RustBuild(object):
+                 )
+             p = Pool(pool_size)
+             try:
+-                # FIXME: A cheap workaround for https://github.com/rust-lang/rust/issues/125578,
+-                # remove this once the issue is closed.
+-                bootstrap_build_artifacts = os.path.join(self.bootstrap_out(), "debug")
+-                if os.path.exists(bootstrap_build_artifacts):
+-                    shutil.rmtree(bootstrap_build_artifacts)
++#                # FIXME: A cheap workaround for https://github.com/rust-lang/rust/issues/125578,
++#                # remove this once the issue is closed.
++#                bootstrap_build_artifacts = os.path.join(self.bootstrap_out(), "debug")
++#                if os.path.exists(bootstrap_build_artifacts):
++#                    shutil.rmtree(bootstrap_build_artifacts)
+ 
+                 p.map(unpack_component, tarballs_download_info)
+             finally:
+@@ -839,7 +850,10 @@ class RustBuild(object):
+             self.nix_deps_dir = nix_deps_dir
+ 
+         patchelf = "{}/bin/patchelf".format(nix_deps_dir)
+-        rpath_entries = [os.path.join(os.path.realpath(nix_deps_dir), "lib")]
++        rpath_entries = [
++            "@PREFIX@/lib",
++            os.path.join(os.path.realpath(nix_deps_dir), "lib")
++        ]
+         patchelf_args = ["--add-rpath", ":".join(rpath_entries)]
+         if ".so" not in fname:
+             # Finally, set the correct .interp for binaries
diff --git a/rust185/patches/patch-src_bootstrap_src_core_build__steps_compile.rs b/rust185/patches/patch-src_bootstrap_src_core_build__steps_compile.rs
new file mode 100644
index 0000000000..92eee78647
--- /dev/null
+++ b/rust185/patches/patch-src_bootstrap_src_core_build__steps_compile.rs
@@ -0,0 +1,15 @@
+$NetBSD: patch-src_bootstrap_src_core_build__steps_compile.rs,v 1.2 2024/04/18 09:29:42 pin Exp $
+
+On Darwin, do not use @rpath for internal libraries.
+
+--- src/bootstrap/src/core/build_steps/compile.rs.orig	2024-01-06 20:42:20.028206400 +0000
++++ src/bootstrap/src/core/build_steps/compile.rs
+@@ -695,7 +695,7 @@ fn copy_sanitizers(
+             || target == "x86_64-apple-ios"
+         {
+             // Update the library’s install name to reflect that it has been renamed.
+-            apple_darwin_update_library_name(builder, &dst, &format!("@rpath/{}", runtime.name));
++            apple_darwin_update_library_name(builder, &dst, &format!("@PREFIX@/lib/{}", runtime.name));
+             // Upon renaming the install name, the code signature of the file will invalidate,
+             // so we will sign it again.
+             apple_darwin_sign_file(builder, &dst);
diff --git a/rust185/patches/patch-src_bootstrap_src_core_build__steps_install.rs b/rust185/patches/patch-src_bootstrap_src_core_build__steps_install.rs
new file mode 100644
index 0000000000..8fa745ac41
--- /dev/null
+++ b/rust185/patches/patch-src_bootstrap_src_core_build__steps_install.rs
@@ -0,0 +1,13 @@
+$NetBSD$
+
+--- src/bootstrap/src/core/build_steps/install.rs.orig	2006-07-24 01:21:28.000000000 +0000
++++ src/bootstrap/src/core/build_steps/install.rs
+@@ -200,7 +200,7 @@ macro_rules! install {
+ install!((self, builder, _config),
+     Docs, path = "src/doc", _config.docs, only_hosts: false, {
+         let tarball = builder.ensure(dist::Docs { host: self.target }).expect("missing docs");
+-        install_sh(builder, "docs", self.compiler.stage, Some(self.target), &tarball);
++        install_sh(builder, "rust", self.compiler.stage, Some(self.target), &tarball);
+     };
+     Std, path = "library/std", true, only_hosts: false, {
+         // `expect` should be safe, only None when host != build, but this
diff --git a/rust185/patches/patch-src_bootstrap_src_core_builder_cargo.rs b/rust185/patches/patch-src_bootstrap_src_core_builder_cargo.rs
new file mode 100644
index 0000000000..46ebd90fbf
--- /dev/null
+++ b/rust185/patches/patch-src_bootstrap_src_core_builder_cargo.rs
@@ -0,0 +1,42 @@
+$NetBSD$
+
+Find external libunwind and libLLVM in pkgsrc (not just Linux).
+Use @PREFIX@ in rpath.
+
+Adapt fix to
+https://github.com/rust-lang/rust/issues/133629
+(files restructured upstream)
+
+--- src/bootstrap/src/core/builder/cargo.rs.orig	2025-01-27 23:20:59.000000000 +0000
++++ src/bootstrap/src/core/builder/cargo.rs
+@@ -238,7 +238,7 @@ impl Cargo {
+                 Some(format!("-Wl,-rpath,@loader_path/../{libdir}"))
+             } else if !target.is_windows() && !target.contains("aix") && !target.contains("xous") {
+                 self.rustflags.arg("-Clink-args=-Wl,-z,origin");
+-                Some(format!("-Wl,-rpath,$ORIGIN/../{libdir}"))
++                Some(format!("-Wl,-rpath,@PREFIX@/lib"))
+             } else {
+                 None
+             };
+@@ -648,7 +648,10 @@ impl Builder<'_> {
+                 // Build proc macros both for the host and the target unless proc-macros are not
+                 // supported by the target.
+                 if target != compiler.host && cmd_kind != Kind::Check {
+-                    let error = command(self.rustc(compiler))
++                    let mut rustc_cmd = command(self.rustc(compiler));
++                    self.add_rustc_lib_path(compiler, &mut rustc_cmd);
++
++                    let error = rustc_cmd
+                         .arg("--target")
+                         .arg(target.rustc_target_arg())
+                         .arg("--print=file-names")
+@@ -1212,6 +1215,9 @@ impl Builder<'_> {
+             }
+         }
+ 
++	// added for pkgsrc libunwind or external LLVM
++	rustflags.arg("-Clink-args=-Wl,-rpath,@PREFIX@/lib,-L@PREFIX/lib");
++
+         Cargo {
+             command: cargo,
+             compiler,
diff --git a/rust185/patches/patch-src_bootstrap_src_lib.rs b/rust185/patches/patch-src_bootstrap_src_lib.rs
new file mode 100644
index 0000000000..e7ca14bda1
--- /dev/null
+++ b/rust185/patches/patch-src_bootstrap_src_lib.rs
@@ -0,0 +1,23 @@
+$NetBSD: patch-src_bootstrap_src_lib.rs,v 1.2 2024/04/18 09:29:42 pin Exp $
+
+Don't filter out optimization flags.
+FreeBSD has a particular C++ runtime library name
+
+--- src/bootstrap/src/lib.rs.orig	2024-01-06 20:52:50.892941220 +0000
++++ src/bootstrap/src/lib.rs
+@@ -1195,13 +1195,13 @@ impl Build {
+             .args()
+             .iter()
+             .map(|s| s.to_string_lossy().into_owned())
+-            .filter(|s| !s.starts_with("-O") && !s.starts_with("/O"))
+             .collect::<Vec<String>>();
+ 
+         // If we're compiling C++ on macOS then we add a flag indicating that
+         // we want libc++ (more filled out than libstdc++), ensuring that
+         // LLVM/etc are all properly compiled.
+-        if matches!(c, CLang::Cxx) && target.contains("apple-darwin") {
++        if matches!(c, CLang::Cxx) &&
++            (target.contains("apple-darwin") || target.contains("freebsd")) {
+             base.push("-stdlib=libc++".into());
+         }
+ 
diff --git a/rust185/patches/patch-src_llvm-project_llvm_CMakeLists.txt b/rust185/patches/patch-src_llvm-project_llvm_CMakeLists.txt
new file mode 100644
index 0000000000..d0dfe4e6da
--- /dev/null
+++ b/rust185/patches/patch-src_llvm-project_llvm_CMakeLists.txt
@@ -0,0 +1,18 @@
+$NetBSD: patch-src_llvm-project_llvm_CMakeLists.txt,v 1.14 2024/04/18 09:29:42 pin Exp $
+
+Don't implement sys/regset.h workaround, fix source instead.
+
+--- src/llvm-project/llvm/CMakeLists.txt.orig	2018-03-10 02:51:13.000000000 +0000
++++ src/llvm-project/llvm/CMakeLists.txt
+@@ -939,11 +939,6 @@ if(LLVM_TARGET_IS_CROSSCOMPILE_HOST)
+ # (this is a variable that CrossCompile sets on recursive invocations)
+ endif()
+ 
+-if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
+-   # special hack for Solaris to handle crazy system sys/regset.h
+-   include_directories("${LLVM_MAIN_INCLUDE_DIR}/llvm/Support/Solaris")
+-endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
+-
+ # Make sure we don't get -rdynamic in every binary. For those that need it,
+ # use export_executable_symbols(target).
+ set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
diff --git a/rust185/patches/patch-src_llvm-project_llvm_cmake_modules_AddLLVM.cmake b/rust185/patches/patch-src_llvm-project_llvm_cmake_modules_AddLLVM.cmake
new file mode 100644
index 0000000000..6a701cd3aa
--- /dev/null
+++ b/rust185/patches/patch-src_llvm-project_llvm_cmake_modules_AddLLVM.cmake
@@ -0,0 +1,49 @@
+$NetBSD: patch-src_llvm-project_llvm_cmake_modules_AddLLVM.cmake,v 1.15 2024/04/18 09:29:42 pin Exp $
+
+On Darwin, use correct install-name for shared libraries.
+
+Undo some of the RPATH magic so that cross-building
+works inside pkgsrc again (indirectly eliminates $ORIGIN rpath
+handling / editing, $ORIGIN handling is partially undone by cwrappers
+in pkgsrc).
+
+--- src/llvm-project/llvm/cmake/modules/AddLLVM.cmake.orig	2023-07-12 03:33:01.000000000 +0000
++++ src/llvm-project/llvm/cmake/modules/AddLLVM.cmake
+@@ -2311,7 +2311,7 @@ function(llvm_setup_rpath name)
+   endif()
+ 
+   if (APPLE)
+-    set(_install_name_dir INSTALL_NAME_DIR "@rpath")
++    set(_install_name_dir INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib")
+     set(_install_rpath "@loader_path/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
+   elseif(${CMAKE_SYSTEM_NAME} MATCHES "AIX" AND BUILD_SHARED_LIBS)
+     # $ORIGIN is not interpreted at link time by aix ld.
+@@ -2320,8 +2320,7 @@ function(llvm_setup_rpath name)
+     # FIXME: update this when there is better solution.
+     set(_install_rpath "${LLVM_LIBRARY_OUTPUT_INTDIR}" "${CMAKE_INSTALL_PREFIX}/lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
+   elseif(UNIX)
+-    set(_build_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
+-    set(_install_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}")
++    set(_install_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
+     if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)")
+       set_property(TARGET ${name} APPEND_STRING PROPERTY
+                    LINK_FLAGS " -Wl,-z,origin ")
+@@ -2335,16 +2334,9 @@ function(llvm_setup_rpath name)
+     return()
+   endif()
+ 
+-  # Enable BUILD_WITH_INSTALL_RPATH unless CMAKE_BUILD_RPATH is set and not
+-  # building for macOS or AIX, as those platforms seemingly require it.
+-  # On AIX, the tool chain doesn't support modifying rpaths/libpaths for XCOFF
+-  # on install at the moment, so BUILD_WITH_INSTALL_RPATH is required.
++  # Enable BUILD_WITH_INSTALL_RPATH unless CMAKE_BUILD_RPATH is set.
+   if("${CMAKE_BUILD_RPATH}" STREQUAL "")
+-    if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin|AIX")
+-      set_property(TARGET ${name} PROPERTY BUILD_WITH_INSTALL_RPATH ON)
+-    else()
+-      set_property(TARGET ${name} APPEND PROPERTY BUILD_RPATH "${_build_rpath}")
+-    endif()
++    set_property(TARGET ${name} PROPERTY BUILD_WITH_INSTALL_RPATH ON)
+   endif()
+ 
+   set_target_properties(${name} PROPERTIES
diff --git a/rust185/patches/patch-src_llvm-project_llvm_include_llvm-c_DataTypes.h b/rust185/patches/patch-src_llvm-project_llvm_include_llvm-c_DataTypes.h
new file mode 100644
index 0000000000..8722fdfe38
--- /dev/null
+++ b/rust185/patches/patch-src_llvm-project_llvm_include_llvm-c_DataTypes.h
@@ -0,0 +1,34 @@
+$NetBSD: patch-src_llvm-project_llvm_include_llvm-c_DataTypes.h,v 1.8 2024/04/18 09:29:42 pin Exp $
+
+Don't implement sys/regset.h workaround, fix source instead.
+
+--- src/llvm-project/llvm/include/llvm-c/DataTypes.h.orig	2021-04-17 01:50:37.000000000 +0000
++++ src/llvm-project/llvm/include/llvm-c/DataTypes.h
+@@ -77,4 +77,27 @@ typedef signed int ssize_t;
+ # define UINT64_MAX 0xffffffffffffffffULL
+ #endif
+ 
++#if defined(__sun)
++#include <sys/regset.h>
++#undef CS
++#undef DS
++#undef ES
++#undef FS
++#undef GS
++#undef SS
++#undef EAX
++#undef ECX
++#undef EDX
++#undef EBX
++#undef ESP
++#undef EBP
++#undef ESI
++#undef EDI
++#undef EIP
++#undef UESP
++#undef EFL
++#undef ERR
++#undef TRAPNO
++#endif
++
+ #endif /* LLVM_C_DATATYPES_H */
diff --git a/rust185/patches/patch-src_llvm-project_llvm_include_llvm_Analysis_ConstantFolding.h b/rust185/patches/patch-src_llvm-project_llvm_include_llvm_Analysis_ConstantFolding.h
new file mode 100644
index 0000000000..159d4a70de
--- /dev/null
+++ b/rust185/patches/patch-src_llvm-project_llvm_include_llvm_Analysis_ConstantFolding.h
@@ -0,0 +1,17 @@
+$NetBSD: patch-src_llvm-project_llvm_include_llvm_Analysis_ConstantFolding.h,v 1.10 2024/04/18 09:29:42 pin Exp $
+
+Fix SunOS CS conflict not handled by include/llvm-c/DataTypes.h
+
+--- src/llvm-project/llvm/include/llvm/Analysis/ConstantFolding.h.orig	2018-08-01 16:32:37.000000000 +0000
++++ src/llvm-project/llvm/include/llvm/Analysis/ConstantFolding.h
+@@ -19,6 +19,10 @@
+ #ifndef LLVM_ANALYSIS_CONSTANTFOLDING_H
+ #define LLVM_ANALYSIS_CONSTANTFOLDING_H
+ 
++#ifdef __sun
++#undef CS
++#endif
++
+ #include <stdint.h>
+ 
+ namespace llvm {
diff --git a/rust185/patches/patch-src_llvm-project_llvm_utils_FileCheck_FileCheck.cpp b/rust185/patches/patch-src_llvm-project_llvm_utils_FileCheck_FileCheck.cpp
new file mode 100644
index 0000000000..e255aa5af9
--- /dev/null
+++ b/rust185/patches/patch-src_llvm-project_llvm_utils_FileCheck_FileCheck.cpp
@@ -0,0 +1,15 @@
+$NetBSD: patch-src_llvm-project_llvm_utils_FileCheck_FileCheck.cpp,v 1.13 2024/04/18 09:29:42 pin Exp $
+
+Avoid ambiguous function call.
+
+--- src/llvm-project/llvm/utils/FileCheck/FileCheck.cpp.orig	2019-02-12 15:22:48.000000000 +0000
++++ src/llvm-project/llvm/utils/FileCheck/FileCheck.cpp
+@@ -592,7 +592,7 @@ static void DumpAnnotatedInput(raw_ostre
+   unsigned LineCount = InputFileText.count('\n');
+   if (InputFileEnd[-1] != '\n')
+     ++LineCount;
+-  unsigned LineNoWidth = std::log10(LineCount) + 1;
++  unsigned LineNoWidth = std::log10((float)LineCount) + 1;
+   // +3 below adds spaces (1) to the left of the (right-aligned) line numbers
+   // on input lines and (2) to the right of the (left-aligned) labels on
+   // annotation lines so that input lines and annotation lines are more
diff --git a/rust185/patches/patch-src_tools_cargo_src_cargo_core_profiles.rs b/rust185/patches/patch-src_tools_cargo_src_cargo_core_profiles.rs
new file mode 100644
index 0000000000..0d2e97d952
--- /dev/null
+++ b/rust185/patches/patch-src_tools_cargo_src_cargo_core_profiles.rs
@@ -0,0 +1,17 @@
+$NetBSD: patch-src_tools_cargo_src_cargo_core_profiles.rs,v 1.17 2024/04/18 09:29:42 pin Exp $
+
+Turn off incremental builds for sparc64, ref.
+https://sources.debian.org/patches/cargo/0.29.0-1/2007_sparc64_disable_incremental_build.patch/
+
+--- src/tools/cargo/src/cargo/core/profiles.rs.orig	2023-07-12 03:33:05.000000000 +0000
++++ src/tools/cargo/src/cargo/core/profiles.rs
+@@ -681,6 +681,9 @@ impl Profile {
+             debuginfo: DebugInfo::Resolved(TomlDebugInfo::Full),
+             debug_assertions: true,
+             overflow_checks: true,
++            #[cfg(target_arch = "sparc64")]
++            incremental: false,
++            #[cfg(not(target_arch = "sparc64"))]
+             incremental: true,
+             ..Profile::default()
+         }
diff --git a/rust185/patches/patch-src_tools_cargo_tests_testsuite_build.rs b/rust185/patches/patch-src_tools_cargo_tests_testsuite_build.rs
new file mode 100644
index 0000000000..faee0c00f9
--- /dev/null
+++ b/rust185/patches/patch-src_tools_cargo_tests_testsuite_build.rs
@@ -0,0 +1,39 @@
+$NetBSD: patch-src_tools_cargo_tests_testsuite_build.rs,v 1.14 2024/04/18 09:29:42 pin Exp $
+
+Don't attempt incremental operations on sparc64, ref.
+https://sources.debian.org/patches/cargo/0.29.0-1/2007_sparc64_disable_incremental_build.patch/
+
+--- src/tools/cargo/tests/testsuite/build.rs.orig	2025-01-27 23:20:59.000000000 +0000
++++ src/tools/cargo/tests/testsuite/build.rs
+@@ -41,6 +41,7 @@ i am foo
+         .run();
+ }
+ 
++#[cfg(not(target_arch = "sparc64"))]
+ #[cargo_test]
+ fn build_with_symlink_to_path_dependency_with_build_script_in_git() {
+     if !symlink_supported() {
+@@ -103,6 +104,7 @@ fn cargo_fail_with_no_stderr() {
+ 
+ /// Checks that the `CARGO_INCREMENTAL` environment variable results in
+ /// `rustc` getting `-C incremental` passed to it.
++#[cfg(not(target_arch = "sparc64"))]
+ #[cargo_test]
+ fn cargo_compile_incremental() {
+     let p = project()
+@@ -132,6 +134,7 @@ fn cargo_compile_incremental() {
+         .run();
+ }
+ 
++#[cfg(not(target_arch = "sparc64"))]
+ #[cargo_test]
+ fn incremental_profile() {
+     let p = project()
+@@ -175,6 +178,7 @@ fn incremental_profile() {
+         .run();
+ }
+ 
++#[cfg(not(target_arch = "sparc64"))]
+ #[cargo_test]
+ fn incremental_config() {
+     let p = project()
diff --git a/rust185/patches/patch-src_tools_rust-installer_install-template.sh b/rust185/patches/patch-src_tools_rust-installer_install-template.sh
new file mode 100644
index 0000000000..556cade057
--- /dev/null
+++ b/rust185/patches/patch-src_tools_rust-installer_install-template.sh
@@ -0,0 +1,179 @@
+$NetBSD: patch-src_tools_rust-installer_install-template.sh,v 1.14 2024/04/18 09:29:42 pin Exp $
+
+No logging to 'install.log'.
+Do not create 'uninstall.sh'.
+Do not make file backups (filename.old), so these will not end up in the final package.
+
+Rewrite to not use a whole lot of subprocesses just for doing
+pattern matching and substitution in the install phase using "grep"
+and "sed" when shell builtin "case" and "omit shortest match" ops
+should do just fine.
+
+--- src/tools/rust-installer/install-template.sh.orig	2023-12-21 16:55:28.000000000 +0000
++++ src/tools/rust-installer/install-template.sh
+@@ -6,20 +6,12 @@ set -u
+ init_logging() {
+     local _abs_libdir="$1"
+     local _logfile="$_abs_libdir/$TEMPLATE_REL_MANIFEST_DIR/install.log"
+-    rm -f "$_logfile"
+-    need_ok "failed to remove old installation log"
+-    touch "$_logfile"
+-    need_ok "failed to create installation log"
+     LOGFILE="$_logfile"
+ }
+ 
+ log_line() {
+     local _line="$1"
+ 
+-    if [ -n "${LOGFILE-}" -a -e "${LOGFILE-}" ]; then
+-    echo "$_line" >> "$LOGFILE"
+-    # Ignore errors, which may happen e.g. after the manifest dir is deleted
+-    fi
+ }
+ 
+ msg() {
+@@ -433,8 +425,8 @@ uninstall_components() {
+             local _directive
+             while read _directive; do
+ 
+-            local _command=`echo $_directive | cut -f1 -d:`
+-            local _file=`echo $_directive | cut -f2 -d:`
++            local _command=${_directive%%:*}
++            local _file=${_directive#*:}
+ 
+             # Sanity checks
+             if [ ! -n "$_command" ]; then critical_err "malformed installation directive"; fi
+@@ -541,8 +533,8 @@ install_components() {
+     local _directive
+     while read _directive; do
+ 
+-        local _command=`echo $_directive | cut -f1 -d:`
+-        local _file=`echo $_directive | cut -f2 -d:`
++        local _command=${_directive%%:*}
++        local _file=${_directive#*:}
+ 
+         # Sanity checks
+         if [ ! -n "$_command" ]; then critical_err "malformed installation directive"; fi
+@@ -551,36 +543,24 @@ install_components() {
+         # Decide the destination of the file
+         local _file_install_path="$_dest_prefix/$_file"
+ 
+-        if echo "$_file" | grep "^etc/" > /dev/null
+-        then
+-        local _f="$(echo "$_file" | sed 's/^etc\///')"
+-        _file_install_path="$CFG_SYSCONFDIR/$_f"
+-        fi
+-
+-        if echo "$_file" | grep "^bin/" > /dev/null
+-        then
+-        local _f="$(echo "$_file" | sed 's/^bin\///')"
+-        _file_install_path="$CFG_BINDIR/$_f"
+-        fi
+-
+-        if echo "$_file" | grep "^lib/" > /dev/null
+-        then
+-        local _f="$(echo "$_file" | sed 's/^lib\///')"
+-        _file_install_path="$CFG_LIBDIR/$_f"
+-        fi
+-
+-        if echo "$_file" | grep "^share" > /dev/null
+-        then
+-        local _f="$(echo "$_file" | sed 's/^share\///')"
+-        _file_install_path="$CFG_DATADIR/$_f"
+-        fi
+-
+-        if echo "$_file" | grep "^share/man/" > /dev/null
+-        then
+-        local _f="$(echo "$_file" | sed 's/^share\/man\///')"
+-        _file_install_path="$CFG_MANDIR/$_f"
+-        fi
+-
++        case "$_file" in
++            etc/*)
++                local _f=${_file#"etc/"}
++                _file_install_path="$CFG_DESTDIR_PREFIX/share/doc/cargo/$_f"
++                ;;
++            bin/*)
++                local _f=${_file#"bin/"}
++                _file_install_path="$CFG_BINDIR/$_f"
++                ;;
++            lib/*)
++                local _f=${_file#"lib/"}
++                _file_install_path="$CFG_LIBDIR/$_f"
++                ;;
++            share/man/*)
++                local _f=${_file#"share/man/"}
++                _file_install_path="$CFG_MANDIR/$_f"
++                ;;
++            share/doc/*)
+             # HACK: Try to support overriding --docdir.  Paths with the form
+             # "share/doc/$product/" can be redirected to a single --docdir
+             # path. If the following detects that --docdir has been specified
+@@ -591,14 +571,17 @@ install_components() {
+             # contents of those directories are _not_ disjoint. Since this feature
+             # is almost entirely to support 'make install' anyway I don't expect
+             # this problem to be a big deal in practice.
+-            if [ "$CFG_DOCDIR" != "<default>" ]
+-            then
+-            if echo "$_file" | grep "^share/doc/" > /dev/null
+-            then
+-            local _f="$(echo "$_file" | sed 's/^share\/doc\/[^/]*\///')"
+-            _file_install_path="$CFG_DOCDIR/$_f"
+-            fi
+-            fi
++                if [ "$CFG_DOCDIR" != "<default>" ]; then
++                    local _f=${_file#"share/doc/"*/}
++                    _file_install_path="$CFG_DOCDIR/$_f"
++                fi
++                ;;
++            share/*)
++                local _f=${_file#"share/"}
++                _file_install_path="$CFG_DATADIR/$_f"
++                ;;
++        esac
++
+ 
+         # Make sure there's a directory for it
+         make_dir_recursive "$(dirname "$_file_install_path")"
+@@ -615,16 +598,16 @@ install_components() {
+ 
+             verbose_msg "copying file $_file_install_path"
+ 
+-            maybe_backup_path "$_file_install_path"
+-
+-            if echo "$_file" | grep "^bin/" > /dev/null || test -x "$_src_dir/$_component/$_file"
+-            then
+-            run cp "$_src_dir/$_component/$_file" "$_file_install_path"
+-            run chmod 755 "$_file_install_path"
+-            else
++            local mode=644
++            if test -x "$_src_dir/$_component/$_file"; then
++                mode=755
++            fi
++            case "$_file" in
++                bin/*) mode=755
++                       ;;
++            esac
+             run cp "$_src_dir/$_component/$_file" "$_file_install_path"
+-            run chmod 644 "$_file_install_path"
+-            fi
++            run chmod $mode "$_file_install_path"
+             critical_need_ok "file creation failed"
+ 
+             # Update the manifest
+@@ -637,7 +620,6 @@ install_components() {
+ 
+             verbose_msg "copying directory $_file_install_path"
+ 
+-            maybe_backup_path "$_file_install_path"
+ 
+             run cp -R "$_src_dir/$_component/$_file" "$_file_install_path"
+             critical_need_ok "failed to copy directory"
+@@ -986,7 +968,6 @@ write_to_file "$TEMPLATE_RUST_INSTALLER_
+ critical_need_ok "failed to write installer version"
+ 
+ # Install the uninstaller
+-install_uninstaller "$src_dir" "$src_basename" "$abs_libdir"
+ 
+ # Install each component
+ install_components "$src_dir" "$abs_libdir" "$dest_prefix" "$components"
diff --git a/rust185/patches/patch-tests_assembly_targets_targets-elf.rs b/rust185/patches/patch-tests_assembly_targets_targets-elf.rs
new file mode 100644
index 0000000000..8a2594e503
--- /dev/null
+++ b/rust185/patches/patch-tests_assembly_targets_targets-elf.rs
@@ -0,0 +1,16 @@
+$NetBSD$
+
+Fix test suite.
+
+--- tests/assembly/targets/targets-elf.rs.orig	2025-02-04 16:02:52.680691048 +0000
++++ tests/assembly/targets/targets-elf.rs
+@@ -276,6 +276,9 @@
+ //@ revisions: mips64el_unknown_linux_muslabi64
+ //@ [mips64el_unknown_linux_muslabi64] compile-flags: --target mips64el-unknown-linux-muslabi64
+ //@ [mips64el_unknown_linux_muslabi64] needs-llvm-components: mips
++//@ revisions: mips64el_unknown_netbsd
++//@ [mips64el_unknown_netbsd] compile-flags: --target mips64el_unknown_netbsd-unknown-linux-muslabi64
++//@ [mips64el_unknown_netbsd] needs-llvm-components: mips
+ //@ revisions: mips_unknown_linux_gnu
+ //@ [mips_unknown_linux_gnu] compile-flags: --target mips-unknown-linux-gnu
+ //@ [mips_unknown_linux_gnu] needs-llvm-components: mips
diff --git a/rust185/patches/patch-tools_rust-analyzer_lib_line-index-src_lib.rs b/rust185/patches/patch-tools_rust-analyzer_lib_line-index-src_lib.rs
new file mode 100644
index 0000000000..8b4f9fe0d2
--- /dev/null
+++ b/rust185/patches/patch-tools_rust-analyzer_lib_line-index-src_lib.rs
@@ -0,0 +1,47 @@
+$NetBSD$
+
+Try to avoid using neon for big-endian aarch64.
+Ref. https://github.com/rust-lang/rust/issues/129819
+
+--- src/tools/rust-analyzer/lib/line-index/src/lib.rs.orig	2024-09-01 14:12:57.016998002 +0000
++++ src/tools/rust-analyzer/lib/line-index/src/lib.rs
+@@ -227,7 +227,7 @@ fn analyze_source_file_dispatch(
+     }
+ }
+ 
+-#[cfg(target_arch = "aarch64")]
++#[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+ fn analyze_source_file_dispatch(
+     src: &str,
+     lines: &mut Vec<TextSize>,
+@@ -339,7 +339,7 @@ unsafe fn analyze_source_file_sse2(
+ }
+ 
+ #[target_feature(enable = "neon")]
+-#[cfg(target_arch = "aarch64")]
++#[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+ #[inline]
+ // See https://community.arm.com/arm-community-blogs/b/infrastructure-solutions-blog/posts/porting-x86-vector-bitmask-optimizations-to-arm-neon
+ //
+@@ -354,7 +354,7 @@ unsafe fn move_mask(v: std::arch::aarch6
+ }
+ 
+ #[target_feature(enable = "neon")]
+-#[cfg(target_arch = "aarch64")]
++#[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+ unsafe fn analyze_source_file_neon(
+     src: &str,
+     lines: &mut Vec<TextSize>,
+@@ -433,7 +433,11 @@ unsafe fn analyze_source_file_neon(
+     }
+ }
+ 
+-#[cfg(not(any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64")))]
++#[cfg(not(any(
++    target_arch = "x86",
++    target_arch = "x86_64",
++    all(target_arch = "aarch64", target_endian = "little")
++)))]
+ // The target (or compiler version) does not support SSE2 ...
+ fn analyze_source_file_dispatch(
+     src: &str,
diff --git a/rust185/patches/patch-vendor_bytecount-0.6.8_src_lib.rs b/rust185/patches/patch-vendor_bytecount-0.6.8_src_lib.rs
new file mode 100644
index 0000000000..d587a1a864
--- /dev/null
+++ b/rust185/patches/patch-vendor_bytecount-0.6.8_src_lib.rs
@@ -0,0 +1,45 @@
+$NetBSD$
+
+Avoid using neon on big-endian aarch64.
+Ref. https://github.com/rust-lang/rust/issues/129819
+
+--- vendor/bytecount-0.6.8/src/lib.rs.orig	2024-09-01 16:29:37.478735730 +0000
++++ vendor/bytecount-0.6.8/src/lib.rs
+@@ -50,7 +50,10 @@ mod integer_simd;
+         feature = "runtime-dispatch-simd",
+         any(target_arch = "x86", target_arch = "x86_64")
+     ),
+-    target_arch = "aarch64",
++    all(
++        target_arch = "aarch64",
++        target_endian = "little"
++    ),
+     target_arch = "wasm32",
+     feature = "generic-simd"
+ ))]
+@@ -93,7 +96,11 @@ pub fn count(haystack: &[u8], needle: u8
+                 }
+             }
+         }
+-        #[cfg(all(target_arch = "aarch64", not(feature = "generic_simd")))]
++        #[cfg(all(
++            target_arch = "aarch64",
++            target_endian = "little",
++            not(feature = "generic_simd")
++        ))]
+         {
+             unsafe {
+                 return simd::aarch64::chunk_count(haystack, needle);
+@@ -155,7 +162,11 @@ pub fn num_chars(utf8_chars: &[u8]) -> u
+                 }
+             }
+         }
+-        #[cfg(all(target_arch = "aarch64", not(feature = "generic_simd")))]
++        #[cfg(all(
++            target_arch = "aarch64",
++            target_endian = "little",
++            not(feature = "generic_simd")
++        ))]
+         {
+             unsafe {
+                 return simd::aarch64::chunk_num_chars(utf8_chars);
diff --git a/rust185/patches/patch-vendor_crossbeam-utils-0.8.18_no__atomic.rs b/rust185/patches/patch-vendor_crossbeam-utils-0.8.18_no__atomic.rs
new file mode 100644
index 0000000000..8a7b3793fa
--- /dev/null
+++ b/rust185/patches/patch-vendor_crossbeam-utils-0.8.18_no__atomic.rs
@@ -0,0 +1,14 @@
+$NetBSD$
+
+Add NetBSD/mipsel to non-atomic targets.
+
+--- vendor/crossbeam-utils-0.8.18/no_atomic.rs.orig	2024-05-03 22:53:42.558166596 +0000
++++ vendor/crossbeam-utils-0.8.18/no_atomic.rs
+@@ -5,6 +5,7 @@ const NO_ATOMIC: &[&str] = &[
+     "bpfeb-unknown-none",
+     "bpfel-unknown-none",
+     "mipsel-sony-psx",
++    "mipsel-unknown-netbsd",
+     "msp430-none-elf",
+     "riscv32i-unknown-none-elf",
+     "riscv32im-unknown-none-elf",
diff --git a/rust185/patches/patch-vendor_libc-0.2.155_src_unix_bsd_netbsdlike_netbsd_mod.rs b/rust185/patches/patch-vendor_libc-0.2.155_src_unix_bsd_netbsdlike_netbsd_mod.rs
new file mode 100644
index 0000000000..1b6c7088be
--- /dev/null
+++ b/rust185/patches/patch-vendor_libc-0.2.155_src_unix_bsd_netbsdlike_netbsd_mod.rs
@@ -0,0 +1,15 @@
+$NetBSD$
+
+Apply https://github.com/rust-lang/libc/pull/4265/files
+to fix getmntinfo() from rust.
+
+--- vendor/libc-0.2.155/src/unix/bsd/netbsdlike/netbsd/mod.rs.orig	2025-02-14 14:04:45.438043897 +0000
++++ vendor/libc-0.2.155/src/unix/bsd/netbsdlike/netbsd/mod.rs
+@@ -3142,6 +3142,7 @@ cfg_if! {
+     if #[cfg(libc_union)] {
+         extern {
+             // these functions use statvfs:
++            #[link_name = "__getmntinfo13"]
+             pub fn getmntinfo(mntbufp: *mut *mut ::statvfs, flags: ::c_int) -> ::c_int;
+             pub fn getvfsstat(buf: *mut statvfs, bufsize: ::size_t, flags: ::c_int) -> ::c_int;
+         }
diff --git a/rust185/patches/patch-vendor_libc-0.2.155_src_unix_solarish_mod.rs b/rust185/patches/patch-vendor_libc-0.2.155_src_unix_solarish_mod.rs
new file mode 100644
index 0000000000..ee6548b217
--- /dev/null
+++ b/rust185/patches/patch-vendor_libc-0.2.155_src_unix_solarish_mod.rs
@@ -0,0 +1,15 @@
+$NetBSD$
+
+Fix xattr build.
+
+--- vendor/libc-0.2.155/src/unix/solarish/mod.rs.orig	2024-08-29 18:03:17.866520790 +0000
++++ vendor/libc-0.2.155/src/unix/solarish/mod.rs
+@@ -1524,6 +1524,8 @@ pub const EOWNERDEAD: ::c_int = 58;
+ pub const ENOTRECOVERABLE: ::c_int = 59;
+ pub const ENOSTR: ::c_int = 60;
+ pub const ENODATA: ::c_int = 61;
++// This is not supported but is required for xattr
++pub const ENOATTR: ::c_int = ::ENODATA;
+ pub const ETIME: ::c_int = 62;
+ pub const ENOSR: ::c_int = 63;
+ pub const ENONET: ::c_int = 64;
diff --git a/rust185/patches/patch-vendor_libc-0.2.158_src_unix_bsd_netbsdlike_netbsd_mod.rs b/rust185/patches/patch-vendor_libc-0.2.158_src_unix_bsd_netbsdlike_netbsd_mod.rs
new file mode 100644
index 0000000000..ae1c37f0d1
--- /dev/null
+++ b/rust185/patches/patch-vendor_libc-0.2.158_src_unix_bsd_netbsdlike_netbsd_mod.rs
@@ -0,0 +1,15 @@
+$NetBSD$
+
+Apply https://github.com/rust-lang/libc/pull/4265/files
+to fix getmntinfo() from rust.
+
+--- vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/mod.rs.orig	2025-02-14 14:04:45.438043897 +0000
++++ vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/mod.rs
+@@ -3142,6 +3142,7 @@ cfg_if! {
+     if #[cfg(libc_union)] {
+         extern {
+             // these functions use statvfs:
++            #[link_name = "__getmntinfo13"]
+             pub fn getmntinfo(mntbufp: *mut *mut ::statvfs, flags: ::c_int) -> ::c_int;
+             pub fn getvfsstat(buf: *mut statvfs, bufsize: ::size_t, flags: ::c_int) -> ::c_int;
+         }
diff --git a/rust185/patches/patch-vendor_libc-0.2.158_src_unix_solarish_mod.rs b/rust185/patches/patch-vendor_libc-0.2.158_src_unix_solarish_mod.rs
new file mode 100644
index 0000000000..16e07b1b96
--- /dev/null
+++ b/rust185/patches/patch-vendor_libc-0.2.158_src_unix_solarish_mod.rs
@@ -0,0 +1,15 @@
+$NetBSD$
+
+Fix xattr build.
+
+--- vendor/libc-0.2.158/src/unix/solarish/mod.rs.orig	2024-08-29 18:03:17.866520790 +0000
++++ vendor/libc-0.2.158/src/unix/solarish/mod.rs
+@@ -1524,6 +1524,8 @@ pub const EOWNERDEAD: ::c_int = 58;
+ pub const ENOTRECOVERABLE: ::c_int = 59;
+ pub const ENOSTR: ::c_int = 60;
+ pub const ENODATA: ::c_int = 61;
++// This is not supported but is required for xattr
++pub const ENOATTR: ::c_int = ::ENODATA;
+ pub const ETIME: ::c_int = 62;
+ pub const ENOSR: ::c_int = 63;
+ pub const ENONET: ::c_int = 64;
diff --git a/rust185/patches/patch-vendor_libc-0.2.167_src_unix_bsd_netbsdlike_netbsd_mod.rs b/rust185/patches/patch-vendor_libc-0.2.167_src_unix_bsd_netbsdlike_netbsd_mod.rs
new file mode 100644
index 0000000000..ea3b603db6
--- /dev/null
+++ b/rust185/patches/patch-vendor_libc-0.2.167_src_unix_bsd_netbsdlike_netbsd_mod.rs
@@ -0,0 +1,15 @@
+$NetBSD$
+
+Apply https://github.com/rust-lang/libc/pull/4265/files
+to fix getmntinfo() from rust.
+
+--- vendor/libc-0.2.167/src/unix/bsd/netbsdlike/netbsd/mod.rs.orig	2025-02-14 14:04:45.438043897 +0000
++++ vendor/libc-0.2.167/src/unix/bsd/netbsdlike/netbsd/mod.rs
+@@ -2872,6 +2872,7 @@ extern "C" {
+         hint: *const c_void,
+     ) -> c_int;
+ 
++    #[link_name = "__getmntinfo13"]
+     pub fn getmntinfo(mntbufp: *mut *mut crate::statvfs, flags: c_int) -> c_int;
+     pub fn getvfsstat(buf: *mut statvfs, bufsize: size_t, flags: c_int) -> c_int;
+ }
diff --git a/rust185/patches/patch-vendor_libc-0.2.167_src_unix_solarish_mod.rs b/rust185/patches/patch-vendor_libc-0.2.167_src_unix_solarish_mod.rs
new file mode 100644
index 0000000000..f3c8e1c437
--- /dev/null
+++ b/rust185/patches/patch-vendor_libc-0.2.167_src_unix_solarish_mod.rs
@@ -0,0 +1,15 @@
+$NetBSD$
+
+Fix xattr build.
+
+--- vendor/libc-0.2.167/src/unix/solarish/mod.rs.orig	2024-08-29 18:03:17.866520790 +0000
++++ vendor/libc-0.2.167/src/unix/solarish/mod.rs
+@@ -1441,6 +1441,8 @@ pub const EOWNERDEAD: c_int = 58;
+ pub const ENOTRECOVERABLE: c_int = 59;
+ pub const ENOSTR: c_int = 60;
+ pub const ENODATA: c_int = 61;
++// This is not supported but is required for xattr
++pub const ENOATTR: ::c_int = ::ENODATA;
+ pub const ETIME: c_int = 62;
+ pub const ENOSR: c_int = 63;
+ pub const ENONET: c_int = 64;
diff --git a/rust185/patches/patch-vendor_libc-0.2.169_src_unix_bsd_netbsdlike_netbsd_mod.rs b/rust185/patches/patch-vendor_libc-0.2.169_src_unix_bsd_netbsdlike_netbsd_mod.rs
new file mode 100644
index 0000000000..67b812ae9b
--- /dev/null
+++ b/rust185/patches/patch-vendor_libc-0.2.169_src_unix_bsd_netbsdlike_netbsd_mod.rs
@@ -0,0 +1,15 @@
+$NetBSD$
+
+Apply https://github.com/rust-lang/libc/pull/4265/files
+to fix getmntinfo() from rust.
+
+--- vendor/libc-0.2.169/src/unix/bsd/netbsdlike/netbsd/mod.rs.orig	2025-02-14 14:04:45.438043897 +0000
++++ vendor/libc-0.2.169/src/unix/bsd/netbsdlike/netbsd/mod.rs
+@@ -2850,6 +2850,7 @@ extern "C" {
+         hint: *const c_void,
+     ) -> c_int;
+ 
++    #[link_name = "__getmntinfo13"]
+     pub fn getmntinfo(mntbufp: *mut *mut crate::statvfs, flags: c_int) -> c_int;
+     pub fn getvfsstat(buf: *mut statvfs, bufsize: size_t, flags: c_int) -> c_int;
+ }
diff --git a/rust185/patches/patch-vendor_libc-0.2.169_src_unix_solarish_mod.rs b/rust185/patches/patch-vendor_libc-0.2.169_src_unix_solarish_mod.rs
new file mode 100644
index 0000000000..a1339953f1
--- /dev/null
+++ b/rust185/patches/patch-vendor_libc-0.2.169_src_unix_solarish_mod.rs
@@ -0,0 +1,15 @@
+$NetBSD$
+
+Fix xattr build.
+
+--- vendor/libc-0.2.169/src/unix/solarish/mod.rs.orig	2024-08-29 18:03:17.866520790 +0000
++++ vendor/libc-0.2.169/src/unix/solarish/mod.rs
+@@ -1421,6 +1421,8 @@ pub const EOWNERDEAD: c_int = 58;
+ pub const ENOTRECOVERABLE: c_int = 59;
+ pub const ENOSTR: c_int = 60;
+ pub const ENODATA: c_int = 61;
++// This is not supported but is required for xattr
++pub const ENOATTR: ::c_int = ::ENODATA;
+ pub const ETIME: c_int = 62;
+ pub const ENOSR: c_int = 63;
+ pub const ENONET: c_int = 64;
diff --git a/rust185/patches/patch-vendor_line-index-0.1.2_src_lib.rs b/rust185/patches/patch-vendor_line-index-0.1.2_src_lib.rs
new file mode 100644
index 0000000000..4d14411866
--- /dev/null
+++ b/rust185/patches/patch-vendor_line-index-0.1.2_src_lib.rs
@@ -0,0 +1,42 @@
+$NetBSD$
+
+Do not attempt use of neon extension in big-endian mode.
+
+--- vendor/line-index-0.1.2/src/lib.rs.orig	2025-02-03 07:59:39.771200202 +0000
++++ vendor/line-index-0.1.2/src/lib.rs
+@@ -235,7 +235,7 @@ fn analyze_source_file_dispatch(
+     }
+ }
+ 
+-#[cfg(target_arch = "aarch64")]
++#[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+ fn analyze_source_file_dispatch(
+     src: &str,
+     lines: &mut Vec<TextSize>,
+@@ -347,7 +347,7 @@ unsafe fn analyze_source_file_sse2(
+ }
+ 
+ #[target_feature(enable = "neon")]
+-#[cfg(target_arch = "aarch64")]
++#[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+ #[inline]
+ // See https://community.arm.com/arm-community-blogs/b/infrastructure-solutions-blog/posts/porting-x86-vector-bitmask-optimizations-to-arm-neon
+ //
+@@ -362,7 +362,7 @@ unsafe fn move_mask(v: std::arch::aarch6
+ }
+ 
+ #[target_feature(enable = "neon")]
+-#[cfg(target_arch = "aarch64")]
++#[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+ unsafe fn analyze_source_file_neon(
+     src: &str,
+     lines: &mut Vec<TextSize>,
+@@ -441,7 +441,7 @@ unsafe fn analyze_source_file_neon(
+     }
+ }
+ 
+-#[cfg(not(any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64")))]
++#[cfg(not(any(target_arch = "x86", target_arch = "x86_64", all(target_arch = "aarch64", target_endian = "little"))))]
+ // The target (or compiler version) does not support SSE2 ...
+ fn analyze_source_file_dispatch(
+     src: &str,
diff --git a/rust185/patches/patch-vendor_lzma-sys-0.1.20_config.h b/rust185/patches/patch-vendor_lzma-sys-0.1.20_config.h
new file mode 100644
index 0000000000..6eaa429abe
--- /dev/null
+++ b/rust185/patches/patch-vendor_lzma-sys-0.1.20_config.h
@@ -0,0 +1,25 @@
+$NetBSD$
+
+clock_gettime() is available also on NetBSD.
+
+This takes care of this build error:
+
+  cargo:warning=xz-5.2/src/common/mythread.h: In function 'mythread_condtime_set':
+  cargo:warning=xz-5.2/src/common/mythread.h:312:9: error: implicit declaration of function 'gettimeofday' [-Wimplicit-function-declaration]
+  cargo:warning=  312 |         gettimeofday(&now, NULL);
+  cargo:warning=      |         ^~~~~~~~~~~~
+
+which popped up when switching powerpc to using gcc14, but strangely
+was not triggered by gcc12 or in-tree gcc.
+
+--- vendor/lzma-sys-0.1.20/config.h.orig	2025-02-11 23:15:56.129312069 +0000
++++ vendor/lzma-sys-0.1.20/config.h
+@@ -39,7 +39,7 @@
+     #define MYTHREAD_POSIX 1
+ #endif
+ 
+-#if defined(__sun)
++#if defined(__sun) || defined(__NetBSD__)
+     #define HAVE_CLOCK_GETTIME 1
+     #define HAVE_DECL_CLOCK_MONOTONIC 1
+ #endif
diff --git a/rust185/patches/patch-vendor_memchr-2.7.4_src_arch_aarch64_memchr.rs b/rust185/patches/patch-vendor_memchr-2.7.4_src_arch_aarch64_memchr.rs
new file mode 100644
index 0000000000..06fbbc1f87
--- /dev/null
+++ b/rust185/patches/patch-vendor_memchr-2.7.4_src_arch_aarch64_memchr.rs
@@ -0,0 +1,24 @@
+$NetBSD$
+
+Don't try to do neon / SIMD on big-endian aarch64.
+
+--- vendor/memchr-2.7.4/src/arch/aarch64/memchr.rs.orig	2024-09-22 14:55:32.455792108 +0000
++++ vendor/memchr-2.7.4/src/arch/aarch64/memchr.rs
+@@ -8,7 +8,7 @@ available for `aarch64` targets.)
+ 
+ macro_rules! defraw {
+     ($ty:ident, $find:ident, $start:ident, $end:ident, $($needles:ident),+) => {{
+-        #[cfg(target_feature = "neon")]
++        #[cfg(all(target_feature = "neon", target_endian = "little"))]
+         {
+             use crate::arch::aarch64::neon::memchr::$ty;
+ 
+@@ -19,7 +19,7 @@ macro_rules! defraw {
+             // enabled.
+             $ty::new_unchecked($($needles),+).$find($start, $end)
+         }
+-        #[cfg(not(target_feature = "neon"))]
++        #[cfg(not(all(target_feature = "neon", target_endian = "little")))]
+         {
+             use crate::arch::all::memchr::$ty;
+ 
diff --git a/rust185/patches/patch-vendor_memchr-2.7.4_src_arch_aarch64_mod.rs b/rust185/patches/patch-vendor_memchr-2.7.4_src_arch_aarch64_mod.rs
new file mode 100644
index 0000000000..3fa3ec8c4d
--- /dev/null
+++ b/rust185/patches/patch-vendor_memchr-2.7.4_src_arch_aarch64_mod.rs
@@ -0,0 +1,15 @@
+$NetBSD$
+
+Don't try to do neon / SIMD on big-endian aarch64.
+
+--- vendor/memchr-2.7.4/src/arch/aarch64/mod.rs.orig	2024-09-22 19:17:13.167426584 +0000
++++ vendor/memchr-2.7.4/src/arch/aarch64/mod.rs
+@@ -2,6 +2,8 @@
+ Vector algorithms for the `aarch64` target.
+ */
+ 
++#[cfg(target_endian = "little")]
+ pub mod neon;
+ 
++#[cfg(target_endian = "little")]
+ pub(crate) mod memchr;
diff --git a/rust185/patches/patch-vendor_memchr-2.7.4_src_memchr.rs b/rust185/patches/patch-vendor_memchr-2.7.4_src_memchr.rs
new file mode 100644
index 0000000000..da85596fc1
--- /dev/null
+++ b/rust185/patches/patch-vendor_memchr-2.7.4_src_memchr.rs
@@ -0,0 +1,128 @@
+$NetBSD$
+
+Don't try to do neon / SIMD on big-endian aarch64.
+
+--- vendor/memchr-2.7.4/src/memchr.rs.orig	2024-09-22 14:50:24.931022916 +0000
++++ vendor/memchr-2.7.4/src/memchr.rs
+@@ -518,14 +518,14 @@ unsafe fn memchr_raw(
+     {
+         crate::arch::wasm32::memchr::memchr_raw(needle, start, end)
+     }
+-    #[cfg(target_arch = "aarch64")]
++    #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+     {
+         crate::arch::aarch64::memchr::memchr_raw(needle, start, end)
+     }
+     #[cfg(not(any(
+         target_arch = "x86_64",
+         all(target_arch = "wasm32", target_feature = "simd128"),
+-        target_arch = "aarch64"
++        all(target_arch = "aarch64", target_endian = "little")
+     )))]
+     {
+         crate::arch::all::memchr::One::new(needle).find_raw(start, end)
+@@ -551,14 +551,14 @@ unsafe fn memrchr_raw(
+     {
+         crate::arch::wasm32::memchr::memrchr_raw(needle, start, end)
+     }
+-    #[cfg(target_arch = "aarch64")]
++    #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+     {
+         crate::arch::aarch64::memchr::memrchr_raw(needle, start, end)
+     }
+     #[cfg(not(any(
+         target_arch = "x86_64",
+         all(target_arch = "wasm32", target_feature = "simd128"),
+-        target_arch = "aarch64"
++        all(target_arch = "aarch64", target_endian = "little")
+     )))]
+     {
+         crate::arch::all::memchr::One::new(needle).rfind_raw(start, end)
+@@ -585,14 +585,14 @@ unsafe fn memchr2_raw(
+     {
+         crate::arch::wasm32::memchr::memchr2_raw(needle1, needle2, start, end)
+     }
+-    #[cfg(target_arch = "aarch64")]
++    #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+     {
+         crate::arch::aarch64::memchr::memchr2_raw(needle1, needle2, start, end)
+     }
+     #[cfg(not(any(
+         target_arch = "x86_64",
+         all(target_arch = "wasm32", target_feature = "simd128"),
+-        target_arch = "aarch64"
++        all(target_arch = "aarch64", target_endian = "little")
+     )))]
+     {
+         crate::arch::all::memchr::Two::new(needle1, needle2)
+@@ -620,7 +620,7 @@ unsafe fn memrchr2_raw(
+     {
+         crate::arch::wasm32::memchr::memrchr2_raw(needle1, needle2, start, end)
+     }
+-    #[cfg(target_arch = "aarch64")]
++    #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+     {
+         crate::arch::aarch64::memchr::memrchr2_raw(
+             needle1, needle2, start, end,
+@@ -629,7 +629,7 @@ unsafe fn memrchr2_raw(
+     #[cfg(not(any(
+         target_arch = "x86_64",
+         all(target_arch = "wasm32", target_feature = "simd128"),
+-        target_arch = "aarch64"
++        all(target_arch = "aarch64", target_endian = "little")
+     )))]
+     {
+         crate::arch::all::memchr::Two::new(needle1, needle2)
+@@ -662,7 +662,7 @@ unsafe fn memchr3_raw(
+             needle1, needle2, needle3, start, end,
+         )
+     }
+-    #[cfg(target_arch = "aarch64")]
++    #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+     {
+         crate::arch::aarch64::memchr::memchr3_raw(
+             needle1, needle2, needle3, start, end,
+@@ -671,7 +671,7 @@ unsafe fn memchr3_raw(
+     #[cfg(not(any(
+         target_arch = "x86_64",
+         all(target_arch = "wasm32", target_feature = "simd128"),
+-        target_arch = "aarch64"
++        all(target_arch = "aarch64", target_endian = "little")
+     )))]
+     {
+         crate::arch::all::memchr::Three::new(needle1, needle2, needle3)
+@@ -704,7 +704,7 @@ unsafe fn memrchr3_raw(
+             needle1, needle2, needle3, start, end,
+         )
+     }
+-    #[cfg(target_arch = "aarch64")]
++    #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+     {
+         crate::arch::aarch64::memchr::memrchr3_raw(
+             needle1, needle2, needle3, start, end,
+@@ -713,7 +713,7 @@ unsafe fn memrchr3_raw(
+     #[cfg(not(any(
+         target_arch = "x86_64",
+         all(target_arch = "wasm32", target_feature = "simd128"),
+-        target_arch = "aarch64"
++        all(target_arch = "aarch64", target_endian = "little")
+     )))]
+     {
+         crate::arch::all::memchr::Three::new(needle1, needle2, needle3)
+@@ -736,14 +736,14 @@ unsafe fn count_raw(needle: u8, start: *
+     {
+         crate::arch::wasm32::memchr::count_raw(needle, start, end)
+     }
+-    #[cfg(target_arch = "aarch64")]
++    #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+     {
+         crate::arch::aarch64::memchr::count_raw(needle, start, end)
+     }
+     #[cfg(not(any(
+         target_arch = "x86_64",
+         all(target_arch = "wasm32", target_feature = "simd128"),
+-        target_arch = "aarch64"
++        all(target_arch = "aarch64", target_endian = "little")
+     )))]
+     {
+         crate::arch::all::memchr::One::new(needle).count_raw(start, end)
diff --git a/rust185/patches/patch-vendor_memchr-2.7.4_src_memmem_searcher.rs b/rust185/patches/patch-vendor_memchr-2.7.4_src_memmem_searcher.rs
new file mode 100644
index 0000000000..743d4886ee
--- /dev/null
+++ b/rust185/patches/patch-vendor_memchr-2.7.4_src_memmem_searcher.rs
@@ -0,0 +1,78 @@
+$NetBSD$
+
+Don't try to use neon / SIMD on big-endian aarch64.
+
+--- vendor/memchr-2.7.4/src/memmem/searcher.rs.orig	2024-09-22 14:44:21.224731060 +0000
++++ vendor/memchr-2.7.4/src/memmem/searcher.rs
+@@ -3,7 +3,7 @@ use crate::arch::all::{
+     rabinkarp, twoway,
+ };
+ 
+-#[cfg(target_arch = "aarch64")]
++#[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+ use crate::arch::aarch64::neon::packedpair as neon;
+ #[cfg(all(target_arch = "wasm32", target_feature = "simd128"))]
+ use crate::arch::wasm32::simd128::packedpair as simd128;
+@@ -129,7 +129,7 @@ impl Searcher {
+                 Searcher::twoway(needle, rabinkarp, prestrat)
+             }
+         }
+-        #[cfg(target_arch = "aarch64")]
++        #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+         {
+             if let Some(pp) = neon::Finder::with_pair(needle, pair) {
+                 if do_packed_search(needle) {
+@@ -152,7 +152,7 @@ impl Searcher {
+         #[cfg(not(any(
+             all(target_arch = "x86_64", target_feature = "sse2"),
+             all(target_arch = "wasm32", target_feature = "simd128"),
+-            target_arch = "aarch64"
++            all(target_arch = "aarch64", target_endian = "little")
+         )))]
+         {
+             if prefilter.is_none() {
+@@ -253,7 +253,7 @@ union SearcherKind {
+     avx2: crate::arch::x86_64::avx2::packedpair::Finder,
+     #[cfg(all(target_arch = "wasm32", target_feature = "simd128"))]
+     simd128: crate::arch::wasm32::simd128::packedpair::Finder,
+-    #[cfg(target_arch = "aarch64")]
++    #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+     neon: crate::arch::aarch64::neon::packedpair::Finder,
+ }
+ 
+@@ -421,7 +421,7 @@ unsafe fn searcher_kind_simd128(
+ /// # Safety
+ ///
+ /// Callers must ensure that the `searcher.kind.neon` union field is set.
+-#[cfg(target_arch = "aarch64")]
++#[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+ unsafe fn searcher_kind_neon(
+     searcher: &Searcher,
+     _prestate: &mut PrefilterState,
+@@ -686,7 +686,7 @@ impl Prefilter {
+     }
+ 
+     /// Return a prefilter using a aarch64 neon vector algorithm.
+-    #[cfg(target_arch = "aarch64")]
++    #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+     #[inline]
+     fn neon(finder: neon::Finder, needle: &[u8]) -> Prefilter {
+         trace!("building aarch64 neon prefilter");
+@@ -763,7 +763,7 @@ union PrefilterKind {
+     avx2: crate::arch::x86_64::avx2::packedpair::Finder,
+     #[cfg(all(target_arch = "wasm32", target_feature = "simd128"))]
+     simd128: crate::arch::wasm32::simd128::packedpair::Finder,
+-    #[cfg(target_arch = "aarch64")]
++    #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+     neon: crate::arch::aarch64::neon::packedpair::Finder,
+ }
+ 
+@@ -852,7 +852,7 @@ unsafe fn prefilter_kind_simd128(
+ /// # Safety
+ ///
+ /// Callers must ensure that the `strat.kind.neon` union field is set.
+-#[cfg(target_arch = "aarch64")]
++#[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+ unsafe fn prefilter_kind_neon(
+     strat: &Prefilter,
+     haystack: &[u8],
diff --git a/rust185/patches/patch-vendor_memchr-2.7.4_src_vector.rs b/rust185/patches/patch-vendor_memchr-2.7.4_src_vector.rs
new file mode 100644
index 0000000000..6851a4a4fd
--- /dev/null
+++ b/rust185/patches/patch-vendor_memchr-2.7.4_src_vector.rs
@@ -0,0 +1,15 @@
+$NetBSD$
+
+Don't try to do neon / SIMD on big-endian aarch64.
+
+--- vendor/memchr-2.7.4/src/vector.rs.orig	2024-09-22 14:16:06.473207292 +0000
++++ vendor/memchr-2.7.4/src/vector.rs
+@@ -289,7 +289,7 @@ mod x86avx2 {
+     }
+ }
+ 
+-#[cfg(target_arch = "aarch64")]
++#[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+ mod aarch64neon {
+     use core::arch::aarch64::*;
+ 
diff --git a/rust185/patches/patch-vendor_openssl-src-111.28.2+1.1.1w_openssl_Configurations_10-main.conf b/rust185/patches/patch-vendor_openssl-src-111.28.2+1.1.1w_openssl_Configurations_10-main.conf
new file mode 100644
index 0000000000..d7eb270fd1
--- /dev/null
+++ b/rust185/patches/patch-vendor_openssl-src-111.28.2+1.1.1w_openssl_Configurations_10-main.conf
@@ -0,0 +1,18 @@
+$NetBSD$
+
+Replicate part of
+https://github.com/openssl/openssl/pull/15086
+
+--- vendor/openssl-src-111.28.2+1.1.1w/openssl/Configurations/10-main.conf.orig	2024-08-29 18:07:36.845484717 +0000
++++ vendor/openssl-src-111.28.2+1.1.1w/openssl/Configurations/10-main.conf
+@@ -950,6 +950,10 @@ my %targets = (
+         shared_cflag     => "-fPIC",
+         shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
+     },
++    "NetBSD-generic32" => {
++        inherit_from	 => [ "BSD-generic32" ],
++        ex_libs		 => add(threads("-latomic")),
++    },
+     "BSD-generic64" => {
+         inherit_from     => [ "BSD-generic32" ],
+         bn_ops           => "SIXTY_FOUR_BIT_LONG",
diff --git a/rust185/patches/patch-vendor_openssl-src-111.28.2+1.1.1w_src_lib.rs b/rust185/patches/patch-vendor_openssl-src-111.28.2+1.1.1w_src_lib.rs
new file mode 100644
index 0000000000..5924303d05
--- /dev/null
+++ b/rust185/patches/patch-vendor_openssl-src-111.28.2+1.1.1w_src_lib.rs
@@ -0,0 +1,62 @@
+$NetBSD$
+
+--- vendor/openssl-src-111.28.2+1.1.1w/src/lib.rs.orig	2024-08-29 18:09:29.494697634 +0000
++++ vendor/openssl-src-111.28.2+1.1.1w/src/lib.rs
+@@ -239,6 +239,8 @@ impl Build {
+             "aarch64-unknown-freebsd" => "BSD-generic64",
+             "aarch64-unknown-linux-gnu" => "linux-aarch64",
+             "aarch64-unknown-linux-musl" => "linux-aarch64",
++            "aarch64-unknown-netbsd" => "BSD-generic64",
++            "aarch64_be-unknown-netbsd" => "BSD-generic64",
+             "aarch64-pc-windows-msvc" => "VC-WIN64-ARM",
+             "arm-linux-androideabi" => "linux-armv4",
+             "armv7-linux-androideabi" => "linux-armv4",
+@@ -249,14 +251,17 @@ impl Build {
+             "armv5te-unknown-linux-gnueabi" => "linux-armv4",
+             "armv5te-unknown-linux-musleabi" => "linux-armv4",
+             "armv6-unknown-freebsd" => "BSD-generic32",
++            "armv6-unknown-netbsd-eabihf" => "BSD-generic32",
+             "armv7-unknown-freebsd" => "BSD-generic32",
+             "armv7-unknown-linux-gnueabi" => "linux-armv4",
+             "armv7-unknown-linux-musleabi" => "linux-armv4",
+             "armv7-unknown-linux-gnueabihf" => "linux-armv4",
+             "armv7-unknown-linux-musleabihf" => "linux-armv4",
++            "armv7-unknown-netbsd-eabihf" => "BSD-generic32",
+             "asmjs-unknown-emscripten" => "gcc",
+             "i586-unknown-linux-gnu" => "linux-elf",
+             "i586-unknown-linux-musl" => "linux-elf",
++            "i586-unknown-netbsd" => "BSD-x86-elf",
+             "i686-apple-darwin" => "darwin-i386-cc",
+             "i686-linux-android" => "linux-elf",
+             "i686-pc-windows-gnu" => "mingw",
+@@ -264,6 +269,7 @@ impl Build {
+             "i686-unknown-freebsd" => "BSD-x86-elf",
+             "i686-unknown-linux-gnu" => "linux-elf",
+             "i686-unknown-linux-musl" => "linux-elf",
++            "i686-unknown-netbsd" => "BSD-x86-elf",
+             "loongarch64-unknown-linux-gnu" => "linux-generic64",
+             "loongarch64-unknown-linux-musl" => "linux-generic64",
+             "mips-unknown-linux-gnu" => "linux-mips32",
+@@ -274,9 +280,11 @@ impl Build {
+             "mips64el-unknown-linux-muslabi64" => "linux64-mips64",
+             "mipsel-unknown-linux-gnu" => "linux-mips32",
+             "mipsel-unknown-linux-musl" => "linux-mips32",
++            "mipsel-unknown-netbsd" => "NetBSD-generic32",
+             "powerpc-unknown-freebsd" => "BSD-generic32",
+             "powerpc-unknown-linux-gnu" => "linux-ppc",
+             "powerpc-unknown-linux-gnuspe" => "linux-ppc",
++            "powerpc-unknown-netbsd" => "BSD-generic32",
+             "powerpc64-unknown-freebsd" => "BSD-generic64",
+             "powerpc64-unknown-linux-gnu" => "linux-ppc64",
+             "powerpc64-unknown-linux-musl" => "linux-ppc64",
+@@ -284,8 +292,10 @@ impl Build {
+             "powerpc64le-unknown-linux-gnu" => "linux-ppc64le",
+             "powerpc64le-unknown-linux-musl" => "linux-ppc64le",
+             "riscv64gc-unknown-linux-gnu" => "linux-generic64",
++            "riscv64gc-unknown-netbsd" => "BSD-generic64",
+             "s390x-unknown-linux-gnu" => "linux64-s390x",
+             "s390x-unknown-linux-musl" => "linux64-s390x",
++            "sparc64-unknown-netbsd" => "BSD-generic64",
+             "x86_64-apple-darwin" => "darwin64-x86_64-cc",
+             "x86_64-linux-android" => "linux-x86_64",
+             "x86_64-pc-windows-gnu" => "mingw64",
diff --git a/rust185/patches/patch-vendor_openssl-sys-0.9.102_build_find__normal.rs b/rust185/patches/patch-vendor_openssl-sys-0.9.102_build_find__normal.rs
new file mode 100644
index 0000000000..80d98e247b
--- /dev/null
+++ b/rust185/patches/patch-vendor_openssl-sys-0.9.102_build_find__normal.rs
@@ -0,0 +1,30 @@
+$NetBSD$
+
+Add hack for Darwin when homebrew is installed.
+
+--- vendor/openssl-sys-0.9.102/build/find_normal.rs.orig	2006-07-24 01:21:28.000000000 +0000
++++ vendor/openssl-sys-0.9.102/build/find_normal.rs
+@@ -72,23 +72,6 @@ fn resolve_with_wellknown_location(dir: 
+ fn find_openssl_dir(target: &str) -> OsString {
+     let host = env::var("HOST").unwrap();
+ 
+-    if host == target && target.ends_with("-apple-darwin") {
+-        let homebrew_dir = match target {
+-            "aarch64-apple-darwin" => "/opt/homebrew",
+-            _ => "/usr/local",
+-        };
+-
+-        if let Some(dir) = resolve_with_wellknown_homebrew_location(homebrew_dir) {
+-            return dir.into();
+-        } else if let Some(dir) = resolve_with_wellknown_location("/opt/pkg") {
+-            // pkgsrc
+-            return dir.into();
+-        } else if let Some(dir) = resolve_with_wellknown_location("/opt/local") {
+-            // MacPorts
+-            return dir.into();
+-        }
+-    }
+-
+     try_pkg_config();
+     try_vcpkg();
+ 
diff --git a/rust185/patches/patch-vendor_openssl-sys-0.9.102_build_main.rs b/rust185/patches/patch-vendor_openssl-sys-0.9.102_build_main.rs
new file mode 100644
index 0000000000..a15188f472
--- /dev/null
+++ b/rust185/patches/patch-vendor_openssl-sys-0.9.102_build_main.rs
@@ -0,0 +1,23 @@
+$NetBSD$
+
+Patterned after Linux and Android, on 32-bit NetBSD ports
+include -latomic.  Parts of this inspired by
+https://github.com/sfackler/rust-openssl/commit/a0a1d1d29263abb7c47fc2e58cef8dab13762a45
+
+--- vendor/openssl-sys-0.9.102/build/main.rs.orig	2006-07-24 01:21:28.000000000 +0000
++++ vendor/openssl-sys-0.9.102/build/main.rs
+@@ -142,6 +142,14 @@ fn main() {
+         println!("cargo:rustc-link-lib=atomic");
+     }
+ 
++    // Patterned of the above, make sure we include -latomic
++    // on ilp32 ports (yes, this only tests the "p32" part).
++    if env::var("CARGO_CFG_TARGET_OS").unwrap() == "netbsd"
++       && env::var("CARGO_CFG_TARGET_POINTER_WIDTH").unwrap() == "32"
++    {
++       println!("cargo:rustc-link-lib=atomic");
++    }
++
+     if kind == "static" && target.contains("windows") {
+         println!("cargo:rustc-link-lib=dylib=gdi32");
+         println!("cargo:rustc-link-lib=dylib=user32");
diff --git a/rust185/patches/patch-vendor_openssl-sys-0.9.92_build_find__normal.rs b/rust185/patches/patch-vendor_openssl-sys-0.9.92_build_find__normal.rs
new file mode 100644
index 0000000000..99108643b7
--- /dev/null
+++ b/rust185/patches/patch-vendor_openssl-sys-0.9.92_build_find__normal.rs
@@ -0,0 +1,30 @@
+$NetBSD$
+
+Add hack for Darwin when homebrew is installed.
+
+--- vendor/openssl-sys-0.9.92/build/find_normal.rs.orig	2006-07-24 01:21:28.000000000 +0000
++++ vendor/openssl-sys-0.9.92/build/find_normal.rs
+@@ -72,23 +72,6 @@ fn resolve_with_wellknown_location(dir: 
+ fn find_openssl_dir(target: &str) -> OsString {
+     let host = env::var("HOST").unwrap();
+ 
+-    if host == target && target.ends_with("-apple-darwin") {
+-        let homebrew_dir = match target {
+-            "aarch64-apple-darwin" => "/opt/homebrew",
+-            _ => "/usr/local",
+-        };
+-
+-        if let Some(dir) = resolve_with_wellknown_homebrew_location(homebrew_dir) {
+-            return dir.into();
+-        } else if let Some(dir) = resolve_with_wellknown_location("/opt/pkg") {
+-            // pkgsrc
+-            return dir.into();
+-        } else if let Some(dir) = resolve_with_wellknown_location("/opt/local") {
+-            // MacPorts
+-            return dir.into();
+-        }
+-    }
+-
+     try_pkg_config();
+     try_vcpkg();
+ 
diff --git a/rust185/patches/patch-vendor_openssl-sys-0.9.92_build_main.rs b/rust185/patches/patch-vendor_openssl-sys-0.9.92_build_main.rs
new file mode 100644
index 0000000000..0a70272949
--- /dev/null
+++ b/rust185/patches/patch-vendor_openssl-sys-0.9.92_build_main.rs
@@ -0,0 +1,23 @@
+$NetBSD$
+
+Patterned after Linux and Android, on 32-bit NetBSD ports
+include -latomic.  Parts of this inspired by
+https://github.com/sfackler/rust-openssl/commit/a0a1d1d29263abb7c47fc2e58cef8dab13762a45
+
+--- vendor/openssl-sys-0.9.92/build/main.rs.orig	2006-07-24 01:21:28.000000000 +0000
++++ vendor/openssl-sys-0.9.92/build/main.rs
+@@ -115,6 +115,14 @@ fn main() {
+         println!("cargo:rustc-link-lib={}={}", kind, lib);
+     }
+ 
++    // Patterned of the above, make sure we include -latomic
++    // on ilp32 ports (yes, this only tests the "p32" part).
++    if env::var("CARGO_CFG_TARGET_OS").unwrap() == "netbsd"
++       && env::var("CARGO_CFG_TARGET_POINTER_WIDTH").unwrap() == "32"
++    {
++       println!("cargo:rustc-link-lib=atomic");
++    }
++
+     if kind == "static" && target.contains("windows") {
+         println!("cargo:rustc-link-lib=dylib=gdi32");
+         println!("cargo:rustc-link-lib=dylib=user32");
diff --git a/rust185/patches/patch-vendor_rustc-ap-rustc__target_src_spec_aarch64__be__unknown__netbsd.rs b/rust185/patches/patch-vendor_rustc-ap-rustc__target_src_spec_aarch64__be__unknown__netbsd.rs
new file mode 100644
index 0000000000..6c90dec84c
--- /dev/null
+++ b/rust185/patches/patch-vendor_rustc-ap-rustc__target_src_spec_aarch64__be__unknown__netbsd.rs
@@ -0,0 +1,27 @@
+$NetBSD: patch-vendor_rustc-ap-rustc__target_src_spec_aarch64__be__unknown__netbsd.rs,v 1.9 2024/04/18 09:29:43 pin Exp $
+
+Add aarch64_be NetBSD target.
+
+--- /dev/null	2021-04-26 00:02:43.147970692 +0200
++++ vendor/rustc-ap-rustc_target/src/spec/aarch64_be_unknown_netbsd.rs	2021-04-26 00:07:44.657579025 +0200
+@@ -0,0 +1,20 @@
++use crate::abi::Endian;
++use crate::spec::{Target, TargetOptions};
++
++pub fn target() -> Target {
++    let mut base = super::netbsd_base::opts();
++    base.max_atomic_width = Some(128);
++    base.unsupported_abis = super::arm_base::unsupported_abis();
++
++    Target {
++        llvm_target: "aarch64_be-unknown-netbsd".to_string(),
++        pointer_width: 64,
++        data_layout: "E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128".to_string(),
++        arch: "aarch64".to_string(),
++        options: TargetOptions {
++            mcount: "__mcount".to_string(),
++            endian: Endian::Big,
++            ..base
++        },
++    }
++}
diff --git a/rust185/patches/patch-vendor_zerocopy-0.7.32_src_lib.rs b/rust185/patches/patch-vendor_zerocopy-0.7.32_src_lib.rs
new file mode 100644
index 0000000000..35ab52f6cb
--- /dev/null
+++ b/rust185/patches/patch-vendor_zerocopy-0.7.32_src_lib.rs
@@ -0,0 +1,25 @@
+$NetBSD$
+
+Attempt at skipping SIMD / neon on big-endian aarch64,
+ref. https://github.com/rust-lang/rust/issues/129819.
+
+--- vendor/zerocopy-0.7.32/src/lib.rs.orig	2024-09-01 12:56:49.837065351 +0000
++++ vendor/zerocopy-0.7.32/src/lib.rs
+@@ -3715,7 +3715,7 @@ mod simd {
+             powerpc64, powerpc64, vector_bool_long, vector_double, vector_signed_long, vector_unsigned_long
+         );
+         simd_arch_mod!(
+-            #[cfg(target_arch = "aarch64")]
++            #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+             aarch64, aarch64, float32x2_t, float32x4_t, float64x1_t, float64x2_t, int8x8_t, int8x8x2_t,
+             int8x8x3_t, int8x8x4_t, int8x16_t, int8x16x2_t, int8x16x3_t, int8x16x4_t, int16x4_t,
+             int16x8_t, int32x2_t, int32x4_t, int64x1_t, int64x2_t, poly8x8_t, poly8x8x2_t, poly8x8x3_t,
+@@ -7998,7 +7998,7 @@ mod tests {
+                 vector_signed_long,
+                 vector_unsigned_long
+             );
+-            #[cfg(target_arch = "aarch64")]
++            #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+             #[rustfmt::skip]
+             test_simd_arch_mod!(
+                 aarch64, float32x2_t, float32x4_t, float64x1_t, float64x2_t, int8x8_t, int8x8x2_t,
diff --git a/rust185/patches/patch-vendor_zerocopy-0.7.35_src_lib.rs b/rust185/patches/patch-vendor_zerocopy-0.7.35_src_lib.rs
new file mode 100644
index 0000000000..d71d7d0924
--- /dev/null
+++ b/rust185/patches/patch-vendor_zerocopy-0.7.35_src_lib.rs
@@ -0,0 +1,25 @@
+$NetBSD$
+
+Attempt at skipping SIMD / neon on big-endian aarch64,
+ref. https://github.com/rust-lang/rust/issues/129819.
+
+--- vendor/zerocopy-0.7.35/src/lib.rs.orig	2024-08-31 21:15:29.602997509 +0000
++++ vendor/zerocopy-0.7.35/src/lib.rs
+@@ -3727,7 +3727,7 @@ mod simd {
+             powerpc64, powerpc64, vector_bool_long, vector_double, vector_signed_long, vector_unsigned_long
+         );
+         simd_arch_mod!(
+-            #[cfg(target_arch = "aarch64")]
++            #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+             aarch64, aarch64, float32x2_t, float32x4_t, float64x1_t, float64x2_t, int8x8_t, int8x8x2_t,
+             int8x8x3_t, int8x8x4_t, int8x16_t, int8x16x2_t, int8x16x3_t, int8x16x4_t, int16x4_t,
+             int16x8_t, int32x2_t, int32x4_t, int64x1_t, int64x2_t, poly8x8_t, poly8x8x2_t, poly8x8x3_t,
+@@ -8020,7 +8020,7 @@ mod tests {
+                 vector_signed_long,
+                 vector_unsigned_long
+             );
+-            #[cfg(target_arch = "aarch64")]
++            #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
+             #[rustfmt::skip]
+             test_simd_arch_mod!(
+                 aarch64, float32x2_t, float32x4_t, float64x1_t, float64x2_t, int8x8_t, int8x8x2_t,
diff --git a/rust185/platform.mk b/rust185/platform.mk
new file mode 100644
index 0000000000..c6a01214d8
--- /dev/null
+++ b/rust185/platform.mk
@@ -0,0 +1,31 @@
+# $NetBSD: platform.mk,v 1.27 2024/08/01 15:24:39 tnn Exp $
+
+# This file encodes whether a given platform has support for rust.
+
+# Platforms where rust ought to work but does not require a link to an
+# open PR.
+
+.if !defined(PLATFORM_SUPPORTS_RUST)
+
+# Rust needs NetBSD>8
+.for rust_arch in aarch64 earmv7hf i386 powerpc riscv64 sparc64 x86_64
+.  for rust_os in Darwin FreeBSD Linux NetBSD SunOS
+.    if ${OPSYS} != "NetBSD" || empty(OS_VERSION:M[0-8].*)
+RUST_PLATFORMS+=	${rust_os}-*-${rust_arch}
+.    endif
+.  endfor
+.endfor
+
+.if ${MACHINE_PLATFORM:MNetBSD-*-earm*} && ${OPSYS_VERSION} < 100000
+RUST_DIR?=	../../lang/rust176
+.endif
+RUST_DIR?=	../../lang/rust
+
+.for rust_platform in ${RUST_PLATFORMS}
+.  if !empty(MACHINE_PLATFORM:M${rust_platform})
+PLATFORM_SUPPORTS_RUST=		yes
+.  endif
+.endfor
+PLATFORM_SUPPORTS_RUST?=	no
+
+.endif # !defined(PLATFORM_SUPPORTS_RUST)
diff --git a/rust185/rust.mk b/rust185/rust.mk
new file mode 100644
index 0000000000..5ecb4c2e46
--- /dev/null
+++ b/rust185/rust.mk
@@ -0,0 +1,56 @@
+# $NetBSD: rust.mk,v 1.9 2024/07/07 11:00:37 wiz Exp $
+#
+# This file determines the type of rust package to use.
+#
+# It should be included by rust-dependent packages that don't use
+# cargo.mk.
+#
+# === User-settable variables ===
+#
+# RUST_TYPE
+#	The preferred type of Rust release to use -
+#	either bootstrap-from-source or an official binary.
+#
+#	Official Rust binaries are only published for certain platforms,
+#	including Darwin, FreeBSD, Linux, and NetBSD x86_64.
+#
+#	Possible values: src bin native
+#	Default: src
+#
+# === Package-settable variables ===
+#
+# RUST_REQ
+#	The minimum version of Rust required by the package.
+#
+#	Default: 1.56.1
+#
+# RUST_RUNTIME
+#	Whether rust is a runtime dependency.
+#	Usually it is only needed to build.
+#
+#	Possible values: yes no
+#	Default: no
+
+.include "../../mk/bsd.fast.prefs.mk"
+.include "platform.mk"
+
+RUST_REQ?=	1.56.1
+RUST_RUNTIME?=	no
+
+RUST_TYPE?=	src
+
+.if ${RUST_TYPE} == "bin"
+.  if ${RUST_RUNTIME} == "no"
+BUILDLINK_DEPMETHOD.rust-bin?=		build
+.  endif
+BUILDLINK_API_DEPENDS.rust-bin+=	rust-bin>=${RUST_REQ}
+.  include "${RUST_DIR}-bin/buildlink3.mk"
+.endif
+
+.if ${RUST_TYPE} == "src"
+.  if ${RUST_RUNTIME} == "no"
+BUILDLINK_DEPMETHOD.rust?=		build
+.  endif
+BUILDLINK_API_DEPENDS.rust+=		rust>=${RUST_REQ}
+.  include "${RUST_DIR}/buildlink3.mk"
+.endif


Home | Main Index | Thread Index | Old Index