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