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

Last change on this file since 71487 was 71487, checked in by jmr@…, 10 years ago

add macports-gcc-4.6 option for configure.compiler

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