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

</pre>
<p><a href="https://github.com/macports/macports-base/commit/ee4cbca919ad8e3e1c2962b241a9897694a51eb2">https://github.com/macports/macports-base/commit/ee4cbca919ad8e3e1c2962b241a9897694a51eb2</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit ee4cbca919ad8e3e1c2962b241a9897694a51eb2
</span>Author: Marcus Calhoun-Lopez <mcalhoun@macports.org>
AuthorDate: Sun Sep 16 05:14:43 2018 -0700

<span style='display:block; white-space:pre;color:#404040;'>    facilitate addition of a Fortran compiler
</span>---
 src/port1.0/portconfigure.tcl | 116 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 115 insertions(+), 1 deletion(-)

<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 c066951..31b84db 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;'>@@ -125,6 +125,13 @@ proc portconfigure::configure_get_cxx_stdlib {} {
</span> 
 # ********** END C++ / OBJECTIVE-C++ **********
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# ********** Begin Fortran **********
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+options                            \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    compiler.require_fortran       \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    compiler.fortran_fallback
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default compiler.require_fortran      no
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default compiler.fortran_fallback    {[portconfigure::get_fortran_fallback]}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# ********** End Fortran **********
</span> 
 # define options
 commands configure autoreconf automake autoconf xmkmf
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -590,6 +597,34 @@ proc portconfigure::configure_get_default_compiler {} {
</span>     return [lindex [option compiler.fallback] 0]
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# internal function to determine the Fortran compiler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc portconfigure::configure_get_fortran_compiler {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global configure.compiler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set compiler [subst ${configure.compiler}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[portconfigure::configure_get_compiler fc ${compiler}] ne ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return ${compiler}
</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 search_list [option compiler.fortran_fallback]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach compiler $search_list {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set allowed yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach pattern [option compiler.blacklist] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[string match $pattern $compiler]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set allowed no
</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 {$allowed &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ([file executable [configure_get_compiler fc $compiler]] ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             [compiler_is_port $compiler])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } then {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            return $compiler
</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;'>+    ui_warn "All Fortran compilers are either blacklisted or unavailable; defaulting to first fallback option"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return [lindex [option compiler.fortran_fallback] 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> #
 # internal utility procedure to get a version larger than any compiler version
 proc portconfigure::max_compiler_version {} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -755,6 +790,40 @@ proc portconfigure::get_min_gcc {} {
</span>     }
     return [lindex [lsort -decreasing -command vercmp ${min_values}] 0]
 }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# utility procedure: get minimum Gfortran version based on restrictions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc portconfigure::get_min_gfortran {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global compiler.openmp_version compiler.thread_local_storage
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set min_values 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[vercmp ${compiler.openmp_version} 4.5] >= 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        lappend min_values 8.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } elseif {[vercmp ${compiler.openmp_version} 4.0] >= 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        lappend min_values 4.9
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } elseif {[vercmp ${compiler.openmp_version} 3.1] >= 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        lappend min_values 4.7
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } elseif {[vercmp ${compiler.openmp_version} 3.0] >= 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        lappend min_values 4.4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } elseif {[vercmp ${compiler.openmp_version} 2.5] >= 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        lappend min_values 4.4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {${compiler.thread_local_storage}} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # GCC emulates thread-local storage, but it seems to be broken on older versions of GCC
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        lappend min_values 4.5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return [lindex [lsort -decreasing -command vercmp ${min_values}] 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 portconfigure::g95_ok {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global compiler.openmp_version os.platform xcodeversion
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {${os.platform} eq "darwin" && ([vercmp $xcodeversion 9.0] > 0)} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # see https://github.com/macports/macports-ports/commit/6b905efc9d5586366ac498ed78d6ac51c120d33f
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return no
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {${compiler.openmp_version} ne ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # G95 does not support OpenMP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return no
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span> # utility procedure: get Apple compilers based on Xcode version
 proc portconfigure::get_apple_compilers_xcode_version {} {
     global xcodeversion
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -969,6 +1038,32 @@ proc portconfigure::get_compiler_fallback {} {
</span>         return $mpi_compilers
     }
 }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc portconfigure::get_fortran_fallback {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set compilers ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach c [portconfigure::get_gcc_compilers] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set v    [lindex [split $c -] 2]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set vmin [join [lrange [split [portconfigure::get_min_gfortran] .] 0 0] .]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[vercmp ${vmin} $v] <= 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lappend compilers $c
</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 {[portconfigure::g95_ok]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        lappend compilers macports-g95
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # generate list of MPI wrappers of current compilers
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[option compiler.mpi] eq ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return $compilers
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set mpi_compilers ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach mpi [option compiler.mpi] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            foreach c ${compilers} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                lappend mpi_compilers {*}[portconfigure::get_mpi_wrapper $mpi $c]
</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 $mpi_compilers
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span> 
 # Find a developer tool
 proc portconfigure::find_developer_tool {name} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -998,7 +1093,20 @@ proc portconfigure::find_developer_tool {name} {
</span> proc portconfigure::configure_get_compiler {type {compiler {}}} {
     global configure.compiler prefix
     if {$compiler eq ""} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        set compiler ${configure.compiler}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[option compiler.require_fortran]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            switch $type {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                fc   -
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                f77  -
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                f90  {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set compiler [portconfigure::configure_get_fortran_compiler]
</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 compiler ${configure.compiler}
</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;'>+            set compiler ${configure.compiler}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span>     }
     # Tcl 8.4's switch doesn't support -matchvar.
     if {[regexp {^apple-gcc(-4\.[02])$} $compiler -> suffix]} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1167,6 +1275,12 @@ proc portconfigure::add_automatic_compiler_dependencies {} {
</span>         ui_debug "Chosen compiler ${compiler} is provided by a port, adding dependency"
         portconfigure::add_compiler_port_dependencies ${compiler}
     }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[option compiler.require_fortran] && [portconfigure::configure_get_compiler fc ${compiler}] eq ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Fortran is required, but compiler does not provide it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_debug "Adding Fortran compiler dependency"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        portconfigure::add_compiler_port_dependencies [portconfigure::configure_get_fortran_compiler]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span> }
 # Register the above procedure as a callback after Portfile evaluation
 port::register_callback portconfigure::add_automatic_compiler_dependencies
</pre><pre style='margin:0'>

</pre>