<pre style='margin:0'>
Chris Jones (cjones051073) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/2c4b9f6b6a5ef0e399c8f4673bb0ddf0757abd7e">https://github.com/macports/macports-ports/commit/2c4b9f6b6a5ef0e399c8f4673bb0ddf0757abd7e</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 2c4b9f6b6a5ef0e399c8f4673bb0ddf0757abd7e
</span>Author: Chris Jones <jonesc@macports.org>
AuthorDate: Tue May 4 14:41:48 2021 +0100

<span style='display:block; white-space:pre;color:#404040;'>    compilerwrapper PG: New PortGroup that consolidates the code to create compiler wrappers
</span>---
 _resources/port1.0/group/compilerwrapper-1.0.tcl | 144 +++++++++++++++++++++++
 1 file changed, 144 insertions(+)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/_resources/port1.0/group/compilerwrapper-1.0.tcl b/_resources/port1.0/group/compilerwrapper-1.0.tcl
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..05350dcbce6
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/_resources/port1.0/group/compilerwrapper-1.0.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,144 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Used to create wrapper compiler scripts on-demand
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Useful to enforce settings such as MacPorts compiler flags, legacysupport settings
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# and ccache support for ports / portgroups / build systems for which the standard
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# compiler flags do not work.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+namespace eval compwrap { }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+options compwrap.add_compiler_flags
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default compwrap.add_compiler_flags yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+options compwrap.add_legacysupport_flags
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default compwrap.add_legacysupport_flags yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+options compwrap.print_compiler_command
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default compwrap.print_compiler_command no
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+options compwrap.compiler_pre_flags
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default compwrap.compiler_pre_flags ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+options compwrap.compiler_post_flags
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default compwrap.compiler_post_flags ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+options compwrap.compiler_args_forward
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default compwrap.compiler_args_forward {\$\{\@\}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc compwrap::use_ccache {tag} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global prefix
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return [ expr [option configure.ccache] && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 [file exists ${prefix}/bin/ccache] && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 [lsearch -exact [compwrap::known_fortran_compiler_tags] ${tag}] < 0 ]
</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 compwrap::get_ccache_dir {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global portdbpath ccache_dir
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[info exists ccache_dir]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return ${ccache_dir}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return [file join $portdbpath build .ccache]
</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 compwrap::known_compiler_tags {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return [list cc objc cxx objcxx fc f77 f90]
</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 compwrap::known_fortran_compiler_tags {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return [list fc f77 f90]
</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 compwrap::create_wrapper {tag} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global prefix
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Get the underlying compiler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set comp [option configure.${tag}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # If not defined, or tag not in list of known compilers to wrap, just return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {${comp} eq "" || [lsearch -exact [compwrap::known_compiler_tags] ${tag}] < 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return ${comp}
</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 wrapdir [option workpath]/compwrap/${tag}[file dirname ${comp}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![file exists ${wrapdir}]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        xinstall -d ${wrapdir}
</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;'>+    switch ${tag} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        cc      { set ftag "c" }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        default { set ftag ${tag} }
</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;'>+    # Wrapper name, based on original
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set fname ${wrapdir}/[file tail ${comp}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Force recreate in case underlying compiler has changed
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    file delete -force ${fname}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Basic option, to pass on all command line arguments
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set comp_opts "[option compwrap.compiler_pre_flags] [option compwrap.compiler_args_forward] [option compwrap.compiler_post_flags]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Add MacPorts compiler flags ?
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if { [option compwrap.add_compiler_flags] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set comp_opts "[option configure.${ftag}flags] [get_canonical_archflags ${tag}] ${comp_opts}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Add legacy support env vars
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if { [option compwrap.add_legacysupport_flags] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set comp_opts "\$\{MACPORTS_LEGACY_SUPPORT_CPPFLAGS\} ${comp_opts}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Append ccache if active
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if { [compwrap::use_ccache ${tag}] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set comp "${prefix}/bin/ccache ${comp}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    ui_debug "Creating compiler wrapper ${fname}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set f [open ${fname} w 0755]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    puts ${f} "#!/bin/bash"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # If ccache active make sure correct CCACHE_DIR is used as not all build systems
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # (looking at you Bazel) propagate this flag.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if { [compwrap::use_ccache ${tag}] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts ${f} "export CCACHE_DIR=[compwrap::get_ccache_dir]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    puts ${f} "CMD=\"${comp} ${comp_opts}\""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[option compwrap.print_compiler_command]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts ${f} "echo \${CMD}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    puts  ${f} "exec \${CMD}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    close ${f}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return ${fname}
</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 compwrap::get_compiler {tag} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set comp [option configure.${tag}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[option configure.ccache]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set comp [compwrap::create_wrapper ${tag}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return ${comp}
</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 various env vars
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc compwrap::configure_envs {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global prefix
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Set some cmake env vars incase build uses cmake
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach tag [compwrap::known_compiler_tags] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[compwrap::use_ccache ${tag}]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            switch ${tag} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                fc {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set ctag Fortran
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                f77 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set ctag Fortran
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                f90 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set ctag Fortran
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                default {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set ctag [string toupper $tag]
</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 phase [list configure build destroot] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ${phase}.env-append CMAKE_${ctag}_COMPILER_LAUNCHER=${prefix}/bin/ccache
</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;'>+port::register_callback compwrap::configure_envs
</span></pre><pre style='margin:0'>

</pre>