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

Last change on this file since 101498 was 101498, checked in by jeremyhu@…, 8 years ago

Update macports-llvm-gcc-4.2 to support -arch, no more fortran

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 34.8 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 101498 2013-01-11 22:43:45Z jeremyhu@macports.org $
4#
5# Copyright (c) 2007 - 2012 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.2 { set name "MacPorts gcc 4.2" }
214        macports-gcc-4.3 { set name "MacPorts gcc 4.3" }
215        macports-gcc-4.4 { set name "MacPorts gcc 4.4" }
216        macports-gcc-4.5 { set name "MacPorts gcc 4.5" }
217        macports-gcc-4.6 { set name "MacPorts gcc 4.6" }
218        macports-gcc-4.7 { set name "MacPorts gcc 4.7" }
219        macports-gcc-4.8 { set name "MacPorts gcc 4.8" }
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        macports-clang-3.2 { set name "MacPorts clang 3.2" }
226        macports-clang-3.3 { set name "MacPorts clang 3.3" }
227        default { return -code error "Invalid value for configure.compiler: ${configure.compiler}" }
228    }
229    ui_debug "Using compiler '$name'"
230
231    # Additional ccache directory setup
232    global configure.ccache ccache_dir ccache_size macportsuser
233    if {${configure.ccache}} {
234        # Create ccache directory with correct permissions with root privileges
235        elevateToRoot "configure ccache"
236        if [catch {
237                file mkdir ${ccache_dir}
238                file attributes ${ccache_dir} -owner ${macportsuser} -permissions 0755
239            } result] {
240            ui_warn "ccache_dir ${ccache_dir} could not be created; disabling ccache: $result"
241            set configure.ccache no
242        }
243        dropPrivileges
244
245        # Initialize ccache directory with the given maximum size
246        if {${configure.ccache}} {
247            if [catch {
248                exec ccache -M ${ccache_size} >/dev/null
249            } result] {
250                ui_warn "ccache_dir ${ccache_dir} could not be initialized; disabling ccache: $result"
251                set configure.ccache no
252            }
253        }
254    }
255}
256
257# internal function to choose the default configure.build_arch and
258# configure.universal_archs based on supported_archs and build_arch or
259# universal_archs
260proc portconfigure::choose_supported_archs {archs} {
261    global supported_archs
262    if {$supported_archs == ""} {
263        return $archs
264    }
265    set ret {}
266    foreach arch $archs {
267        if {[lsearch -exact $supported_archs $arch] != -1} {
268            set add_arch $arch
269        } elseif {$arch == "x86_64" && [lsearch -exact $supported_archs "i386"] != -1} {
270            set add_arch "i386"
271        } elseif {$arch == "ppc64" && [lsearch -exact $supported_archs "ppc"] != -1} {
272            set add_arch "ppc"
273        } else {
274            continue
275        }
276        if {[lsearch -exact $ret $add_arch] == -1} {
277            lappend ret $add_arch
278        }
279    }
280    return $ret
281}
282
283# internal function to determine the compiler flags to select an arch
284proc portconfigure::configure_get_archflags {tool} {
285    global configure.build_arch configure.m32 configure.m64 configure.compiler
286    set flags ""
287    if {[tbool configure.m64]} {
288        set flags "-m64"
289    } elseif {[tbool configure.m32]} {
290        set flags "-m32"
291    } elseif {${configure.build_arch} != ""} {
292        if {[arch_flag_supported] && ($tool == "cc" || $tool == "cxx" || $tool == "objc")} {
293            set flags "-arch ${configure.build_arch}"
294        } elseif {${configure.build_arch} == "x86_64" || ${configure.build_arch} == "ppc64"} {
295            set flags "-m64"
296        } elseif {${configure.compiler} != "gcc-3.3"} {
297            set flags "-m32"
298        }
299    }
300    return $flags
301}
302
303# internal function to determine the ld flags to select an arch
304# Unfortunately there's no consistent way to do this when the compiler
305# doesn't support -arch, because it could be used to link rather than using
306# ld directly. So we punt and let portfiles deal with that case.
307proc portconfigure::configure_get_ld_archflags {args} {
308    global configure.build_arch
309    if {${configure.build_arch} != "" && [arch_flag_supported]} {
310        return "-arch ${configure.build_arch}"
311    } else {
312        return ""
313    }
314}
315
316proc portconfigure::configure_get_sdkroot {} {
317    global developer_dir macosx_deployment_target macosx_version xcodeversion os.arch os.platform
318    if {${os.platform} == "darwin" && ($macosx_deployment_target != $macosx_version
319        || (${os.arch} == "powerpc" && $macosx_version == "10.4" && [variant_exists universal] && [variant_isset universal]))} {
320        if {[vercmp $xcodeversion 4.3] < 0} {
321            set sdks_dir "${developer_dir}/SDKs"
322        } else {
323            set sdks_dir "${developer_dir}/Platforms/MacOSX.platform/Developer/SDKs"
324        }
325        if {$macosx_deployment_target == "10.4"} {
326            set sdk "${sdks_dir}/MacOSX10.4u.sdk"
327        } else {
328            set sdk "${sdks_dir}/MacOSX${macosx_deployment_target}.sdk"
329        }
330        if {[file exists $sdk]} {
331            return $sdk
332        }
333    }
334    return ""
335}
336
337# internal function to determine the "-arch xy" flags for the compiler
338proc portconfigure::configure_get_universal_archflags {args} {
339    global configure.universal_archs
340    set flags ""
341    foreach arch ${configure.universal_archs} {
342        if {$flags == ""} {
343            set flags "-arch $arch"
344        } else {
345            append flags " -arch $arch"
346        }
347    }
348    return $flags
349}
350
351# internal function to determine the CFLAGS for the compiler
352proc portconfigure::configure_get_universal_cflags {args} {
353    return [configure_get_universal_archflags]
354}
355
356# internal function to determine the LDFLAGS for the compiler
357proc portconfigure::configure_get_universal_ldflags {args} {
358    return [configure_get_universal_archflags]
359}
360
361# internal proc to determine if the compiler supports -arch
362proc portconfigure::arch_flag_supported {args} {
363    global configure.compiler
364    switch -exact ${configure.compiler} {
365        gcc-4.0 -
366        gcc-4.2 -
367        llvm-gcc-4.2 -
368        clang -
369        apple-gcc-4.0 -
370        apple-gcc-4.2 -
371        macports-llvm-gcc-4.2 -
372        macports-clang-2.9 -
373        macports-clang-3.0 -
374        macports-clang-3.1 -
375        macports-clang-3.2 -
376        macports-clang-3.3 -
377        macports-clang {
378            return yes
379        }
380        default {
381            return no
382        }
383    }
384}
385
386# check if a compiler comes from a port
387proc portconfigure::compiler_is_port {compiler} {
388    switch $compiler {
389        clang -
390        llvm-gcc-4.2 -
391        gcc-4.2 -
392        gcc-4.0 -
393        gcc-3.3 {return no}
394        default {return yes}
395    }
396}
397
398# maps compiler names to the port that provides them
399array set portconfigure::compiler_name_map {
400        apple-gcc-4.0           apple-gcc40
401        apple-gcc-4.2           apple-gcc42
402        macports-gcc-4.2        gcc42
403        macports-gcc-4.3        gcc43
404        macports-gcc-4.4        gcc44
405        macports-gcc-4.5        gcc45
406        macports-gcc-4.6        gcc46
407        macports-gcc-4.7        gcc47
408        macports-gcc-4.8        gcc48
409        macports-llvm-gcc-4.2   llvm-gcc42
410        macports-clang-2.9      clang-2.9
411        macports-clang-3.0      clang-3.0
412        macports-clang-3.1      clang-3.1
413        macports-clang-3.2      clang-3.2
414        macports-clang-3.3      clang-3.3
415}
416
417# internal function to determine the default compiler
418proc portconfigure::configure_get_default_compiler {args} {
419    global compiler.blacklist compiler.whitelist compiler.fallback
420    if {${compiler.whitelist} != {}} {
421        set search_list ${compiler.whitelist}
422    } else {
423        set search_list ${compiler.fallback}
424    }
425    foreach compiler $search_list {
426        if {[lsearch -exact ${compiler.blacklist} $compiler] == -1} {
427            if {[file executable [configure_get_compiler cc $compiler]] 
428                || [compiler_is_port $compiler]} {
429                return $compiler
430            }
431        }
432    }
433    ui_warn "All compilers are either blacklisted or unavailable; using first fallback entry as last resort"
434    return [lindex ${compiler.fallback} 0]
435}
436
437# internal function to choose compiler fallback list based on platform
438proc portconfigure::get_compiler_fallback {} {
439    global xcodeversion macosx_deployment_target default_compiler
440    if {[info exists default_compiler]} {
441        return $default_compiler
442    } elseif {$xcodeversion == "none" || $xcodeversion == ""} {
443        return {cc}
444    } elseif {[vercmp $xcodeversion 4.2] >= 0} {
445        return {clang llvm-gcc-4.2 apple-gcc-4.2}
446    } elseif {[vercmp $xcodeversion 4.0] >= 0} {
447        return {llvm-gcc-4.2 clang gcc-4.2}
448    } elseif {[vercmp $xcodeversion 3.2] >= 0} {
449        if {$macosx_deployment_target == "10.4"} {
450            # It's not the deployment target that is the issue, it's the
451            # 10.4u SDK which base chooses if the deployment_target is set
452            return {gcc-4.0}
453        } else {
454            return {gcc-4.2 clang llvm-gcc-4.2 gcc-4.0}
455        }
456    } elseif {[vercmp $xcodeversion 3.0] >= 0} {
457        return {gcc-4.2 apple-gcc-4.2 macports-clang-3.0 gcc-4.0}
458    } else {
459        return {gcc-4.0 apple-gcc-4.2 macports-clang-3.0 gcc-3.3}
460    }
461}
462
463# Find a developer tool
464proc portconfigure::find_developer_tool {name} {
465        global developer_dir
466
467    # first try /usr/bin since this doesn't move around
468    set toolpath "/usr/bin/${name}"
469    if {[file executable $toolpath]} {
470        return $toolpath
471    }
472
473        # Use xcode's xcrun to find the named tool.
474        if {![catch {exec [findBinary xcrun $portutil::autoconf::xcrun_path] -find ${name}} toolpath]} {
475                return ${toolpath}
476        }
477
478        # If xcrun failed to find the tool, return a path from
479        # the developer_dir.
480        # The tool may not be there, but we'll leave it up to
481        # the invoking code to figure out that it doesn't have
482        # a valid compiler
483        return "${developer_dir}/usr/bin/${name}"
484}
485
486# internal function to find correct compilers
487proc portconfigure::configure_get_compiler {type {compiler {}}} {
488    global configure.compiler prefix
489    set ret ""
490    if {$compiler == {}} {
491        set compiler ${configure.compiler}
492    }
493
494    # Set defaults
495    switch -exact ${type} {
496        cc   { set ret [find_developer_tool cc] }
497        objc { set ret [find_developer_tool cc] }
498        cxx  { set ret [find_developer_tool c++] }
499        cpp  { set ret [find_developer_tool cpp] }
500    }
501
502    switch -exact ${compiler} {
503        gcc {
504            switch -exact ${type} {
505                cc   { set ret [find_developer_tool gcc] }
506                objc { set ret [find_developer_tool gcc] }
507                cxx  { set ret [find_developer_tool g++] }
508                cpp  { set ret [find_developer_tool cpp] }
509            }
510        }
511        gcc-3.3 {
512            switch -exact ${type} {
513                cc   { set ret [find_developer_tool gcc-3.3] }
514                objc { set ret [find_developer_tool gcc-3.3] }
515                cxx  { set ret [find_developer_tool g++-3.3] }
516                cpp  { set ret [find_developer_tool cpp-3.3] }
517            }
518        }
519        gcc-4.0 {
520            switch -exact ${type} {
521                cc   { set ret [find_developer_tool gcc-4.0] }
522                objc { set ret [find_developer_tool gcc-4.0] }
523                cxx  { set ret [find_developer_tool g++-4.0] }
524                cpp  { set ret [find_developer_tool cpp-4.0] }
525            }
526        }
527        gcc-4.2 {
528            switch -exact ${type} {
529                cc   { set ret [find_developer_tool gcc-4.2] }
530                objc { set ret [find_developer_tool gcc-4.2] }
531                cxx  { set ret [find_developer_tool g++-4.2] }
532                cpp  { set ret [find_developer_tool cpp-4.2] }
533            }
534        }
535        llvm-gcc-4.2 {
536            switch -exact ${type} {
537                cc   { set ret [find_developer_tool llvm-gcc-4.2] }
538                objc { set ret [find_developer_tool llvm-gcc-4.2] }
539                cxx  { set ret [find_developer_tool llvm-g++-4.2] }
540                cpp  { set ret [find_developer_tool llvm-cpp-4.2] }
541            }
542        }
543        clang {
544            switch -exact ${type} {
545                cc   { set ret [find_developer_tool clang] }
546                objc { set ret [find_developer_tool clang] }
547                cxx  {
548                    set clangpp [find_developer_tool clang++]
549                    if {[file executable ${clangpp}]} {
550                        set ret ${clangpp}
551                    } else {
552                        set ret [find_developer_tool llvm-g++-4.2]
553                    }
554                }
555            }
556        }
557        apple-gcc-4.0 {
558            switch -exact ${type} {
559                cc   { set ret ${prefix}/bin/gcc-apple-4.0 }
560                objc { set ret ${prefix}/bin/gcc-apple-4.0 }
561                cpp  { set ret ${prefix}/bin/cpp-apple-4.0 }
562            }
563        }
564        apple-gcc-4.2 {
565            switch -exact ${type} {
566                cc   { set ret ${prefix}/bin/gcc-apple-4.2 }
567                objc { set ret ${prefix}/bin/gcc-apple-4.2 }
568                cpp  { set ret ${prefix}/bin/cpp-apple-4.2 }
569                cxx  { set ret ${prefix}/bin/g++-apple-4.2 }
570            }
571        }
572        macports-gcc {
573            switch -exact ${type} {
574                cc   { set ret ${prefix}/bin/gcc }
575                objc { set ret ${prefix}/bin/gcc }
576                cxx  { set ret ${prefix}/bin/g++ }
577                cpp  { set ret ${prefix}/bin/cpp }
578                fc   { set ret ${prefix}/bin/gfortran }
579                f77  { set ret ${prefix}/bin/gfortran }
580                f90  { set ret ${prefix}/bin/gfortran }
581            }
582        }
583        macports-gcc-4.2 {
584            switch -exact ${type} {
585                cc   { set ret ${prefix}/bin/gcc-mp-4.2 }
586                objc { set ret ${prefix}/bin/gcc-mp-4.2 }
587                cxx  { set ret ${prefix}/bin/g++-mp-4.2 }
588                cpp  { set ret ${prefix}/bin/cpp-mp-4.2 }
589                fc   { set ret ${prefix}/bin/gfortran-mp-4.2 }
590                f77  { set ret ${prefix}/bin/gfortran-mp-4.2 }
591                f90  { set ret ${prefix}/bin/gfortran-mp-4.2 }
592            }
593        }
594        macports-gcc-4.3 {
595            switch -exact ${type} {
596                cc   { set ret ${prefix}/bin/gcc-mp-4.3 }
597                objc { set ret ${prefix}/bin/gcc-mp-4.3 }
598                cxx  { set ret ${prefix}/bin/g++-mp-4.3 }
599                cpp  { set ret ${prefix}/bin/cpp-mp-4.3 }
600                fc   { set ret ${prefix}/bin/gfortran-mp-4.3 }
601                f77  { set ret ${prefix}/bin/gfortran-mp-4.3 }
602                f90  { set ret ${prefix}/bin/gfortran-mp-4.3 }
603            }
604        }
605        macports-gcc-4.4 {
606            switch -exact ${type} {
607                cc   { set ret ${prefix}/bin/gcc-mp-4.4 }
608                objc { set ret ${prefix}/bin/gcc-mp-4.4 }
609                cxx  { set ret ${prefix}/bin/g++-mp-4.4 }
610                cpp  { set ret ${prefix}/bin/cpp-mp-4.4 }
611                fc   { set ret ${prefix}/bin/gfortran-mp-4.4 }
612                f77  { set ret ${prefix}/bin/gfortran-mp-4.4 }
613                f90  { set ret ${prefix}/bin/gfortran-mp-4.4 }
614            }
615        }
616        macports-gcc-4.5 {
617            switch -exact ${type} {
618                cc   { set ret ${prefix}/bin/gcc-mp-4.5 }
619                objc { set ret ${prefix}/bin/gcc-mp-4.5 }
620                cxx  { set ret ${prefix}/bin/g++-mp-4.5 }
621                cpp  { set ret ${prefix}/bin/cpp-mp-4.5 }
622                fc   { set ret ${prefix}/bin/gfortran-mp-4.5 }
623                f77  { set ret ${prefix}/bin/gfortran-mp-4.5 }
624                f90  { set ret ${prefix}/bin/gfortran-mp-4.5 }
625            }
626        }
627        macports-gcc-4.6 {
628            switch -exact ${type} {
629                cc   { set ret ${prefix}/bin/gcc-mp-4.6 }
630                objc { set ret ${prefix}/bin/gcc-mp-4.6 }
631                cxx  { set ret ${prefix}/bin/g++-mp-4.6 }
632                cpp  { set ret ${prefix}/bin/cpp-mp-4.6 }
633                fc   { set ret ${prefix}/bin/gfortran-mp-4.6 }
634                f77  { set ret ${prefix}/bin/gfortran-mp-4.6 }
635                f90  { set ret ${prefix}/bin/gfortran-mp-4.6 }
636            }
637        }
638        macports-gcc-4.7 {
639            switch -exact ${type} {
640                cc   { set ret ${prefix}/bin/gcc-mp-4.7 }
641                objc { set ret ${prefix}/bin/gcc-mp-4.7 }
642                cxx  { set ret ${prefix}/bin/g++-mp-4.7 }
643                cpp  { set ret ${prefix}/bin/cpp-mp-4.7 }
644                fc   { set ret ${prefix}/bin/gfortran-mp-4.7 }
645                f77  { set ret ${prefix}/bin/gfortran-mp-4.7 }
646                f90  { set ret ${prefix}/bin/gfortran-mp-4.7 }
647            }
648        }
649        macports-gcc-4.8 {
650            switch -exact ${type} {
651                cc   { set ret ${prefix}/bin/gcc-mp-4.8 }
652                objc { set ret ${prefix}/bin/gcc-mp-4.8 }
653                cxx  { set ret ${prefix}/bin/g++-mp-4.8 }
654                cpp  { set ret ${prefix}/bin/cpp-mp-4.8 }
655                fc   { set ret ${prefix}/bin/gfortran-mp-4.8 }
656                f77  { set ret ${prefix}/bin/gfortran-mp-4.8 }
657                f90  { set ret ${prefix}/bin/gfortran-mp-4.8 }
658            }
659        }
660        macports-llvm-gcc-4.2 {
661            switch -exact ${type} {
662                cc   { set ret ${prefix}/bin/llvm-gcc-4.2 }
663                objc { set ret ${prefix}/bin/llvm-gcc-4.2 }
664                cxx  { set ret ${prefix}/bin/llvm-g++-4.2 }
665                cpp  { set ret ${prefix}/bin/llvm-cpp-4.2 }
666            }
667        }
668        macports-clang {
669            switch -exact ${type} {
670                cc   { set ret ${prefix}/bin/clang }
671                objc { set ret ${prefix}/bin/clang }
672                cxx  { set ret ${prefix}/bin/clang++ }
673            }
674        }
675        macports-clang-2.9 {
676            switch -exact ${type} {
677                cc   { set ret ${prefix}/bin/clang-mp-2.9 }
678                objc { set ret ${prefix}/bin/clang-mp-2.9 }
679                cxx  { set ret ${prefix}/bin/clang++-mp-2.9 }
680            }
681        }
682        macports-clang-3.0 {
683            switch -exact ${type} {
684                cc   { set ret ${prefix}/bin/clang-mp-3.0 }
685                objc { set ret ${prefix}/bin/clang-mp-3.0 }
686                cxx  { set ret ${prefix}/bin/clang++-mp-3.0 }
687            }
688        }
689        macports-clang-3.1 {
690            switch -exact ${type} {
691                cc   { set ret ${prefix}/bin/clang-mp-3.1 }
692                objc { set ret ${prefix}/bin/clang-mp-3.1 }
693                cxx  { set ret ${prefix}/bin/clang++-mp-3.1 }
694            }
695        }
696        macports-clang-3.2 {
697            switch -exact ${type} {
698                cc   { set ret ${prefix}/bin/clang-mp-3.2 }
699                objc { set ret ${prefix}/bin/clang-mp-3.2 }
700                cxx  { set ret ${prefix}/bin/clang++-mp-3.2 }
701            }
702        }
703        macports-clang-3.3 {
704            switch -exact ${type} {
705                cc   { set ret ${prefix}/bin/clang-mp-3.3 }
706                objc { set ret ${prefix}/bin/clang-mp-3.3 }
707                cxx  { set ret ${prefix}/bin/clang++-mp-3.3 }
708            }
709        }
710    }
711    return $ret
712}
713
714proc portconfigure::configure_main {args} {
715    global [info globals]
716    global worksrcpath use_configure use_autoreconf use_autoconf use_automake use_xmkmf
717    global configure.env configure.pipe configure.libs configure.classpath configure.universal_args
718    global configure.perl configure.python configure.ruby configure.install configure.awk configure.bison configure.pkg_config configure.pkg_config_path
719    global configure.ccache configure.distcc configure.cpp configure.javac configure.march configure.mtune configure.sdkroot
720    foreach tool {cc cxx objc f77 f90 fc ld} {
721        global configure.${tool} configure.${tool}_archflags
722    }
723    foreach flags {cflags cppflags cxxflags objcflags ldflags fflags f90flags fcflags} {
724        global configure.${flags} configure.universal_${flags}
725    }
726   
727    if {[tbool use_autoreconf]} {
728        if {[catch {command_exec autoreconf} result]} {
729            return -code error "[format [msgcat::mc "%s failure: %s"] autoreconf $result]"
730        }
731    }
732   
733    if {[tbool use_automake]} {
734        if {[catch {command_exec automake} result]} {
735            return -code error "[format [msgcat::mc "%s failure: %s"] automake $result]"
736        }
737    }
738   
739    if {[tbool use_autoconf]} {
740        if {[catch {command_exec autoconf} result]} {
741            return -code error "[format [msgcat::mc "%s failure: %s"] autoconf $result]"
742        }
743    }
744
745    if {[tbool use_xmkmf]} {
746        parse_environment xmkmf
747        append_list_to_environment_value xmkmf "IMAKECPP" ${configure.cpp}
748        if {[catch {command_exec xmkmf} result]} {
749            return -code error "[format [msgcat::mc "%s failure: %s"] xmkmf $result]"
750        }
751
752        parse_environment xmkmf
753        append_list_to_environment_value xmkmf "IMAKECPP" ${configure.cpp}
754        if {[catch {command_exec "cd ${worksrcpath} && make Makefiles" -varprefix xmkmf} result]} {
755            return -code error "[format [msgcat::mc "%s failure: %s"] "make Makefiles" $result]"
756        }
757    } elseif {[tbool use_configure]} {
758        # Merge (ld|c|cpp|cxx)flags into the environment variable.
759        parse_environment configure
760
761        # Set pre-compiler filter to use (ccache/distcc), if any.
762        if {[tbool configure.ccache] && [tbool configure.distcc]} {
763            set filter "ccache "
764            append_list_to_environment_value configure "CCACHE_PREFIX" "distcc"
765        } elseif {[tbool configure.ccache]} {
766            set filter "ccache "
767        } elseif {[tbool configure.distcc]} {
768            set filter "distcc "
769        } else {
770            set filter ""
771        }
772       
773        # Set flags controlling the kind of compiler output.
774        if {[tbool configure.pipe]} {
775            set output "-pipe "
776        } else {
777            set output ""
778        }
779
780        # Append configure flags.
781        append_list_to_environment_value configure "CC" ${filter}${configure.cc}
782        append_list_to_environment_value configure "CXX" ${filter}${configure.cxx}
783        append_list_to_environment_value configure "OBJC" ${filter}${configure.objc}
784        append_list_to_environment_value configure "FC" ${configure.fc}
785        append_list_to_environment_value configure "F77" ${configure.f77}
786        append_list_to_environment_value configure "F90" ${configure.f90}
787        append_list_to_environment_value configure "JAVAC" ${configure.javac}
788        append_list_to_environment_value configure "CFLAGS" ${output}${configure.cflags}
789        append_list_to_environment_value configure "CPPFLAGS" ${configure.cppflags}
790        append_list_to_environment_value configure "CXXFLAGS" ${output}${configure.cxxflags}
791        append_list_to_environment_value configure "OBJCFLAGS" ${output}${configure.objcflags}
792        append_list_to_environment_value configure "LDFLAGS" ${configure.ldflags}
793        append_list_to_environment_value configure "LIBS" ${configure.libs}
794        append_list_to_environment_value configure "FFLAGS" ${output}${configure.fflags}
795        append_list_to_environment_value configure "F90FLAGS" ${output}${configure.f90flags}
796        append_list_to_environment_value configure "FCFLAGS" ${output}${configure.fcflags}
797        append_list_to_environment_value configure "CLASSPATH" ${configure.classpath}
798        append_list_to_environment_value configure "PERL" ${configure.perl}
799        append_list_to_environment_value configure "PYTHON" ${configure.python}
800        append_list_to_environment_value configure "RUBY" ${configure.ruby}
801        append_list_to_environment_value configure "INSTALL" ${configure.install}
802        append_list_to_environment_value configure "AWK" ${configure.awk}
803        append_list_to_environment_value configure "BISON" ${configure.bison}
804        append_list_to_environment_value configure "PKG_CONFIG" ${configure.pkg_config}
805        append_list_to_environment_value configure "PKG_CONFIG_PATH" ${configure.pkg_config_path}
806
807        # add SDK flags if cross-compiling (or universal on ppc tiger)
808        if {${configure.sdkroot} != ""} {
809            foreach flags {CPPFLAGS CFLAGS CXXFLAGS OBJCFLAGS} {
810                append_list_to_environment_value configure $flags "-isysroot ${configure.sdkroot}"
811            }
812            append_list_to_environment_value configure "LDFLAGS" "-Wl,-syslibroot,${configure.sdkroot}"
813        }
814
815        # add extra flags that are conditional on whether we're building universal
816        if {[variant_exists universal] && [variant_isset universal]} {
817            foreach flags {CFLAGS OBJCFLAGS} {
818                append_list_to_environment_value configure $flags ${configure.universal_cflags}
819            }
820            append_list_to_environment_value configure "CXXFLAGS" ${configure.universal_cxxflags}
821            append_list_to_environment_value configure "CPPFLAGS" ${configure.universal_cppflags}
822            append_list_to_environment_value configure "LDFLAGS" ${configure.universal_ldflags}
823            eval configure.pre_args-append ${configure.universal_args}
824        } else {
825            foreach {tool flags} {cc CFLAGS cxx CXXFLAGS objc OBJCFLAGS f77 FFLAGS f90 F90FLAGS fc FCFLAGS ld LDFLAGS} {
826                append_list_to_environment_value configure $flags [set configure.${tool}_archflags]
827                if {${configure.march} != {}} {
828                    append_list_to_environment_value configure $flags "-march=${configure.march}"
829                }
830                if {${configure.mtune} != {}} {
831                    append_list_to_environment_value configure $flags "-mtune=${configure.mtune}"
832                }
833            }
834        }
835
836        # Execute the command (with the new environment).
837        if {[catch {command_exec configure} result]} {
838            return -code error "[format [msgcat::mc "%s failure: %s"] configure $result]"
839        }
840    }
841    return 0
842}
Note: See TracBrowser for help on using the repository browser.