1dnl
2dnl  This file is part of Bakefile (http://www.bakefile.org)
3dnl
4dnl  Copyright (C) 2003-2007 Vaclav Slavik, David Elliott and others
5dnl
6dnl  Permission is hereby granted, free of charge, to any person obtaining a
7dnl  copy of this software and associated documentation files (the "Software"),
8dnl  to deal in the Software without restriction, including without limitation
9dnl  the rights to use, copy, modify, merge, publish, distribute, sublicense,
10dnl  and/or sell copies of the Software, and to permit persons to whom the
11dnl  Software is furnished to do so, subject to the following conditions:
12dnl
13dnl  The above copyright notice and this permission notice shall be included in
14dnl  all copies or substantial portions of the Software.
15dnl
16dnl  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17dnl  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18dnl  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19dnl  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20dnl  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21dnl  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22dnl  DEALINGS IN THE SOFTWARE.
23dnl
24dnl  $Id: bakefile-lang.m4 58915 2009-02-15 15:31:47Z VZ $
25dnl
26dnl  Compiler detection macros by David Elliott and Vadim Zeitlin
27dnl
28
29
30dnl ===========================================================================
31dnl Macros to detect different C/C++ compilers
32dnl ===========================================================================
33
34dnl Based on autoconf _AC_LANG_COMPILER_GNU
35dnl _AC_BAKEFILE_LANG_COMPILER(NAME, LANG, SYMBOL, IF-YES, IF-NO)
36AC_DEFUN([_AC_BAKEFILE_LANG_COMPILER],
37[
38    AC_LANG_PUSH($2)
39    AC_CACHE_CHECK(
40        [whether we are using the $1 $2 compiler],
41        [bakefile_cv_[]_AC_LANG_ABBREV[]_compiler_[]$3],
42        [AC_TRY_COMPILE(
43            [],
44            [
45             #ifndef $3
46                choke me
47             #endif
48            ],
49            [bakefile_cv_[]_AC_LANG_ABBREV[]_compiler_[]$3=yes],
50            [bakefile_cv_[]_AC_LANG_ABBREV[]_compiler_[]$3=no]
51         )
52        ]
53    )
54    if test "x$bakefile_cv_[]_AC_LANG_ABBREV[]_compiler_[]$3" = "xyes"; then
55        :; $4
56    else
57        :; $5
58    fi
59    AC_LANG_POP($2)
60])
61
62dnl More specific version of the above macro checking whether the compiler
63dnl version is at least the given one (assumes that we do use this compiler)
64dnl
65dnl _AC_BAKEFILE_LANG_COMPILER_LATER_THAN(NAME, LANG, SYMBOL, VER, VERMSG, IF-YES, IF-NO)
66AC_DEFUN([_AC_BAKEFILE_LANG_COMPILER_LATER_THAN],
67[
68    AC_LANG_PUSH($2)
69    AC_CACHE_CHECK(
70        [whether we are using $1 $2 compiler v$5 or later],
71        [bakefile_cv_[]_AC_LANG_ABBREV[]_compiler_[]$3[]_lt_[]$4],
72        [AC_TRY_COMPILE(
73            [],
74            [
75             #ifndef $3 || $3 < $4
76                choke me
77             #endif
78            ],
79            [bakefile_cv_[]_AC_LANG_ABBREV[]_compiler_[]$3[]_lt_[]$4=yes],
80            [bakefile_cv_[]_AC_LANG_ABBREV[]_compiler_[]$3[]_lt_[]$4=no]
81         )
82        ]
83    )
84    if test "x$bakefile_cv_[]_AC_LANG_ABBREV[]_compiler_[]$3[]_lt_[]$4" = "xyes"; then
85        :; $6
86    else
87        :; $7
88    fi
89    AC_LANG_POP($2)
90])
91
92dnl CodeWarrior Metrowerks compiler defines __MWERKS__ for both C and C++
93AC_DEFUN([AC_BAKEFILE_PROG_MWCC],
94[
95    _AC_BAKEFILE_LANG_COMPILER(Metrowerks, C, __MWERKS__, MWCC=yes)
96])
97
98AC_DEFUN([AC_BAKEFILE_PROG_MWCXX],
99[
100    _AC_BAKEFILE_LANG_COMPILER(Metrowerks, C++, __MWERKS__, MWCXX=yes)
101])
102
103dnl IBM xlC compiler defines __xlC__ for both C and C++
104AC_DEFUN([AC_BAKEFILE_PROG_XLCC],
105[
106    _AC_BAKEFILE_LANG_COMPILER([IBM xlC], C, __xlC__, XLCC=yes)
107])
108
109AC_DEFUN([AC_BAKEFILE_PROG_XLCXX],
110[
111    _AC_BAKEFILE_LANG_COMPILER([IBM xlC], C++, __xlC__, XLCXX=yes)
112])
113
114dnl recent versions of SGI mipsPro compiler define _SGI_COMPILER_VERSION
115dnl
116dnl NB: old versions define _COMPILER_VERSION but this could probably be
117dnl     defined by other compilers too so don't test for it to be safe
118AC_DEFUN([AC_BAKEFILE_PROG_SGICC],
119[
120    _AC_BAKEFILE_LANG_COMPILER(SGI, C, _SGI_COMPILER_VERSION, SGICC=yes)
121])
122
123AC_DEFUN([AC_BAKEFILE_PROG_SGICXX],
124[
125    _AC_BAKEFILE_LANG_COMPILER(SGI, C++, _SGI_COMPILER_VERSION, SGICXX=yes)
126])
127
128dnl Sun compiler defines __SUNPRO_C/__SUNPRO_CC
129AC_DEFUN([AC_BAKEFILE_PROG_SUNCC],
130[
131    _AC_BAKEFILE_LANG_COMPILER(Sun, C, __SUNPRO_C, SUNCC=yes)
132])
133
134AC_DEFUN([AC_BAKEFILE_PROG_SUNCXX],
135[
136    _AC_BAKEFILE_LANG_COMPILER(Sun, C++, __SUNPRO_CC, SUNCXX=yes)
137])
138
139dnl Intel icc compiler defines __INTEL_COMPILER for both C and C++
140AC_DEFUN([AC_BAKEFILE_PROG_INTELCC],
141[
142    _AC_BAKEFILE_LANG_COMPILER(Intel, C, __INTEL_COMPILER, INTELCC=yes)
143])
144
145AC_DEFUN([AC_BAKEFILE_PROG_INTELCXX],
146[
147    _AC_BAKEFILE_LANG_COMPILER(Intel, C++, __INTEL_COMPILER, INTELCXX=yes)
148])
149
150dnl Intel compiler command line options changed in incompatible ways sometimes
151dnl before v8 (-KPIC was replaced with gcc-compatible -fPIC) and again in v10
152dnl (-create-pch deprecated in favour of -pch-create) so we need to test for
153dnl its exact version too
154AC_DEFUN([AC_BAKEFILE_PROG_INTELCC_8],
155[
156    _AC_BAKEFILE_LANG_COMPILER_LATER_THAN(Intel, C, __INTEL_COMPILER, 800, 8, INTELCC8=yes)
157])
158AC_DEFUN([AC_BAKEFILE_PROG_INTELCXX_8],
159[
160    _AC_BAKEFILE_LANG_COMPILER_LATER_THAN(Intel, C++, __INTEL_COMPILER, 800, 8, INTELCXX8=yes)
161])
162
163AC_DEFUN([AC_BAKEFILE_PROG_INTELCC_10],
164[
165    _AC_BAKEFILE_LANG_COMPILER_LATER_THAN(Intel, C, __INTEL_COMPILER, 1000, 10, INTELCC10=yes)
166])
167
168AC_DEFUN([AC_BAKEFILE_PROG_INTELCXX_10],
169[
170    _AC_BAKEFILE_LANG_COMPILER_LATER_THAN(Intel, C++, __INTEL_COMPILER, 1000, 10, INTELCXX10=yes)
171])
172
173dnl HP-UX aCC: see http://docs.hp.com/en/6162/preprocess.htm#macropredef
174AC_DEFUN([AC_BAKEFILE_PROG_HPCC],
175[
176    _AC_BAKEFILE_LANG_COMPILER(HP, C, __HP_cc, HPCC=yes)
177])
178
179AC_DEFUN([AC_BAKEFILE_PROG_HPCXX],
180[
181    _AC_BAKEFILE_LANG_COMPILER(HP, C++, __HP_aCC, HPCXX=yes)
182])
183
184dnl Tru64 cc and cxx
185AC_DEFUN([AC_BAKEFILE_PROG_COMPAQCC],
186[
187    _AC_BAKEFILE_LANG_COMPILER(Compaq, C, __DECC, COMPAQCC=yes)
188])
189
190AC_DEFUN([AC_BAKEFILE_PROG_COMPAQCXX],
191[
192    _AC_BAKEFILE_LANG_COMPILER(Compaq, C++, __DECCXX, COMPAQCXX=yes)
193])
194
195dnl ===========================================================================
196dnl macros to detect specialty compiler options
197dnl ===========================================================================
198
199dnl Figure out if we need to pass -ext o to compiler (MetroWerks)
200AC_DEFUN([AC_BAKEFILE_METROWERKS_EXTO],
201[AC_CACHE_CHECK([if the _AC_LANG compiler requires -ext o], bakefile_cv_[]_AC_LANG_ABBREV[]_exto,
202dnl First create an empty conf test
203[AC_LANG_CONFTEST([AC_LANG_PROGRAM()])
204dnl Now remove .o and .c.o or .cc.o
205rm -f conftest.$ac_objext conftest.$ac_ext.o
206dnl Now compile the test
207AS_IF([AC_TRY_EVAL(ac_compile)],
208dnl If the test succeeded look for conftest.c.o or conftest.cc.o
209[for ac_file in `(ls conftest.* 2>/dev/null)`; do
210    case $ac_file in
211        conftest.$ac_ext.o)
212            bakefile_cv_[]_AC_LANG_ABBREV[]_exto="-ext o"
213            ;;
214        *)
215            ;;
216    esac
217done],
218[AC_MSG_FAILURE([cannot figure out if compiler needs -ext o: cannot compile])
219]) dnl AS_IF
220
221rm -f conftest.$ac_ext.o conftest.$ac_objext conftest.$ac_ext
222]) dnl AC_CACHE_CHECK
223
224if test "x$bakefile_cv_[]_AC_LANG_ABBREV[]_exto" '!=' "x"; then
225    if test "[]_AC_LANG_ABBREV[]" = "c"; then
226        CFLAGS="$bakefile_cv_[]_AC_LANG_ABBREV[]_exto $CFLAGS"
227    fi
228    if test "[]_AC_LANG_ABBREV[]" = "cxx"; then
229        CXXFLAGS="$bakefile_cv_[]_AC_LANG_ABBREV[]_exto $CXXFLAGS"
230    fi
231fi
232]) dnl AC_DEFUN
233
234
235dnl ===========================================================================
236dnl Macros to do all of the compiler detections as one macro
237dnl ===========================================================================
238
239dnl check for different proprietary compilers depending on target platform
240dnl _AC_BAKEFILE_PROG_COMPILER(LANG)
241AC_DEFUN([_AC_BAKEFILE_PROG_COMPILER],
242[
243    AC_PROG_$1
244
245    dnl Intel compiler can be used under several different OS and even
246    dnl different architectures (x86, amd64 and Itanium) so it's easier to just
247    dnl always test for it
248    AC_BAKEFILE_PROG_INTEL$1
249
250    dnl If we use Intel compiler we also need to know its version
251    if test "$INTEL$1" = "yes"; then
252        AC_BAKEFILE_PROG_INTEL$1_8
253        AC_BAKEFILE_PROG_INTEL$1_10
254    fi
255
256    dnl if we're using gcc, we can't be using any of incompatible compilers
257    if test "x$G$1" != "xyes"; then
258        if test "x$1" = "xC"; then
259            AC_BAKEFILE_METROWERKS_EXTO
260            if test "x$bakefile_cv_c_exto" '!=' "x"; then
261                unset ac_cv_prog_cc_g
262                _AC_PROG_CC_G
263            fi
264        fi
265
266        dnl most of these compilers are only used under well-defined OS so
267        dnl don't waste time checking for them on other ones
268        case `uname -s` in
269            AIX*)
270                AC_BAKEFILE_PROG_XL$1
271                ;;
272
273            Darwin)
274                AC_BAKEFILE_PROG_MW$1
275                if test "$MW$1" != "yes"; then
276                    AC_BAKEFILE_PROG_XL$1
277                fi
278                ;;
279
280            IRIX*)
281                AC_BAKEFILE_PROG_SGI$1
282                ;;
283
284            Linux*)
285                dnl Sun CC is now available under Linux too, test for it unless
286                dnl we already found that we were using a different compiler
287                if test "$INTEL$1" != "yes"; then
288                    AC_BAKEFILE_PROG_SUN$1
289                fi
290                ;;
291
292            HP-UX*)
293                AC_BAKEFILE_PROG_HP$1
294                ;;
295
296            OSF1)
297                AC_BAKEFILE_PROG_COMPAQ$1
298                ;;
299
300            SunOS)
301                AC_BAKEFILE_PROG_SUN$1
302                ;;
303        esac
304    fi
305])
306
307AC_DEFUN([AC_BAKEFILE_PROG_CC],
308[
309    _AC_BAKEFILE_PROG_COMPILER(CC)
310])
311
312AC_DEFUN([AC_BAKEFILE_PROG_CXX],
313[
314    _AC_BAKEFILE_PROG_COMPILER(CXX)
315])
316
317