[MacPorts] #38769: atlas: incorrect compiler checking code

MacPorts noreply at macports.org
Thu Apr 11 16:12:51 PDT 2013


#38769: atlas: incorrect compiler checking code
--------------------------+---------------------
 Reporter:  ryandesign@…  |      Owner:  vince@…
     Type:  defect        |     Status:  new
 Priority:  Normal        |  Milestone:
Component:  ports         |    Version:  2.1.3
 Keywords:                |       Port:  atlas
--------------------------+---------------------
 The atlas port includes this code in the global part of the portfile:

 {{{
 # Chose the right flags for GCC and Clang compilers

 if {${build_arch} == "i386" || ${build_arch} == "x86_64"} {

     # General flags
     # GCC
     set gcc_flags   "-fomit-frame-pointer -mfpmath=sse -O3\
                      -fno-schedule-insns2 -fPIC"

     # Clang
     if {${use_clang} == "32" || ${use_clang} == "XCode" } {

         pre-fetch {
             ui_warn "Compiling Atlas with this version of clang is\
                     likely *NOT* to work. Please use clang-3.3 or\
                     higher."
         }
         set clang_flags "-O3 -fomit-frame-pointer -fPIC"
     } else {

         # Clang 3.3 – Use loop and straight vectorizer
         set clang_flags "-O3 -fomit-frame-pointer -fPIC\
                          -fvectorize -fslp-vectorize"

     }
 }}}

 There are two problems with this.

 First, if compiling atlas with clang 3.2 will not work, then the
 +mpclang32 variant should be removed and macports-clang-3.2 should be
 added to compiler.blacklist (along with any other compilers with which
 atlas will not work). If compiling atlas with some versions of Xcode clang
 will not work, then the specific versions of Xcode clang with which it
 will not work should be blacklisted using the compiler_blacklist_versions
 portgroup as mentioned in #38768.

 Second, the more important issue is that the message will never actually
 be printed, because MacPorts does not execute code in the order in which
 you think it does. First, MacPorts executes all code in the global part of
 the portfile (i.e. code that's not within a phase or a variant). Then
 afterward, it executes the code in any selected variants. And within
 variants is where you're defining the use_clang variable. So at the point
 where the above code runs, use_clang is always empty (except when no
 compiler variant was selected and have_avx is yes, in which case use_clang
 is set to 33), so the message never prints. This also means the
 clang_flags aren't set the way you want them to be, for some clang
 versions.

 The same goes for the gcc_version variable. It's initialized to 0 in the
 global part of the portfile, then changed in the gcc4x variants, but it's
 checked in the global part of the portfile, before it's been set, so it
 will always be 0 when the following code runs (except when no compiler
 variant was selected and have_avx is no, in which case gcc_version is set
 to 47):

 {{{
 # Threading
 # If we run on a mono-processor machine (PPC), then disable threading

 if {![catch {sysctl hw.logicalcpu} result] && $result == 1} {

     configure.args-append    -t 0
     set no_threads  1
 } else {

     set no_threads  0

     # Threading relies on OpenMP if gcc compilers are selected
     if {${gcc_version} != 0} {

         configure.args-append   -Si omp 1
     }
 }
 }}}

 This means `-Si omp 1` won't be added to the configure.args in all of the
 situations where you want it to be. (Specifically, it won't be, if the
 user selects a gcc4x variant.)

 ------

 One solution could be to set the variables in the global part of the
 portfile instead of within a variant. For example, instead of doing this:

 {{{
 variant gcc48               conflicts   gcc46 gcc47 \
                                         clang mpclang32 mpclang33 \
                             description {build using macports-gcc-4.8} {

     depends_build-append    port:gcc48
     configure.compiler      macports-gcc-4.8

     set gcc_version         48
     set use_clang           ""
 }
 }}}

 Do this:

 {{{
 variant gcc48               conflicts   gcc46 gcc47 \
                                         clang mpclang32 mpclang33 \
                             description {build using macports-gcc-4.8} {

     depends_build-append    port:gcc48
     configure.compiler      macports-gcc-4.8
 }
 if {[variant_isset gcc48]} {
     set gcc_version         48
     set use_clang           ""
 }
 }}}

 You'll need to increase the port's revision when you make these changes so
 that things get rebuilt in the way you want them to be built.

-- 
Ticket URL: <https://trac.macports.org/ticket/38769>
MacPorts <http://www.macports.org/>
Ports system for OS X


More information about the macports-tickets mailing list