source: trunk/base/src/port1.0/portconfigure.tcl @ 89359

Last change on this file since 89359 was 89359, checked in by jberry@…, 6 years ago

Guard search for xcrun inside catch clause; see #32890.
If xcrun is not present (Xcode 2.x, apparently), then
this allows us to fall-back to a conventional compiler
location rather than failing outright due to a lack of
xcrun.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 32.9 KB
Line 
1# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:filetype=tcl:et:sw=4:ts=4:sts=4
2# portconfigure.tcl
3# $Id: portconfigure.tcl 89359 2012-01-26 20:01:52Z jberry@macports.org $
4#
5# Copyright (c) 2007 - 2011 The MacPorts Project
6# Copyright (c) 2007 Markus W. Weissmann <mww@macports.org>
7# Copyright (c) 2002 - 2003 Apple Inc.
8# All rights reserved.
9#
10# Redistribution and use in source and binary forms, with or without
11# modification, are permitted provided that the following conditions
12# are met:
13# 1. Redistributions of source code must retain the above copyright
14#    notice, this list of conditions and the following disclaimer.
15# 2. Redistributions in binary form must reproduce the above copyright
16#    notice, this list of conditions and the following disclaimer in the
17#    documentation and/or other materials provided with the distribution.
18# 3. Neither the name of Apple Inc. nor the names of its contributors
19#    may be used to endorse or promote products derived from this software
20#    without specific prior written permission.
21#
22# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32# POSSIBILITY OF SUCH DAMAGE.
33#
34
35package provide portconfigure 1.0
36package require portutil 1.0
37
38set org.macports.configure [target_new org.macports.configure portconfigure::configure_main]
39target_provides ${org.macports.configure} configure
40target_requires ${org.macports.configure} main fetch checksum extract patch
41target_prerun ${org.macports.configure} portconfigure::configure_start
42
43namespace eval portconfigure {
44}
45
46# define options
47commands configure autoreconf automake autoconf xmkmf
48# defaults
49default configure.env       ""
50default configure.pre_args  {--prefix=${prefix}}
51default configure.cmd       ./configure
52default configure.nice      {${buildnicevalue}}
53default configure.dir       {${worksrcpath}}
54default autoreconf.dir      {${worksrcpath}}
55default autoreconf.pre_args {--install}
56default autoconf.dir        {${worksrcpath}}
57default automake.dir        {${worksrcpath}}
58default xmkmf.cmd           xmkmf
59default xmkmf.dir           {${worksrcpath}}
60default use_configure       yes
61
62option_proc use_autoreconf  portconfigure::set_configure_type
63option_proc use_automake    portconfigure::set_configure_type
64option_proc use_autoconf    portconfigure::set_configure_type
65option_proc use_xmkmf       portconfigure::set_configure_type
66
67option_proc autoreconf.cmd  portconfigure::set_configure_type
68option_proc automake.cmd    portconfigure::set_configure_type
69option_proc autoconf.cmd    portconfigure::set_configure_type
70option_proc xmkmf.cmd       portconfigure::set_configure_type
71
72##
73# Local helper proc
74proc portconfigure::add_build_dep { type dep } {
75    global ${type}.cmd option_defaults
76
77    if {![info exists ${type}.cmd] || (
78        ([info exists option_defaults(${type}.cmd)] && [set ${type}.cmd] == $option_defaults(${type}.cmd)) ||
79        (![info exists option_defaults(${type}.cmd)] && [set ${type}.cmd] == "${type}")
80        )} {
81            eval depends_build-append $dep
82    }
83}
84
85##
86# Adds dependencies for the binaries which will be called, but only if it is
87# the default. If .cmd was overwritten the port has to care for deps itself.
88proc portconfigure::set_configure_type {option action args} {
89    global autoreconf.cmd automake.cmd autoconf.cmd xmkmf.cmd
90
91    array set configure_map {
92        autoconf    {port:autoconf port:automake port:libtool}
93        xmkmf       port:imake
94    }
95
96    if {[string equal ${action} "set"]} {
97        switch $option {
98            autoreconf.cmd  -
99            automake.cmd    -
100            autoconf.cmd {
101                eval depends_build-delete $configure_map(autoconf)
102            }
103            xmkmf.cmd {
104                depends_build-delete $configure_map(xmkmf)
105            }
106            use_xmkmf {
107                if {[tbool args]} {
108                    depends_build-append $configure_map(xmkmf)
109                }
110            }
111            default {
112                # strip "use_"
113                set type [string range $option 4 end]
114                if {[tbool args]} {
115                    add_build_dep $type $configure_map(autoconf)
116                }
117            }
118        }
119    }
120}
121
122options configure.asroot
123default configure.asroot no
124
125# Configure special environment variables.
126# We could have m32/m64/march/mtune be global configurable at some point.
127options configure.m32 configure.m64 configure.march configure.mtune
128default configure.march     {}
129default configure.mtune     {}
130# We could have debug/optimizations be global configurable at some point.
131options configure.optflags configure.cflags configure.cppflags configure.cxxflags configure.objcflags configure.ldflags configure.libs configure.fflags configure.f90flags configure.fcflags configure.classpath
132default configure.optflags  {-O2}
133# compiler flags section
134default configure.cflags    {${configure.optflags}}
135default configure.cppflags  {-I${prefix}/include}
136default configure.cxxflags  {${configure.optflags}}
137default configure.objcflags {${configure.optflags}}
138default configure.ldflags   {-L${prefix}/lib}
139default configure.libs      {}
140default configure.fflags    {${configure.optflags}}
141default configure.f90flags  {${configure.optflags}}
142default configure.fcflags   {${configure.optflags}}
143default configure.classpath {}
144
145# tools section
146options configure.perl configure.python configure.ruby configure.install configure.awk configure.bison configure.pkg_config configure.pkg_config_path
147default configure.perl              {}
148default configure.python            {}
149default configure.ruby              {}
150default configure.install           {${portutil::autoconf::install_command}}
151default configure.awk               {}
152default configure.bison             {}
153default configure.pkg_config        {}
154default configure.pkg_config_path   {}
155
156options configure.build_arch configure.ld_archflags configure.sdkroot
157default configure.build_arch {[portconfigure::choose_supported_archs ${build_arch}]}
158default configure.ld_archflags {[portconfigure::configure_get_ld_archflags]}
159default configure.sdkroot {[portconfigure::configure_get_sdkroot]}
160foreach tool {cc cxx objc f77 f90 fc} {
161    options configure.${tool}_archflags
162    default configure.${tool}_archflags  "\[portconfigure::configure_get_archflags $tool\]"
163}
164
165options configure.universal_archs configure.universal_args configure.universal_cflags configure.universal_cppflags configure.universal_cxxflags configure.universal_ldflags
166default configure.universal_archs       {[portconfigure::choose_supported_archs ${universal_archs}]}
167default configure.universal_args        {--disable-dependency-tracking}
168default configure.universal_cflags      {[portconfigure::configure_get_universal_cflags]}
169default configure.universal_cppflags    {}
170default configure.universal_cxxflags    {[portconfigure::configure_get_universal_cflags]}
171default configure.universal_ldflags     {[portconfigure::configure_get_universal_ldflags]}
172
173# Select a distinct compiler (C, C preprocessor, C++)
174options configure.ccache configure.distcc configure.pipe configure.cc \
175        configure.cxx configure.cpp configure.objc configure.f77 \
176        configure.f90 configure.fc configure.javac configure.compiler \
177        compiler.blacklist compiler.whitelist compiler.fallback
178default configure.ccache        {${configureccache}}
179default configure.distcc        {${configuredistcc}}
180default configure.pipe          {${configurepipe}}
181default configure.cc            {[portconfigure::configure_get_compiler cc]}
182default configure.cxx           {[portconfigure::configure_get_compiler cxx]}
183default configure.cpp           {[portconfigure::configure_get_compiler cpp]}
184default configure.objc          {[portconfigure::configure_get_compiler objc]}
185default configure.f77           {[portconfigure::configure_get_compiler f77]}
186default configure.f90           {[portconfigure::configure_get_compiler f90]}
187default configure.fc            {[portconfigure::configure_get_compiler fc]}
188default configure.javac         {[portconfigure::configure_get_compiler javac]}
189default configure.compiler      {[portconfigure::configure_get_default_compiler]}
190default compiler.fallback       {[portconfigure::get_compiler_fallback]}
191default compiler.blacklist      {}
192default compiler.whitelist      {}
193
194set_ui_prefix
195
196proc portconfigure::configure_start {args} {
197    global UI_PREFIX configure.compiler
198   
199    ui_notice "$UI_PREFIX [format [msgcat::mc "Configuring %s"] [option subport]]"
200
201    set name ""
202    switch -exact ${configure.compiler} {
203        cc { set name "System cc" }
204        gcc { set name "System gcc" }
205        gcc-3.3 { set name "Mac OS X gcc 3.3" }
206        gcc-4.0 { set name "Mac OS X gcc 4.0" }
207        gcc-4.2 { set name "Mac OS X gcc 4.2" }
208        llvm-gcc-4.2 { set name "Mac OS X llvm-gcc 4.2" }
209        clang { set name "Mac OS X clang" }
210        apple-gcc-4.0 { set name "MacPorts Apple gcc 4.0" }
211        apple-gcc-4.2 { set name "MacPorts Apple gcc 4.2" }
212        macports-gcc     { set name "MacPorts gcc (port select)" }
213        macports-gcc-4.0 { set name "MacPorts gcc 4.0" }
214        macports-gcc-4.1 { set name "MacPorts gcc 4.1" }
215        macports-gcc-4.2 { set name "MacPorts gcc 4.2" }
216        macports-gcc-4.3 { set name "MacPorts gcc 4.3" }
217        macports-gcc-4.4 { set name "MacPorts gcc 4.4" }
218        macports-gcc-4.5 { set name "MacPorts gcc 4.5" }
219        macports-gcc-4.6 { set name "MacPorts gcc 4.6" }
220        macports-llvm-gcc-4.2 { set name "MacPorts llvm-gcc 4.2" }
221        macports-clang { set name "MacPorts clang (port select)" }
222        macports-clang-2.9 { set name "MacPorts clang 2.9" }
223        macports-clang-3.0 { set name "MacPorts clang 3.0" }
224        macports-clang-3.1 { set name "MacPorts clang 3.1" }
225        default { return -code error "Invalid value for configure.compiler" }
226    }
227    ui_debug "Using compiler '$name'"
228
229    # Additional ccache directory setup
230    global configureccache ccache_dir ccache_size macportsuser
231    if {${configureccache}} {
232        elevateToRoot "configure ccache"
233        if [catch {
234                file mkdir ${ccache_dir}
235                file attributes ${ccache_dir} -owner ${macportsuser} -permissions 0755
236                exec ccache -M ${ccache_size} >/dev/null
237            } result] {
238            ui_warn "ccache_dir ${ccache_dir} could not be initialized; disabling ccache: $result"
239            set configureccache no
240        }
241        dropPrivileges
242    }
243}
244
245# internal function to choose the default configure.build_arch and
246# configure.universal_archs based on supported_archs and build_arch or
247# universal_archs
248proc portconfigure::choose_supported_archs {archs} {
249    global supported_archs
250    if {$supported_archs == ""} {
251        return $archs
252    }
253    set ret {}
254    foreach arch $archs {
255        if {[lsearch -exact $supported_archs $arch] != -1} {
256            set add_arch $arch
257        } elseif {$arch == "x86_64" && [lsearch -exact $supported_archs "i386"] != -1} {
258            set add_arch "i386"
259        } elseif {$arch == "ppc64" && [lsearch -exact $supported_archs "ppc"] != -1} {
260            set add_arch "ppc"
261        } else {
262            continue
263        }
264        if {[lsearch -exact $ret $add_arch] == -1} {
265            lappend ret $add_arch
266        }
267    }
268    return $ret
269}
270
271# internal function to determine the compiler flags to select an arch
272proc portconfigure::configure_get_archflags {tool} {
273    global configure.build_arch configure.m32 configure.m64 configure.compiler
274    set flags ""
275    if {[tbool configure.m64]} {
276        set flags "-m64"
277    } elseif {[tbool configure.m32]} {
278        set flags "-m32"
279    } elseif {${configure.build_arch} != ""} {
280        if {[arch_flag_supported] && ($tool == "cc" || $tool == "cxx" || $tool == "objc")} {
281            set flags "-arch ${configure.build_arch}"
282        } elseif {${configure.build_arch} == "x86_64" || ${configure.build_arch} == "ppc64"} {
283            set flags "-m64"
284        } elseif {${configure.compiler} != "gcc-3.3"} {
285            set flags "-m32"
286        }
287    }
288    return $flags
289}
290
291# internal function to determine the ld flags to select an arch
292# Unfortunately there's no consistent way to do this when the compiler
293# doesn't support -arch, because it could be used to link rather than using
294# ld directly. So we punt and let portfiles deal with that case.
295proc portconfigure::configure_get_ld_archflags {args} {
296    global configure.build_arch
297    if {${configure.build_arch} != "" && [arch_flag_supported]} {
298        return "-arch ${configure.build_arch}"
299    } else {
300        return ""
301    }
302}
303
304proc portconfigure::configure_get_sdkroot {} {
305    global developer_dir macosx_deployment_target macosx_version os.arch os.platform
306    if {${os.platform} == "darwin" && ($macosx_deployment_target != $macosx_version
307        || (${os.arch} == "powerpc" && $macosx_version == "10.4" && [variant_exists universal] && [variant_isset universal]))} {
308        if {$macosx_deployment_target == "10.4"} {
309            set sdk "${developer_dir}/SDKs/MacOSX10.4u.sdk"
310        } else {
311            set sdk "${developer_dir}/SDKs/MacOSX${macosx_deployment_target}.sdk"
312        }
313        if {[file exists $sdk]} {
314            return $sdk
315        }
316    }
317    return ""
318}
319
320# internal function to determine the "-arch xy" flags for the compiler
321proc portconfigure::configure_get_universal_archflags {args} {
322    global configure.universal_archs
323    set flags ""
324    foreach arch ${configure.universal_archs} {
325        if {$flags == ""} {
326            set flags "-arch $arch"
327        } else {
328            append flags " -arch $arch"
329        }
330    }
331    return $flags
332}
333
334# internal function to determine the CFLAGS for the compiler
335proc portconfigure::configure_get_universal_cflags {args} {
336    return [configure_get_universal_archflags]
337}
338
339# internal function to determine the LDFLAGS for the compiler
340proc portconfigure::configure_get_universal_ldflags {args} {
341    return [configure_get_universal_archflags]
342}
343
344# internal proc to determine if the compiler supports -arch
345proc portconfigure::arch_flag_supported {args} {
346    global configure.compiler
347    switch -exact ${configure.compiler} {
348        gcc-4.0 -
349        gcc-4.2 -
350        llvm-gcc-4.2 -
351        clang -
352        apple-gcc-4.0 -
353        apple-gcc-4.2 -
354        macports-clang {
355            return yes
356        }
357        default {
358            return no
359        }
360    }
361}
362
363# check if a compiler comes from a port
364proc portconfigure::compiler_is_port {compiler} {
365    switch $compiler {
366        clang -
367        llvm-gcc-4.2 -
368        gcc-4.2 -
369        gcc-4.0 -
370        gcc-3.3 {return no}
371        default {return yes}
372    }
373}
374
375# maps compiler names to the port that provides them
376array set portconfigure::compiler_name_map {
377        apple-gcc-4.0           apple-gcc40
378        apple-gcc-4.2           apple-gcc42
379        macports-gcc-4.2        gcc42
380        macports-gcc-4.3        gcc43
381        macports-gcc-4.4        gcc44
382        macports-gcc-4.5        gcc45
383        macports-gcc-4.6        gcc46
384        macports-llvm-gcc-4.2   llvm-gcc42
385        macports-clang-2.9      clang-2.9
386        macports-clang-3.0      clang-3.0
387        macports-clang-3.1      clang-3.1
388}
389
390# internal function to determine the default compiler
391proc portconfigure::configure_get_default_compiler {args} {
392    global compiler.blacklist compiler.whitelist compiler.fallback
393    if {${compiler.whitelist} != {}} {
394        set search_list ${compiler.whitelist}
395    } else {
396        set search_list ${compiler.fallback}
397    }
398    foreach compiler $search_list {
399        if {[lsearch -exact ${compiler.blacklist} $compiler] == -1} {
400            if {[file executable [configure_get_compiler cc $compiler]] 
401                || [compiler_is_port $compiler]} {
402                return $compiler
403            }
404        }
405    }
406    ui_warn "All compilers are either blacklisted or unavailable; using first fallback entry as last resort"
407    return [lindex ${compiler.fallback} 0]
408}
409
410# internal function to choose compiler fallback list based on platform
411proc portconfigure::get_compiler_fallback {} {
412    global xcodeversion macosx_deployment_target
413    if {$xcodeversion == "none" || $xcodeversion == ""} {
414        return {cc}
415    } elseif {[vercmp $xcodeversion 4.2] >= 0} {
416        return {clang llvm-gcc-4.2 apple-gcc-4.2}
417    } elseif {[vercmp $xcodeversion 4.0] >= 0} {
418        return {llvm-gcc-4.2 clang gcc-4.2}
419    } elseif {[vercmp $xcodeversion 3.2] >= 0 && $macosx_deployment_target != "10.4"} {
420        return {gcc-4.2 clang llvm-gcc-4.2 gcc-4.0 apple-gcc-4.0}
421    } elseif {$macosx_deployment_target != "10.4"} {
422        return {gcc-4.0 gcc-4.2 llvm-gcc-4.2 gcc-3.3 apple-gcc-4.0}
423    } else {
424        return {gcc-4.0 gcc-3.3 apple-gcc-4.0}
425    }
426}
427
428# Find a developer tool
429proc portconfigure::find_developer_tool {name} {
430        global developer_dir
431       
432        # Use xcode's xcrun to find the named tool.
433        if {[catch {set toolpath [exec [findBinary xcrun $portutil::autoconf::xcrun_path] -find ${name}]} result] == 0} {
434                return ${toolpath}
435        }
436       
437        # If xcrun failed to find the tool, return a path from
438        # the developer_dir, falling back to /usr/bin.
439        # The tool may not be there, but we'll leave it up to
440        # the invoking code to figure out that it doesn't have
441        # a valid compiler
442        set toolpath ""
443        foreach path "${developer_dir}/usr/bin /usr/bin" {
444                set toolpath "${path}/${name}"
445                if {[file executable $toolpath]} {
446                        break
447                }
448        }
449        return $toolpath
450}
451
452# internal function to find correct compilers
453proc portconfigure::configure_get_compiler {type {compiler {}}} {
454    global configure.compiler prefix
455    set ret ""
456    if {$compiler == {}} {
457        set compiler ${configure.compiler}
458    }
459    switch -exact ${compiler} {
460        cc {
461            switch -exact ${type} {
462                cc   { set ret [find_developer_tool cc] }
463                objc { set ret [find_developer_tool cc] }
464                cxx  { set ret [find_developer_tool c++] }
465                cpp  { set ret [find_developer_tool cpp] }
466            }
467        }
468        gcc {
469            switch -exact ${type} {
470                cc   { set ret [find_developer_tool gcc] }
471                objc { set ret [find_developer_tool gcc] }
472                cxx  { set ret [find_developer_tool g++] }
473                cpp  { set ret [find_developer_tool cpp] }
474            }
475        }
476        gcc-3.3 {
477            switch -exact ${type} {
478                cc   { set ret [find_developer_tool gcc-3.3] }
479                objc { set ret [find_developer_tool gcc-3.3] }
480                cxx  { set ret [find_developer_tool g++-3.3] }
481                cpp  { set ret [find_developer_tool cpp-3.3] }
482            }
483        }
484        gcc-4.0 {
485            switch -exact ${type} {
486                cc   { set ret [find_developer_tool gcc-4.0] }
487                objc { set ret [find_developer_tool gcc-4.0] }
488                cxx  { set ret [find_developer_tool g++-4.0] }
489                cpp  { set ret [find_developer_tool cpp-4.0] }
490            }
491        }
492        gcc-4.2 {
493            switch -exact ${type} {
494                cc   { set ret [find_developer_tool gcc-4.2] }
495                objc { set ret [find_developer_tool gcc-4.2] }
496                cxx  { set ret [find_developer_tool g++-4.2] }
497                cpp  { set ret [find_developer_tool cpp-4.2] }
498            }
499        }
500        llvm-gcc-4.2 {
501            switch -exact ${type} {
502                cc   { set ret [find_developer_tool llvm-gcc-4.2] }
503                objc { set ret [find_developer_tool llvm-gcc-4.2] }
504                cxx  { set ret [find_developer_tool llvm-g++-4.2] }
505                cpp  { set ret [find_developer_tool llvm-cpp-4.2] }
506            }
507        }
508        clang {
509            switch -exact ${type} {
510                cc   { set ret [find_developer_tool clang] }
511                objc { set ret [find_developer_tool clang] }
512                cxx  {
513                                        set clangpp [find_developer_tool clang++]
514                    if {[file executable ${clangpp}]} {
515                        set ret ${clangpp}
516                    } else {
517                        set ret [find_developer_tool llvm-g++-4.2]
518                    }
519                }
520            }
521        }
522        apple-gcc-4.0 {
523            switch -exact ${type} {
524                cc   { set ret ${prefix}/bin/gcc-apple-4.0 }
525                objc { set ret ${prefix}/bin/gcc-apple-4.0 }
526                cpp  { set ret ${prefix}/bin/cpp-apple-4.0 }
527            }
528        }
529        apple-gcc-4.2 {
530            switch -exact ${type} {
531                cc   { set ret ${prefix}/bin/gcc-apple-4.2 }
532                objc { set ret ${prefix}/bin/gcc-apple-4.2 }
533                cpp  { set ret ${prefix}/bin/cpp-apple-4.2 }
534                cxx  { set ret ${prefix}/bin/g++-apple-4.2 }
535            }
536        }
537        macports-gcc {
538            switch -exact ${type} {
539                cc   { set ret ${prefix}/bin/gcc }
540                objc { set ret ${prefix}/bin/gcc }
541                cxx  { set ret ${prefix}/bin/g++ }
542                cpp  { set ret ${prefix}/bin/cpp }
543                fc   { set ret ${prefix}/bin/gfortran }
544                f77  { set ret ${prefix}/bin/gfortran }
545                f90  { set ret ${prefix}/bin/gfortran }
546            }
547        }
548        macports-gcc-4.0 {
549            switch -exact ${type} {
550                cc   { set ret ${prefix}/bin/gcc-mp-4.0 }
551                objc { set ret ${prefix}/bin/gcc-mp-4.0 }
552                cxx  { set ret ${prefix}/bin/g++-mp-4.0 }
553                cpp  { set ret ${prefix}/bin/cpp-mp-4.0 }
554                fc   { set ret ${prefix}/bin/gfortran-mp-4.0 }
555                f77  { set ret ${prefix}/bin/gfortran-mp-4.0 }
556                f90  { set ret ${prefix}/bin/gfortran-mp-4.0 }
557            }
558        }
559        macports-gcc-4.1 {
560            switch -exact ${type} {
561                cc   { set ret ${prefix}/bin/gcc-mp-4.1 }
562                objc { set ret ${prefix}/bin/gcc-mp-4.1 }
563                cxx  { set ret ${prefix}/bin/g++-mp-4.1 }
564                cpp  { set ret ${prefix}/bin/cpp-mp-4.1 }
565                fc   { set ret ${prefix}/bin/gfortran-mp-4.1 }
566                f77  { set ret ${prefix}/bin/gfortran-mp-4.1 }
567                f90  { set ret ${prefix}/bin/gfortran-mp-4.1 }
568            }
569        }
570        macports-gcc-4.2 {
571            switch -exact ${type} {
572                cc   { set ret ${prefix}/bin/gcc-mp-4.2 }
573                objc { set ret ${prefix}/bin/gcc-mp-4.2 }
574                cxx  { set ret ${prefix}/bin/g++-mp-4.2 }
575                cpp  { set ret ${prefix}/bin/cpp-mp-4.2 }
576                fc   { set ret ${prefix}/bin/gfortran-mp-4.2 }
577                f77  { set ret ${prefix}/bin/gfortran-mp-4.2 }
578                f90  { set ret ${prefix}/bin/gfortran-mp-4.2 }
579            }
580        }
581        macports-gcc-4.3 {
582            switch -exact ${type} {
583                cc   { set ret ${prefix}/bin/gcc-mp-4.3 }
584                objc { set ret ${prefix}/bin/gcc-mp-4.3 }
585                cxx  { set ret ${prefix}/bin/g++-mp-4.3 }
586                cpp  { set ret ${prefix}/bin/cpp-mp-4.3 }
587                fc   { set ret ${prefix}/bin/gfortran-mp-4.3 }
588                f77  { set ret ${prefix}/bin/gfortran-mp-4.3 }
589                f90  { set ret ${prefix}/bin/gfortran-mp-4.3 }
590            }
591        }
592        macports-gcc-4.4 {
593            switch -exact ${type} {
594                cc   { set ret ${prefix}/bin/gcc-mp-4.4 }
595                objc { set ret ${prefix}/bin/gcc-mp-4.4 }
596                cxx  { set ret ${prefix}/bin/g++-mp-4.4 }
597                cpp  { set ret ${prefix}/bin/cpp-mp-4.4 }
598                fc   { set ret ${prefix}/bin/gfortran-mp-4.4 }
599                f77  { set ret ${prefix}/bin/gfortran-mp-4.4 }
600                f90  { set ret ${prefix}/bin/gfortran-mp-4.4 }
601            }
602        }
603        macports-gcc-4.5 {
604            switch -exact ${type} {
605                cc   { set ret ${prefix}/bin/gcc-mp-4.5 }
606                objc { set ret ${prefix}/bin/gcc-mp-4.5 }
607                cxx  { set ret ${prefix}/bin/g++-mp-4.5 }
608                cpp  { set ret ${prefix}/bin/cpp-mp-4.5 }
609                fc   { set ret ${prefix}/bin/gfortran-mp-4.5 }
610                f77  { set ret ${prefix}/bin/gfortran-mp-4.5 }
611                f90  { set ret ${prefix}/bin/gfortran-mp-4.5 }
612            }
613        }
614        macports-gcc-4.6 {
615            switch -exact ${type} {
616                cc   { set ret ${prefix}/bin/gcc-mp-4.6 }
617                objc { set ret ${prefix}/bin/gcc-mp-4.6 }
618                cxx  { set ret ${prefix}/bin/g++-mp-4.6 }
619                cpp  { set ret ${prefix}/bin/cpp-mp-4.6 }
620                fc   { set ret ${prefix}/bin/gfortran-mp-4.6 }
621                f77  { set ret ${prefix}/bin/gfortran-mp-4.6 }
622                f90  { set ret ${prefix}/bin/gfortran-mp-4.6 }
623            }
624        }
625        macports-llvm-gcc-4.2 {
626            switch -exact ${type} {
627                cc   { set ret ${prefix}/bin/llvm-gcc-4.2 }
628                objc { set ret ${prefix}/bin/llvm-gcc-4.2 }
629                cxx  { set ret ${prefix}/bin/llvm-g++-4.2 }
630                cpp  { set ret ${prefix}/bin/llvm-cpp-4.2 }
631                fc   { set ret ${prefix}/bin/llvm-gfortran-4.2 }
632                f77  { set ret ${prefix}/bin/llvm-gfortran-4.2 }
633                f90  { set ret ${prefix}/bin/llvm-gfortran-4.2 }
634            }
635        }
636        macports-clang {
637            switch -exact ${type} {
638                cc   { set ret ${prefix}/bin/clang }
639                objc { set ret ${prefix}/bin/clang }
640                cxx  { set ret ${prefix}/bin/clang++ }
641            }
642        }
643        macports-clang-2.9 {
644            switch -exact ${type} {
645                cc   { set ret ${prefix}/bin/clang-mp-2.9 }
646                objc { set ret ${prefix}/bin/clang-mp-2.9 }
647                cxx  { set ret ${prefix}/bin/clang++-mp-2.9 }
648            }
649        }
650        macports-clang-3.0 {
651            switch -exact ${type} {
652                cc   { set ret ${prefix}/bin/clang-mp-3.0 }
653                objc { set ret ${prefix}/bin/clang-mp-3.0 }
654                cxx  { set ret ${prefix}/bin/clang++-mp-3.0 }
655            }
656        }
657        macports-clang-3.1 {
658            switch -exact ${type} {
659                cc   { set ret ${prefix}/bin/clang-mp-3.1 }
660                objc { set ret ${prefix}/bin/clang-mp-3.1 }
661                cxx  { set ret ${prefix}/bin/clang++-mp-3.1 }
662            }
663        }
664    }
665    return $ret
666}
667
668proc portconfigure::configure_main {args} {
669    global [info globals]
670    global worksrcpath use_configure use_autoreconf use_autoconf use_automake use_xmkmf
671    global configure.env configure.pipe configure.libs configure.classpath configure.universal_args
672    global configure.perl configure.python configure.ruby configure.install configure.awk configure.bison configure.pkg_config configure.pkg_config_path
673    global configure.ccache configure.distcc configure.cpp configure.javac configure.march configure.mtune configure.sdkroot
674    foreach tool {cc cxx objc f77 f90 fc ld} {
675        global configure.${tool} configure.${tool}_archflags
676    }
677    foreach flags {cflags cppflags cxxflags objcflags ldflags fflags f90flags fcflags} {
678        global configure.${flags} configure.universal_${flags}
679    }
680   
681    if {[tbool use_autoreconf]} {
682        if {[catch {command_exec autoreconf} result]} {
683            return -code error "[format [msgcat::mc "%s failure: %s"] autoreconf $result]"
684        }
685    }
686   
687    if {[tbool use_automake]} {
688        if {[catch {command_exec automake} result]} {
689            return -code error "[format [msgcat::mc "%s failure: %s"] automake $result]"
690        }
691    }
692   
693    if {[tbool use_autoconf]} {
694        if {[catch {command_exec autoconf} result]} {
695            return -code error "[format [msgcat::mc "%s failure: %s"] autoconf $result]"
696        }
697    }
698
699    if {[tbool use_xmkmf]} {
700        if {[catch {command_exec xmkmf} result]} {
701            return -code error "[format [msgcat::mc "%s failure: %s"] xmkmf $result]"
702        } else {
703            # XXX should probably use make command abstraction but we know that
704            # X11 will already set things up so that "make Makefiles" always works.
705            system "cd ${worksrcpath} && make Makefiles"
706        }
707    } elseif {[tbool use_configure]} {
708        # Merge (ld|c|cpp|cxx)flags into the environment variable.
709        parse_environment configure
710
711        # Set pre-compiler filter to use (ccache/distcc), if any.
712        if {[tbool configure.ccache] && [tbool configure.distcc]} {
713            set filter "ccache "
714            append_list_to_environment_value configure "CCACHE_PREFIX" "distcc"
715        } elseif {[tbool configure.ccache]} {
716            set filter "ccache "
717        } elseif {[tbool configure.distcc]} {
718            set filter "distcc "
719        } else {
720            set filter ""
721        }
722       
723        # Set flags controlling the kind of compiler output.
724        if {[tbool configure.pipe]} {
725            set output "-pipe "
726        } else {
727            set output ""
728        }
729
730        # Append configure flags.
731        append_list_to_environment_value configure "CC" ${filter}${configure.cc}
732        append_list_to_environment_value configure "CXX" ${filter}${configure.cxx}
733        append_list_to_environment_value configure "OBJC" ${filter}${configure.objc}
734        append_list_to_environment_value configure "FC" ${configure.fc}
735        append_list_to_environment_value configure "F77" ${configure.f77}
736        append_list_to_environment_value configure "F90" ${configure.f90}
737        append_list_to_environment_value configure "JAVAC" ${configure.javac}
738        append_list_to_environment_value configure "CFLAGS" ${output}${configure.cflags}
739        append_list_to_environment_value configure "CPPFLAGS" ${configure.cppflags}
740        append_list_to_environment_value configure "CXXFLAGS" ${output}${configure.cxxflags}
741        append_list_to_environment_value configure "OBJCFLAGS" ${output}${configure.objcflags}
742        append_list_to_environment_value configure "LDFLAGS" ${configure.ldflags}
743        append_list_to_environment_value configure "LIBS" ${configure.libs}
744        append_list_to_environment_value configure "FFLAGS" ${output}${configure.fflags}
745        append_list_to_environment_value configure "F90FLAGS" ${output}${configure.f90flags}
746        append_list_to_environment_value configure "FCFLAGS" ${output}${configure.fcflags}
747        append_list_to_environment_value configure "CLASSPATH" ${configure.classpath}
748        append_list_to_environment_value configure "PERL" ${configure.perl}
749        append_list_to_environment_value configure "PYTHON" ${configure.python}
750        append_list_to_environment_value configure "RUBY" ${configure.ruby}
751        append_list_to_environment_value configure "INSTALL" ${configure.install}
752        append_list_to_environment_value configure "AWK" ${configure.awk}
753        append_list_to_environment_value configure "BISON" ${configure.bison}
754        append_list_to_environment_value configure "PKG_CONFIG" ${configure.pkg_config}
755        append_list_to_environment_value configure "PKG_CONFIG_PATH" ${configure.pkg_config_path}
756
757        # add SDK flags if cross-compiling (or universal on ppc tiger)
758        if {${configure.sdkroot} != ""} {
759            foreach flags {CPPFLAGS CFLAGS CXXFLAGS OBJCFLAGS} {
760                append_list_to_environment_value configure $flags "-isysroot ${configure.sdkroot}"
761            }
762            append_list_to_environment_value configure "LDFLAGS" "-Wl,-syslibroot,${configure.sdkroot}"
763        }
764
765        # add extra flags that are conditional on whether we're building universal
766        if {[variant_exists universal] && [variant_isset universal]} {
767            foreach flags {CFLAGS OBJCFLAGS} {
768                append_list_to_environment_value configure $flags ${configure.universal_cflags}
769            }
770            append_list_to_environment_value configure "CXXFLAGS" ${configure.universal_cxxflags}
771            append_list_to_environment_value configure "CPPFLAGS" ${configure.universal_cppflags}
772            append_list_to_environment_value configure "LDFLAGS" ${configure.universal_ldflags}
773            eval configure.pre_args-append ${configure.universal_args}
774        } else {
775            foreach {tool flags} {cc CFLAGS cxx CXXFLAGS objc OBJCFLAGS f77 FFLAGS f90 F90FLAGS fc FCFLAGS ld LDFLAGS} {
776                append_list_to_environment_value configure $flags [set configure.${tool}_archflags]
777                if {${configure.march} != {}} {
778                    append_list_to_environment_value configure $flags "-march=${configure.march}"
779                }
780                if {${configure.mtune} != {}} {
781                    append_list_to_environment_value configure $flags "-mtune=${configure.mtune}"
782                }
783            }
784        }
785
786        # Execute the command (with the new environment).
787        if {[catch {command_exec configure} result]} {
788            return -code error "[format [msgcat::mc "%s failure: %s"] configure $result]"
789        }
790    }
791    return 0
792}
Note: See TracBrowser for help on using the repository browser.