<pre style='margin:0'>
Marcus Calhoun-Lopez (MarcusCalhoun-Lopez) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/7ae4142ad07c771fb6036cd1bf5b0a94444736f2">https://github.com/macports/macports-ports/commit/7ae4142ad07c771fb6036cd1bf5b0a94444736f2</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new 7ae4142ad07 cargo_fetch PG: add functionality from caro PG
</span>7ae4142ad07 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 7ae4142ad07c771fb6036cd1bf5b0a94444736f2
</span>Author: Marcus Calhoun-Lopez <mcalhoun@macports.org>
AuthorDate: Thu Apr 6 05:05:31 2023 -0700

<span style='display:block; white-space:pre;color:#404040;'>    cargo_fetch PG: add functionality from caro PG
</span>---
 _resources/port1.0/group/cargo_fetch-1.0.tcl | 539 +++++++++++++++++----------
 1 file changed, 345 insertions(+), 194 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/_resources/port1.0/group/cargo_fetch-1.0.tcl b/_resources/port1.0/group/cargo_fetch-1.0.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 7bc1d7dbf85..94427fb2b30 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/_resources/port1.0/group/cargo_fetch-1.0.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/_resources/port1.0/group/cargo_fetch-1.0.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -37,82 +37,179 @@
</span> #    baz    author/baz  branch  abcdef12345678...commit...abcdef12345678  fedcba654321...
 #
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-PortGroup compiler_blacklist_versions 1.0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-PortGroup legacysupport 1.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+PortGroup   muniversal          1.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+PortGroup   compiler_wrapper    1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# ideally, we would like to add the openssl PG, however
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#     its use of `option_proc` makes changing the default value of `openssl.branch` difficult, and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#     it interferes with our intended use of compiler_wrapper PG
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# for now, create an option `openssl.branch` in this PG
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Cargo's interaction with OpenSSL is a bit delicate
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# see, e.g., https://trac.macports.org/ticket/65011
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# similarly for legacysupport PG
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-options cargo.bin cargo.home cargo.crates cargo.crates_github
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+options cargo.bin \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        cargo.home \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        cargo.dir \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        cargo.crates \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        cargo.offline_cmd \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        cargo.crates_github cargo.update
</span> 
 default cargo.bin           {${prefix}/bin/cargo}
 default cargo.home          {${workpath}/.home/.cargo}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+default cargo.dir           {${worksrcpath}}
</span> default cargo.crates        {}
 default cargo.crates_github {}
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# if a dependency has been patched, `--offline` might be a reasonable choice
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default     cargo.offline_cmd   {--frozen}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# some packags do not provide Cargo.lock,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# so offer the option of running cargo-update
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default     cargo.update        {no}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# use `--remap-path-prefix` to prevent build information from bing included installed binaries
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+options     rust.remap
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default     rust.remap          {${cargo.home} "" ${worksrcpath} ""}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# flags to be passed to the rust compiler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# --remap-path-prefix=... is eventually added unless rust.remap is empty
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+options     rust.flags
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default     rust.flags          {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> # As building with rust uses the same underlying compiler as used to build it
 # replicate the same compiler selection options here
<span style='display:block; white-space:pre;background:#ffe0e0;'>-compiler.cxx_standard       2017
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-compiler.blacklist-append   {macports-clang-[4-9].0}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-option_proc cargo.crates handle_cargo_crates
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc handle_cargo_crates {option action {value ""}} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {${action} eq "set"} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        foreach {cname cversion chksum} ${value} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set cratefile       ${cname}-${cversion}.crate
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # The same crate name can appear with multiple versions. Use
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # a combination of crate name and checksum as unique identifier.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # As the :disttag cannot contain dots, the version number cannot be
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # used.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            #
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # To download the crate file curl-0.4.11.crate, the URL is
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            #    https://crates.io/api/v1/crates/curl/0.4.11/download.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # Use ?dummy= to ignore ${distfile}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # see https://trac.macports.org/wiki/PortfileRecipes#fetchwithgetparams
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set cratetag        crate-${cname}-${chksum}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            distfiles-append    ${cratefile}:${cratetag}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            master_sites-append https://crates.io/api/v1/crates/${cname}/${cversion}/download?dummy=:${cratetag}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            checksums-append    ${cratefile} sha256 ${chksum}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default compiler.cxx_standard           2017
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default compiler.thread_local_storage   yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# do not include os.major in target triplet
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default triplet.os          {${os.platform}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Rust does not easily pass external flags to compilers, so add them to compiler wrappers
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default     compwrap.compilers_to_wrap          {cc cxx ld}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default     compwrap.ccache_supported_compilers {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# possible OpenSSL versions: empty, 3, 1.1, and 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+options     openssl.branch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default     openssl.branch      {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# the distfiles of the main port will also be stored in this directory,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# but this is the only way to allow reusing the same crates across multiple ports.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default     dist_subdir             {[expr {[llength ${cargo.crates}] > 0 || [llength ${cargo.crates_github}] > 0 ? "cargo-crates" : ${name}}]}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default     extract.only            {[rust::disttagclean $distfiles]}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# to wrap linker, compiler_wrapper PG required existence of configure.ld
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+options     configure.ld
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default     configure.ld            {${configure.cc}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+####################################################################################################################################
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# internal procedures
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+####################################################################################################################################
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+namespace eval rust {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# based on portextract::disttagclean from portextract.tcl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc rust::disttagclean {list} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {$list eq ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return $list
</span>     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach fname $list {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set name [getdistname ${fname}]
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-option_proc cargo.crates_github handle_cargo_crates_github
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc handle_cargo_crates_github {option action {value ""}} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {${action} eq "set"} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        foreach {cname cgithub cbranch crevision chksum} ${value} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set cratefile       ${cname}-${crevision}.tar.gz
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # The same crate name can appear with multiple versions. Use
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # a combination of crate name and checksum as unique identifier.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # As the :disttag cannot contain dots, the version number cannot be
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # used.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set cratetag        crate-${cname}-${chksum}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            distfiles-append    ${cratefile}:${cratetag}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            master_sites-append https://github.com/${cgithub}/archive/${crevision}.tar.gz?dummy=:${cratetag}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            checksums-append    ${cratefile} sha256 ${chksum}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set is_crate no
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach {cname cversion chksum} [option cargo.crates] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set cratefile ${cname}-${cversion}.crate
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {${name} eq ${cratefile}} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set is_crate yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach {cname cgithub cbranch crevision chksum} [option cargo.crates_github] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set cratefile ${cname}-${crevision}.tar.gz
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {${name} eq ${cratefile}} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set is_crate yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {!${is_crate}} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lappend val ${name}
</span>         }
     }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    return $val
</span> }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc cargo._extract_crate {cratefile} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    global cargo.home distpath
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc rust::handle_crates {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach {cname cversion chksum} [option cargo.crates] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # The same crate name can appear with multiple versions. Use
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # a combination of crate name and checksum as unique identifier.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # As the :disttag cannot contain dots, the version number cannot be
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # used.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # To download the crate file curl-0.4.11.crate, the URL is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        #    https://crates.io/api/v1/crates/curl/0.4.11/download.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Use ?dummy= to ignore ${distfile}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # see https://trac.macports.org/wiki/PortfileRecipes#fetchwithgetparams
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set cratefile       ${cname}-${cversion}.crate
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set cratetag        crate-${cname}-${chksum}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        distfiles-append    ${cratefile}:${cratetag}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        master_sites-append https://crates.io/api/v1/crates/${cname}/${cversion}/download?dummy=:${cratetag}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        checksums-append    ${cratefile} sha256 ${chksum}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach {cname cgithub cbranch crevision chksum} [option cargo.crates_github] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set cratefile       ${cname}-${crevision}.tar.gz
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set cratetag        crate-${cname}-${chksum}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        distfiles-append    ${cratefile}:${cratetag}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        master_sites-append https://github.com/${cgithub}/archive/${crevision}.tar.gz?dummy=:${cratetag}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        checksums-append    ${cratefile} sha256 ${chksum}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+port::register_callback rust::handle_crates
</span> 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+proc rust::extract_crate {cratefile} {
</span>     set tar [findBinary tar ${portutil::autoconf::tar_path}]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    system -W "${cargo.home}/macports" "$tar -xf [shellescape ${distpath}/${cratefile}]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    system -W "[option cargo.home]/macports" "$tar -xf [shellescape [option distpath]/${cratefile}]"
</span> }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc cargo._write_cargo_checksum {cdirname chksum} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    global cargo.home
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc rust::write_cargo_checksum {cdirname chksum} {
</span>     # although cargo will never see the .crate, it expects to find the sha256 checksum here
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set chkfile [open "${cargo.home}/macports/${cdirname}/.cargo-checksum.json" "w"]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set chkfile [open "[option cargo.home]/macports/${cdirname}/.cargo-checksum.json" "w"]
</span>     puts $chkfile "{"
     puts $chkfile "    \"package\": ${chksum},"
     puts $chkfile "    \"files\": {}"
     puts $chkfile "}"
     close $chkfile
 }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+proc rust::old_macos_compatibility {cname cversion} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global cargo.home subport
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    switch ${cname} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        "kqueue" {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if { [vercmp ${cversion} < 1.0.5] && "i386" in [option muniversal.architectures] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # see https://gitlab.com/worr/rust-kqueue/-/merge_requests/10
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                reinplace {s|all(target_os = "freebsd", target_arch = "x86")|all(any(target_os = "freebsd", target_os = "macos"), any(target_arch = "x86", target_arch = "powerpc"))|g} \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    ${cargo.home}/macports/${cname}-${cversion}/src/time.rs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                cargo.offline_cmd-replace --frozen --offline
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        "curl-sys" {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if { [vercmp ${cversion} < 0.4.56] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # on Mac OS X 10.6, clang exists, but `clang --print-search-dirs` returns an empty library directory
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # see https://github.com/alexcrichton/curl-rust/commit/b3a3ce876921f2e82a145d9abd539cd8f9b7ab7b
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # see https://trac.macports.org/ticket/64146#comment:16
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # on other systems, we want the static library of the compiler we are using and not necessarily the system compiler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # see https://github.com/alexcrichton/curl-rust/commit/a6969c03b1e8f66bc4c801914327176ed38f44c5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # see https://github.com/alexcrichton/curl-rust/issues/279
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # for upstream pull request, see https://github.com/alexcrichton/curl-rust/pull/451
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                reinplace "s|Command::new(\"clang\")|cc::Build::new().get_compiler().to_command()|g" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    ${cargo.home}/macports/${cname}-${cversion}/build.rs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc cargo._old_macos_compatibility {cname cversion} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    global os.platform os.major cargo.home
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {${os.platform} ne "darwin" || ${os.major} >= 12} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # rust-bootstrap requires `macosx_deployment_target` instead of `os.major`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[option os.platform] ne "darwin" || [vercmp [option macosx_deployment_target] >= 10.8]} {
</span>         return
     }
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -121,94 +218,66 @@ proc cargo._old_macos_compatibility {cname cversion} {
</span>             # switch crypto-hash to use openssl instead of commoncrypto
             # See: https://github.com/malept/crypto-hash/issues/23
             reinplace "s|target_os = \"macos\"|target_os = \"macos_disabled\"|g" \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                ${cargo.home}/macports/crypto-hash-${cversion}/src/lib.rs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ${cargo.home}/macports/${cname}-${cversion}/src/lib.rs
</span>             reinplace "s|macos|macos_disabled|g" \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                ${cargo.home}/macports/crypto-hash-${cversion}/Cargo.toml
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ${cargo.home}/macports/${cname}-${cversion}/Cargo.toml
</span>         }
         "curl-sys" {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            # curl-sys requires CCDigestGetOutputSizeFromRef which is available since macOS 10.8
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # disable USE_SECTRANSP to avoid calling of CCDigestGetOutputSizeFromRef
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # curl-sys requires CCDigestGetOutputSizeFromRef which is only available since macOS 10.8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # disable USE_SECTRANSP to avoid calling of CCDigestGetOutputSizeFromRef and use OpenSSL instead
</span>             # See: https://github.com/alexcrichton/curl-rust/issues/429
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            reinplace "s|USE_SECTRANSP|USE_SECTRANSP_DISABLED|g" \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                ${cargo.home}/macports/curl-sys-${cversion}/build.rs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            reinplace "s|else if target.contains(\"-apple-\")|else if target.contains(\"-apple_disabled-\")|g" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ${cargo.home}/macports/${cname}-${cversion}/build.rs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            reinplace "s|macos|macos_disabled|g" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ${cargo.home}/macports/${cname}-${cversion}/Cargo.toml
</span>         }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        "libgit2-sys" {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # libgit2-sys requires SSLCreateContext which is only available since macOS 10.8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # disable GIT_SECURE_TRANSPORT to avoid calling of SSLCreateContext and use OpenSSL instead
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            reinplace "s|else if target.contains(\"apple\")|else if target.contains(\"apple_disabled\")|g" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ${cargo.home}/macports/${cname}-${cversion}/build.rs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[option os.platform] ne "darwin" || [vercmp [option macosx_deployment_target] >= 10.6]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return
</span>     }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    switch ${cname} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        "notify" {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            reinplace {s|default = \["macos_fsevent"\]|default = \["macos_kqueue"\]|g} \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ${cargo.home}/macports/${cname}-${cversion}/Cargo.toml
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        "cargo-util" {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            reinplace {s|#\[cfg(not(target_os = "macos"))\]|#\[cfg(not(target_os = "macos_temp"))\]|g} \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ${cargo.home}/macports/${cname}-${cversion}/src/paths.rs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            reinplace {s|#\[cfg(target_os = "macos")\]|#\[cfg(not(target_os = "macos"))\]|g} \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ${cargo.home}/macports/${cname}-${cversion}/src/paths.rs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            reinplace {s|#\[cfg(not(target_os = "macos_temp"))\]|#\[cfg(target_os = "macos")\]|g} \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ${cargo.home}/macports/${cname}-${cversion}/src/paths.rs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span> }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc cargo._import_crate {cname cversion chksum cratefile} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc rust::import_crate {cname cversion chksum cratefile} {
</span>     global cargo.home
 
     ui_info "Adding ${cratefile} to cargo home"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    cargo._extract_crate ${cratefile}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    cargo._write_cargo_checksum "${cname}-${cversion}" "\"${chksum}\""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    cargo._old_macos_compatibility ${cname} ${cversion}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    rust::extract_crate ${cratefile}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    rust::write_cargo_checksum "${cname}-${cversion}" "\"${chksum}\""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    rust::old_macos_compatibility ${cname} ${cversion}
</span> }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc cargo._import_crate_github {cname cgithub crevision chksum cratefile} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc rust::import_crate_github {cname cgithub crevision chksum cratefile} {
</span>     global cargo.home
 
     set crepo [lindex [split ${cgithub} "/"] 1]
     set cdirname "${crepo}-${crevision}"
 
     ui_info "Adding ${cratefile} from github to cargo home"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    cargo._extract_crate ${cratefile}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    cargo._write_cargo_checksum ${cdirname} "null"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    cargo._old_macos_compatibility ${cname} ${cversion}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# The distfiles of the main port will also be stored in this directory,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# but this is the only way to allow reusing the same crates across multiple ports.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-default dist_subdir     {[cargo._dist_subdir]}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc cargo._dist_subdir {} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    global name cargo.crates cargo.crates_github
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[llength ${cargo.crates}] > 0 || [llength ${cargo.crates_github}]>0} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return cargo-crates
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return ${name}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-default extract.only    {[cargo._disttagclean $distfiles]}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# based on portextract::disttagclean from portextract.tcl
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc cargo._disttagclean {list} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    global cargo.crates cargo.crates_github
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {$list eq ""} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return $list
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach fname $list {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set name [getdistname ${fname}]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set is_crate no
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        foreach {cname cversion chksum} ${cargo.crates} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set cratefile ${cname}-${cversion}.crate
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {${name} eq ${cratefile}} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                set is_crate yes
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        foreach {cname cgithub cbranch crevision chksum} ${cargo.crates_github} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set cratefile ${cname}-${crevision}.tar.gz
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {${name} eq ${cratefile}} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                set is_crate yes
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {!${is_crate}} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            lappend val ${name}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return $val
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-if {${subport} ne "cargo-bootstrap" && ${subport} ne "cargo-stage1" && ${subport} ne "cargo"} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    depends_build-append port:cargo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # do not force all Portfiles to switch from depends_build to depends_build-append
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    proc cargo.add_dependencies {} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        depends_build-delete port:cargo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        depends_build-append port:cargo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    port::register_callback cargo.add_dependencies
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    rust::extract_crate ${cratefile}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    rust::write_cargo_checksum ${cdirname} "null"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    rust::old_macos_compatibility ${cname} ${crevision}
</span> }
 
 post-extract {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -218,7 +287,7 @@ post-extract {
</span>         # avoid downloading files from online repository during build phase
         # use a replacement for crates.io
         # https://doc.rust-lang.org/cargo/reference/source-replacement.html
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        set conf [open "${cargo.home}/config" "w"]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set conf [open "${cargo.home}/config.toml" "w"]
</span>         puts $conf "\[source\]"
         puts $conf "\[source.macports\]"
         puts $conf "directory = \"${cargo.home}/macports\""
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -236,111 +305,193 @@ post-extract {
</span>         # import all crates
         foreach {cname cversion chksum} ${cargo.crates} {
             set cratefile ${cname}-${cversion}.crate
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            cargo._import_crate ${cname} ${cversion} ${chksum} ${cratefile}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            rust::import_crate ${cname} ${cversion} ${chksum} ${cratefile}
</span>         }
         foreach {cname cgithub cbranch crevision chksum} ${cargo.crates_github} {
             set cratefile ${cname}-${crevision}.tar.gz
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            cargo._import_crate_github ${cname} ${cgithub} ${crevision} ${chksum} ${cratefile}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            rust::import_crate_github ${cname} ${cgithub} ${crevision} ${chksum} ${cratefile}
</span>         }
     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# MacPorts use the name i386 for 32-bit Intel architecture
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# Cargo and Rust use the name i686
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc cargo.translate_arch_name {arch} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {${arch} eq "i386"} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return "i686"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    } elseif {${arch} eq "arm64"} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return "aarch64"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return ${arch}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {${subport} ne "rust" && [join [lrange [split ${subport} -] 0 1] -] ne "rust-bootstrap"} {
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc cargo.rust_platform {{arch ""}} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    global os.platform configure.build_arch muniversal.current_arch
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {${arch} eq ""} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {[info exists muniversal.current_arch]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set arch ${muniversal.current_arch}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set arch ${configure.build_arch}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # see comment below concerning RUSTC and RUSTFLAGS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        file mkdir "${cargo.home}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set conf [open "${cargo.home}/config.toml" "a"]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts $conf "\[build\]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts $conf "rustc = \"${prefix}/bin/rustc\""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[option rust.flags] ne ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            puts $conf "rustflags = \[\"[join [option rust.flags] {", "}]\"\]"
</span>         }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # be sure to include all architectures in case, e.g., a 64-bit Cargo compiles a 32-bit port
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach arch {arm64 x86_64 i386 ppc ppc64} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            puts $conf "\[target.[option triplet.${arch}]\]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            puts $conf "linker = \"[compwrap::wrap_compiler ld]\""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        close $conf
</span>     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    return [cargo.translate_arch_name ${arch}]-apple-${os.platform}
</span> }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc cargo.append_envs { var {phases {configure build destroot}} } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc rust::append_envs { var {phases {configure build destroot}} } {
</span>     foreach phase ${phases} {
         ${phase}.env-delete ${var}
         ${phase}.env-append ${var}
     }
 }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# see https://trac.macports.org/wiki/UsingTheRightCompiler
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc cargo.set_compiler_envs {} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    global configure.cc configure.cxx
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    cargo.append_envs CC=${configure.cc}   {build destroot}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    cargo.append_envs CXX=${configure.cxx} {build destroot}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    cargo.append_envs "RUSTFLAGS=-C linker=${configure.cc}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-port::register_callback cargo.set_compiler_envs
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> # Is build caching enabled ?
 # WIP for now ...
 #if {[tbool configure.ccache]} {
 #    # Enable sccache for rust caching
 #    depends_build-append port:sccache
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#    cargo.append_envs    RUSTC_WRAPPER=${prefix}/bin/sccache
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#    cargo.append_envs    SCCACHE_CACHE_SIZE=2G
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#    cargo.append_envs    SCCACHE_DIR=${workpath}/.sccache
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#    rust::append_envs    RUSTC_WRAPPER=${prefix}/bin/sccache
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#    rust::append_envs    SCCACHE_CACHE_SIZE=2G
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#    rust::append_envs    SCCACHE_DIR=${workpath}/.sccache
</span> #}
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# do not force all Portfiles to switch from ${stage}.env to ${stage}.env-append
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc cargo.environments {} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    global os.major prefix configure.pkg_config_path
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    global configure.cc configure.cxx subport configure.build_arch configure.universal_archs
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    global merger_configure_env merger_build_env merger_destroot_env worksrcpath
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set cargo_ld ${configure.cc}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#    if { ${os.major} <= [option legacysupport.newest_darwin_requires_legacy] } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#        # Use wrapped rust compilers
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#        depends_build-append port:rust-compiler-wrap
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#        configure.cc      ${prefix}/libexec/rust-compiler-wrap/bin/clang
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#        configure.cxx     ${prefix}/libexec/rust-compiler-wrap/bin/clang++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#        configure.objc    ${prefix}/libexec/rust-compiler-wrap/bin/clang
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#        configure.objcxx  ${prefix}/libexec/rust-compiler-wrap/bin/clang++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#        set cargo_ld      ${prefix}/libexec/rust-compiler-wrap/bin/ld-rust
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    cargo.append_envs     CC=${configure.cc}   {build destroot}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    cargo.append_envs     CXX=${configure.cxx} {build destroot}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    cargo.append_envs     "RUSTFLAGS=-C linker=${cargo_ld}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    cargo.append_envs     "RUST_BACKTRACE=1"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    cargo.append_envs     "CARGO_BUILD_RUSTC=${prefix}/bin/rustc"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Propagate pkgconfig path to build and destroot phases as well
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Needed to work with openssl PG
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc rust::set_environment {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global prefix configure.pkg_config_path
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global subport configure.build_arch configure.universal_archs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    rust::append_envs     "RUST_BACKTRACE=1"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    rust::append_envs     CC=[compwrap::wrap_compiler cc]   {build destroot}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    rust::append_envs     CXX=[compwrap::wrap_compiler cxx] {build destroot}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if { [option openssl.branch] ne "" } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set openssl_ver                     [string map {. {}} [option openssl.branch]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        rust::append_envs                   OPENSSL_DIR=${prefix}/libexec/openssl${openssl_ver}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        compiler.cpath-prepend              ${prefix}/libexec/openssl${openssl_ver}/include
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        compiler.library_path-prepend       ${prefix}/libexec/openssl${openssl_ver}/lib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        configure.pkg_config_path-prepend   ${prefix}/libexec/openssl${openssl_ver}/lib/pkgconfig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Propagate pkgconfig path to build and destroot phases as well.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Needed to work with openssl PG.
</span>     if { ${configure.pkg_config_path} ne "" } {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        cargo.append_envs "PKG_CONFIG_PATH=${configure.pkg_config_path}" {build destroot}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        rust::append_envs "PKG_CONFIG_PATH=[join ${configure.pkg_config_path} :]" {build destroot}
</span>     }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    # CARGO_BUILD_TARGET does not work correctly
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # see the patchfile path-dyld.diff in cargo Portfile
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {${subport} ne "cargo-stage1"} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {![variant_exists universal] || ![variant_isset universal]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            cargo.append_envs CARGO_BUILD_TARGET=[cargo.rust_platform ${configure.build_arch}] {configure build destroot}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            foreach stage {configure build destroot} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                foreach arch ${configure.universal_archs} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    lappend merger_${stage}_env(${arch}) \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        CARGO_BUILD_TARGET=[cargo.rust_platform ${arch}]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {${subport} ne "rust" && [join [lrange [split ${subport} -] 0 1] -] ne "rust-bootstrap"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # when CARGO_BUILD_TARGET is set or `--target` is used, RUSTFLAGS and RUSTC are ignored
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        #     rust::append_envs     "RUSTFLAGS=-C linker=[compwrap::wrap_compiler ld]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        #     rust::append_envs     "RUSTC=${prefix}/bin/rustc"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # see https://github.com/rust-lang/cargo/issues/4423
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach stage {configure build destroot} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            foreach arch [option muniversal.architectures] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ${stage}.env.${arch}-append "CARGO_BUILD_TARGET=[option triplet.${arch}]"
</span>             }
         }
     }
 }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-port::register_callback cargo.environments
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+port::register_callback rust::set_environment
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc rust::rust_pg_callback {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global  subport \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            prefix
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if { ${subport} ne "rust" && [join [lrange [split ${subport} -] 0 1] -] ne "rust-bootstrap" } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # port is *not* building Rust
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach {f s} [option rust.remap] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            rust.flags-prepend          --remap-path-prefix=${f}=${s}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        depends_build-delete            port:rust
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        depends_build-append            port:rust
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if { ${subport} ne "cargo" } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # port is building neither Rust nor Cargo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            depends_build-delete        port:cargo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            depends_build-append        port:cargo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            depends_skip_archcheck-delete   cargo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            depends_skip_archcheck-append   cargo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # port is building Rust
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if { [option rust.llvm.legacy] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            depends_build-delete        path:lib/libMacportsLegacySupport.a:legacy-support
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            depends_build-append        path:lib/libMacportsLegacySupport.a:legacy-support
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if { [option rust.use_cctools] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            depends_build-delete        port:cctools
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            depends_build-append        port:cctools
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            depends_skip_archcheck-delete   cctools
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            depends_skip_archcheck-append   cctools
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if { [option openssl.branch] ne "" } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set openssl_ver                 [string map {. {}} [option openssl.branch]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        depends_lib-delete              port:openssl${openssl_ver}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        depends_lib-append              port:openssl${openssl_ver}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if { [string match "macports-clang*" [option configure.compiler]] && [option os.major] < 11 } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # by default, ld64 uses ld64-127 when 9 <= ${os.major} < 11
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Rust fails to build when architecture is x86_64 and ld64 uses ld64-127
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        depends_build-delete            port:ld64-274
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        depends_build-append            port:ld64-274
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        depends_skip_archcheck-delete   ld64-274
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        depends_skip_archcheck-append   ld64-274
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        configure.ldflags-delete        -fuse-ld=${prefix}/bin/ld-274
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        configure.ldflags-append        -fuse-ld=${prefix}/bin/ld-274
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # rust-bootstrap requires `macosx_deployment_target` instead of `os.major`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if { [option os.platform] eq "darwin" && [vercmp [option macosx_deployment_target] < 10.6]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # __Unwind_RaiseException
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        depends_lib-delete              port:libunwind
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        depends_lib-append              port:libunwind
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        configure.ldflags-delete        -lunwind
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        configure.ldflags-append        -lunwind
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if { [join [lrange [split ${subport} -] 0 1] -] eq "rust-bootstrap" } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # Bootstrap compilers are building on newer machines to be run on older ones.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # Use libMacportsLegacySystem.B.dylib since it is able to use the `__asm("$ld$add$os10.5$...")` trick for symbols that are part of legacy-support *only* on older systems.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set legacyLib               libMacportsLegacySystem.B.dylib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set dep_type                lib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # code should mimic legacy-support
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # see https://github.com/macports/macports-ports/blob/master/devel/legacy-support/Portfile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set max_darwin_reexport 19
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if { [option configure.build_arch] eq "arm64" || [option os.major] > ${max_darwin_reexport} } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # ${prefix}/lib/libMacportsLegacySystem.B.dylib does not exist
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # see https://trac.macports.org/ticket/65255
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                known_fail              yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                pre-fetch {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    ui_error "${subport} requires libMacportsLegacySystem.B.dylib, which is provided by legacy-support"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    return -code error "incompatible system configuration"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # Use the static library since the Rust compiler looks up certain symbols at *runtime* (e.g. `openat`).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # Normally, we would want the additional functionality provided by MacPorts.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # However, for reasons yet unknown, the Rust file system (sys/unix/fs.rs) functions fail when they try to use MacPorts system calls.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set legacyLib               libMacportsLegacySupport.a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set dep_type                build
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# see https://trac.macports.org/ticket/51643 for a similar case
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-PortGroup muniversal 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # LLVM: CFPropertyListCreateWithStream, uuid_string_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Rust: _posix_memalign, extended _realpath, _pthread_setname_np, _copyfile_state_get
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        depends_${dep_type}-delete      path:lib/${legacyLib}:legacy-support
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        depends_${dep_type}-append      path:lib/${legacyLib}:legacy-support
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        configure.ldflags-delete        -Wl,${prefix}/lib/${legacyLib}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        configure.ldflags-append        -Wl,${prefix}/lib/${legacyLib}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # sometimes Cargo.lock does not exist
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    post-extract {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if { ${cargo.update} } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            system -W ${cargo.dir} "${cargo.bin} --offline update"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+port::register_callback rust::rust_pg_callback
</span></pre><pre style='margin:0'>

</pre>