dnl Lots of compiler & linker detection code contained here was taken from
dnl wxWindows configure.in script (see http://www.wxwindows.org)
+dnl Based on autoconf _AC_LANG_COMPILER_GNU
+AC_DEFUN([_AC_BAKEFILE_LANG_COMPILER_MWERKS],
+[AC_CACHE_CHECK([whether we are using the Metrowerks _AC_LANG compiler],
+ [bakefile_cv_[]_AC_LANG_ABBREV[]_compiler_mwerks],
+ [AC_TRY_COMPILE([],[#ifndef __MWERKS__
+ choke me
+#endif
+],
+ [bakefile_compiler_mwerks=yes],
+ [bakefile_compiler_mwerks=no])
+ bakefile_cv_[]_AC_LANG_ABBREV[]_compiler_mwerks=$bakefile_compiler_mwerks
+ ])
+])
+dnl Loosely based on autoconf AC_PROG_CC
+dnl TODO: Maybe this should wrap the call to AC_PROG_CC and be used instead.
+AC_DEFUN([AC_BAKEFILE_PROG_MWCC],
+[AC_LANG_PUSH(C)
+_AC_BAKEFILE_LANG_COMPILER_MWERKS
+MWCC=`test $bakefile_compiler_mwerks = yes && echo yes`
+AC_LANG_POP(C)
+])
+
+dnl Loosely based on autoconf AC_PROG_CXX
+dnl TODO: Maybe this should wrap the call to AC_PROG_CXX and be used instead.
+AC_DEFUN([AC_BAKEFILE_PROG_MWCXX],
+[AC_LANG_PUSH(C++)
+_AC_BAKEFILE_LANG_COMPILER_MWERKS
+MWCXX=`test $bakefile_compiler_mwerks = yes && echo yes`
+AC_LANG_POP(C++)
+])
dnl ---------------------------------------------------------------------------
dnl AC_BAKEFILE_GNUMAKE
PLATFORM_WIN32=0
PLATFORM_MSDOS=0
PLATFORM_MAC=0
+ PLATFORM_MACOS=0
PLATFORM_MACOSX=0
PLATFORM_OS2=0
+ PLATFORM_BEOS=0
if test "x$BAKEFILE_FORCE_PLATFORM" = "x"; then
case "${BAKEFILE_HOST}" in
powerpc-*-darwin* )
PLATFORM_MAC=1
PLATFORM_MACOSX=1
+ ;;
+ *-*-beos* )
+ PLATFORM_BEOS=1
+ ;;
+ powerpc-apple-macos* )
+ PLATFORM_MAC=1
+ PLATFORM_MACOS=1
;;
* )
PLATFORM_UNIX=1
unix )
PLATFORM_UNIX=1
;;
+ beos )
+ PLATFORM_BEOS=1
+ ;;
* )
AC_MSG_ERROR([Unknown platform: $BAKEFILE_FORCE_PLATFORM])
;;
AC_SUBST(PLATFORM_WIN32)
AC_SUBST(PLATFORM_MSDOS)
AC_SUBST(PLATFORM_MAC)
+ AC_SUBST(PLATFORM_MACOS)
AC_SUBST(PLATFORM_MACOSX)
AC_SUBST(PLATFORM_OS2)
+ AC_SUBST(PLATFORM_BEOS)
])
OS2_LIBEXT="a"
fi
;;
+
+ i*86-*-beos* )
+ LDFLAGS="-L/boot/develop/lib/x86 $LDFLAGS"
+ ;;
esac
])
AC_DEFUN([AC_BAKEFILE_SHARED_LD],
[
- dnl Defaults for GCC and ELF .so shared libs:
- SHARED_LD_CC="\$(CC) -shared -o"
- SHARED_LD_CXX="\$(CXX) -shared -o"
-
dnl the extra compiler flags needed for compilation of shared library
+ PIC_FLAG=""
if test "x$GCC" = "xyes"; then
dnl the switch for gcc is the same under all platforms
PIC_FLAG="-fPIC"
fi
+
+ dnl Defaults for GCC and ELF .so shared libs:
+ SHARED_LD_CC="\$(CC) -shared ${PIC_FLAG} -o"
+ SHARED_LD_CXX="\$(CXX) -shared ${PIC_FLAG} -o"
case "${BAKEFILE_HOST}" in
*-hp-hpux* )
dnl default settings are good for gcc but not for the native HP-UX
- if test "x$GCC" = "xyes"; then
- dnl -o flag must be after PIC flag
- SHARED_LD_CC="${CC} -shared ${PIC_FLAG} -o"
- SHARED_LD_CXX="${CXX} -shared ${PIC_FLAG} -o"
- else
+ if test "x$GCC" != "xyes"; then
dnl no idea why it wants it, but it does
LDFLAGS="$LDFLAGS -L/usr/lib"
*-*-beos* )
dnl can't use gcc under BeOS for shared library creation because it
dnl complains about missing 'main'
- SHARED_LD_CC="${LD} -shared -o"
- SHARED_LD_CXX="${LD} -shared -o"
+ SHARED_LD_CC="${LD} -nostart -o"
+ SHARED_LD_CXX="${LD} -nostart -o"
;;
*-*-irix* )
*-*-cygwin* | *-*-mingw32* )
PIC_FLAG=""
+ SHARED_LD_CC="\$(CC) -shared -o"
+ SHARED_LD_CXX="\$(CXX) -shared -o"
;;
*-pc-os2_emx | *-pc-os2-emx )
- SHARED_LD_CC="`pwd`/dllar.sh -o"
- SHARED_LD_CXX="`pwd`/dllar.sh -o"
+ SHARED_LD_CC="`pwd`/dllar.sh -libf INITINSTANCE -libf TERMINSTANCE -o"
+ SHARED_LD_CXX="`pwd`/dllar.sh -libf INITINSTANCE -libf TERMINSTANCE -o"
PIC_FLAG=""
AC_BAKEFILE_CREATE_FILE_DLLAR_SH
chmod +x dllar.sh
;;
+ powerpc-apple-macos* | \
*-*-freebsd* | *-*-openbsd* | *-*-netbsd* | \
*-*-sunos4* | \
*-*-osf* | \
SONAME_FLAG=
case "${BAKEFILE_HOST}" in
- *-*-linux* )
+ *-*-linux* | *-*-freebsd* )
SONAME_FLAG="-Wl,-soname,"
USE_SOVERSION=1
USE_SOVERLINUX=1
;;
esac
AC_MSG_RESULT([gcc])
+ elif test "x$MWCC" = "xyes"; then
+ DEPSMODE=gcc
+ DEPS_TRACKING=1
+ DEPSFLAG_GCC="-MMD"
+ AC_MSG_RESULT([mwcc])
else
AC_MSG_RESULT([none])
fi
case ${BAKEFILE_HOST} in
*-hp-hpux* )
+ dnl HP-UX install doesn't handle the "-d" switch so don't
+ dnl use it there
INSTALL_DIR="mkdir -p"
;;
*) INSTALL_DIR="$INSTALL -d"
fi
;;
- *-*-darwin* )
+ *-*-darwin* | powerpc-apple-macos* )
AC_CHECK_PROG(RESCOMP, Rez, Rez, /Developer/Tools/Rez)
AC_CHECK_PROG(SETFILE, SetFile, SetFile, /Developer/Tools/SetFile)
;;
AC_MSG_RESULT([no])
])
if test $GCC_PCH = 1 ; then
- cat <<EOF >bk-make-pch
-#!/bin/sh
-
-# This script is part of Bakefile (http://bakefile.sourceforge.net) autoconf
-# script. It is used to generated precompiled headers.
-#
-# Permission is given to use this file in any way.
-
-outfile="\${1}"
-header="\${2}"
-shift
-shift
-
-compiler=
-headerfile=
-while test \${#} -gt 0; do
- case "\${1}" in
- -I* )
- incdir=\`echo \${1} | sed -e 's/-I\(.*\)/\1/g'\`
- if test "x\${headerfile}" = "x" -a -f "\${incdir}/\${header}" ; then
- headerfile="\${incdir}/\${header}"
- fi
- ;;
- esac
- compiler="\${compiler} \${1}"
- shift
-done
-
-if test "x\${headerfile}" = "x" ; then
- echo "error: can't find header \${header} in include paths" >2
-else
- if test -f \${outfile} ; then
- rm -f \${outfile}
- else
- mkdir -p \`dirname \${outfile}\`
- fi
- depsfile=".deps/\`basename \${outfile}\`.d"
- mkdir -p .deps
- # can do this because gcc is >= 3.4:
- \${compiler} -o \${outfile} -MMD -MF "\${depsfile}" "\${headerfile}"
- exit \${?}
-fi
-EOF
+ AC_BAKEFILE_CREATE_FILE_BK_MAKE_PCH
chmod +x bk-make-pch
fi
fi
AC_DEFUN([AC_BAKEFILE],
[
+ AC_PREREQ(2.58)
+
if test "x$BAKEFILE_HOST" = "x"; then
BAKEFILE_HOST="${host}"
fi
AC_BAKEFILE_DEPS
AC_BAKEFILE_RES_COMPILERS
- BAKEFILE_BAKEFILE_M4_VERSION="0.1.4"
+ BAKEFILE_BAKEFILE_M4_VERSION="0.1.5"
- builtin(include, autoconf_inc.m4)
+ m4_include([autoconf_inc.m4])
if test "$BAKEFILE_BAKEFILE_M4_VERSION" != "$BAKEFILE_AUTOCONF_INC_M4_VERSION" ; then
AC_MSG_ERROR([Versions of Bakefile used to generate makefiles ($BAKEFILE_AUTOCONF_INC_M4_VERSION) and configure ($BAKEFILE_BAKEFILE_M4_VERSION) do not match.])
basnam(){
case ${D}# in
1)
- echo ${D}1 | sed 's/.*\///' | sed 's/.*\\//'
+ echo ${D}1 | sed 's/.*\\///' | sed 's/.*\\\\//'
;;
2)
echo ${D}1 | sed 's/'${D}2'${D}//'
# Kill result in case of failure as there is just to many stupid make/nmake
# things out there which doesn't do this.
- if [[] ${D}# -eq 0 []]; then
+ if @<:@ ${D}# -eq 0 @:>@; then
rm -f ${D}arcFile ${D}arcFile2 ${D}defFile ${D}dllFile
fi
}
# Print usage and exit script with rc=1.
PrintHelp() {
- echo 'Usage: dllar [[]-o[[]utput[]] output_file[]] [[]-i[[]mport[]] importlib_name[]]'
- echo ' [[]-d[[]escription[]] "dll descrption"[]] [[]-cc "CC"[]] [[]-f[[]lags[]] "CFLAGS"[]]'
- echo ' [[]-ord[[]inals[]][]] -ex[[]clude[]] "symbol(s)"'
- echo ' [[]-libf[[]lags[]] "{INIT|TERM}{GLOBAL|INSTANCE}"[]] [[]-nocrt[[]dll[]][]] [[]-nolxl[[]ite[]][]]'
- echo ' [[]*.o[]] [[]*.a[]]'
+ echo 'Usage: dllar.sh @<:@-o@<:@utput@:>@ output_file@:>@ @<:@-i@<:@mport@:>@ importlib_name@:>@'
+ echo ' @<:@-name-mangler-script script.sh@:>@'
+ echo ' @<:@-d@<:@escription@:>@ "dll descrption"@:>@ @<:@-cc "CC"@:>@ @<:@-f@<:@lags@:>@ "CFLAGS"@:>@'
+ echo ' @<:@-ord@<:@inals@:>@@:>@ -ex@<:@clude@:>@ "symbol(s)"'
+ echo ' @<:@-libf@<:@lags@:>@ "{INIT|TERM}{GLOBAL|INSTANCE}"@:>@ @<:@-nocrt@<:@dll@:>@@:>@ @<:@-nolxl@<:@ite@:>@@:>@'
+ echo ' @<:@*.o@:>@ @<:@*.a@:>@'
echo '*> "output_file" should have no extension.'
echo ' If it has the .o, .a or .dll extension, it is automatically removed.'
echo ' The import library name is derived from this and is set to "name".a,'
echo ' This name is used as the import library name and may be longer and'
echo ' more descriptive than the DLL name which has to follow the old '
echo ' 8.3 convention of FAT.'
+ echo '*> "script.sh may be given to override the output_file name by a'
+ echo ' different name. It is mainly useful if the regular make process'
+ echo ' of some package does not take into account OS/2 restriction of'
+ echo ' DLL name lengths. It takes the importlib name as input and is'
+ echo ' supposed to procude a shorter name as output. The script should'
+ echo ' expect to get importlib_name without extension and should produce'
+ echo ' a (max.) 8 letter name without extension.'
echo '*> "cc" is used to use another GCC executable. (default: gcc.exe)'
echo '*> "flags" should be any set of valid GCC flags. (default: -s -Zcrtdll)'
echo ' These flags will be put at the start of GCC command line.'
- echo '*> -ord[[]inals[]] tells dllar to export entries by ordinals. Be careful.'
- echo '*> -ex[[]clude[]] defines symbols which will not be exported. You can define'
+ echo '*> -ord@<:@inals@:>@ tells dllar to export entries by ordinals. Be careful.'
+ echo '*> -ex@<:@clude@:>@ defines symbols which will not be exported. You can define'
echo ' multiple symbols, for example -ex "myfunc yourfunc _GLOBAL*".'
echo ' If the last character of a symbol is "*", all symbols beginning'
echo ' with the prefix before "*" will be exclude, (see _GLOBAL* above).'
- echo '*> -libf[[]lags[]] can be used to add INITGLOBAL/INITINSTANCE and/or'
+ echo '*> -libf@<:@lags@:>@ can be used to add INITGLOBAL/INITINSTANCE and/or'
echo ' TERMGLOBAL/TERMINSTANCE flags to the dynamically-linked library.'
- echo '*> -nocrt[[]dll[]] switch will disable linking the library against emx''s'
+ echo '*> -nocrt@<:@dll@:>@ switch will disable linking the library against emx''s'
echo ' C runtime DLLs.'
- echo '*> -nolxl[[]ite[]] switch will disable running lxlite on the resulting DLL.'
+ echo '*> -nolxl@<:@ite@:>@ switch will disable running lxlite on the resulting DLL.'
echo '*> All other switches (for example -L./ or -lmylib) will be passed'
echo ' unchanged to GCC at the end of command line.'
echo '*> If you create a DLL from a library and you do not specify -o,'
eval ${D}*
rcCmd=${D}?
- if [[] ${D}rcCmd -ne 0 []]; then
+ if @<:@ ${D}rcCmd -ne 0 @:>@; then
echo "command failed, exit code="${D}rcCmd
CleanUp
exit ${D}rcCmd
outFile=""
outimpFile=""
inputFiles=""
+renameScript=""
description=""
CC=gcc.exe
CFLAGS="-s -Zcrtdll"
esac
# Parse commandline
libsToLink=0
-while [[] ${D}1 []]; do
+omfLinking=0
+while @<:@ ${D}1 @:>@; do
case ${D}1 in
-ord*)
EXPORT_BY_ORDINALS=1;
shift
outimpFile=${D}1
;;
+ -name-mangler-script)
+ shift
+ renameScript=${D}1
+ ;;
-d*)
shift
description=${D}1
-L* | -l*)
libsToLink=1
;;
+ -Zomf)
+ omfLinking=1
+ ;;
*)
;;
esac
EXTRA_CFLAGS=${D}{EXTRA_CFLAGS}" "${D}1
;;
+ *.dll)
+ EXTRA_CFLAGS="${D}{EXTRA_CFLAGS} \`basnam ${D}1 .dll\`"
+ if @<:@ ${D}omfLinking -eq 1 @:>@; then
+ EXTRA_CFLAGS="${D}{EXTRA_CFLAGS}.lib"
+ else
+ EXTRA_CFLAGS="${D}{EXTRA_CFLAGS}.a"
+ fi
+ ;;
*)
found=0;
- if [[] ${D}libsToLink -ne 0 []]; then
+ if @<:@ ${D}libsToLink -ne 0 @:>@; then
EXTRA_CFLAGS=${D}{EXTRA_CFLAGS}" "${D}1
else
for file in ${D}1 ; do
- if [[] -f ${D}file []]; then
+ if @<:@ -f ${D}file @:>@; then
inputFiles="${D}{inputFiles} ${D}file"
found=1
fi
done
- if [[] ${D}found -eq 0 []]; then
+ if @<:@ ${D}found -eq 0 @:>@; then
echo "ERROR: No file(s) found: "${D}1
exit 8
fi
done # iterate cmdline words
#
-if [[] -z "${D}inputFiles" []]; then
+if @<:@ -z "${D}inputFiles" @:>@; then
echo "dllar: no input files"
PrintHelp
fi
esac
dirname=\`basnam ${D}file ${D}suffix\`"_%"
mkdir ${D}dirname
- if [[] ${D}? -ne 0 []]; then
+ if @<:@ ${D}? -ne 0 @:>@; then
echo "Failed to create subdirectory ./${D}dirname"
CleanUp
exit 8;
cd ${D}curDir
found=0;
for subfile in ${D}dirname/*.o* ; do
- if [[] -f ${D}subfile []]; then
+ if @<:@ -f ${D}subfile @:>@; then
found=1
- if [[] -s ${D}subfile []]; then
+ if @<:@ -s ${D}subfile @:>@; then
# FIXME: This should be: is file size > 32 byte, _not_ > 0!
newInputFiles="${D}newInputFiles ${D}subfile"
fi
fi
done
- if [[] ${D}found -eq 0 []]; then
- echo "WARNING: there are no files in archive \'${D}file\'"
+ if @<:@ ${D}found -eq 0 @:>@; then
+ echo "WARNING: there are no files in archive \\'${D}file\\'"
fi
;;
*)
# Output filename(s).
do_backup=0;
-if [[] -z ${D}outFile []]; then
+if @<:@ -z ${D}outFile @:>@; then
do_backup=1;
set outFile ${D}inputFiles; outFile=${D}2
fi
*)
;;
esac
-if [[] -z ${D}outimpFile []]; then
+if @<:@ -z ${D}outimpFile @:>@; then
outimpFile=${D}outFile
fi
defFile="${D}{outFile}.def"
arcFile="${D}{outimpFile}.a"
arcFile2="${D}{outimpFile}.lib"
-dllFile="${D}outFile"
-# Add suffix to dllFile later, first we need a version to use as
-# name in .def file.
-if [[] ${D}do_backup -ne 0 []] ; then
- if [[] -f ${D}arcFile []] ; then
+#create ${D}dllFile as something matching 8.3 restrictions,
+if @<:@ -z ${D}renameScript @:>@ ; then
+ dllFile="${D}outFile"
+else
+ dllFile=\`${D}renameScript ${D}outimpFile\`
+fi
+
+if @<:@ ${D}do_backup -ne 0 @:>@ ; then
+ if @<:@ -f ${D}arcFile @:>@ ; then
doCommand "mv ${D}arcFile ${D}{outFile}_s.a"
fi
- if [[] -f ${D}arcFile2 []] ; then
+ if @<:@ -f ${D}arcFile2 @:>@ ; then
doCommand "mv ${D}arcFile2 ${D}{outFile}_s.lib"
fi
fi
# Create the def file.
rm -f ${D}defFile
echo "LIBRARY \`basnam ${D}dllFile\` ${D}library_flags" >> ${D}defFile
-dllFile="${D}dllFile.dll"
-if [[] -n ${D}description []]; then
- echo "DESCRIPTION \"${D}{description}\"" >> ${D}defFile
+dllFile="${D}{dllFile}.dll"
+if @<:@ ! -z ${D}description @:>@; then
+ echo "DESCRIPTION \\"${D}{description}\\"" >> ${D}defFile
fi
echo "EXPORTS" >> ${D}defFile
done
-if [[] ${D}EXPORT_BY_ORDINALS -ne 0 []]; then
- sed "=" < ${D}tmpdefFile | \
+if @<:@ ${D}EXPORT_BY_ORDINALS -ne 0 @:>@; then
+ sed "=" < ${D}tmpdefFile | \\
sed '
N
: loop
- s/^\([[]0-9[]]\+\)\([[]^;[]]*\)\(;.*\)\?/\2 @\1 NONAME/
+ s/^\\(@<:@0-9@:>@\\+\\)\\(@<:@^;@:>@*\\)\\(;.*\\)\\?/\\2 @\\1 NONAME/
t loop
' > ${D}{tmpdefFile}%
grep -v "^ *${D}" < ${D}{tmpdefFile}% > ${D}tmpdefFile
touch "${D}{outFile}.dll"
doCommand "emximp -o ${D}arcFile ${D}defFile"
-if [[] ${D}flag_USE_LXLITE -ne 0 []]; then
+if @<:@ ${D}flag_USE_LXLITE -ne 0 @:>@; then
add_flags="";
- if [[] ${D}EXPORT_BY_ORDINALS -ne 0 []]; then
+ if @<:@ ${D}EXPORT_BY_ORDINALS -ne 0 @:>@; then
add_flags="-ynd"
fi
doCommand "lxlite -cs -t: -mrn -mln ${D}add_flags ${D}dllFile"
esac
shift
done
- depfile=\`basename ${D}srcfile | sed -e 's/\..*${D}/.d/g'\`
- depobjname=\`echo ${D}depfile |sed -e 's/\.d/.o/g'\`
+ depfile=\`basename ${D}srcfile | sed -e 's/\\..*${D}/.d/g'\`
+ depobjname=\`echo ${D}depfile |sed -e 's/\\.d/.o/g'\`
if test -f ${D}depfile ; then
sed -e "s,${D}depobjname:,${D}objfile:,g" ${D}depfile >${D}{DEPSDIR}/${D}{objfile}.d
rm -f ${D}depfile
else
- depfile=\`basename ${D}objfile | sed -e 's/\..*${D}/.d/g'\`
+ depfile=\`basename ${D}objfile | sed -e 's/\\..*${D}/.d/g'\`
if test -f ${D}depfile ; then
sed -e "/^${D}objfile/!s,${D}depobjname:,${D}objfile:,g" ${D}depfile >${D}{DEPSDIR}/${D}{objfile}.d
rm -f ${D}depfile
dnl ===================== shared-ld-sh ends here =====================
])
+AC_DEFUN([AC_BAKEFILE_CREATE_FILE_BK_MAKE_PCH],
+[
+dnl ===================== bk-make-pch begins here =====================
+D='$'
+cat <<EOF >bk-make-pch
+#!/bin/sh
+
+# This script is part of Bakefile (http://bakefile.sourceforge.net) autoconf
+# script. It is used to generated precompiled headers.
+#
+# Permission is given to use this file in any way.
+
+outfile="${D}{1}"
+header="${D}{2}"
+shift
+shift
+
+compiler=
+headerfile=
+while test ${D}{#} -gt 0; do
+ case "${D}{1}" in
+ -I* )
+ incdir=\`echo ${D}{1} | sed -e 's/-I\\(.*\\)/\\1/g'\`
+ if test "x${D}{headerfile}" = "x" -a -f "${D}{incdir}/${D}{header}" ; then
+ headerfile="${D}{incdir}/${D}{header}"
+ fi
+ ;;
+ esac
+ compiler="${D}{compiler} ${D}{1}"
+ shift
+done
+
+if test "x${D}{headerfile}" = "x" ; then
+ echo "error: can't find header ${D}{header} in include paths" >2
+else
+ if test -f ${D}{outfile} ; then
+ rm -f ${D}{outfile}
+ else
+ mkdir -p \`dirname ${D}{outfile}\`
+ fi
+ depsfile=".deps/\`echo ${D}{outfile} | tr '/.' '__'\`.d"
+ mkdir -p .deps
+ # can do this because gcc is >= 3.4:
+ ${D}{compiler} -o ${D}{outfile} -MMD -MF "${D}{depsfile}" "${D}{headerfile}"
+ exit ${D}{?}
+fi
+EOF
+dnl ===================== bk-make-pch ends here =====================
+])
+
dnl
dnl AM_PATH_CPPUNIT(MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
dnl