<pre style='margin:0'>
Joshua Root (jmroot) pushed a commit to branch master
in repository macports-base.
</pre>
<p><a href="https://github.com/macports/macports-base/commit/a83bf738719f6127f051969560135bf624c2f8a6">https://github.com/macports/macports-base/commit/a83bf738719f6127f051969560135bf624c2f8a6</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 a83bf7387 mpkg: add +universal to deps if needed
</span>a83bf7387 is described below
<span style='display:block; white-space:pre;color:#808000;'>commit a83bf738719f6127f051969560135bf624c2f8a6
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Tue Apr 8 14:34:31 2025 +1000
<span style='display:block; white-space:pre;color:#404040;'> mpkg: add +universal to deps if needed
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Closes: https://trac.macports.org/ticket/34177
</span>---
src/macports1.0/macports.tcl | 3 +
src/package1.0/portmpkg.tcl | 150 +++++++++++++++++++++++++++++--------------
src/port1.0/portutil.tcl | 18 ++++++
3 files changed, 123 insertions(+), 48 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/macports1.0/macports.tcl b/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 8438a90f0..256d4b90a 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2003,6 +2003,9 @@ proc macports::worker_init {workername portpath porturl portbuildpath options va
</span> $workername alias _portnameactive _portnameactive
$workername alias get_actual_cxx_stdlib macports::get_actual_cxx_stdlib
$workername alias shellescape macports::shellescape
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ $workername alias _mportkey _mportkey
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ $workername alias _mport_archs macports::_mport_archs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ $workername alias _mport_supports_archs macports::_mport_supports_archs
</span>
# New Registry/Receipts stuff
$workername alias registry_new registry::new_entry
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/package1.0/portmpkg.tcl b/src/package1.0/portmpkg.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 94275a64f..4d75fdf87 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/package1.0/portmpkg.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/package1.0/portmpkg.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -56,29 +56,31 @@ proc portmpkg::mpkg_main {args} {
</span> return [package_mpkg $subport $epoch $version $revision]
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc portmpkg::make_dependency_list {portname destination} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- global prefix package.flat requested_variations
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set result [list]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if {[catch {set res [mport_lookup $portname]} error]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ui_debug $::errorInfo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return -code error "port lookup failed: $error"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc portmpkg::archcheck {mport dependent_mport} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set portinfo [mport_info $mport]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {[dict exists $portinfo installs_libs] && ![dict get $portinfo installs_libs]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 1
</span> }
<span style='display:block; white-space:pre;background:#ffe0e0;'>- lassign $res portname portinfo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if {[getuid] == 0 && [geteuid] != 0} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- seteuid 0; setegid 0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set deprivileged 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set skip_archcheck [_mportkey $dependent_mport depends_skip_archcheck]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {[lsearch -exact -nocase $skip_archcheck [dict get $portinfo name]] >= 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 1
</span> }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set mport [mport_open [dict get $portinfo porturl] [dict create prefix $prefix package.destpath ${destination} package.flat ${package.flat} subport $portname] [array get requested_variations]]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if {[info exists deprivileged]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- global macportsuser
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- setegid [uname_to_gid $macportsuser]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- seteuid [name_to_uid $macportsuser]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set required_archs [_mport_archs $dependent_mport]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {[_mport_supports_archs $mport $required_archs]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 1
</span> }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Since only depends_lib and depends_run are considered in mpkg,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # there's no need to check if the dep type needs matching archs.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span>
<span style='display:block; white-space:pre;background:#e0ffe0;'>+proc portmpkg::get_dependencies {mport dep_map base_options variations} {
</span> set portinfo [mport_info $mport]
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ set portname [dict get $portinfo name]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {![dict exists $dep_map $portname]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # guard against infinite recursion with circular dependencies
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dict set dep_map $portname {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span>
# get the union of depends_run and depends_lib
set depends [list]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -88,32 +90,92 @@ proc portmpkg::make_dependency_list {portname destination} {
</span> foreach depspec $depends {
set dep [_get_dep_port $depspec]
if {$dep ne ""} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- lappend result {*}[make_dependency_list $dep $destination]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Get the dep's mport handle, opening it if needed
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {[catch {set res [mport_lookup $dep]} error]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ui_debug $::errorInfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return -code error "port lookup failed: $error"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # depname will have canonical case and so can safely be
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # used as the dict key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ lassign $res depname dep_portinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set add_deps 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {[dict exists $dep_map $depname]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set dep_mport [dict get $dep_map $depname]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # The dep has already been processed, so there's
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # nothing to do in this case if the archs match.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set options $base_options
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dict set options subport $depname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ exec_with_available_privileges {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set dep_mport [mport_open [dict get $dep_portinfo porturl] $options $variations]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set add_deps 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Reopen with +universal if possible if the archs aren't compatible
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {![archcheck $dep_mport $mport] && ![dict exists $variations universal]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set check_portinfo [mport_info $dep_mport]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set dep_archs [_mport_archs $dep_mport]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {[dict exists $check_portinfo variants] && "universal" in [dict get $check_portinfo variants]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ && [llength $dep_archs] < 2} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ mport_close $dep_mport
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set uvariations $variations
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dict set uvariations universal +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set options $base_options
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dict set options subport $depname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ exec_with_available_privileges {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set dep_mport [mport_open [dict get $dep_portinfo porturl] $options $uvariations]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set add_deps 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # dep_map entry for this dep will be updated in the recursive call
</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 {$add_deps} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Add this dependency and its dependencies to the dep_map
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set dep_map [get_dependencies $dep_mport $dep_map $base_options $variations]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span> }
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>- lappend result [list $portname [dict get $portinfo version] [dict get $portinfo revision] $mport]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return $result
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # ensure this port comes after its deps in the dict
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dict unset dep_map $portname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dict set dep_map $portname [list $mport [dict get $portinfo version] [dict get $portinfo revision]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return $dep_map
</span> }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc portmpkg::make_one_package {portname mport} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if {[getuid] == 0 && [geteuid] != 0} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- seteuid 0; setegid 0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set deprivileged 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc portmpkg::make_dependency_list {portname destination} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ global prefix package.flat requested_variations
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {[catch {set res [mport_lookup $portname]} error]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ui_debug $::errorInfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return -code error "port lookup failed: $error"
</span> }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ lassign $res portname portinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set base_options [dict create prefix $prefix package.destpath ${destination} package.flat ${package.flat}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set options $base_options
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dict set options subport $portname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set variations [array get requested_variations]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ exec_with_available_privileges {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set mport [mport_open [dict get $portinfo porturl] $options $variations]
</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;'>+ set result [get_dependencies $mport [dict create] $base_options $variations]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ mport_close $mport
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # don't re-package ourself
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dict unset result $portname
</span>
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ return $result
</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;'>+proc portmpkg::make_one_package {portname mport} {
</span> ui_debug "building dependency package: $portname"
<span style='display:block; white-space:pre;background:#ffe0e0;'>- set result [mport_exec $mport pkg]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ exec_with_available_privileges {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set result [mport_exec $mport pkg]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span> mport_close $mport
if {$result} {
error "Processing of port $portname failed"
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if {[info exists deprivileged]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- global macportsuser
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- setegid [uname_to_gid $macportsuser]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- seteuid [name_to_uid $macportsuser]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span> }
proc portmpkg::mpkg_path {portname portversion portrevision} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -136,26 +198,18 @@ proc portmpkg::package_mpkg {portname portepoch portversion portrevision} {
</span> set packages_path ${mpkgpath}/Contents/Packages
set resources_path ${mpkgpath}/Contents/Resources
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>- system "mkdir -p -m 0755 [shellescape ${packages_path}]"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- system "mkdir -p -m 0755 [shellescape ${resources_path}]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ xinstall -d -m 0755 ${packages_path} ${resources_path}
</span>
set dependencies [list]
# get deplist
set deps [make_dependency_list $portname $packages_path]
<span style='display:block; white-space:pre;background:#ffe0e0;'>- set deps [lsort -unique $deps]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- foreach dep $deps {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set name [lindex $dep 0]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set vers [lindex $dep 1]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set rev [lindex $dep 2]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set mport [lindex $dep 3]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # don't re-package ourself
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if {$name ne $portname} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- make_one_package $name $mport
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if {${package.flat} && ${os.major} >= 10} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- lappend dependencies org.macports.${name} [portpkg::image_name ${name} ${vers} ${rev}]-component.pkg
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- lappend dependencies [portpkg::image_name ${name} ${vers} ${rev}].pkg
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dict for {name depinfo} $deps {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ lassign $depinfo mport vers rev
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ make_one_package $name $mport
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {${package.flat} && ${os.major} >= 10} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ lappend dependencies org.macports.${name} [portpkg::image_name ${name} ${vers} ${rev}]-component.pkg
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ lappend dependencies [portpkg::image_name ${name} ${vers} ${rev}].pkg
</span> }
}
if {${package.flat} && ${os.major} >= 10} {
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port1.0/portutil.tcl b/src/port1.0/portutil.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 0ec87f1cf..245e0d4ab 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port1.0/portutil.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port1.0/portutil.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3167,6 +3167,24 @@ proc exec_as_uid {uid code} {
</span> return -code $retcode $result
}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# Run the given code, becoming root first if possible, and dropping
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# privileges again afterward.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc exec_with_available_privileges {code} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {[getuid] == 0 && [geteuid] != 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ seteuid 0; setegid 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set deprivileged 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ try {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uplevel 1 $code
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } finally {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {[info exists deprivileged]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ global macportsuser
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ setegid [uname_to_gid $macportsuser]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ seteuid [name_to_uid $macportsuser]
</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;'>+
</span> # dependency analysis helpers
### _libtest is private; subject to change without notice
</pre><pre style='margin:0'>
</pre>