@@ -258,5 +258,147 @@ ], [ AC_MSG_RESULT([not found]) ] ) ]) + +dnl Usage: +dnl DC_TEST_SHOBJFLAGS(shobjflags, shobjldflags, action-if-not-found) +dnl +AC_DEFUN(DC_TEST_SHOBJFLAGS, [ + AC_SUBST(SHOBJFLAGS) + AC_SUBST(SHOBJLDFLAGS) + + OLD_LDFLAGS="$LDFLAGS" + SHOBJFLAGS="" + + LDFLAGS="$OLD_LDFLAGS $1 $2" + + AC_TRY_LINK([#include +int unrestst(void);], [ printf("okay\n"); unrestst(); return(0); ], [ SHOBJFLAGS="$1"; SHOBJLDFLAGS="$2" ], [ + LDFLAGS="$OLD_LDFLAGS" + $3 +]) + + LDFLAGS="$OLD_LDFLAGS" +]) + +AC_DEFUN(DC_GET_SHOBJFLAGS, [ + AC_SUBST(SHOBJFLAGS) + AC_SUBST(SHOBJLDFLAGS) + + AC_MSG_CHECKING(how to create shared objects) + + if test -z "$SHOBJFLAGS" -a -z "$SHOBJLDFLAGS"; then + DC_TEST_SHOBJFLAGS([-fPIC -DPIC], [-shared -rdynamic], [ + DC_TEST_SHOBJFLAGS([-fPIC -DPIC], [-shared], [ + DC_TEST_SHOBJFLAGS([-fPIC -DPIC], [-shared -rdynamic -mimpure-text], [ + DC_TEST_SHOBJFLAGS([-fPIC -DPIC], [-shared -mimpure-text], [ + DC_TEST_SHOBJFLAGS([-fPIC -DPIC], [-shared -rdynamic -Wl,-G,-z,textoff], [ + DC_TEST_SHOBJFLAGS([-fPIC -DPIC], [-shared -Wl,-G,-z,textoff], [ + DC_TEST_SHOBJFLAGS([-fPIC -DPIC], [-shared -dynamiclib -flat_namespace -undefined suppress -bind_at_load], [ + DC_TEST_SHOBJFLAGS([-fPIC -DPIC], [-dynamiclib -flat_namespace -undefined suppress -bind_at_load], [ + DC_TEST_SHOBJFLAGS([-fPIC -DPIC], [-Wl,-dynamiclib -Wl,-flat_namespace -Wl,-undefined,suppress -Wl,-bind_at_load], [ + DC_TEST_SHOBJFLAGS([-fPIC -DPIC], [-dynamiclib -flat_namespace -undefined suppress], [ + DC_TEST_SHOBJFLAGS([-fPIC -DPIC], [-dynamiclib], [ + AC_MSG_RESULT(cant) + AC_MSG_ERROR([We are unable to make shared objects.]) + ]) + ]) + ]) + ]) + ]) + ]) + ]) + ]) + ]) + ]) + ]) + fi + + AC_MSG_RESULT($SHOBJLDFLAGS $SHOBJFLAGS) +]) + +AC_DEFUN(DC_CHK_OS_INFO, [ + AC_CANONICAL_HOST + AC_SUBST(SHOBJEXT) + AC_SUBST(AREXT) + AC_SUBST(SHOBJFLAGS) + AC_SUBST(SHOBJLDFLAGS) + + AC_MSG_CHECKING(host operating system) + AC_MSG_RESULT($host_os) + + SHOBJEXT="so" + AREXT="a" + + case $host_os in + darwin*) + SHOBJEXT="dylib" + ;; + hpux*) + SHOBJEXT="sl" + ;; + mingw*) + SHOBJEXT="dll" + SHOBJFLAGS="-mno-cygwin -mms-bitfields -DPIC" + SHOBJLDFLAGS='-shared -Wl,--dll -Wl,--enable-auto-image-base -Wl,--output-def,$[@].def,--out-implib,$[@].a -Wl,--export-all-symbols -Wl,--add-stdcall-alias' + ;; + esac +]) + +AC_DEFUN(DC_TEST_WHOLE_ARCHIVE_SHARED_LIB, [ + + SAVE_LIBS="${LIBS}" + + LIBS="${WHOLEARCHIVE} $1 ${NOWHOLEARCHIVE} ${SAVE_LIBS}" + AC_LINK_IFELSE( + AC_LANG_PROGRAM([[ + ]], [[ + ]] + ), + [ + LIBS="${SAVE_LIBS}" + + $2 + ], [ + LIBS="${SAVE_LIBS}" + + $3 + ] + ) +]) + +AC_DEFUN(DC_CHECK_FOR_WHOLE_ARCHIVE, [ + AC_MSG_CHECKING([for how to link whole archive]) + + SAVE_CFLAGS="${CFLAGS}" + + wholearchive="" + + for check in "-Wl,--whole-archive -Wl,--no-whole-archive" "-Wl,-z,allextract -Wl,-z,defaultextract"; do + CFLAGS="${SAVE_CFLAGS} ${check}" + + AC_LINK_IFELSE(AC_LANG_PROGRAM([], []), + [ + wholearchive="${check}" + + break + ] + ) + + done + + CFLAGS="${SAVE_CFLAGS}" + + if test -z "${wholearchive}"; then + AC_MSG_RESULT([not found]) + else + AC_MSG_RESULT([${wholearchive}]) + + WHOLEARCHIVE=`echo "${wholearchive}" | cut -f 1 -d ' '` + NOWHOLEARCHIVE=`echo "${wholearchive}" | cut -f 2 -d ' '` + fi + + AC_SUBST(WHOLEARCHIVE) + AC_SUBST(NOWHOLEARCHIVE) +])