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