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

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

Add dragonegg compilers as an option

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