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