<pre style='margin:0'>
Clemens Lang (neverpanic) pushed a commit to branch master
in repository macports-base.

</pre>
<p><a href="https://github.com/macports/macports-base/commit/938d8528b896f15dc10c21a208b795f78acac127">https://github.com/macports/macports-base/commit/938d8528b896f15dc10c21a208b795f78acac127</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 938d8528 port1.0: configure: Add check for implicit decls
</span>938d8528 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 938d8528b896f15dc10c21a208b795f78acac127
</span>Author: Clemens Lang <cal@macports.org>
AuthorDate: Thu Nov 19 23:57:22 2020 +0100

<span style='display:block; white-space:pre;color:#404040;'>    port1.0: configure: Add check for implicit decls
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    On macOS 11, implicit function declarations are now errors by default.
</span><span style='display:block; white-space:pre;color:#404040;'>    This may affect configure checks and actually cause software to compile
</span><span style='display:block; white-space:pre;color:#404040;'>    differently without us knowing.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Add a post-configure check that scans any config.log files in
</span><span style='display:block; white-space:pre;color:#404040;'>    ${configure.dir} for indicators of such problems and warn about them, so
</span><span style='display:block; white-space:pre;color:#404040;'>    they will not go unnoticed. Extract the list of functions that were
</span><span style='display:block; white-space:pre;color:#404040;'>    found to be undeclared and check them against a whitelist of glob
</span><span style='display:block; white-space:pre;color:#404040;'>    expressions initialized from a file in
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>      _resources/port1.0/checks/implicit_function_declaration/macosx${configure.sdk_version}.sdk.list
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    so that functions that are legitimately undeclared on macOS can be
</span><span style='display:block; white-space:pre;color:#404040;'>    whitelisted globally. Note that the whitelist in
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>      configure.checks.implicit_function_declaration.whitelist
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    can also be edited per-Portfile, should that become necessary.
</span>---
 src/port1.0/portconfigure.tcl | 79 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 79 insertions(+)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port1.0/portconfigure.tcl b/src/port1.0/portconfigure.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index e472fb2d..af09bc3b 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port1.0/portconfigure.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port1.0/portconfigure.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -33,11 +33,13 @@
</span> package provide portconfigure 1.0
 package require portutil 1.0
 package require portprogress 1.0
<span style='display:block; white-space:pre;background:#e0ffe0;'>+package require struct::set
</span> 
 set org.macports.configure [target_new org.macports.configure portconfigure::configure_main]
 target_provides ${org.macports.configure} configure
 target_requires ${org.macports.configure} main fetch checksum extract patch
 target_prerun ${org.macports.configure} portconfigure::configure_start
<span style='display:block; white-space:pre;background:#e0ffe0;'>+target_postrun ${org.macports.configure} portconfigure::configure_end
</span> 
 namespace eval portconfigure {
 }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1723,3 +1725,80 @@ proc portconfigure::configure_main {args} {
</span>     }
     return 0
 }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+options configure.checks.implicit_function_declaration \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        configure.checks.implicit_function_declaration.whitelist
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default configure.checks.implicit_function_declaration yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default configure.checks.implicit_function_declaration.whitelist {[portconfigure::load_implicit_function_declaration_whitelist ${configure.sdk_version}]}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc portconfigure::check_implicit_function_declarations {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        configure.dir \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        configure.checks.implicit_function_declaration.whitelist
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Map from function name to config.log that used it without declaration
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    array set undeclared_functions {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    fs-traverse -tails file ${configure.dir} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[file tail $file] eq "config.log" && [file isfile [file join ${configure.dir} $file]]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # We could do the searching ourselves, but using a tool optimized for this purpose is likely much faster
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # than using Tcl.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # Using /usr/bin/grep here, so we don't accidentally pick up a macports-installed grep which might
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # currently not be runnable due to a missing library.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set args [list "/usr/bin/grep" "--" "-Wimplicit-function-declaration"]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lappend args [file join ${configure.dir} $file]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {![catch {set result [exec -- {*}$args]}]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                foreach line [split $result "\n"] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    if {[regexp -- "implicit declaration of function '(\[^']+)'" $line -> function]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        set is_whitelisted no
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        foreach whitelisted ${configure.checks.implicit_function_declaration.whitelist} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            if {[string match -nocase $whitelisted $function]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                set is_whitelisted yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                break
</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_whitelisted} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            ::struct::set include undeclared_functions($function) $file
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            ui_debug [format "Ignoring implicit declaration of function '%s', because it is whitelisted" $function]
</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><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 {[array size undeclared_functions] > 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_warn "Configuration logfiles contain indications of -Wimplicit-function-declaration, check that features were not accidentially disabled:"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach {function files} [array get undeclared_functions] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_msg [format "  %s: found in %s" $function [join $files ", "]]
</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><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc portconfigure::load_implicit_function_declaration_whitelist {sdk_version} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set whitelist {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set whitelist_file [getdefaultportresourcepath "port1.0/checks/implicit_function_declaration/macosx${sdk_version}.sdk.list"]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[file exists $whitelist_file]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set fd [open $whitelist_file r]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        while {[gets $fd whitelist_entry] >= 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lappend whitelist $whitelist_entry
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        close $fd
</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;'>+    return $whitelist
</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 portconfigure::configure_end {args} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        configure.dir \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        configure.checks.implicit_function_declaration
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[file isdirectory ${configure.dir}] && ${configure.checks.implicit_function_declaration}} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        portconfigure::check_implicit_function_declarations
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span></pre><pre style='margin:0'>

</pre>