don't use -single_module together with -bundle under Darwin (ld gives an error for...
[wxWidgets.git] / build / aclocal / bakefile.m4
1 dnl ---------------------------------------------------------------------------
2 dnl Support macros for makefiles generated by BAKEFILE.
3 dnl ---------------------------------------------------------------------------
4
5 dnl Lots of compiler & linker detection code contained here was taken from
6 dnl wxWindows configure.in script (see http://www.wxwindows.org)
7
8
9
10 dnl ---------------------------------------------------------------------------
11 dnl AC_BAKEFILE_GNUMAKE
12 dnl
13 dnl Detects GNU make
14 dnl ---------------------------------------------------------------------------
15
16 AC_DEFUN([AC_BAKEFILE_GNUMAKE],
17 [
18     dnl does make support "-include" (only GNU make does AFAIK)?
19     AC_CACHE_CHECK([if make is GNU make], bakefile_cv_prog_makeisgnu,
20     [
21         if ( ${SHELL-sh} -c "${MAKE-make} --version" 2> /dev/null |
22                 egrep -s GNU > /dev/null); then
23             bakefile_cv_prog_makeisgnu="yes"
24         else
25             bakefile_cv_prog_makeisgnu="no"
26         fi
27     ])
28
29     if test "x$bakefile_cv_prog_makeisgnu" = "xyes"; then
30         IF_GNU_MAKE=""
31     else
32         IF_GNU_MAKE="#"
33     fi
34     AC_SUBST(IF_GNU_MAKE)
35 ])
36
37 dnl ---------------------------------------------------------------------------
38 dnl AC_BAKEFILE_PLATFORM
39 dnl
40 dnl Detects platform and sets PLATFORM_XXX variables accordingly
41 dnl ---------------------------------------------------------------------------
42
43 AC_DEFUN([AC_BAKEFILE_PLATFORM],
44 [
45     PLATFORM_UNIX=0
46     PLATFORM_WIN32=0
47     PLATFORM_MSDOS=0
48     PLATFORM_MAC=0
49     PLATFORM_MACOS=0
50     PLATFORM_MACOSX=0
51     PLATFORM_OS2=0
52     PLATFORM_BEOS=0
53
54     if test "x$BAKEFILE_FORCE_PLATFORM" = "x"; then 
55         case "${BAKEFILE_HOST}" in
56             *-*-mingw32* )
57                 PLATFORM_WIN32=1
58             ;;
59             *-pc-msdosdjgpp )
60                 PLATFORM_MSDOS=1
61             ;;
62             *-pc-os2_emx | *-pc-os2-emx )
63                 PLATFORM_OS2=1
64             ;;
65             *-*-darwin* )
66                 PLATFORM_MAC=1
67                 PLATFORM_MACOSX=1
68             ;; 
69             *-*-beos* )
70                 PLATFORM_BEOS=1
71             ;;
72             powerpc-apple-macos* )
73                 PLATFORM_MAC=1
74                 PLATFORM_MACOS=1
75             ;;
76             * )
77                 PLATFORM_UNIX=1
78             ;;
79         esac
80     else
81         case "$BAKEFILE_FORCE_PLATFORM" in
82             win32 )
83                 PLATFORM_WIN32=1
84             ;;
85             msdos )
86                 PLATFORM_MSDOS=1
87             ;;
88             os2 )
89                 PLATFORM_OS2=1
90             ;;
91             darwin )
92                 PLATFORM_MAC=1
93                 PLATFORM_MACOSX=1
94             ;;
95             unix )
96                 PLATFORM_UNIX=1
97             ;;
98             beos )
99                 PLATFORM_BEOS=1
100             ;;
101             * )
102                 AC_MSG_ERROR([Unknown platform: $BAKEFILE_FORCE_PLATFORM])
103             ;;
104         esac
105     fi
106
107     AC_SUBST(PLATFORM_UNIX)
108     AC_SUBST(PLATFORM_WIN32)
109     AC_SUBST(PLATFORM_MSDOS)
110     AC_SUBST(PLATFORM_MAC)
111     AC_SUBST(PLATFORM_MACOS)
112     AC_SUBST(PLATFORM_MACOSX)
113     AC_SUBST(PLATFORM_OS2)
114     AC_SUBST(PLATFORM_BEOS)
115 ])
116
117
118 dnl ---------------------------------------------------------------------------
119 dnl AC_BAKEFILE_PLATFORM_SPECIFICS
120 dnl
121 dnl Sets misc platform-specific settings
122 dnl ---------------------------------------------------------------------------
123
124 AC_DEFUN([AC_BAKEFILE_PLATFORM_SPECIFICS],
125 [
126     AC_ARG_ENABLE([omf], AS_HELP_STRING([--enable-omf],
127                                         [use OMF object format (OS/2)]),
128                   [bk_os2_use_omf="$enableval"])
129     
130     case "${BAKEFILE_HOST}" in
131       *-*-darwin* )
132         dnl For Unix to MacOS X porting instructions, see:
133         dnl http://fink.sourceforge.net/doc/porting/porting.html
134         if test "x$GCC" = "xyes"; then
135             CFLAGS="$CFLAGS -fno-common"
136             CXXFLAGS="$CXXFLAGS -fno-common"
137         fi
138         if test "x$XLCC" = "xyes"; then
139             CFLAGS="$CFLAGS -qnocommon"
140             CXXFLAGS="$CXXFLAGS -qnocommon"
141         fi
142         ;;
143
144       *-pc-os2_emx | *-pc-os2-emx )
145         if test "x$bk_os2_use_omf" = "xyes" ; then
146             AR=emxomfar
147             RANLIB=:
148             LDFLAGS="-Zomf $LDFLAGS"
149             CFLAGS="-Zomf $CFLAGS"
150             CXXFLAGS="-Zomf $CXXFLAGS"
151             OS2_LIBEXT="lib"
152         else
153             OS2_LIBEXT="a"
154         fi
155         ;;
156       
157       i*86-*-beos* )
158         LDFLAGS="-L/boot/develop/lib/x86 $LDFLAGS"
159         ;;
160     esac
161 ])
162
163 dnl ---------------------------------------------------------------------------
164 dnl AC_BAKEFILE_SUFFIXES
165 dnl
166 dnl Detects shared various suffixes for shared libraries, libraries, programs,
167 dnl plugins etc.
168 dnl ---------------------------------------------------------------------------
169
170 AC_DEFUN([AC_BAKEFILE_SUFFIXES],
171 [
172     SO_SUFFIX="so"
173     SO_SUFFIX_MODULE="so"
174     EXEEXT=""
175     LIBPREFIX="lib"
176     LIBEXT=".a"
177     DLLPREFIX="lib"
178     DLLPREFIX_MODULE=""
179     DLLIMP_SUFFIX=""
180     dlldir="$libdir"
181     
182     case "${BAKEFILE_HOST}" in
183         *-hp-hpux* )
184             SO_SUFFIX="sl"
185             SO_SUFFIX_MODULE="sl"
186         ;;
187         *-*-aix* )
188             dnl quoting from
189             dnl http://www-1.ibm.com/servers/esdd/articles/gnu.html:
190             dnl     Both archive libraries and shared libraries on AIX have an
191             dnl     .a extension. This will explain why you can't link with an
192             dnl     .so and why it works with the name changed to .a.
193             SO_SUFFIX="a"
194             SO_SUFFIX_MODULE="a"
195         ;;
196         *-*-cygwin* )
197             SO_SUFFIX="dll"
198             SO_SUFFIX_MODULE="dll"
199             DLLIMP_SUFFIX="dll.a"
200             EXEEXT=".exe"
201             DLLPREFIX="cyg"
202             dlldir="$bindir"
203         ;;
204         *-*-mingw32* )
205             SO_SUFFIX="dll"
206             SO_SUFFIX_MODULE="dll"
207             DLLIMP_SUFFIX="dll.a"
208             EXEEXT=".exe"
209             DLLPREFIX=""
210             dlldir="$bindir"
211         ;;
212         *-pc-msdosdjgpp )
213             EXEEXT=".exe"
214             DLLPREFIX=""
215             dlldir="$bindir"
216         ;;
217         *-pc-os2_emx | *-pc-os2-emx )
218             SO_SUFFIX="dll"
219             SO_SUFFIX_MODULE="dll"
220             DLLIMP_SUFFIX=$OS2_LIBEXT
221             EXEEXT=".exe"
222             DLLPREFIX=""
223             LIBPREFIX=""
224             LIBEXT=".$OS2_LIBEXT"
225             dlldir="$bindir"
226         ;;
227         *-*-darwin* )
228             SO_SUFFIX="dylib"
229             SO_SUFFIX_MODULE="bundle"
230         ;;
231     esac
232
233     if test "x$DLLIMP_SUFFIX" = "x" ; then
234         DLLIMP_SUFFIX="$SO_SUFFIX"
235     fi
236
237     AC_SUBST(SO_SUFFIX)
238     AC_SUBST(SO_SUFFIX_MODULE)
239     AC_SUBST(DLLIMP_SUFFIX)
240     AC_SUBST(EXEEXT)
241     AC_SUBST(LIBPREFIX)
242     AC_SUBST(LIBEXT)
243     AC_SUBST(DLLPREFIX)
244     AC_SUBST(DLLPREFIX_MODULE)
245     AC_SUBST(dlldir)
246 ])
247
248
249 dnl ---------------------------------------------------------------------------
250 dnl AC_BAKEFILE_SHARED_LD
251 dnl
252 dnl Detects command for making shared libraries, substitutes SHARED_LD_CC
253 dnl and SHARED_LD_CXX.
254 dnl ---------------------------------------------------------------------------
255
256 AC_DEFUN([AC_BAKEFILE_SHARED_LD],
257 [
258     dnl the extra compiler flags needed for compilation of shared library
259     PIC_FLAG=""
260     if test "x$GCC" = "xyes"; then
261         dnl the switch for gcc is the same under all platforms
262         PIC_FLAG="-fPIC"
263     fi
264     
265     dnl Defaults for GCC and ELF .so shared libs:
266     SHARED_LD_CC="\$(CC) -shared ${PIC_FLAG} -o"
267     SHARED_LD_CXX="\$(CXX) -shared ${PIC_FLAG} -o"
268     WINDOWS_IMPLIB=0
269
270     case "${BAKEFILE_HOST}" in
271       *-hp-hpux* )
272         dnl default settings are good for gcc but not for the native HP-UX
273         if test "x$GCC" != "xyes"; then
274             dnl no idea why it wants it, but it does
275             LDFLAGS="$LDFLAGS -L/usr/lib"
276
277             SHARED_LD_CC="${CC} -b -o"
278             SHARED_LD_CXX="${CXX} -b -o"
279             PIC_FLAG="+Z"
280         fi
281       ;;
282
283       *-*-linux* )
284         if test "x$GCC" != "xyes"; then
285             AC_CACHE_CHECK([for Intel compiler], bakefile_cv_prog_icc,
286             [
287                 AC_TRY_COMPILE([],
288                     [
289                         #ifndef __INTEL_COMPILER
290                         #error Not icc
291                         #endif
292                     ],
293                     bakefile_cv_prog_icc=yes,
294                     bakefile_cv_prog_icc=no
295                 )
296             ])
297             if test "$bakefile_cv_prog_icc" = "yes"; then
298                 PIC_FLAG="-KPIC"
299             fi
300         fi
301       ;;
302
303       *-*-solaris2* )
304         if test "x$GCC" != xyes ; then
305             SHARED_LD_CC="${CC} -G -o"
306             SHARED_LD_CXX="${CXX} -G -o"
307             PIC_FLAG="-KPIC"
308         fi
309       ;;
310
311       *-*-darwin* )
312         dnl Most apps benefit from being fully binded (its faster and static
313         dnl variables initialized at startup work).
314         dnl This can be done either with the exe linker flag -Wl,-bind_at_load
315         dnl or with a double stage link in order to create a single module
316         dnl "-init _wxWindowsDylibInit" not useful with lazy linking solved
317
318         SHARED_LD_MODULE_CC="`pwd`/shared-ld-sh -bundle -headerpad_max_install_names -o"
319         SHARED_LD_MODULE_CXX="$SHARED_LD_MODULE_CC"
320
321         dnl If using newer dev tools then there is a -single_module flag that
322         dnl we can use to do this for dylibs, otherwise we'll need to use a helper
323         dnl script.  Check the version of gcc to see which way we can go:
324         AC_CACHE_CHECK([for gcc 3.1 or later], bakefile_cv_gcc31, [
325            AC_TRY_COMPILE([],
326                [
327                    #if (__GNUC__ < 3) || \
328                        ((__GNUC__ == 3) && (__GNUC_MINOR__ < 1))
329                        #error old gcc
330                    #endif
331                ],
332                [
333                    bakefile_cv_gcc31=yes
334                ],
335                [
336                    bakefile_cv_gcc31=no
337                ]
338            )
339         ])
340         if test "$bakefile_cv_gcc31" = "no"; then
341             AC_BAKEFILE_CREATE_FILE_SHARED_LD_SH
342             chmod +x shared-ld-sh
343
344             dnl Use the shared-ld-sh helper script
345             SHARED_LD_CC="`pwd`/shared-ld-sh -dynamiclib -headerpad_max_install_names -o"
346             SHARED_LD_CXX="$SHARED_LD_CC"
347         else
348             dnl Use the -single_module flag and let the linker do it for us
349             SHARED_LD_CC="\${CC} -dynamiclib -single_module -headerpad_max_install_names -o"
350             SHARED_LD_CXX="\${CXX} -dynamiclib -single_module -headerpad_max_install_names -o"
351         fi
352
353         if test "x$GCC" == "xyes"; then
354             PIC_FLAG="-dynamic -fPIC"
355         fi
356         if test "x$XLCC" = "xyes"; then
357             PIC_FLAG="-dynamic -DPIC"
358         fi
359       ;;
360
361       *-*-aix* )
362         if test "x$GCC" = "xyes"; then
363             dnl at least gcc 2.95 warns that -fPIC is ignored when
364             dnl compiling each and every file under AIX which is annoying,
365             dnl so don't use it there (it's useless as AIX runs on
366             dnl position-independent architectures only anyhow)
367             PIC_FLAG=""
368
369             dnl -bexpfull is needed by AIX linker to export all symbols (by
370             dnl default it doesn't export any and even with -bexpall it
371             dnl doesn't export all C++ support symbols, e.g. vtable
372             dnl pointers) but it's only available starting from 5.1 (with
373             dnl maintenance pack 2, whatever this is), see
374             dnl http://www-128.ibm.com/developerworks/eserver/articles/gnu.html
375             case "${BAKEFILE_HOST}" in
376                 *-*-aix5* )
377                     LD_EXPFULL="-Wl,-bexpfull"
378                     ;;
379             esac
380
381             SHARED_LD_CC="\$(CC) -shared $LD_EXPFULL -o"
382             SHARED_LD_CXX="\$(CXX) -shared $LD_EXPFULL -o"
383         else
384             dnl FIXME: makeC++SharedLib is obsolete, what should we do for
385             dnl        recent AIX versions?
386             AC_CHECK_PROG(AIX_CXX_LD, makeC++SharedLib,
387                           makeC++SharedLib, /usr/lpp/xlC/bin/makeC++SharedLib)
388             SHARED_LD_CC="$AIX_CC_LD -p 0 -o"
389             SHARED_LD_CXX="$AIX_CXX_LD -p 0 -o"
390         fi
391       ;;
392
393       *-*-beos* )
394         dnl can't use gcc under BeOS for shared library creation because it
395         dnl complains about missing 'main'
396         SHARED_LD_CC="${LD} -nostart -o"
397         SHARED_LD_CXX="${LD} -nostart -o"
398       ;;
399
400       *-*-irix* )
401         dnl default settings are ok for gcc
402         if test "x$GCC" != "xyes"; then
403             PIC_FLAG="-KPIC"
404         fi
405       ;;
406       
407       *-*-cygwin* | *-*-mingw32* )
408         PIC_FLAG=""
409         SHARED_LD_CC="\$(CC) -shared -o"
410         SHARED_LD_CXX="\$(CXX) -shared -o"
411         WINDOWS_IMPLIB=1
412       ;;
413
414       *-pc-os2_emx | *-pc-os2-emx )
415         SHARED_LD_CC="`pwd`/dllar.sh -libf INITINSTANCE -libf TERMINSTANCE -o"
416         SHARED_LD_CXX="`pwd`/dllar.sh -libf INITINSTANCE -libf TERMINSTANCE -o"
417         PIC_FLAG=""
418         AC_BAKEFILE_CREATE_FILE_DLLAR_SH
419         chmod +x dllar.sh
420       ;;
421       
422       powerpc-apple-macos* | \
423       *-*-freebsd* | *-*-openbsd* | *-*-netbsd* | *-*-k*bsd*-gnu | \
424       *-*-sunos4* | \
425       *-*-osf* | \
426       *-*-dgux5* | \
427       *-*-sysv5* | \
428       *-pc-msdosdjgpp )
429         dnl defaults are ok
430       ;;
431
432       *)
433         AC_MSG_ERROR(unknown system type $BAKEFILE_HOST.)
434     esac
435
436     if test "x$PIC_FLAG" != "x" ; then
437         PIC_FLAG="$PIC_FLAG -DPIC"
438     fi
439
440     if test "x$SHARED_LD_MODULE_CC" = "x" ; then
441         SHARED_LD_MODULE_CC="$SHARED_LD_CC"
442     fi
443     if test "x$SHARED_LD_MODULE_CXX" = "x" ; then
444         SHARED_LD_MODULE_CXX="$SHARED_LD_CXX"
445     fi
446
447     AC_SUBST(SHARED_LD_CC)
448     AC_SUBST(SHARED_LD_CXX)
449     AC_SUBST(SHARED_LD_MODULE_CC)
450     AC_SUBST(SHARED_LD_MODULE_CXX)
451     AC_SUBST(PIC_FLAG)
452     AC_SUBST(WINDOWS_IMPLIB)
453 ])
454
455
456 dnl ---------------------------------------------------------------------------
457 dnl AC_BAKEFILE_SHARED_VERSIONS
458 dnl
459 dnl Detects linker options for attaching versions (sonames) to shared  libs.
460 dnl ---------------------------------------------------------------------------
461
462 AC_DEFUN([AC_BAKEFILE_SHARED_VERSIONS],
463 [
464     USE_SOVERSION=0
465     USE_SOVERLINUX=0
466     USE_SOVERSOLARIS=0
467     USE_SOVERCYGWIN=0
468     USE_SOSYMLINKS=0
469     USE_MACVERSION=0
470     SONAME_FLAG=
471
472     case "${BAKEFILE_HOST}" in
473       *-*-linux* | *-*-freebsd* | *-*-k*bsd*-gnu )
474         SONAME_FLAG="-Wl,-soname,"
475         USE_SOVERSION=1
476         USE_SOVERLINUX=1
477         USE_SOSYMLINKS=1
478       ;;
479
480       *-*-solaris2* )
481         SONAME_FLAG="-h "
482         USE_SOVERSION=1
483         USE_SOVERSOLARIS=1
484         USE_SOSYMLINKS=1
485       ;;
486
487       *-*-darwin* )
488         USE_MACVERSION=1
489         USE_SOVERSION=1
490         USE_SOSYMLINKS=1
491       ;;
492
493       *-*-cygwin* )
494         USE_SOVERSION=1
495         USE_SOVERCYGWIN=1
496       ;;
497     esac
498
499     AC_SUBST(USE_SOVERSION)
500     AC_SUBST(USE_SOVERLINUX)
501     AC_SUBST(USE_SOVERSOLARIS)
502     AC_SUBST(USE_SOVERCYGWIN)
503     AC_SUBST(USE_MACVERSION)
504     AC_SUBST(USE_SOSYMLINKS)
505     AC_SUBST(SONAME_FLAG)
506 ])
507
508
509 dnl ---------------------------------------------------------------------------
510 dnl AC_BAKEFILE_DEPS
511 dnl
512 dnl Detects available C/C++ dependency tracking options
513 dnl ---------------------------------------------------------------------------
514
515 AC_DEFUN([AC_BAKEFILE_DEPS],
516 [
517     AC_MSG_CHECKING([for dependency tracking method])
518     DEPS_TRACKING=1
519
520     if test "x$GCC" = "xyes"; then
521         DEPSMODE=gcc
522         case "${BAKEFILE_HOST}" in
523             *-*-darwin* )
524                 dnl -cpp-precomp (the default) conflicts with -MMD option
525                 dnl used by bk-deps (see also http://developer.apple.com/documentation/Darwin/Conceptual/PortingUnix/compiling/chapter_4_section_3.html)
526                 DEPSFLAG="-no-cpp-precomp -MMD"
527             ;;
528             * )
529                 DEPSFLAG="-MMD"
530             ;;
531         esac
532         AC_MSG_RESULT([gcc])
533     elif test "x$MWCC" = "xyes"; then
534         DEPSMODE=mwcc
535         DEPSFLAG="-MM"
536         AC_MSG_RESULT([mwcc])
537     elif test "x$SUNCC" = "xyes"; then
538         DEPSMODE=unixcc
539         DEPSFLAG="-xM1"
540         AC_MSG_RESULT([Sun cc])
541     elif test "x$SGICC" = "xyes"; then
542         DEPSMODE=unixcc
543         DEPSFLAG="-M"
544         AC_MSG_RESULT([SGI cc])
545     elif test "x$HPCC" = "xyes"; then
546         DEPSMODE=unixcc
547         DEPSFLAG="+make"
548         AC_MSG_RESULT([HP cc])
549     elif test "x$COMPAQCC" = "xyes"; then
550         DEPSMODE=gcc
551         DEPSFLAG="-MD"
552         AC_MSG_RESULT([Compaq cc])
553     else
554         DEPS_TRACKING=0
555         AC_MSG_RESULT([none])
556     fi
557
558     if test $DEPS_TRACKING = 1 ; then
559         AC_BAKEFILE_CREATE_FILE_BK_DEPS
560         chmod +x bk-deps
561     fi
562
563     AC_SUBST(DEPS_TRACKING)
564 ])
565
566 dnl ---------------------------------------------------------------------------
567 dnl AC_BAKEFILE_CHECK_BASIC_STUFF
568 dnl
569 dnl Checks for presence of basic programs, such as C and C++ compiler, "ranlib"
570 dnl or "install"
571 dnl ---------------------------------------------------------------------------
572
573 AC_DEFUN([AC_BAKEFILE_CHECK_BASIC_STUFF],
574 [
575     AC_PROG_RANLIB
576     AC_PROG_INSTALL
577     AC_PROG_LN_S
578
579     AC_PROG_MAKE_SET
580     AC_SUBST(MAKE_SET)
581     
582     AC_CHECK_TOOL(AR, ar, ar)
583     AC_CHECK_TOOL(STRIP, strip, :)
584     AC_CHECK_TOOL(NM, nm, :)
585
586     case ${BAKEFILE_HOST} in
587         *-hp-hpux* )
588             dnl HP-UX install doesn't handle the "-d" switch so don't
589             dnl use it there
590             INSTALL_DIR="mkdir -p"
591             ;;
592         *)  INSTALL_DIR="$INSTALL -d"
593             ;;
594     esac
595     AC_SUBST(INSTALL_DIR)
596
597     LDFLAGS_GUI=
598     case ${BAKEFILE_HOST} in
599         *-*-cygwin* | *-*-mingw32* )
600         LDFLAGS_GUI="-mwindows"
601     esac
602     AC_SUBST(LDFLAGS_GUI)
603 ])
604
605
606 dnl ---------------------------------------------------------------------------
607 dnl AC_BAKEFILE_RES_COMPILERS
608 dnl
609 dnl Checks for presence of resource compilers for win32 or mac
610 dnl ---------------------------------------------------------------------------
611
612 AC_DEFUN([AC_BAKEFILE_RES_COMPILERS],
613 [
614     RESCOMP=
615     SETFILE=
616
617     case ${BAKEFILE_HOST} in 
618         *-*-cygwin* | *-*-mingw32* )
619             dnl Check for win32 resources compiler:
620             if test "$build" != "$host" ; then
621                 RESCOMP=$host_alias-windres
622             else
623                 AC_CHECK_PROG(RESCOMP, windres, windres, windres)
624             fi
625          ;;
626  
627       *-*-darwin* | powerpc-apple-macos* )
628             AC_CHECK_PROG(RESCOMP, Rez, Rez, /Developer/Tools/Rez)
629             AC_CHECK_PROG(SETFILE, SetFile, SetFile, /Developer/Tools/SetFile)
630         ;;
631     esac
632
633     AC_SUBST(RESCOMP)
634     AC_SUBST(SETFILE)
635 ])
636
637 dnl ---------------------------------------------------------------------------
638 dnl AC_BAKEFILE_PRECOMP_HEADERS
639 dnl
640 dnl Check for precompiled headers support (GCC >= 3.4)
641 dnl ---------------------------------------------------------------------------
642
643 AC_DEFUN([AC_BAKEFILE_PRECOMP_HEADERS],
644 [
645
646     AC_ARG_ENABLE([precomp-headers],
647                   AS_HELP_STRING([--disable-precomp-headers],
648                                  [don't use precompiled headers even if compiler can]),
649                   [bk_use_pch="$enableval"])
650
651     GCC_PCH=0
652
653     if test "x$bk_use_pch" = "x" -o "x$bk_use_pch" = "xyes" ; then
654         if test "x$GCC" = "xyes"; then
655             dnl test if we have gcc-3.4:
656             AC_MSG_CHECKING([if the compiler supports precompiled headers])
657             AC_TRY_COMPILE([],
658                 [
659                     #if !defined(__GNUC__) || !defined(__GNUC_MINOR__)
660                         #error "no pch support"
661                     #endif
662                     #if (__GNUC__ < 3)
663                         #error "no pch support"
664                     #endif
665                     #if (__GNUC__ == 3) && \
666                        ((!defined(__APPLE_CC__) && (__GNUC_MINOR__ < 4)) || \
667                        ( defined(__APPLE_CC__) && (__GNUC_MINOR__ < 3)))
668                         #error "no pch support"
669                     #endif
670                 ],
671                 [
672                     AC_MSG_RESULT([yes])
673                     GCC_PCH=1
674                 ],
675                 [
676                     AC_MSG_RESULT([no])
677                 ])
678             if test $GCC_PCH = 1 ; then
679                 AC_BAKEFILE_CREATE_FILE_BK_MAKE_PCH
680                 chmod +x bk-make-pch
681             fi
682         fi
683     fi
684
685     AC_SUBST(GCC_PCH)
686 ])
687
688
689
690 dnl ---------------------------------------------------------------------------
691 dnl AC_BAKEFILE([autoconf_inc.m4 inclusion])
692 dnl
693 dnl To be used in configure.in of any project using Bakefile-generated mks
694 dnl
695 dnl Behaviour can be modified by setting following variables:
696 dnl    BAKEFILE_CHECK_BASICS    set to "no" if you don't want bakefile to
697 dnl                             to perform check for basic tools like ranlib
698 dnl    BAKEFILE_HOST            set this to override host detection, defaults
699 dnl                             to ${host}
700 dnl    BAKEFILE_FORCE_PLATFORM  set to override platform detection
701 dnl
702 dnl Example usage:
703 dnl
704 dnl   AC_BAKEFILE([FOO(autoconf_inc.m4)])
705 dnl
706 dnl (replace FOO with m4_include above, aclocal would die otherwise)
707 dnl (yes, it's ugly, but thanks to a bug in aclocal, it's the only thing
708 dnl we can do...)
709 dnl ---------------------------------------------------------------------------
710
711 AC_DEFUN([AC_BAKEFILE],
712 [
713     AC_PREREQ(2.58)
714
715     if test "x$BAKEFILE_HOST" = "x"; then
716         BAKEFILE_HOST="${host}"
717     fi
718
719     if test "x$BAKEFILE_CHECK_BASICS" != "xno"; then
720         AC_BAKEFILE_CHECK_BASIC_STUFF
721     fi
722     AC_BAKEFILE_GNUMAKE
723     AC_BAKEFILE_PLATFORM
724     AC_BAKEFILE_PLATFORM_SPECIFICS
725     AC_BAKEFILE_SUFFIXES
726     AC_BAKEFILE_SHARED_LD
727     AC_BAKEFILE_SHARED_VERSIONS
728     AC_BAKEFILE_DEPS
729     AC_BAKEFILE_RES_COMPILERS
730
731     BAKEFILE_BAKEFILE_M4_VERSION="0.1.9"
732    
733     dnl includes autoconf_inc.m4:
734     $1
735     
736     if test "$BAKEFILE_AUTOCONF_INC_M4_VERSION" = "" ; then
737         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)?])
738     fi
739     
740     if test "$BAKEFILE_BAKEFILE_M4_VERSION" != "$BAKEFILE_AUTOCONF_INC_M4_VERSION" ; then
741         AC_MSG_ERROR([Versions of Bakefile used to generate makefiles ($BAKEFILE_AUTOCONF_INC_M4_VERSION) and configure ($BAKEFILE_BAKEFILE_M4_VERSION) do not match.])
742     fi
743 ])
744         
745
746 dnl ---------------------------------------------------------------------------
747 dnl              Embedded copies of helper scripts follow:
748 dnl ---------------------------------------------------------------------------
749
750 AC_DEFUN([AC_BAKEFILE_CREATE_FILE_DLLAR_SH],
751 [
752 dnl ===================== dllar.sh begins here =====================
753 dnl    (Created by merge-scripts.py from dllar.sh
754 dnl     file do not edit here!)
755 D='$'
756 cat <<EOF >dllar.sh
757 #!/bin/sh
758 #
759 # dllar - a tool to build both a .dll and an .a file
760 # from a set of object (.o) files for EMX/OS2.
761 #
762 #  Written by Andrew Zabolotny, bit@freya.etu.ru
763 #  Ported to Unix like shell by Stefan Neis, Stefan.Neis@t-online.de
764 #
765 #  This script will accept a set of files on the command line.
766 #  All the public symbols from the .o files will be exported into
767 #  a .DEF file, then linker will be run (through gcc) against them to
768 #  build a shared library consisting of all given .o files. All libraries
769 #  (.a) will be first decompressed into component .o files then act as
770 #  described above. You can optionally give a description (-d "description")
771 #  which will be put into .DLL. To see the list of accepted options (as well
772 #  as command-line format) simply run this program without options. The .DLL
773 #  is built to be imported by name (there is no guarantee that new versions
774 #  of the library you build will have same ordinals for same symbols).
775 #
776 #  dllar is free software; you can redistribute it and/or modify
777 #  it under the terms of the GNU General Public License as published by
778 #  the Free Software Foundation; either version 2, or (at your option)
779 #  any later version.
780 #
781 #  dllar is distributed in the hope that it will be useful,
782 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
783 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
784 #  GNU General Public License for more details.
785 #
786 #  You should have received a copy of the GNU General Public License
787 #  along with dllar; see the file COPYING.  If not, write to the Free
788 #  Software Foundation, 59 Temple Place - Suite 330, Boston, MA
789 #  02111-1307, USA.
790
791 # To successfuly run this program you will need:
792 #  - Current drive should have LFN support (HPFS, ext2, network, etc)
793 #    (Sometimes dllar generates filenames which won't fit 8.3 scheme)
794 #  - gcc
795 #    (used to build the .dll)
796 #  - emxexp
797 #    (used to create .def file from .o files)
798 #  - emximp
799 #    (used to create .a file from .def file)
800 #  - GNU text utilites (cat, sort, uniq)
801 #    used to process emxexp output
802 #  - GNU file utilities (mv, rm)
803 #  - GNU sed
804 #  - lxlite (optional, see flag below)
805 #    (used for general .dll cleanup)
806 #
807
808 flag_USE_LXLITE=1;
809
810 #
811 # helper functions
812 # basnam, variant of basename, which does _not_ remove the path, _iff_
813 #                              second argument (suffix to remove) is given
814 basnam(){
815     case ${D}# in
816     1)
817         echo ${D}1 | sed 's/.*\\///' | sed 's/.*\\\\//'
818         ;;
819     2)
820         echo ${D}1 | sed 's/'${D}2'${D}//'
821         ;;
822     *)
823         echo "error in basnam ${D}*"
824         exit 8
825         ;;
826     esac
827 }
828
829 # Cleanup temporary files and output
830 CleanUp() {
831     cd ${D}curDir
832     for i in ${D}inputFiles ; do
833         case ${D}i in
834         *!)
835             rm -rf \`basnam ${D}i !\`
836             ;;
837         *)
838             ;;
839         esac
840     done
841
842     # Kill result in case of failure as there is just to many stupid make/nmake
843     # things out there which doesn't do this.
844     if @<:@ ${D}# -eq 0 @:>@; then
845         rm -f ${D}arcFile ${D}arcFile2 ${D}defFile ${D}dllFile
846     fi
847 }
848
849 # Print usage and exit script with rc=1.
850 PrintHelp() {
851  echo 'Usage: dllar.sh @<:@-o@<:@utput@:>@ output_file@:>@ @<:@-i@<:@mport@:>@ importlib_name@:>@'
852  echo '       @<:@-name-mangler-script script.sh@:>@'
853  echo '       @<:@-d@<:@escription@:>@ "dll descrption"@:>@ @<:@-cc "CC"@:>@ @<:@-f@<:@lags@:>@ "CFLAGS"@:>@'
854  echo '       @<:@-ord@<:@inals@:>@@:>@ -ex@<:@clude@:>@ "symbol(s)"'
855  echo '       @<:@-libf@<:@lags@:>@ "{INIT|TERM}{GLOBAL|INSTANCE}"@:>@ @<:@-nocrt@<:@dll@:>@@:>@ @<:@-nolxl@<:@ite@:>@@:>@'
856  echo '       @<:@*.o@:>@ @<:@*.a@:>@'
857  echo '*> "output_file" should have no extension.'
858  echo '   If it has the .o, .a or .dll extension, it is automatically removed.'
859  echo '   The import library name is derived from this and is set to "name".a,'
860  echo '   unless overridden by -import'
861  echo '*> "importlib_name" should have no extension.'
862  echo '   If it has the .o, or .a extension, it is automatically removed.'
863  echo '   This name is used as the import library name and may be longer and'
864  echo '   more descriptive than the DLL name which has to follow the old '
865  echo '   8.3 convention of FAT.'
866  echo '*> "script.sh may be given to override the output_file name by a'
867  echo '   different name. It is mainly useful if the regular make process'
868  echo '   of some package does not take into account OS/2 restriction of'
869  echo '   DLL name lengths. It takes the importlib name as input and is'
870  echo '   supposed to procude a shorter name as output. The script should'
871  echo '   expect to get importlib_name without extension and should produce'
872  echo '   a (max.) 8 letter name without extension.'
873  echo '*> "cc" is used to use another GCC executable.   (default: gcc.exe)'
874  echo '*> "flags" should be any set of valid GCC flags. (default: -s -Zcrtdll)'
875  echo '   These flags will be put at the start of GCC command line.'
876  echo '*> -ord@<:@inals@:>@ tells dllar to export entries by ordinals. Be careful.'
877  echo '*> -ex@<:@clude@:>@ defines symbols which will not be exported. You can define'
878  echo '   multiple symbols, for example -ex "myfunc yourfunc _GLOBAL*".'
879  echo '   If the last character of a symbol is "*", all symbols beginning'
880  echo '   with the prefix before "*" will be exclude, (see _GLOBAL* above).'
881  echo '*> -libf@<:@lags@:>@ can be used to add INITGLOBAL/INITINSTANCE and/or'
882  echo '   TERMGLOBAL/TERMINSTANCE flags to the dynamically-linked library.'
883  echo '*> -nocrt@<:@dll@:>@ switch will disable linking the library against emx''s'
884  echo '   C runtime DLLs.'
885  echo '*> -nolxl@<:@ite@:>@ switch will disable running lxlite on the resulting DLL.'
886  echo '*> All other switches (for example -L./ or -lmylib) will be passed'
887  echo '   unchanged to GCC at the end of command line.'
888  echo '*> If you create a DLL from a library and you do not specify -o,'
889  echo '   the basename for DLL and import library will be set to library name,'
890  echo '   the initial library will be renamed to 'name'_s.a (_s for static)'
891  echo '   i.e. "dllar gcc.a" will create gcc.dll and gcc.a, and the initial'
892  echo '   library will be renamed into gcc_s.a.'
893  echo '--------'
894  echo 'Example:'
895  echo '   dllar -o gcc290.dll libgcc.a -d "GNU C runtime library" -ord'
896  echo '    -ex "__main __ctordtor*" -libf "INITINSTANCE TERMINSTANCE"'
897  CleanUp
898  exit 1
899 }
900
901 # Execute a command.
902 # If exit code of the commnad <> 0 CleanUp() is called and we'll exit the script.
903 # @Uses    Whatever CleanUp() uses.
904 doCommand() {
905     echo "${D}*"
906     eval ${D}*
907     rcCmd=${D}?
908
909     if @<:@ ${D}rcCmd -ne 0 @:>@; then
910         echo "command failed, exit code="${D}rcCmd
911         CleanUp
912         exit ${D}rcCmd
913     fi
914 }
915
916 # main routine
917 # setup globals
918 cmdLine=${D}*
919 outFile=""
920 outimpFile=""
921 inputFiles=""
922 renameScript=""
923 description=""
924 CC=gcc.exe
925 CFLAGS="-s -Zcrtdll"
926 EXTRA_CFLAGS=""
927 EXPORT_BY_ORDINALS=0
928 exclude_symbols=""
929 library_flags=""
930 curDir=\`pwd\`
931 curDirS=curDir
932 case ${D}curDirS in
933 */)
934   ;;
935 *)
936   curDirS=${D}{curDirS}"/"
937   ;;
938 esac
939 # Parse commandline
940 libsToLink=0
941 omfLinking=0
942 while @<:@ ${D}1 @:>@; do
943     case ${D}1 in
944     -ord*)
945         EXPORT_BY_ORDINALS=1;
946         ;;
947     -o*)
948         shift
949         outFile=${D}1
950         ;;
951     -i*)
952         shift
953         outimpFile=${D}1
954         ;;
955     -name-mangler-script)
956         shift
957         renameScript=${D}1
958         ;;
959     -d*)
960         shift
961         description=${D}1
962         ;;
963     -f*)
964         shift
965         CFLAGS=${D}1
966         ;;
967     -c*)
968         shift
969         CC=${D}1
970         ;;
971     -h*)
972         PrintHelp
973         ;;
974     -ex*)
975         shift
976         exclude_symbols=${D}{exclude_symbols}${D}1" "
977         ;;
978     -libf*)
979         shift
980         library_flags=${D}{library_flags}${D}1" "
981         ;;
982     -nocrt*)
983         CFLAGS="-s"
984         ;;
985     -nolxl*)
986         flag_USE_LXLITE=0
987         ;;
988     -* | /*)
989         case ${D}1 in
990         -L* | -l*)
991             libsToLink=1
992             ;;
993         -Zomf)
994             omfLinking=1
995             ;;
996         *)
997             ;;
998         esac
999         EXTRA_CFLAGS=${D}{EXTRA_CFLAGS}" "${D}1
1000         ;;
1001     *.dll)
1002         EXTRA_CFLAGS="${D}{EXTRA_CFLAGS} \`basnam ${D}1 .dll\`"
1003         if @<:@ ${D}omfLinking -eq 1 @:>@; then
1004             EXTRA_CFLAGS="${D}{EXTRA_CFLAGS}.lib"
1005         else
1006             EXTRA_CFLAGS="${D}{EXTRA_CFLAGS}.a"
1007         fi
1008         ;;
1009     *)
1010         found=0;
1011         if @<:@ ${D}libsToLink -ne 0 @:>@; then
1012             EXTRA_CFLAGS=${D}{EXTRA_CFLAGS}" "${D}1
1013         else
1014             for file in ${D}1 ; do
1015                 if @<:@ -f ${D}file @:>@; then
1016                     inputFiles="${D}{inputFiles} ${D}file"
1017                     found=1
1018                 fi
1019             done
1020             if @<:@ ${D}found -eq 0 @:>@; then
1021                 echo "ERROR: No file(s) found: "${D}1
1022                 exit 8
1023             fi
1024         fi
1025       ;;
1026     esac
1027     shift
1028 done # iterate cmdline words
1029
1030 #
1031 if @<:@ -z "${D}inputFiles" @:>@; then
1032     echo "dllar: no input files"
1033     PrintHelp
1034 fi
1035
1036 # Now extract all .o files from .a files
1037 newInputFiles=""
1038 for file in ${D}inputFiles ; do
1039     case ${D}file in
1040     *.a | *.lib)
1041         case ${D}file in
1042         *.a)
1043             suffix=".a"
1044             AR="ar"
1045             ;;
1046         *.lib)
1047             suffix=".lib"
1048             AR="emxomfar"
1049             EXTRA_CFLAGS="${D}EXTRA_CFLAGS -Zomf"
1050             ;;
1051         *)
1052             ;;
1053         esac
1054         dirname=\`basnam ${D}file ${D}suffix\`"_%"
1055         mkdir ${D}dirname
1056         if @<:@ ${D}? -ne 0 @:>@; then
1057             echo "Failed to create subdirectory ./${D}dirname"
1058             CleanUp
1059             exit 8;
1060         fi
1061         # Append '!' to indicate archive
1062         newInputFiles="${D}newInputFiles ${D}{dirname}!"
1063         doCommand "cd ${D}dirname; ${D}AR x ../${D}file"
1064         cd ${D}curDir
1065         found=0;
1066         for subfile in ${D}dirname/*.o* ; do
1067             if @<:@ -f ${D}subfile @:>@; then
1068                 found=1
1069                 if @<:@ -s ${D}subfile @:>@; then
1070                     # FIXME: This should be: is file size > 32 byte, _not_ > 0!
1071                     newInputFiles="${D}newInputFiles ${D}subfile"
1072                 fi
1073             fi
1074         done
1075         if @<:@ ${D}found -eq 0 @:>@; then
1076             echo "WARNING: there are no files in archive \\'${D}file\\'"
1077         fi
1078         ;;
1079     *)
1080         newInputFiles="${D}{newInputFiles} ${D}file"
1081         ;;
1082     esac
1083 done
1084 inputFiles="${D}newInputFiles"
1085
1086 # Output filename(s).
1087 do_backup=0;
1088 if @<:@ -z ${D}outFile @:>@; then
1089     do_backup=1;
1090     set outFile ${D}inputFiles; outFile=${D}2
1091 fi
1092
1093 # If it is an archive, remove the '!' and the '_%' suffixes
1094 case ${D}outFile in
1095 *_%!)
1096     outFile=\`basnam ${D}outFile _%!\`
1097     ;;
1098 *)
1099     ;;
1100 esac
1101 case ${D}outFile in
1102 *.dll)
1103     outFile=\`basnam ${D}outFile .dll\`
1104     ;;
1105 *.DLL)
1106     outFile=\`basnam ${D}outFile .DLL\`
1107     ;;
1108 *.o)
1109     outFile=\`basnam ${D}outFile .o\`
1110     ;;
1111 *.obj)
1112     outFile=\`basnam ${D}outFile .obj\`
1113     ;;
1114 *.a)
1115     outFile=\`basnam ${D}outFile .a\`
1116     ;;
1117 *.lib)
1118     outFile=\`basnam ${D}outFile .lib\`
1119     ;;
1120 *)
1121     ;;
1122 esac
1123 case ${D}outimpFile in
1124 *.a)
1125     outimpFile=\`basnam ${D}outimpFile .a\`
1126     ;;
1127 *.lib)
1128     outimpFile=\`basnam ${D}outimpFile .lib\`
1129     ;;
1130 *)
1131     ;;
1132 esac
1133 if @<:@ -z ${D}outimpFile @:>@; then
1134     outimpFile=${D}outFile
1135 fi
1136 defFile="${D}{outFile}.def"
1137 arcFile="${D}{outimpFile}.a"
1138 arcFile2="${D}{outimpFile}.lib"
1139
1140 #create ${D}dllFile as something matching 8.3 restrictions,
1141 if @<:@ -z ${D}renameScript @:>@ ; then
1142     dllFile="${D}outFile"
1143 else
1144     dllFile=\`${D}renameScript ${D}outimpFile\`
1145 fi
1146
1147 if @<:@ ${D}do_backup -ne 0 @:>@ ; then
1148     if @<:@ -f ${D}arcFile @:>@ ; then
1149         doCommand "mv ${D}arcFile ${D}{outFile}_s.a"
1150     fi
1151     if @<:@ -f ${D}arcFile2 @:>@ ; then
1152         doCommand "mv ${D}arcFile2 ${D}{outFile}_s.lib"
1153     fi
1154 fi
1155
1156 # Extract public symbols from all the object files.
1157 tmpdefFile=${D}{defFile}_%
1158 rm -f ${D}tmpdefFile
1159 for file in ${D}inputFiles ; do
1160     case ${D}file in
1161     *!)
1162         ;;
1163     *)
1164         doCommand "emxexp -u ${D}file >> ${D}tmpdefFile"
1165         ;;
1166     esac
1167 done
1168
1169 # Create the def file.
1170 rm -f ${D}defFile
1171 echo "LIBRARY \`basnam ${D}dllFile\` ${D}library_flags" >> ${D}defFile
1172 dllFile="${D}{dllFile}.dll"
1173 if @<:@ ! -z ${D}description @:>@; then
1174     echo "DESCRIPTION  \\"${D}{description}\\"" >> ${D}defFile
1175 fi
1176 echo "EXPORTS" >> ${D}defFile
1177
1178 doCommand "cat ${D}tmpdefFile | sort.exe | uniq.exe > ${D}{tmpdefFile}%"
1179 grep -v "^ *;" < ${D}{tmpdefFile}% | grep -v "^ *${D}" >${D}tmpdefFile
1180
1181 # Checks if the export is ok or not.
1182 for word in ${D}exclude_symbols; do
1183     grep -v ${D}word < ${D}tmpdefFile >${D}{tmpdefFile}%
1184     mv ${D}{tmpdefFile}% ${D}tmpdefFile
1185 done
1186
1187
1188 if @<:@ ${D}EXPORT_BY_ORDINALS -ne 0 @:>@; then
1189     sed "=" < ${D}tmpdefFile | \\
1190     sed '
1191       N
1192       : loop
1193       s/^\\(@<:@0-9@:>@\\+\\)\\(@<:@^;@:>@*\\)\\(;.*\\)\\?/\\2 @\\1 NONAME/
1194       t loop
1195     ' > ${D}{tmpdefFile}%
1196     grep -v "^ *${D}" < ${D}{tmpdefFile}% > ${D}tmpdefFile
1197 else
1198     rm -f ${D}{tmpdefFile}%
1199 fi
1200 cat ${D}tmpdefFile >> ${D}defFile
1201 rm -f ${D}tmpdefFile
1202
1203 # Do linking, create implib, and apply lxlite.
1204 gccCmdl="";
1205 for file in ${D}inputFiles ; do
1206     case ${D}file in
1207     *!)
1208         ;;
1209     *)
1210         gccCmdl="${D}gccCmdl ${D}file"
1211         ;;
1212     esac
1213 done
1214 doCommand "${D}CC ${D}CFLAGS -Zdll -o ${D}dllFile ${D}defFile ${D}gccCmdl ${D}EXTRA_CFLAGS"
1215 touch "${D}{outFile}.dll"
1216
1217 doCommand "emximp -o ${D}arcFile ${D}defFile"
1218 if @<:@ ${D}flag_USE_LXLITE -ne 0 @:>@; then
1219     add_flags="";
1220     if @<:@ ${D}EXPORT_BY_ORDINALS -ne 0 @:>@; then
1221         add_flags="-ynd"
1222     fi
1223     doCommand "lxlite -cs -t: -mrn -mln ${D}add_flags ${D}dllFile"
1224 fi
1225 doCommand "emxomf -s -l ${D}arcFile"
1226
1227 # Successful exit.
1228 CleanUp 1
1229 exit 0
1230 EOF
1231 dnl ===================== dllar.sh ends here =====================
1232 ])
1233
1234 AC_DEFUN([AC_BAKEFILE_CREATE_FILE_BK_DEPS],
1235 [
1236 dnl ===================== bk-deps begins here =====================
1237 dnl    (Created by merge-scripts.py from bk-deps
1238 dnl     file do not edit here!)
1239 D='$'
1240 cat <<EOF >bk-deps
1241 #!/bin/sh
1242
1243 # This script is part of Bakefile (http://bakefile.sourceforge.net) autoconf
1244 # script. It is used to track C/C++ files dependencies in portable way.
1245 #
1246 # Permission is given to use this file in any way.
1247
1248 DEPSMODE=${DEPSMODE}
1249 DEPSDIR=.deps
1250 DEPSFLAG="${DEPSFLAG}"
1251
1252 mkdir -p ${D}DEPSDIR
1253
1254 if test ${D}DEPSMODE = gcc ; then
1255     ${D}* ${D}{DEPSFLAG}
1256     status=${D}?
1257     if test ${D}{status} != 0 ; then
1258         exit ${D}{status}
1259     fi
1260     # move created file to the location we want it in:
1261     while test ${D}# -gt 0; do
1262         case "${D}1" in
1263             -o )
1264                 shift
1265                 objfile=${D}1
1266             ;;
1267             -* )
1268             ;;
1269             * )
1270                 srcfile=${D}1
1271             ;;
1272         esac
1273         shift
1274     done
1275     depfile=\`basename ${D}srcfile | sed -e 's/\\..*${D}/.d/g'\`
1276     depobjname=\`echo ${D}depfile |sed -e 's/\\.d/.o/g'\`
1277     if test -f ${D}depfile ; then
1278         sed -e "s,${D}depobjname:,${D}objfile:,g" ${D}depfile >${D}{DEPSDIR}/${D}{objfile}.d
1279         rm -f ${D}depfile
1280     else
1281         # "g++ -MMD -o fooobj.o foosrc.cpp" produces fooobj.d
1282         depfile=\`basename ${D}objfile | sed -e 's/\\..*${D}/.d/g'\`
1283         if test ! -f ${D}depfile ; then
1284             # "cxx -MD -o fooobj.o foosrc.cpp" creates fooobj.o.d (Compaq C++)
1285             depfile="${D}objfile.d"
1286         fi
1287         if test -f ${D}depfile ; then
1288             sed -e "/^${D}objfile/!s,${D}depobjname:,${D}objfile:,g" ${D}depfile >${D}{DEPSDIR}/${D}{objfile}.d
1289             rm -f ${D}depfile
1290         fi
1291     fi
1292     exit 0
1293 elif test ${D}DEPSMODE = mwcc ; then
1294     ${D}* || exit ${D}?
1295     # Run mwcc again with -MM and redirect into the dep file we want
1296     # NOTE: We can't use shift here because we need ${D}* to be valid
1297     prevarg=
1298     for arg in ${D}* ; do
1299         if test "${D}prevarg" = "-o"; then
1300             objfile=${D}arg
1301         else
1302             case "${D}arg" in
1303                 -* )
1304                 ;;
1305                 * )
1306                     srcfile=${D}arg
1307                 ;;
1308             esac
1309         fi
1310         prevarg="${D}arg"
1311     done
1312     ${D}* ${D}DEPSFLAG >${D}{DEPSDIR}/${D}{objfile}.d
1313     exit 0
1314 elif test ${D}DEPSMODE = unixcc; then
1315     ${D}* || exit ${D}?
1316     # Run compiler again with deps flag and redirect into the dep file.
1317     # It doesn't work if the '-o FILE' option is used, but without it the
1318     # dependency file will contain the wrong name for the object. So it is
1319     # removed from the command line, and the dep file is fixed with sed.
1320     cmd=""
1321     while test ${D}# -gt 0; do
1322         case "${D}1" in
1323             -o )
1324                 shift
1325                 objfile=${D}1
1326             ;;
1327             * )
1328                 eval arg${D}#=\\${D}1
1329                 cmd="${D}cmd \\${D}arg${D}#"
1330             ;;
1331         esac
1332         shift
1333     done
1334     eval "${D}cmd ${D}DEPSFLAG" | sed "s|.*:|${D}objfile:|" >${D}{DEPSDIR}/${D}{objfile}.d
1335     exit 0
1336 else
1337     ${D}*
1338     exit ${D}?
1339 fi
1340 EOF
1341 dnl ===================== bk-deps ends here =====================
1342 ])
1343
1344 AC_DEFUN([AC_BAKEFILE_CREATE_FILE_SHARED_LD_SH],
1345 [
1346 dnl ===================== shared-ld-sh begins here =====================
1347 dnl    (Created by merge-scripts.py from shared-ld-sh
1348 dnl     file do not edit here!)
1349 D='$'
1350 cat <<EOF >shared-ld-sh
1351 #!/bin/sh
1352 #-----------------------------------------------------------------------------
1353 #-- Name:        distrib/mac/shared-ld-sh
1354 #-- Purpose:     Link a mach-o dynamic shared library for Darwin / Mac OS X
1355 #-- Author:      Gilles Depeyrot
1356 #-- Copyright:   (c) 2002 Gilles Depeyrot
1357 #-- Licence:     any use permitted
1358 #-----------------------------------------------------------------------------
1359
1360 verbose=0
1361 args=""
1362 objects=""
1363 linking_flag="-dynamiclib"
1364 ldargs="-r -keep_private_externs -nostdlib"
1365
1366 while test ${D}# -gt 0; do
1367     case ${D}1 in
1368
1369        -v)
1370         verbose=1
1371         ;;
1372
1373        -o|-compatibility_version|-current_version|-framework|-undefined|-install_name)
1374         # collect these options and values
1375         args="${D}{args} ${D}1 ${D}2"
1376         shift
1377         ;;
1378        
1379        -s|-Wl,*)
1380         # collect these load args
1381         ldargs="${D}{ldargs} ${D}1"
1382         ;;
1383
1384        -l*|-L*|-flat_namespace|-headerpad_max_install_names)
1385         # collect these options
1386         args="${D}{args} ${D}1"
1387         ;;
1388
1389        -dynamiclib|-bundle)
1390         linking_flag="${D}1"
1391         ;;
1392
1393        -*)
1394         echo "shared-ld: unhandled option '${D}1'"
1395         exit 1
1396         ;;
1397
1398         *.o | *.a | *.dylib)
1399         # collect object files
1400         objects="${D}{objects} ${D}1"
1401         ;;
1402
1403         *)
1404         echo "shared-ld: unhandled argument '${D}1'"
1405         exit 1
1406         ;;
1407
1408     esac
1409     shift
1410 done
1411
1412 status=0
1413
1414 #
1415 # Link one module containing all the others
1416 #
1417 if test ${D}{verbose} = 1; then
1418     echo "c++ ${D}{ldargs} ${D}{objects} -o master.${D}${D}.o"
1419 fi
1420 c++ ${D}{ldargs} ${D}{objects} -o master.${D}${D}.o
1421 status=${D}?
1422
1423 #
1424 # Link the shared library from the single module created, but only if the
1425 # previous command didn't fail:
1426 #
1427 if test ${D}{status} = 0; then
1428     if test ${D}{verbose} = 1; then
1429         echo "c++ ${D}{linking_flag} master.${D}${D}.o ${D}{args}"
1430     fi
1431     c++ ${D}{linking_flag} master.${D}${D}.o ${D}{args}
1432     status=${D}?
1433 fi
1434
1435 #
1436 # Remove intermediate module
1437 #
1438 rm -f master.${D}${D}.o
1439
1440 exit ${D}status
1441 EOF
1442 dnl ===================== shared-ld-sh ends here =====================
1443 ])
1444
1445 AC_DEFUN([AC_BAKEFILE_CREATE_FILE_BK_MAKE_PCH],
1446 [
1447 dnl ===================== bk-make-pch begins here =====================
1448 dnl    (Created by merge-scripts.py from bk-make-pch
1449 dnl     file do not edit here!)
1450 D='$'
1451 cat <<EOF >bk-make-pch
1452 #!/bin/sh
1453
1454 # This script is part of Bakefile (http://bakefile.sourceforge.net) autoconf
1455 # script. It is used to generated precompiled headers.
1456 #
1457 # Permission is given to use this file in any way.
1458
1459 outfile="${D}{1}"
1460 header="${D}{2}"
1461 shift
1462 shift
1463
1464 compiler=
1465 headerfile=
1466 while test ${D}{#} -gt 0; do
1467     case "${D}{1}" in
1468         -I* )
1469             incdir=\`echo ${D}{1} | sed -e 's/-I\\(.*\\)/\\1/g'\`
1470             if test "x${D}{headerfile}" = "x" -a -f "${D}{incdir}/${D}{header}" ; then
1471                 headerfile="${D}{incdir}/${D}{header}"
1472             fi
1473         ;;
1474     esac
1475     compiler="${D}{compiler} ${D}{1}"
1476     shift
1477 done
1478
1479 if test "x${D}{headerfile}" = "x" ; then
1480     echo "error: can't find header ${D}{header} in include paths" >2
1481 else
1482     if test -f ${D}{outfile} ; then
1483         rm -f ${D}{outfile}
1484     else
1485         mkdir -p \`dirname ${D}{outfile}\`
1486     fi
1487     depsfile=".deps/\`echo ${D}{outfile} | tr '/.' '__'\`.d"
1488     mkdir -p .deps
1489     # can do this because gcc is >= 3.4:
1490     ${D}{compiler} -o ${D}{outfile} -MMD -MF "${D}{depsfile}" "${D}{headerfile}"
1491     exit ${D}{?}
1492 fi
1493 EOF
1494 dnl ===================== bk-make-pch ends here =====================
1495 ])