don't use __thread keyword with g++ < 4 as it results in mysterious problems at link...
[wxWidgets.git] / build / aclocal / bakefile.m4
1 dnl
2 dnl  This file is part of Bakefile (http://www.bakefile.org)
3 dnl
4 dnl  Copyright (C) 2003-2007 Vaclav Slavik and others
5 dnl
6 dnl  Permission is hereby granted, free of charge, to any person obtaining a
7 dnl  copy of this software and associated documentation files (the "Software"),
8 dnl  to deal in the Software without restriction, including without limitation
9 dnl  the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 dnl  and/or sell copies of the Software, and to permit persons to whom the
11 dnl  Software is furnished to do so, subject to the following conditions:
12 dnl
13 dnl  The above copyright notice and this permission notice shall be included in
14 dnl  all copies or substantial portions of the Software.
15 dnl
16 dnl  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 dnl  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 dnl  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 dnl  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 dnl  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 dnl  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 dnl  DEALINGS IN THE SOFTWARE.
23 dnl
24 dnl  $Id$
25 dnl
26 dnl  Support macros for makefiles generated by BAKEFILE.
27 dnl
28
29
30 dnl ---------------------------------------------------------------------------
31 dnl Lots of compiler & linker detection code contained here was taken from
32 dnl wxWidgets configure.in script (see http://www.wxwidgets.org)
33 dnl ---------------------------------------------------------------------------
34
35
36
37 dnl ---------------------------------------------------------------------------
38 dnl AC_BAKEFILE_GNUMAKE
39 dnl
40 dnl Detects GNU make
41 dnl ---------------------------------------------------------------------------
42
43 AC_DEFUN([AC_BAKEFILE_GNUMAKE],
44 [
45     dnl does make support "-include" (only GNU make does AFAIK)?
46     AC_CACHE_CHECK([if make is GNU make], bakefile_cv_prog_makeisgnu,
47     [
48         if ( ${SHELL-sh} -c "${MAKE-make} --version" 2> /dev/null |
49                 egrep -s GNU > /dev/null); then
50             bakefile_cv_prog_makeisgnu="yes"
51         else
52             bakefile_cv_prog_makeisgnu="no"
53         fi
54     ])
55
56     if test "x$bakefile_cv_prog_makeisgnu" = "xyes"; then
57         IF_GNU_MAKE=""
58     else
59         IF_GNU_MAKE="#"
60     fi
61     AC_SUBST(IF_GNU_MAKE)
62 ])
63
64 dnl ---------------------------------------------------------------------------
65 dnl AC_BAKEFILE_PLATFORM
66 dnl
67 dnl Detects platform and sets PLATFORM_XXX variables accordingly
68 dnl ---------------------------------------------------------------------------
69
70 AC_DEFUN([AC_BAKEFILE_PLATFORM],
71 [
72     PLATFORM_UNIX=0
73     PLATFORM_WIN32=0
74     PLATFORM_MSDOS=0
75     PLATFORM_MAC=0
76     PLATFORM_MACOS=0
77     PLATFORM_MACOSX=0
78     PLATFORM_OS2=0
79     PLATFORM_BEOS=0
80
81     if test "x$BAKEFILE_FORCE_PLATFORM" = "x"; then
82         case "${BAKEFILE_HOST}" in
83             *-*-mingw32* )
84                 PLATFORM_WIN32=1
85             ;;
86             *-pc-msdosdjgpp )
87                 PLATFORM_MSDOS=1
88             ;;
89             *-pc-os2_emx | *-pc-os2-emx )
90                 PLATFORM_OS2=1
91             ;;
92             *-*-darwin* )
93                 PLATFORM_MAC=1
94                 PLATFORM_MACOSX=1
95             ;;
96             *-*-beos* )
97                 PLATFORM_BEOS=1
98             ;;
99             powerpc-apple-macos* )
100                 PLATFORM_MAC=1
101                 PLATFORM_MACOS=1
102             ;;
103             * )
104                 PLATFORM_UNIX=1
105             ;;
106         esac
107     else
108         case "$BAKEFILE_FORCE_PLATFORM" in
109             win32 )
110                 PLATFORM_WIN32=1
111             ;;
112             msdos )
113                 PLATFORM_MSDOS=1
114             ;;
115             os2 )
116                 PLATFORM_OS2=1
117             ;;
118             darwin )
119                 PLATFORM_MAC=1
120                 PLATFORM_MACOSX=1
121             ;;
122             unix )
123                 PLATFORM_UNIX=1
124             ;;
125             beos )
126                 PLATFORM_BEOS=1
127             ;;
128             * )
129                 dnl wxWidgets-specific: allow unknown Unix systems
130                 dnl AC_MSG_ERROR([Unknown platform: $BAKEFILE_FORCE_PLATFORM])
131             ;;
132         esac
133     fi
134
135     AC_SUBST(PLATFORM_UNIX)
136     AC_SUBST(PLATFORM_WIN32)
137     AC_SUBST(PLATFORM_MSDOS)
138     AC_SUBST(PLATFORM_MAC)
139     AC_SUBST(PLATFORM_MACOS)
140     AC_SUBST(PLATFORM_MACOSX)
141     AC_SUBST(PLATFORM_OS2)
142     AC_SUBST(PLATFORM_BEOS)
143 ])
144
145
146 dnl ---------------------------------------------------------------------------
147 dnl AC_BAKEFILE_PLATFORM_SPECIFICS
148 dnl
149 dnl Sets misc platform-specific settings
150 dnl ---------------------------------------------------------------------------
151
152 AC_DEFUN([AC_BAKEFILE_PLATFORM_SPECIFICS],
153 [
154     AC_ARG_ENABLE([omf], AS_HELP_STRING([--enable-omf],
155                                         [use OMF object format (OS/2)]),
156                   [bk_os2_use_omf="$enableval"])
157
158     case "${BAKEFILE_HOST}" in
159       *-*-darwin* )
160         dnl For Unix to MacOS X porting instructions, see:
161         dnl http://fink.sourceforge.net/doc/porting/porting.html
162         if test "x$GCC" = "xyes"; then
163             CFLAGS="$CFLAGS -fno-common"
164             CXXFLAGS="$CXXFLAGS -fno-common"
165         fi
166         if test "x$XLCC" = "xyes"; then
167             CFLAGS="$CFLAGS -qnocommon"
168             CXXFLAGS="$CXXFLAGS -qnocommon"
169         fi
170         ;;
171
172       *-pc-os2_emx | *-pc-os2-emx )
173         if test "x$bk_os2_use_omf" = "xyes" ; then
174             AR=emxomfar
175             RANLIB=:
176             LDFLAGS="-Zomf $LDFLAGS"
177             CFLAGS="-Zomf $CFLAGS"
178             CXXFLAGS="-Zomf $CXXFLAGS"
179             OS2_LIBEXT="lib"
180         else
181             OS2_LIBEXT="a"
182         fi
183         ;;
184
185       i*86-*-beos* )
186         LDFLAGS="-L/boot/develop/lib/x86 $LDFLAGS"
187         ;;
188     esac
189 ])
190
191 dnl ---------------------------------------------------------------------------
192 dnl AC_BAKEFILE_SUFFIXES
193 dnl
194 dnl Detects shared various suffixes for shared libraries, libraries, programs,
195 dnl plugins etc.
196 dnl ---------------------------------------------------------------------------
197
198 AC_DEFUN([AC_BAKEFILE_SUFFIXES],
199 [
200     SO_SUFFIX="so"
201     SO_SUFFIX_MODULE="so"
202     EXEEXT=""
203     LIBPREFIX="lib"
204     LIBEXT=".a"
205     DLLPREFIX="lib"
206     DLLPREFIX_MODULE=""
207     DLLIMP_SUFFIX=""
208     dlldir="$libdir"
209
210     case "${BAKEFILE_HOST}" in
211         dnl PA-RISC HP systems used .sl but IA64 use ELF-64 and so use the
212         dnl standard .so extension
213         ia64-hp-hpux* )
214         ;;
215         *-hp-hpux* )
216             SO_SUFFIX="sl"
217             SO_SUFFIX_MODULE="sl"
218         ;;
219         *-*-aix* )
220             dnl quoting from
221             dnl http://www-1.ibm.com/servers/esdd/articles/gnu.html:
222             dnl     Both archive libraries and shared libraries on AIX have an
223             dnl     .a extension. This will explain why you can't link with an
224             dnl     .so and why it works with the name changed to .a.
225             SO_SUFFIX="a"
226             SO_SUFFIX_MODULE="a"
227         ;;
228         *-*-cygwin* )
229             SO_SUFFIX="dll"
230             SO_SUFFIX_MODULE="dll"
231             DLLIMP_SUFFIX="dll.a"
232             EXEEXT=".exe"
233             DLLPREFIX="cyg"
234             dlldir="$bindir"
235         ;;
236         *-*-mingw32* )
237             SO_SUFFIX="dll"
238             SO_SUFFIX_MODULE="dll"
239             DLLIMP_SUFFIX="dll.a"
240             EXEEXT=".exe"
241             DLLPREFIX=""
242             dlldir="$bindir"
243         ;;
244         *-pc-msdosdjgpp )
245             EXEEXT=".exe"
246             DLLPREFIX=""
247             dlldir="$bindir"
248         ;;
249         *-pc-os2_emx | *-pc-os2-emx )
250             SO_SUFFIX="dll"
251             SO_SUFFIX_MODULE="dll"
252             DLLIMP_SUFFIX=$OS2_LIBEXT
253             EXEEXT=".exe"
254             DLLPREFIX=""
255             LIBPREFIX=""
256             LIBEXT=".$OS2_LIBEXT"
257             dlldir="$bindir"
258         ;;
259         *-*-darwin* )
260             SO_SUFFIX="dylib"
261             SO_SUFFIX_MODULE="bundle"
262         ;;
263     esac
264
265     if test "x$DLLIMP_SUFFIX" = "x" ; then
266         DLLIMP_SUFFIX="$SO_SUFFIX"
267     fi
268
269     AC_SUBST(SO_SUFFIX)
270     AC_SUBST(SO_SUFFIX_MODULE)
271     AC_SUBST(DLLIMP_SUFFIX)
272     AC_SUBST(EXEEXT)
273     AC_SUBST(LIBPREFIX)
274     AC_SUBST(LIBEXT)
275     AC_SUBST(DLLPREFIX)
276     AC_SUBST(DLLPREFIX_MODULE)
277     AC_SUBST(dlldir)
278 ])
279
280
281 dnl ---------------------------------------------------------------------------
282 dnl AC_BAKEFILE_SHARED_LD
283 dnl
284 dnl Detects command for making shared libraries, substitutes SHARED_LD_CC
285 dnl and SHARED_LD_CXX.
286 dnl ---------------------------------------------------------------------------
287
288 AC_DEFUN([AC_BAKEFILE_SHARED_LD],
289 [
290     dnl the extra compiler flags needed for compilation of shared library
291     PIC_FLAG=""
292     if test "x$GCC" = "xyes"; then
293         dnl the switch for gcc is the same under all platforms
294         PIC_FLAG="-fPIC"
295     fi
296
297     dnl Defaults for GCC and ELF .so shared libs:
298     SHARED_LD_CC="\$(CC) -shared ${PIC_FLAG} -o"
299     SHARED_LD_CXX="\$(CXX) -shared ${PIC_FLAG} -o"
300     WINDOWS_IMPLIB=0
301
302     case "${BAKEFILE_HOST}" in
303       *-hp-hpux* )
304         dnl default settings are good for gcc but not for the native HP-UX
305         if test "x$GCC" != "xyes"; then
306             dnl no idea why it wants it, but it does
307             LDFLAGS="$LDFLAGS -L/usr/lib"
308
309             SHARED_LD_CC="${CC} -b -o"
310             SHARED_LD_CXX="${CXX} -b -o"
311             PIC_FLAG="+Z"
312         fi
313       ;;
314
315       *-*-linux* )
316         dnl newer icc versions use -fPIC just as gcc does and, in fact, the
317         dnl newest (v10+) ones don't even understand -KPIC any longer
318         if test "$INTELCC" = "yes" -a "$INTELCC8" != "yes"; then
319             PIC_FLAG="-KPIC"
320         elif test "x$SUNCXX" = "xyes"; then
321             SHARED_LD_CC="${CC} -G -o"
322             SHARED_LD_CXX="${CXX} -G -o"
323             PIC_FLAG="-KPIC"
324         fi
325       ;;
326
327       *-*-solaris2* )
328         if test "x$SUNCXX" = xyes ; then
329             SHARED_LD_CC="${CC} -G -o"
330             SHARED_LD_CXX="${CXX} -G -o"
331             PIC_FLAG="-KPIC"
332         fi
333       ;;
334
335       *-*-darwin* )
336         AC_BAKEFILE_CREATE_FILE_SHARED_LD_SH
337         chmod +x shared-ld-sh
338
339         SHARED_LD_MODULE_CC="`pwd`/shared-ld-sh -bundle -headerpad_max_install_names -o"
340         SHARED_LD_MODULE_CXX="CXX=\$(CXX) $SHARED_LD_MODULE_CC"
341
342         dnl Most apps benefit from being fully binded (its faster and static
343         dnl variables initialized at startup work).
344         dnl This can be done either with the exe linker flag -Wl,-bind_at_load
345         dnl or with a double stage link in order to create a single module
346         dnl "-init _wxWindowsDylibInit" not useful with lazy linking solved
347
348         dnl If using newer dev tools then there is a -single_module flag that
349         dnl we can use to do this for dylibs, otherwise we'll need to use a helper
350         dnl script.  Check the version of gcc to see which way we can go:
351         AC_CACHE_CHECK([for gcc 3.1 or later], bakefile_cv_gcc31, [
352            AC_TRY_COMPILE([],
353                [
354                    #if (__GNUC__ < 3) || \
355                        ((__GNUC__ == 3) && (__GNUC_MINOR__ < 1))
356                        This is old gcc
357                    #endif
358                ],
359                [
360                    bakefile_cv_gcc31=yes
361                ],
362                [
363                    bakefile_cv_gcc31=no
364                ]
365            )
366         ])
367         if test "$bakefile_cv_gcc31" = "no"; then
368             dnl Use the shared-ld-sh helper script
369             SHARED_LD_CC="`pwd`/shared-ld-sh -dynamiclib -headerpad_max_install_names -o"
370             SHARED_LD_CXX="$SHARED_LD_CC"
371         else
372             dnl Use the -single_module flag and let the linker do it for us
373             SHARED_LD_CC="\${CC} -dynamiclib -single_module -headerpad_max_install_names -o"
374             SHARED_LD_CXX="\${CXX} -dynamiclib -single_module -headerpad_max_install_names -o"
375         fi
376
377         if test "x$GCC" == "xyes"; then
378             PIC_FLAG="-dynamic -fPIC"
379         fi
380         if test "x$XLCC" = "xyes"; then
381             PIC_FLAG="-dynamic -DPIC"
382         fi
383       ;;
384
385       *-*-aix* )
386         if test "x$GCC" = "xyes"; then
387             dnl at least gcc 2.95 warns that -fPIC is ignored when
388             dnl compiling each and every file under AIX which is annoying,
389             dnl so don't use it there (it's useless as AIX runs on
390             dnl position-independent architectures only anyhow)
391             PIC_FLAG=""
392
393             dnl -bexpfull is needed by AIX linker to export all symbols (by
394             dnl default it doesn't export any and even with -bexpall it
395             dnl doesn't export all C++ support symbols, e.g. vtable
396             dnl pointers) but it's only available starting from 5.1 (with
397             dnl maintenance pack 2, whatever this is), see
398             dnl http://www-128.ibm.com/developerworks/eserver/articles/gnu.html
399             case "${BAKEFILE_HOST}" in
400                 *-*-aix5* )
401                     LD_EXPFULL="-Wl,-bexpfull"
402                     ;;
403             esac
404
405             SHARED_LD_CC="\$(CC) -shared $LD_EXPFULL -o"
406             SHARED_LD_CXX="\$(CXX) -shared $LD_EXPFULL -o"
407         else
408             dnl FIXME: makeC++SharedLib is obsolete, what should we do for
409             dnl        recent AIX versions?
410             AC_CHECK_PROG(AIX_CXX_LD, makeC++SharedLib,
411                           makeC++SharedLib, /usr/lpp/xlC/bin/makeC++SharedLib)
412             SHARED_LD_CC="$AIX_CC_LD -p 0 -o"
413             SHARED_LD_CXX="$AIX_CXX_LD -p 0 -o"
414         fi
415       ;;
416
417       *-*-beos* )
418         dnl can't use gcc under BeOS for shared library creation because it
419         dnl complains about missing 'main'
420         SHARED_LD_CC="${LD} -nostart -o"
421         SHARED_LD_CXX="${LD} -nostart -o"
422       ;;
423
424       *-*-irix* )
425         dnl default settings are ok for gcc
426         if test "x$GCC" != "xyes"; then
427             PIC_FLAG="-KPIC"
428         fi
429       ;;
430
431       *-*-cygwin* | *-*-mingw32* )
432         PIC_FLAG=""
433         SHARED_LD_CC="\$(CC) -shared -o"
434         SHARED_LD_CXX="\$(CXX) -shared -o"
435         WINDOWS_IMPLIB=1
436       ;;
437
438       *-pc-os2_emx | *-pc-os2-emx )
439         SHARED_LD_CC="`pwd`/dllar.sh -libf INITINSTANCE -libf TERMINSTANCE -o"
440         SHARED_LD_CXX="`pwd`/dllar.sh -libf INITINSTANCE -libf TERMINSTANCE -o"
441         PIC_FLAG=""
442         AC_BAKEFILE_CREATE_FILE_DLLAR_SH
443         chmod +x dllar.sh
444       ;;
445
446       powerpc-apple-macos* | \
447       *-*-freebsd* | *-*-openbsd* | *-*-netbsd* | *-*-k*bsd*-gnu | \
448       *-*-mirbsd* | \
449       *-*-sunos4* | \
450       *-*-osf* | \
451       *-*-dgux5* | \
452       *-*-sysv5* | \
453       *-pc-msdosdjgpp )
454         dnl defaults are ok
455       ;;
456
457       *)
458         AC_MSG_ERROR(unknown system type $BAKEFILE_HOST.)
459     esac
460
461     if test "x$PIC_FLAG" != "x" ; then
462         PIC_FLAG="$PIC_FLAG -DPIC"
463     fi
464
465     if test "x$SHARED_LD_MODULE_CC" = "x" ; then
466         SHARED_LD_MODULE_CC="$SHARED_LD_CC"
467     fi
468     if test "x$SHARED_LD_MODULE_CXX" = "x" ; then
469         SHARED_LD_MODULE_CXX="$SHARED_LD_CXX"
470     fi
471
472     AC_SUBST(SHARED_LD_CC)
473     AC_SUBST(SHARED_LD_CXX)
474     AC_SUBST(SHARED_LD_MODULE_CC)
475     AC_SUBST(SHARED_LD_MODULE_CXX)
476     AC_SUBST(PIC_FLAG)
477     AC_SUBST(WINDOWS_IMPLIB)
478 ])
479
480
481 dnl ---------------------------------------------------------------------------
482 dnl AC_BAKEFILE_SHARED_VERSIONS
483 dnl
484 dnl Detects linker options for attaching versions (sonames) to shared  libs.
485 dnl ---------------------------------------------------------------------------
486
487 AC_DEFUN([AC_BAKEFILE_SHARED_VERSIONS],
488 [
489     USE_SOVERSION=0
490     USE_SOVERLINUX=0
491     USE_SOVERSOLARIS=0
492     USE_SOVERCYGWIN=0
493     USE_SOSYMLINKS=0
494     USE_MACVERSION=0
495     SONAME_FLAG=
496
497     case "${BAKEFILE_HOST}" in
498       *-*-linux* | *-*-freebsd* | *-*-openbsd* | *-*-netbsd* | \
499       *-*-k*bsd*-gnu | *-*-mirbsd* )
500         if test "x$SUNCXX" = "xyes"; then
501             SONAME_FLAG="-h "
502         else
503             SONAME_FLAG="-Wl,-soname,"
504         fi
505         USE_SOVERSION=1
506         USE_SOVERLINUX=1
507         USE_SOSYMLINKS=1
508       ;;
509
510       *-*-solaris2* )
511         SONAME_FLAG="-h "
512         USE_SOVERSION=1
513         USE_SOVERSOLARIS=1
514         USE_SOSYMLINKS=1
515       ;;
516
517       *-*-darwin* )
518         USE_MACVERSION=1
519         USE_SOVERSION=1
520         USE_SOSYMLINKS=1
521       ;;
522
523       *-*-cygwin* )
524         USE_SOVERSION=1
525         USE_SOVERCYGWIN=1
526       ;;
527     esac
528
529     AC_SUBST(USE_SOVERSION)
530     AC_SUBST(USE_SOVERLINUX)
531     AC_SUBST(USE_SOVERSOLARIS)
532     AC_SUBST(USE_SOVERCYGWIN)
533     AC_SUBST(USE_MACVERSION)
534     AC_SUBST(USE_SOSYMLINKS)
535     AC_SUBST(SONAME_FLAG)
536 ])
537
538
539 dnl ---------------------------------------------------------------------------
540 dnl AC_BAKEFILE_DEPS
541 dnl
542 dnl Detects available C/C++ dependency tracking options
543 dnl ---------------------------------------------------------------------------
544
545 AC_DEFUN([AC_BAKEFILE_DEPS],
546 [
547     AC_ARG_ENABLE([dependency-tracking],
548                   AS_HELP_STRING([--disable-dependency-tracking],
549                                  [don't use dependency tracking even if the compiler can]),
550                   [bk_use_trackdeps="$enableval"])
551
552     AC_MSG_CHECKING([for dependency tracking method])
553
554     BK_DEPS=""
555     if test "x$bk_use_trackdeps" = "xno" ; then
556         DEPS_TRACKING=0
557         AC_MSG_RESULT([disabled])
558     else
559         DEPS_TRACKING=1
560
561         if test "x$GCC" = "xyes"; then
562             DEPSMODE=gcc
563             case "${BAKEFILE_HOST}" in
564                 *-*-darwin* )
565                     dnl -cpp-precomp (the default) conflicts with -MMD option
566                     dnl used by bk-deps (see also http://developer.apple.com/documentation/Darwin/Conceptual/PortingUnix/compiling/chapter_4_section_3.html)
567                     DEPSFLAG="-no-cpp-precomp -MMD"
568                 ;;
569                 * )
570                     DEPSFLAG="-MMD"
571                 ;;
572             esac
573             AC_MSG_RESULT([gcc])
574         elif test "x$MWCC" = "xyes"; then
575             DEPSMODE=mwcc
576             DEPSFLAG="-MM"
577             AC_MSG_RESULT([mwcc])
578         elif test "x$SUNCC" = "xyes"; then
579             DEPSMODE=unixcc
580             DEPSFLAG="-xM1"
581             AC_MSG_RESULT([Sun cc])
582         elif test "x$SGICC" = "xyes"; then
583             DEPSMODE=unixcc
584             DEPSFLAG="-M"
585             AC_MSG_RESULT([SGI cc])
586         elif test "x$HPCC" = "xyes"; then
587             DEPSMODE=unixcc
588             DEPSFLAG="+make"
589             AC_MSG_RESULT([HP cc])
590         elif test "x$COMPAQCC" = "xyes"; then
591             DEPSMODE=gcc
592             DEPSFLAG="-MD"
593             AC_MSG_RESULT([Compaq cc])
594         else
595             DEPS_TRACKING=0
596             AC_MSG_RESULT([none])
597         fi
598
599         if test $DEPS_TRACKING = 1 ; then
600             AC_BAKEFILE_CREATE_FILE_BK_DEPS
601             chmod +x bk-deps
602             dnl FIXME: make this $(top_builddir)/bk-deps once autoconf-2.60
603             dnl        is required (and so top_builddir is never empty):
604             BK_DEPS="`pwd`/bk-deps"
605         fi
606     fi
607
608     AC_SUBST(DEPS_TRACKING)
609     AC_SUBST(BK_DEPS)
610 ])
611
612 dnl ---------------------------------------------------------------------------
613 dnl AC_BAKEFILE_CHECK_BASIC_STUFF
614 dnl
615 dnl Checks for presence of basic programs, such as C and C++ compiler, "ranlib"
616 dnl or "install"
617 dnl ---------------------------------------------------------------------------
618
619 AC_DEFUN([AC_BAKEFILE_CHECK_BASIC_STUFF],
620 [
621     AC_PROG_RANLIB
622     AC_PROG_INSTALL
623     AC_PROG_LN_S
624
625     AC_PROG_MAKE_SET
626     AC_SUBST(MAKE_SET)
627
628     if test "x$SUNCXX" = "xyes"; then
629         dnl Sun C++ compiler requires special way of creating static libs;
630         dnl see here for more details:
631         dnl https://sourceforge.net/tracker/?func=detail&atid=109863&aid=1229751&group_id=9863
632         AR=$CXX
633         AROPTIONS="-xar -o"
634         AC_SUBST(AR)
635     elif test "x$SGICC" = "xyes"; then
636         dnl Almost the same as above for SGI mipsPro compiler
637         AR=$CXX
638         AROPTIONS="-ar -o"
639         AC_SUBST(AR)
640     else
641         AC_CHECK_TOOL(AR, ar, ar)
642         AROPTIONS=rcu
643     fi
644     AC_SUBST(AROPTIONS)
645
646     AC_CHECK_TOOL(STRIP, strip, :)
647     AC_CHECK_TOOL(NM, nm, :)
648
649     dnl This check is necessary because "install -d" doesn't exist on
650     dnl all platforms (e.g. HP/UX), see http://www.bakefile.org/ticket/80
651     AC_MSG_CHECKING([for command to install directories])
652     INSTALL_TEST_DIR=acbftest$$
653     $INSTALL -d $INSTALL_TEST_DIR > /dev/null 2>&1
654     if test $? = 0 -a -d $INSTALL_TEST_DIR; then
655         rmdir $INSTALL_TEST_DIR
656         dnl we must refer to makefile's $(INSTALL) variable and not
657         dnl current value of shell variable, hence the single quoting:
658         INSTALL_DIR='$(INSTALL) -d'
659         AC_MSG_RESULT([$INSTALL -d])
660     else
661         INSTALL_DIR="mkdir -p"
662         AC_MSG_RESULT([mkdir -p])
663     fi
664     AC_SUBST(INSTALL_DIR)
665
666     LDFLAGS_GUI=
667     case ${BAKEFILE_HOST} in
668         *-*-cygwin* | *-*-mingw32* )
669         LDFLAGS_GUI="-mwindows"
670     esac
671     AC_SUBST(LDFLAGS_GUI)
672 ])
673
674
675 dnl ---------------------------------------------------------------------------
676 dnl AC_BAKEFILE_RES_COMPILERS
677 dnl
678 dnl Checks for presence of resource compilers for win32 or mac
679 dnl ---------------------------------------------------------------------------
680
681 AC_DEFUN([AC_BAKEFILE_RES_COMPILERS],
682 [
683     case ${BAKEFILE_HOST} in
684         *-*-cygwin* | *-*-mingw32* )
685             dnl Check for win32 resources compiler:
686             AC_CHECK_TOOL(WINDRES, windres)
687          ;;
688
689       *-*-darwin* | powerpc-apple-macos* )
690             AC_CHECK_PROG(REZ, Rez, Rez, /Developer/Tools/Rez)
691             AC_CHECK_PROG(SETFILE, SetFile, SetFile, /Developer/Tools/SetFile)
692         ;;
693     esac
694
695     AC_SUBST(WINDRES)
696     AC_SUBST(REZ)
697     AC_SUBST(SETFILE)
698 ])
699
700 dnl ---------------------------------------------------------------------------
701 dnl AC_BAKEFILE_PRECOMP_HEADERS
702 dnl
703 dnl Check for precompiled headers support (GCC >= 3.4)
704 dnl ---------------------------------------------------------------------------
705
706 AC_DEFUN([AC_BAKEFILE_PRECOMP_HEADERS],
707 [
708
709     AC_ARG_ENABLE([precomp-headers],
710                   AS_HELP_STRING([--disable-precomp-headers],
711                                  [don't use precompiled headers even if compiler can]),
712                   [bk_use_pch="$enableval"])
713
714     GCC_PCH=0
715     ICC_PCH=0
716     USE_PCH=0
717     BK_MAKE_PCH=""
718
719     case ${BAKEFILE_HOST} in
720         *-*-cygwin* )
721             dnl PCH support is broken in cygwin gcc because of unportable
722             dnl assumptions about mmap() in gcc code which make PCH generation
723             dnl fail erratically; disable PCH completely until this is fixed
724             bk_use_pch="no"
725             ;;
726     esac
727
728     if test "x$bk_use_pch" = "x" -o "x$bk_use_pch" = "xyes" ; then
729         if test "x$GCC" = "xyes"; then
730             dnl test if we have gcc-3.4:
731             AC_MSG_CHECKING([if the compiler supports precompiled headers])
732             AC_TRY_COMPILE([],
733                 [
734                     #if !defined(__GNUC__) || !defined(__GNUC_MINOR__)
735                         There is no PCH support
736                     #endif
737                     #if (__GNUC__ < 3)
738                         There is no PCH support
739                     #endif
740                     #if (__GNUC__ == 3) && \
741                        ((!defined(__APPLE_CC__) && (__GNUC_MINOR__ < 4)) || \
742                        ( defined(__APPLE_CC__) && (__GNUC_MINOR__ < 3))) || \
743                        ( defined(__INTEL_COMPILER) )
744                         There is no PCH support
745                     #endif
746                 ],
747                 [
748                     AC_MSG_RESULT([yes])
749                     GCC_PCH=1
750                 ],
751                 [
752                     if test "$INTELCXX8" = "yes"; then
753                         AC_MSG_RESULT([yes])
754                         ICC_PCH=1
755                         if test "$INTELCXX10" = "yes"; then
756                             ICC_PCH_CREATE_SWITCH="-pch-create"
757                             ICC_PCH_USE_SWITCH="-pch-use"
758                         else
759                             ICC_PCH_CREATE_SWITCH="-create-pch"
760                             ICC_PCH_USE_SWITCH="-use-pch"
761                         fi
762                     else
763                         AC_MSG_RESULT([no])
764                     fi
765                 ])
766             if test $GCC_PCH = 1 -o $ICC_PCH = 1 ; then
767                 USE_PCH=1
768                 AC_BAKEFILE_CREATE_FILE_BK_MAKE_PCH
769                 chmod +x bk-make-pch
770                 dnl FIXME: make this $(top_builddir)/bk-make-pch once
771                 dnl        autoconf-2.60 is required (and so top_builddir is
772                 dnl        never empty):
773                 BK_MAKE_PCH="`pwd`/bk-make-pch"
774             fi
775         fi
776     fi
777
778     AC_SUBST(GCC_PCH)
779     AC_SUBST(ICC_PCH)
780     AC_SUBST(ICC_PCH_CREATE_SWITCH)
781     AC_SUBST(ICC_PCH_USE_SWITCH)
782     AC_SUBST(BK_MAKE_PCH)
783 ])
784
785
786
787 dnl ---------------------------------------------------------------------------
788 dnl AC_BAKEFILE([autoconf_inc.m4 inclusion])
789 dnl
790 dnl To be used in configure.in of any project using Bakefile-generated mks
791 dnl
792 dnl Behaviour can be modified by setting following variables:
793 dnl    BAKEFILE_CHECK_BASICS    set to "no" if you don't want bakefile to
794 dnl                             to perform check for basic tools like ranlib
795 dnl    BAKEFILE_HOST            set this to override host detection, defaults
796 dnl                             to ${host}
797 dnl    BAKEFILE_FORCE_PLATFORM  set to override platform detection
798 dnl
799 dnl Example usage:
800 dnl
801 dnl   AC_BAKEFILE([FOO(autoconf_inc.m4)])
802 dnl
803 dnl (replace FOO with m4_include above, aclocal would die otherwise)
804 dnl (yes, it's ugly, but thanks to a bug in aclocal, it's the only thing
805 dnl we can do...)
806 dnl ---------------------------------------------------------------------------
807
808 AC_DEFUN([AC_BAKEFILE],
809 [
810     AC_PREREQ([2.58])
811
812     dnl We need to always run C/C++ compiler tests, but it's also possible
813     dnl for the user to call these macros manually, hence this instead of
814     dnl simply calling these macros. See http://www.bakefile.org/ticket/64
815     AC_REQUIRE([AC_BAKEFILE_PROG_CC])
816     AC_REQUIRE([AC_BAKEFILE_PROG_CXX])
817
818     if test "x$BAKEFILE_HOST" = "x"; then
819                if test "x${host}" = "x" ; then
820                        AC_MSG_ERROR([You must call the autoconf "CANONICAL_HOST" macro in your configure.ac (or .in) file.])
821                fi
822
823         BAKEFILE_HOST="${host}"
824     fi
825
826     if test "x$BAKEFILE_CHECK_BASICS" != "xno"; then
827         AC_BAKEFILE_CHECK_BASIC_STUFF
828     fi
829     AC_BAKEFILE_GNUMAKE
830     AC_BAKEFILE_PLATFORM
831     AC_BAKEFILE_PLATFORM_SPECIFICS
832     AC_BAKEFILE_SUFFIXES
833     AC_BAKEFILE_SHARED_LD
834     AC_BAKEFILE_SHARED_VERSIONS
835     AC_BAKEFILE_DEPS
836     AC_BAKEFILE_RES_COMPILERS
837
838     dnl OBJCFLAGS is set by Autoconf, but OBJCXXFLAGS is not:
839     AC_SUBST(OBJCXXFLAGS)
840
841
842     BAKEFILE_BAKEFILE_M4_VERSION="0.2.5"
843
844     dnl includes autoconf_inc.m4:
845     $1
846
847     if test "$BAKEFILE_AUTOCONF_INC_M4_VERSION" = "" ; then
848         AC_MSG_ERROR([No version found in autoconf_inc.m4 - bakefile macro was changed to take additional argument, perhaps configure.in wasn't updated (see the documentation)?])
849     fi
850
851     if test "$BAKEFILE_BAKEFILE_M4_VERSION" != "$BAKEFILE_AUTOCONF_INC_M4_VERSION" ; then
852         AC_MSG_ERROR([Versions of Bakefile used to generate makefiles ($BAKEFILE_AUTOCONF_INC_M4_VERSION) and configure ($BAKEFILE_BAKEFILE_M4_VERSION) do not match.])
853     fi
854 ])
855
856
857 dnl ---------------------------------------------------------------------------
858 dnl              Embedded copies of helper scripts follow:
859 dnl ---------------------------------------------------------------------------
860
861 AC_DEFUN([AC_BAKEFILE_CREATE_FILE_BK_DEPS],
862 [
863 dnl ===================== bk-deps begins here =====================
864 dnl    (Created by merge-scripts.py from bk-deps
865 dnl     file do not edit here!)
866 D='$'
867 cat <<EOF >bk-deps
868 #!/bin/sh
869
870 # This script is part of Bakefile (http://www.bakefile.org) autoconf
871 # script. It is used to track C/C++ files dependencies in portable way.
872 #
873 # Permission is given to use this file in any way.
874
875 DEPSMODE=${DEPSMODE}
876 DEPSFLAG="${DEPSFLAG}"
877 DEPSDIRBASE=.deps
878
879 if test ${D}DEPSMODE = gcc ; then
880     ${D}* ${D}{DEPSFLAG}
881     status=${D}?
882
883     # determine location of created files:
884     while test ${D}# -gt 0; do
885         case "${D}1" in
886             -o )
887                 shift
888                 objfile=${D}1
889             ;;
890             -* )
891             ;;
892             * )
893                 srcfile=${D}1
894             ;;
895         esac
896         shift
897     done
898     objfilebase=\`basename ${D}objfile\`
899     builddir=\`dirname ${D}objfile\`
900     depfile=\`basename ${D}srcfile | sed -e 's/\\..*${D}/.d/g'\`
901     depobjname=\`echo ${D}depfile |sed -e 's/\\.d/.o/g'\`
902     depsdir=${D}builddir/${D}DEPSDIRBASE
903     mkdir -p ${D}depsdir
904
905     # if the compiler failed, we're done:
906     if test ${D}{status} != 0 ; then
907         rm -f ${D}depfile
908         exit ${D}{status}
909     fi
910
911     # move created file to the location we want it in:
912     if test -f ${D}depfile ; then
913         sed -e "s,${D}depobjname:,${D}objfile:,g" ${D}depfile >${D}{depsdir}/${D}{objfilebase}.d
914         rm -f ${D}depfile
915     else
916         # "g++ -MMD -o fooobj.o foosrc.cpp" produces fooobj.d
917         depfile=\`echo "${D}objfile" | sed -e 's/\\..*${D}/.d/g'\`
918         if test ! -f ${D}depfile ; then
919             # "cxx -MD -o fooobj.o foosrc.cpp" creates fooobj.o.d (Compaq C++)
920             depfile="${D}objfile.d"
921         fi
922         if test -f ${D}depfile ; then
923             sed -e "\\,^${D}objfile,!s,${D}depobjname:,${D}objfile:,g" ${D}depfile >${D}{depsdir}/${D}{objfilebase}.d
924             rm -f ${D}depfile
925         fi
926     fi
927     exit 0
928
929 elif test ${D}DEPSMODE = mwcc ; then
930     ${D}* || exit ${D}?
931     # Run mwcc again with -MM and redirect into the dep file we want
932     # NOTE: We can't use shift here because we need ${D}* to be valid
933     prevarg=
934     for arg in ${D}* ; do
935         if test "${D}prevarg" = "-o"; then
936             objfile=${D}arg
937         else
938             case "${D}arg" in
939                 -* )
940                 ;;
941                 * )
942                     srcfile=${D}arg
943                 ;;
944             esac
945         fi
946         prevarg="${D}arg"
947     done
948
949     objfilebase=\`basename ${D}objfile\`
950     builddir=\`dirname ${D}objfile\`
951     depsdir=${D}builddir/${D}DEPSDIRBASE
952     mkdir -p ${D}depsdir
953
954     ${D}* ${D}DEPSFLAG >${D}{depsdir}/${D}{objfilebase}.d
955     exit 0
956
957 elif test ${D}DEPSMODE = unixcc; then
958     ${D}* || exit ${D}?
959     # Run compiler again with deps flag and redirect into the dep file.
960     # It doesn't work if the '-o FILE' option is used, but without it the
961     # dependency file will contain the wrong name for the object. So it is
962     # removed from the command line, and the dep file is fixed with sed.
963     cmd=""
964     while test ${D}# -gt 0; do
965         case "${D}1" in
966             -o )
967                 shift
968                 objfile=${D}1
969             ;;
970             * )
971                 eval arg${D}#=\\${D}1
972                 cmd="${D}cmd \\${D}arg${D}#"
973             ;;
974         esac
975         shift
976     done
977
978     objfilebase=\`basename ${D}objfile\`
979     builddir=\`dirname ${D}objfile\`
980     depsdir=${D}builddir/${D}DEPSDIRBASE
981     mkdir -p ${D}depsdir
982
983     eval "${D}cmd ${D}DEPSFLAG" | sed "s|.*:|${D}objfile:|" >${D}{depsdir}/${D}{objfilebase}.d
984     exit 0
985
986 else
987     ${D}*
988     exit ${D}?
989 fi
990 EOF
991 dnl ===================== bk-deps ends here =====================
992 ])
993
994 AC_DEFUN([AC_BAKEFILE_CREATE_FILE_SHARED_LD_SH],
995 [
996 dnl ===================== shared-ld-sh begins here =====================
997 dnl    (Created by merge-scripts.py from shared-ld-sh
998 dnl     file do not edit here!)
999 D='$'
1000 cat <<EOF >shared-ld-sh
1001 #!/bin/sh
1002 #-----------------------------------------------------------------------------
1003 #-- Name:        distrib/mac/shared-ld-sh
1004 #-- Purpose:     Link a mach-o dynamic shared library for Darwin / Mac OS X
1005 #-- Author:      Gilles Depeyrot
1006 #-- Copyright:   (c) 2002 Gilles Depeyrot
1007 #-- Licence:     any use permitted
1008 #-----------------------------------------------------------------------------
1009
1010 verbose=0
1011 args=""
1012 objects=""
1013 linking_flag="-dynamiclib"
1014 ldargs="-r -keep_private_externs -nostdlib"
1015
1016 if test "x${D}CXX" = "x"; then
1017     CXX="c++"
1018 fi
1019
1020 while test ${D}# -gt 0; do
1021     case ${D}1 in
1022
1023        -v)
1024         verbose=1
1025         ;;
1026
1027        -o|-compatibility_version|-current_version|-framework|-undefined|-install_name)
1028         # collect these options and values
1029         args="${D}{args} ${D}1 ${D}2"
1030         shift
1031         ;;
1032        
1033        -arch|-isysroot)
1034         # collect these options and values
1035         ldargs="${D}{ldargs} ${D}1 ${D}2"
1036         shift
1037         ;;
1038
1039        -s|-Wl,*)
1040         # collect these load args
1041         ldargs="${D}{ldargs} ${D}1"
1042         ;;
1043
1044        -l*|-L*|-flat_namespace|-headerpad_max_install_names)
1045         # collect these options
1046         args="${D}{args} ${D}1"
1047         ;;
1048
1049        -dynamiclib|-bundle)
1050         linking_flag="${D}1"
1051         ;;
1052
1053        -*)
1054         echo "shared-ld: unhandled option '${D}1'"
1055         exit 1
1056         ;;
1057
1058         *.o | *.a | *.dylib)
1059         # collect object files
1060         objects="${D}{objects} ${D}1"
1061         ;;
1062
1063         *)
1064         echo "shared-ld: unhandled argument '${D}1'"
1065         exit 1
1066         ;;
1067
1068     esac
1069     shift
1070 done
1071
1072 status=0
1073
1074 #
1075 # Link one module containing all the others
1076 #
1077 if test ${D}{verbose} = 1; then
1078     echo "${D}CXX ${D}{ldargs} ${D}{objects} -o master.${D}${D}.o"
1079 fi
1080 ${D}CXX ${D}{ldargs} ${D}{objects} -o master.${D}${D}.o
1081 status=${D}?
1082
1083 #
1084 # Link the shared library from the single module created, but only if the
1085 # previous command didn't fail:
1086 #
1087 if test ${D}{status} = 0; then
1088     if test ${D}{verbose} = 1; then
1089         echo "${D}CXX ${D}{linking_flag} master.${D}${D}.o ${D}{args}"
1090     fi
1091     ${D}CXX ${D}{linking_flag} master.${D}${D}.o ${D}{args}
1092     status=${D}?
1093 fi
1094
1095 #
1096 # Remove intermediate module
1097 #
1098 rm -f master.${D}${D}.o
1099
1100 exit ${D}status
1101 EOF
1102 dnl ===================== shared-ld-sh ends here =====================
1103 ])
1104
1105 AC_DEFUN([AC_BAKEFILE_CREATE_FILE_BK_MAKE_PCH],
1106 [
1107 dnl ===================== bk-make-pch begins here =====================
1108 dnl    (Created by merge-scripts.py from bk-make-pch
1109 dnl     file do not edit here!)
1110 D='$'
1111 cat <<EOF >bk-make-pch
1112 #!/bin/sh
1113
1114 # This script is part of Bakefile (http://www.bakefile.org) autoconf
1115 # script. It is used to generated precompiled headers.
1116 #
1117 # Permission is given to use this file in any way.
1118
1119 outfile="${D}{1}"
1120 header="${D}{2}"
1121 shift
1122 shift
1123
1124 builddir=\`echo ${D}outfile | sed -e 's,/\\.pch/.*${D},,g'\`
1125
1126 compiler=""
1127 headerfile=""
1128
1129 while test ${D}{#} -gt 0; do
1130     add_to_cmdline=1
1131     case "${D}{1}" in
1132         -I* )
1133             incdir=\`echo ${D}{1} | sed -e 's/-I\\(.*\\)/\\1/g'\`
1134             if test "x${D}{headerfile}" = "x" -a -f "${D}{incdir}/${D}{header}" ; then
1135                 headerfile="${D}{incdir}/${D}{header}"
1136             fi
1137         ;;
1138         -use-pch|-use_pch|-pch-use )
1139             shift
1140             add_to_cmdline=0
1141         ;;
1142     esac
1143     if test ${D}add_to_cmdline = 1 ; then
1144         compiler="${D}{compiler} ${D}{1}"
1145     fi
1146     shift
1147 done
1148
1149 if test "x${D}{headerfile}" = "x" ; then
1150     echo "error: can't find header ${D}{header} in include paths" >&2
1151 else
1152     if test -f ${D}{outfile} ; then
1153         rm -f ${D}{outfile}
1154     else
1155         mkdir -p \`dirname ${D}{outfile}\`
1156     fi
1157     depsfile="${D}{builddir}/.deps/\`echo ${D}{outfile} | tr '/.' '__'\`.d"
1158     mkdir -p ${D}{builddir}/.deps
1159     if test "x${GCC_PCH}" = "x1" ; then
1160         # can do this because gcc is >= 3.4:
1161         ${D}{compiler} -o ${D}{outfile} -MMD -MF "${D}{depsfile}" "${D}{headerfile}"
1162     elif test "x${ICC_PCH}" = "x1" ; then
1163         filename=pch_gen-${D}${D}
1164         file=${D}{filename}.c
1165         dfile=${D}{filename}.d
1166         cat > ${D}file <<EOT
1167 #include "${D}header"
1168 EOT
1169         # using -MF icc complains about differing command lines in creation/use
1170         ${D}compiler -c ${ICC_PCH_CREATE_SWITCH} ${D}outfile -MMD ${D}file && \\
1171           sed -e "s,^.*:,${D}outfile:," -e "s, ${D}file,," < ${D}dfile > ${D}depsfile && \\
1172           rm -f ${D}file ${D}dfile ${D}{filename}.o
1173     fi
1174     exit ${D}{?}
1175 fi
1176 EOF
1177 dnl ===================== bk-make-pch ends here =====================
1178 ])