<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>