source: branches/gsoc09-logging/base/src/port1.0/portconfigure.tcl @ 52218

Last change on this file since 52218 was 52218, checked in by enl@…, 11 years ago

Merge from trunk

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 21.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 52218 2009-06-12 08:57:53Z enl@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 extract checksum 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.dir       {${worksrcpath}}
52default autoreconf.dir      {${worksrcpath}}
53default autoreconf.pre_args {--install}
54default autoconf.dir        {${worksrcpath}}
55default automake.dir        {${worksrcpath}}
56default xmkmf.cmd           xmkmf
57default xmkmf.dir           {${worksrcpath}}
58default use_configure       yes
59
60option_proc use_autoreconf  portconfigure::set_configure_type
61option_proc use_automake    portconfigure::set_configure_type
62option_proc use_autoconf    portconfigure::set_configure_type
63option_proc use_xmkmf       portconfigure::set_configure_type
64
65proc portconfigure::set_configure_type {option action args} {
66    if {[string equal ${action} "set"] && [tbool args]} {
67        switch $option {
68            use_xmkmf {
69                depends_build-append port:imake
70            }
71            default {
72                depends_build-append port:autoconf port:automake port:libtool
73            }
74        }
75    }
76}
77
78options configure.asroot
79default configure.asroot no
80
81# Configure special environment variables.
82# We could have m32/m64/march/mtune be global configurable at some point.
83options configure.m32 configure.m64 configure.march configure.mtune
84default configure.march     {}
85default configure.mtune     {}
86# We could have debug/optimizations be global configurable at some point.
87options configure.optflags configure.cflags configure.cppflags configure.cxxflags configure.objcflags configure.ldflags configure.libs configure.fflags configure.f90flags configure.fcflags configure.classpath
88default configure.optflags  {-O2}
89# compiler flags section
90default configure.cflags    {[portconfigure::configure_get_cflags]}
91default configure.cppflags  {"-I${prefix}/include"}
92default configure.cxxflags  {[portconfigure::configure_get_cflags]}
93default configure.objcflags {[portconfigure::configure_get_cflags]}
94default configure.ldflags   {"-L${prefix}/lib"}
95default configure.libs      {}
96default configure.fflags    {[portconfigure::configure_get_cflags]}
97default configure.f90flags  {[portconfigure::configure_get_cflags]}
98default configure.fcflags   {[portconfigure::configure_get_cflags]}
99default configure.classpath {}
100
101# internal function to return the system value for CFLAGS/CXXFLAGS/etc
102proc portconfigure::configure_get_cflags {args} {
103    global configure.optflags
104    global configure.m32 configure.m64 configure.march configure.mtune
105    set flags "${configure.optflags}"
106    if {[tbool configure.m64]} {
107        set flags "-m64 ${flags}"
108    } elseif {[tbool configure.m32]} {
109        set flags "-m32 ${flags}"
110    }
111    if {[info exists configure.march] && ${configure.march} != {}} {
112        set flags "${flags} -march=${configure.march}"
113    }
114    if {[info exists configure.mtune] && ${configure.mtune} != {}} {
115        set flags "${flags} -mtune=${configure.mtune}"
116    }
117    return $flags
118}
119
120# tools section
121options configure.perl configure.python configure.ruby configure.install configure.awk configure.bison configure.pkg_config configure.pkg_config_path
122default configure.perl              {}
123default configure.python            {}
124default configure.ruby              {}
125default configure.install           {${portutil::autoconf::install_command}}
126default configure.awk               {}
127default configure.bison             {}
128default configure.pkg_config        {}
129default configure.pkg_config_path   {}
130
131options configure.universal_target configure.universal_sysroot configure.universal_archs configure.universal_args configure.universal_cflags configure.universal_cppflags configure.universal_cxxflags configure.universal_ldflags
132default configure.universal_target      {${universal_target}}
133default configure.universal_sysroot     {${universal_sysroot}}
134default configure.universal_archs       {${universal_archs}}
135default configure.universal_args        {--disable-dependency-tracking}
136default configure.universal_cflags      {[portconfigure::configure_get_universal_cflags]}
137default configure.universal_cppflags    {[portconfigure::configure_get_universal_cppflags]}
138default configure.universal_cxxflags    {[portconfigure::configure_get_universal_cflags]}
139default configure.universal_ldflags     {[portconfigure::configure_get_universal_ldflags]}
140
141# Select a distinct compiler (C, C preprocessor, C++)
142options configure.ccache configure.distcc configure.pipe configure.cc configure.cxx configure.cpp configure.objc configure.f77 configure.f90 configure.fc configure.javac configure.compiler
143default configure.ccache        {${configureccache}}
144default configure.distcc        {${configuredistcc}}
145default configure.pipe          {${configurepipe}}
146default configure.cc            {[portconfigure::configure_get_compiler cc]}
147default configure.cxx           {[portconfigure::configure_get_compiler cxx]}
148default configure.cpp           {[portconfigure::configure_get_compiler cpp]}
149default configure.objc          {[portconfigure::configure_get_compiler objc]}
150default configure.f77           {[portconfigure::configure_get_compiler f77]}
151default configure.f90           {[portconfigure::configure_get_compiler f90]}
152default configure.fc            {[portconfigure::configure_get_compiler fc]}
153default configure.javac         {[portconfigure::configure_get_compiler javac]}
154default configure.compiler      {[portconfigure::configure_get_default_compiler]}
155
156set_ui_prefix
157
158proc portconfigure::configure_start {args} {
159    global UI_PREFIX
160    global configure.compiler
161   
162    ui_msg "$UI_PREFIX [format [msgcat::mc "Configuring %s"] [option name]]"
163
164    set name ""
165    switch -exact ${configure.compiler} {
166        gcc { set name "System gcc" }
167        gcc-3.3 { set name "Mac OS X gcc 3.3" }
168        gcc-4.0 { set name "Mac OS X gcc 4.0" }
169        gcc-4.2 { set name "Mac OS X gcc 4.2" }
170        llvm-gcc-4.2 { set name "Mac OS X llvm-gcc 4.2" }
171        clang { set name "Mac OS X clang" }
172        apple-gcc-3.3 { set name "MacPorts Apple gcc 3.3" }
173        apple-gcc-4.0 { set name "MacPorts Apple gcc 4.0" }
174        apple-gcc-4.2 { set name "MacPorts Apple gcc 4.2" }
175        macports-gcc-3.3 { set name "MacPorts gcc 3.3" }
176        macports-gcc-3.4 { set name "MacPorts gcc 3.4" }
177        macports-gcc-4.0 { set name "MacPorts gcc 4.0" }
178        macports-gcc-4.1 { set name "MacPorts gcc 4.1" }
179        macports-gcc-4.2 { set name "MacPorts gcc 4.2" }
180        macports-gcc-4.3 { set name "MacPorts gcc 4.3" }
181        macports-gcc-4.4 { set name "MacPorts gcc 4.4" }
182        default { return -code error "Invalid value for configure.compiler" }
183    }
184    ui_debug "Using compiler '$name'"
185}
186
187# internal function to determine the "-arch xy" flags for the compiler
188proc portconfigure::configure_get_universal_archflags {args} {
189    global configure.universal_archs
190    set flags ""
191    foreach arch ${configure.universal_archs} {
192        set flags "$flags -arch $arch"
193    }
194    return $flags
195}
196
197# internal function to determine the CPPFLAGS for the compiler
198proc portconfigure::configure_get_universal_cppflags {args} {
199    global configure.universal_sysroot
200    set flags ""
201    # include sysroot in CPPFLAGS too (twice), for the benefit of autoconf
202    if {[info exists configure.universal_sysroot]} {
203        set flags "-isysroot ${configure.universal_sysroot}"
204    }
205    return $flags
206}
207
208# internal function to determine the CFLAGS for the compiler
209proc portconfigure::configure_get_universal_cflags {args} {
210    global configure.universal_sysroot configure.universal_target
211    set flags [configure_get_universal_archflags]
212    # these flags should be valid for C/C++ and similar compiler frontends
213    if {[info exists configure.universal_sysroot]} {
214        set flags "-isysroot ${configure.universal_sysroot} ${flags}"
215    }
216    return $flags
217}
218
219# internal function to determine the LDFLAGS for the compiler
220proc portconfigure::configure_get_universal_ldflags {args} {
221    global configure.universal_sysroot configure.universal_target
222    global os.arch
223    set flags [configure_get_universal_archflags]
224    # works around linking without using the CFLAGS, outside of automake
225    if {${os.arch} == "powerpc"} {
226        set flags "-Wl,-syslibroot,${configure.universal_sysroot} ${flags}"
227    }
228    return $flags
229}
230
231# internal function to determine the default compiler
232proc portconfigure::configure_get_default_compiler {args} {
233    global os.platform os.major
234    set compiler ""
235    switch -exact "${os.platform} ${os.major}" {
236        "darwin 7" { set compiler gcc-3.3 }
237        "darwin 8" { set compiler gcc-4.0 }
238        "darwin 9" { set compiler gcc-4.0 }
239        "darwin 10" { set compiler gcc-4.2 }
240        default { set compiler gcc }
241    }
242    return $compiler
243}
244
245# internal function to find correct compilers
246proc portconfigure::configure_get_compiler {type} {
247    global configure.compiler prefix developer_dir
248    set ret ""
249    switch -exact ${configure.compiler} {
250        gcc {
251            switch -exact ${type} {
252                cc   { set ret /usr/bin/gcc }
253                objc { set ret /usr/bin/gcc }
254                cxx  { set ret /usr/bin/g++ }
255                cpp  { set ret /usr/bin/cpp }
256            }
257        }
258        gcc-3.3 {
259            switch -exact ${type} {
260                cc   { set ret /usr/bin/gcc-3.3 }
261                objc { set ret /usr/bin/gcc-3.3 }
262                cxx  { set ret /usr/bin/g++-3.3 }
263                cpp  { set ret /usr/bin/cpp-3.3 }
264            }
265        }
266        gcc-4.0 {
267            switch -exact ${type} {
268                cc   { set ret /usr/bin/gcc-4.0 }
269                objc { set ret /usr/bin/gcc-4.0 }
270                cxx  { set ret /usr/bin/g++-4.0 }
271                cpp  { set ret /usr/bin/cpp-4.0 }
272            }
273        }
274        gcc-4.2 {
275            switch -exact ${type} {
276                cc   { set ret /usr/bin/gcc-4.2 }
277                objc { set ret /usr/bin/gcc-4.2 }
278                cxx  { set ret /usr/bin/g++-4.2 }
279            }
280        }
281        llvm-gcc-4.2 {
282            switch -exact ${type} {
283                cc   { set ret ${developer_dir}/usr/llvm-gcc-4.2/bin/llvm-gcc-4.2 }
284                objc { set ret ${developer_dir}/usr/llvm-gcc-4.2/bin/llvm-gcc-4.2 }
285                cxx  { set ret ${developer_dir}/usr/llvm-gcc-4.2/bin/llvm-g++-4.2 }
286                cpp  { set ret ${developer_dir}/usr/llvm-gcc-4.2/bin/llvm-cpp-4.2 }
287            }
288        }
289        clang {
290            switch -exact ${type} {
291                cc   { set ret ${developer_dir}/usr/bin/clang }
292                objc { set ret ${developer_dir}/usr/bin/clang }
293            }
294        }
295        apple-gcc-3.3 {
296            switch -exact ${type} {
297                cc  { set ret ${prefix}/bin/gcc-apple-3.3 }
298                cpp { set ret ${prefix}/bin/cpp-apple-3.3 }
299            }
300        }
301        apple-gcc-4.0 {
302            switch -exact ${type} {
303                cc   { set ret ${prefix}/bin/gcc-apple-4.0 }
304                objc { set ret ${prefix}/bin/gcc-apple-4.0 }
305                cpp  { set ret ${prefix}/bin/cpp-apple-4.0 }
306            }
307        }
308        apple-gcc-4.2 {
309            switch -exact ${type} {
310                cc   { set ret ${prefix}/bin/gcc-apple-4.2 }
311                objc { set ret ${prefix}/bin/gcc-apple-4.2 }
312                cpp  { set ret ${prefix}/bin/cpp-apple-4.2 }
313            }
314        }
315        macports-gcc-3.3 {
316            switch -exact ${type} {
317                cc  { set ret ${prefix}/bin/gcc-mp-3.3 }
318                cxx { set ret ${prefix}/bin/g++-mp-3.3 }
319                cpp { set ret ${prefix}/bin/cpp-mp-3.3 }
320            }
321        }
322        macports-gcc-3.4 {
323            switch -exact ${type} {
324                cc  { set ret ${prefix}/bin/gcc-mp-3.4 }
325                cxx { set ret ${prefix}/bin/g++-mp-3.4 }
326                cpp { set ret ${prefix}/bin/cpp-mp-3.4 }
327            }
328        }
329        macports-gcc-4.0 {
330            switch -exact ${type} {
331                cc   { set ret ${prefix}/bin/gcc-mp-4.0 }
332                objc { set ret ${prefix}/bin/gcc-mp-4.0 }
333                cxx  { set ret ${prefix}/bin/g++-mp-4.0 }
334                cpp  { set ret ${prefix}/bin/cpp-mp-4.0 }
335                fc   { set ret ${prefix}/bin/gfortran-mp-4.0 }
336                f77  { set ret ${prefix}/bin/gfortran-mp-4.0 }
337                f90  { set ret ${prefix}/bin/gfortran-mp-4.0 }
338            }
339        }
340        macports-gcc-4.1 {
341            switch -exact ${type} {
342                cc   { set ret ${prefix}/bin/gcc-mp-4.1 }
343                objc { set ret ${prefix}/bin/gcc-mp-4.1 }
344                cxx  { set ret ${prefix}/bin/g++-mp-4.1 }
345                cpp  { set ret ${prefix}/bin/cpp-mp-4.1 }
346                fc   { set ret ${prefix}/bin/gfortran-mp-4.1 }
347                f77  { set ret ${prefix}/bin/gfortran-mp-4.1 }
348                f90  { set ret ${prefix}/bin/gfortran-mp-4.1 }
349            }
350        }
351        macports-gcc-4.2 {
352            switch -exact ${type} {
353                cc   { set ret ${prefix}/bin/gcc-mp-4.2 }
354                objc { set ret ${prefix}/bin/gcc-mp-4.2 }
355                cxx  { set ret ${prefix}/bin/g++-mp-4.2 }
356                cpp  { set ret ${prefix}/bin/cpp-mp-4.2 }
357                fc   { set ret ${prefix}/bin/gfortran-mp-4.2 }
358                f77  { set ret ${prefix}/bin/gfortran-mp-4.2 }
359                f90  { set ret ${prefix}/bin/gfortran-mp-4.2 }
360            }
361        }
362        macports-gcc-4.3 {
363            switch -exact ${type} {
364                cc   { set ret ${prefix}/bin/gcc-mp-4.3 }
365                objc { set ret ${prefix}/bin/gcc-mp-4.3 }
366                cxx  { set ret ${prefix}/bin/g++-mp-4.3 }
367                cpp  { set ret ${prefix}/bin/cpp-mp-4.3 }
368                fc   { set ret ${prefix}/bin/gfortran-mp-4.3 }
369                f77  { set ret ${prefix}/bin/gfortran-mp-4.3 }
370                f90  { set ret ${prefix}/bin/gfortran-mp-4.3 }
371            }
372        }
373        macports-gcc-4.4 {
374            switch -exact ${type} {
375                cc   { set ret ${prefix}/bin/gcc-mp-4.4 }
376                objc { set ret ${prefix}/bin/gcc-mp-4.4 }
377                cxx  { set ret ${prefix}/bin/g++-mp-4.4 }
378                cpp  { set ret ${prefix}/bin/cpp-mp-4.4 }
379                fc   { set ret ${prefix}/bin/gfortran-mp-4.4 }
380                f77  { set ret ${prefix}/bin/gfortran-mp-4.4 }
381                f90  { set ret ${prefix}/bin/gfortran-mp-4.4 }
382            }
383        }
384    }
385    return $ret
386}
387
388proc portconfigure::configure_main {args} {
389    global [info globals]
390    global worksrcpath use_configure use_autoreconf use_autoconf use_automake use_xmkmf
391    global configure.env configure.pipe configure.cflags configure.cppflags configure.cxxflags configure.objcflags configure.ldflags configure.libs configure.fflags configure.f90flags configure.fcflags configure.classpath
392    global configure.perl configure.python configure.ruby configure.install configure.awk configure.bison configure.pkg_config configure.pkg_config_path
393    global configure.ccache configure.distcc configure.cc configure.cxx configure.cpp configure.objc configure.f77 configure.f90 configure.fc configure.javac
394   
395    if {[tbool use_autoreconf]} {
396        if {[catch {command_exec autoreconf} result]} {
397            return -code error "[format [msgcat::mc "%s failure: %s"] autoreconf $result]"
398        }
399    }
400   
401    if {[tbool use_automake]} {
402        if {[catch {command_exec automake} result]} {
403            return -code error "[format [msgcat::mc "%s failure: %s"] automake $result]"
404        }
405    }
406   
407    if {[tbool use_autoconf]} {
408        if {[catch {command_exec autoconf} result]} {
409            return -code error "[format [msgcat::mc "%s failure: %s"] autoconf $result]"
410        }
411    }
412
413    if {[tbool use_xmkmf]} {
414        if {[catch {command_exec xmkmf} result]} {
415            return -code error "[format [msgcat::mc "%s failure: %s"] xmkmf $result]"
416        } else {
417            # XXX should probably use make command abstraction but we know that
418            # X11 will already set things up so that "make Makefiles" always works.
419            system "cd ${worksrcpath} && make Makefiles"
420        }
421    } elseif {[tbool use_configure]} {
422        # Merge (ld|c|cpp|cxx)flags into the environment variable.
423        parse_environment configure
424
425        # Set pre-compiler filter to use (ccache/distcc), if any.
426        if {[tbool configure.ccache] && [tbool configure.distcc]} {
427            set filter "ccache "
428            append_list_to_environment_value configure "CCACHE_PREFIX" "distcc"
429        } elseif {[tbool configure.ccache]} {
430            set filter "ccache "
431        } elseif {[tbool configure.distcc]} {
432            set filter "distcc "
433        } else {
434            set filter ""
435        }
436       
437        # Set flags controlling the kind of compiler output.
438        if {[tbool configure.pipe]} {
439            set output "-pipe "
440        } else {
441            set output ""
442        }
443
444        # Append configure flags.
445        append_list_to_environment_value configure "CC" ${filter}${configure.cc}
446        append_list_to_environment_value configure "CPP" ${filter}${configure.cpp}
447        append_list_to_environment_value configure "CXX" ${filter}${configure.cxx}
448        append_list_to_environment_value configure "OBJC" ${filter}${configure.objc}
449        append_list_to_environment_value configure "FC" ${configure.fc}
450        append_list_to_environment_value configure "F77" ${configure.f77}
451        append_list_to_environment_value configure "F90" ${configure.f90}
452        append_list_to_environment_value configure "JAVAC" ${configure.javac}
453        append_list_to_environment_value configure "CFLAGS" ${output}${configure.cflags}
454        append_list_to_environment_value configure "CPPFLAGS" ${configure.cppflags}
455        append_list_to_environment_value configure "CXXFLAGS" ${output}${configure.cxxflags}
456        append_list_to_environment_value configure "OBJCFLAGS" ${output}${configure.objcflags}
457        append_list_to_environment_value configure "LDFLAGS" ${configure.ldflags}
458        append_list_to_environment_value configure "LIBS" ${configure.libs}
459        append_list_to_environment_value configure "FFLAGS" ${output}${configure.fflags}
460        append_list_to_environment_value configure "F90FLAGS" ${output}${configure.f90flags}
461        append_list_to_environment_value configure "FCFLAGS" ${output}${configure.fcflags}
462        append_list_to_environment_value configure "CLASSPATH" ${configure.classpath}
463        append_list_to_environment_value configure "PERL" ${configure.perl}
464        append_list_to_environment_value configure "PYTHON" ${configure.python}
465        append_list_to_environment_value configure "RUBY" ${configure.ruby}
466        append_list_to_environment_value configure "INSTALL" ${configure.install}
467        append_list_to_environment_value configure "AWK" ${configure.awk}
468        append_list_to_environment_value configure "BISON" ${configure.bison}
469        append_list_to_environment_value configure "PKG_CONFIG" ${configure.pkg_config}
470        append_list_to_environment_value configure "PKG_CONFIG_PATH" ${configure.pkg_config_path}
471
472        # Execute the command (with the new environment).
473        if {[catch {command_exec configure} result]} {
474            return -code error "[format [msgcat::mc "%s failure: %s"] configure $result]"
475        }
476    }
477    return 0
478}
Note: See TracBrowser for help on using the repository browser.