dnl dnl Definitions for creating shared libraries dnl dnl The purpose of these definitions is to provide common support for dnl shared libraries, with *or without* the use of the GNU Libtool package. dnl For many of our important platforms, the Libtool approach is overkill, dnl and can be particularly painful for developers. dnl dnl To use libtool, you need macros that are defined by libtool for libtool dnl Don't even think about the consequences of this for updating and for dnl using user-versions of libtool :( dnl dnl !!!!!!!!!!!!!!!!!!!!! dnl libtool requires ac 2.50 !!!!!!!!!!!!!!!!! dnl dnl builtin(include,libtool.m4) dnl dnl/*D dnl PAC_ARG_SHAREDLIBS - Add --enable-sharedlibs=kind to configure. dnl dnl Synopsis: dnl PAC_ARG_SHAREDLIBS dnl dnl Output effects: dnl Adds '--enable-sharedlibs=kind' to the command line. If this is enabled, dnl then based on the value of 'kind', programs are selected for the dnl names 'CC_SHL' and 'CC_LINK_SHL' that configure will substitute for in dnl 'Makefile.in's. These symbols are generated by 'simplemake' when dnl shared library support is selected. dnl The variable 'C_LINKPATH_SHL' is set to the option to specify the dnl path to search at runtime for libraries (-rpath in gcc/GNU ld). dnl This can be turned off with --disable-rpath , which is appropriate dnl for libraries and for executables that may be installed in different dnl locations. dnl The variable 'SHLIB_EXT' is set to the extension used by shared dnl libraries; under most forms of Unix, this is 'so'; under Mac OS/X, this dnl is 'dylib', and under Windows (including cygwin), this is 'dll'. dnl dnl Supported values of 'kind' include \: dnl+ gcc - Use gcc to create both shared objects and libraries dnl. osx-gcc - Use gcc on Mac OS/X to create both shared objects and dnl libraries dnl. solaris-cc - Use native Solaris cc to create shared objects and dnl libraries dnl. cygwin-gcc - Use gcc on Cygwin to create shared objects and libraries dnl- none - The same as '--disable-sharedlibs' dnl dnl Others will be added as experience dictates. Likely names are dnl + libtool - For general GNU libtool dnl - linux-pgcc - For Portland group under Linux dnl dnl Notes: dnl Shared libraries are only partially implemented. Additional symbols dnl will probably be defined, including symbols to specify how shared library dnl search paths are specified and how shared library names are set. dnl D*/ AC_DEFUN([PAC_ARG_SHAREDLIBS],[ AC_ARG_ENABLE(shared, AC_HELP_STRING([--enable-shared], [Enable shared library builds]),, enable_shared=no) AC_ARG_ENABLE(rpath, AC_HELP_STRING([--enable-rpath], [Determine whether the rpath is set when programs are compiled and linked when shared libraries are built. The default is yes; use --disable-rpath to turn this feature off; in that case, shared libraries will be found according to the rules for your system (e.g., in LD_LIBRARY_PATH)]),,enable_rpath=yes) AC_ARG_ENABLE(sharedlibs, [ --enable-sharedlibs=kind - Enable shared libraries. kind may be gcc - Standard gcc and GNU ld options for creating shared libraries osx-gcc - Special options for gcc needed only on OS/X solaris-cc - Solaris native (SPARC) compilers for 32 bit systems cygwin-gcc - Special options for gcc needed only for cygwin none - same as --disable-sharedlibs Only gcc, osx-gcc, and solaris-cc are currently supported ],,enable_sharedlibs=default) if test "$enable_sharedlibs" = "default" ; then if test "$enable_shared" = "yes" ; then AS_CASE([$host], [*-*-darwin*], [enable_sharedlibs=gcc-osx], [*-*-cygwin*|*-*-mingw*|*-*-pw32*|*-*-cegcc*], [enable_sharedlibs=cygwin-gcc], [*-*-sunos*], [enable_sharedlibs=solaris-gcc], [enable_sharedlibs=gcc]) else enable_sharedlibs=none fi fi # If --enable-sharedlibs is given, but --enable-shared is not, throw # an error if test "$enable_sharedlibs" != "no" -a "$enable_sharedlibs" != "none" ; then if test "$enable_shared" = "no" ; then AC_MSG_ERROR([--enable-sharedlibs cannot be used without --enable-shared]) fi fi CC_SHL=true C_LINK_SHL=true C_LINKPATH_SHL="" SHLIB_EXT=unknown SHLIB_FROM_LO=no SHLIB_INSTALL='$(INSTALL_PROGRAM)' case "$enable_sharedlibs" in no|none) ;; gcc-osx|osx-gcc) AC_MSG_RESULT([Creating shared libraries using GNU for Mac OSX]) C_LINK_SHL='${CC} -dynamiclib -undefined suppress -single_module -flat_namespace' CC_SHL='${CC} -fPIC' # No way in osx to specify the location of the shared libraries at link # time (see the code in createshlib in mpich/src/util) # As of 10.5, -Wl,-rpath,dirname should work . The dirname # must be a single directory, not a colon-separated list (use multiple # -Wl,-rpath,path for each of the paths in the list). However, os x # apparently records the library full path, so rpath isn't as useful # as it is on other systems C_LINKPATH_SHL="" SHLIB_EXT="dylib" enable_sharedlibs="osx-gcc" ;; gcc) AC_MSG_RESULT([Creating shared libraries using GNU]) # Not quite right yet. See mpich/util/makesharedlib # Use syntax that works in both Make and the shell #C_LINK_SHL='${CC} -shared -Wl,-r' C_LINK_SHL='${CC} -shared' # For example, include the libname as ${LIBNAME_SHL} #C_LINK_SHL='${CC} -shared -Wl,-h,' # May need -fPIC . Test to see which one works. for sh_arg in "-fPIC" "-fpic" "-KPIC" ; do PAC_C_CHECK_COMPILER_OPTION($sh_arg,works=yes,works=no) if test "$works" = "yes" ; then CC_SHL="${CC} ${sh_arg}" break fi done if test "$works" != "yes"; then AC_MSG_ERROR([Cannot build shared libraries with this compiler]) fi # This used to have -Wl,-rpath earlier, but that causes problems # on many systems. if test $enable_rpath = "yes" ; then C_LINKPATH_SHL="-Wl,-rpath," fi SHLIB_EXT=so # We need to test that this isn't osx. The following is a # simple hack osname=`uname -s` case $osname in *Darwin*|*darwin*) AC_MSG_ERROR([You must specify --enable-sharedlibs=osx-gcc for Mac OS/X]) ;; *CYGWIN*|*cygwin*) AC_MSG_ERROR([You must specify --enable-sharedlibs=cygwin-gcc for Cygwin]) ;; *SunOS*) AC_MSG_ERROR([You must specify --enable-sharedlibs=solaris-gcc for Solaris with gcc]) ;; esac ;; cygwin|cygwin-gcc|gcc-cygwin) AC_MSG_RESULT([Creating shared libraries using GNU under CYGWIN]) C_LINK_SHL='${CC} -shared' CC_SHL='${CC}' # DLL Libraries need to be in the user's path (!) C_LINKPATH_SHL="" SHLIB_EXT="dll" enable_sharedlibs="cygwin-gcc" ;; libtool) # set TRY_LIBTOOL to yes to experiment with libtool. You are on your # own - only send fixes, not bug reports. if test "$TRY_LIBTOOL" != yes ; then AC_MSG_ERROR([Creating shared libraries using libtool not yet supported]) else # Using libtool requires a heavy-weight process to test for # various stuff that libtool needs. Without this, you'll get a # bizarre error message about libtool being unable to find # configure.in or configure.ac (!) # Libtool expects to see at least enable-shared. if test "X$enable_shared" = "X" ; then enable_shared=yes ; fi # Initialize libtool # This works, but libtool version 2 places the object files # in a different place, making it harder to integrate with # our base approach. Disabling for now dnl LT_PREREQ([2.2.6]) dnl LT_INIT([disable-shared]) AC_MSG_ERROR([To use this test verison, edit aclocal_shl.m4]) # Likely to be # either CC or CC_SHL is libtool $cc CC_SHL='${LIBTOOL} --mode=compile ${CC}' # CC_LINK_SHL includes the final installation path # For many systems, the link may need to include *all* libraries # (since many systems don't allow any unsatisfied dependencies) # We need to give libtool the .lo file, not the .o files SHLIB_FROM_LO=yes # We also need to add -no-undefined when the compiler is gcc and # we are building under cygwin sysname=`uname -s | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ` isCygwin=no case "$sysname" in *CYGWIN*) isCygwin=yes ;; esac if test "$isCygwin" = yes ; then C_LINK_SHL='${LIBTOOL} --mode=link ${CC} -no-undefined -rpath ${libdir}' else C_LINK_SHL='${LIBTOOL} --mode=link ${CC} -rpath ${libdir}' fi if test $enable_rpath = "yes" ; then C_LINKPATH_SHL="-rpath " fi # We also need a special install process with libtool. Note that this # will also install the static libraries SHLIB_INSTALL='$(LIBTOOL) --mode=install $(INSTALL_PROGRAM)' # Note we may still need to add #'$(LIBTOOL) --mode=finish $(libdir)' fi ;; dnl dnl Other, such as solaris-cc solaris|solaris-cc) AC_MSG_RESULT([Creating shared libraries using Solaris]) # pic32 is appropriate for both 32 and 64 bit Solaris C_LINK_SHL='${CC} -G -xcode=pic32' CC_SHL='${CC} -xcode=pic32' if test $enable_rpath = "yes" ; then C_LINKPATH_SHL="-R" fi SHLIB_EXT=so enable_sharedlibs="solaris-cc" ;; solaris-gcc) # This is the same as gcc, except for the C_LINKPATH_SHL AC_MSG_RESULT([Creating shared libraries using Solaris with gcc]) C_LINK_SHL='${CC} -shared' CC_SHL='${CC} -fPIC' if test $enable_rpath = "yes" ; then C_LINKPATH_SHL="-R" fi SHLIB_EXT=so enable_sharedlibs="solaris-gcc" ;; linuxppc-xlc) # This is only the beginning of xlc support, thanks to andy@vpac.org CC_SHL='${CC} -qmkshrobj' # More recent versions allow multiple args, separated by commas if test $enable_rpath = "yes" ; then C_LINKPATH_SHL="-Wl,-rpath," fi #C_LINKPATH_SHL="-Wl,-rpath -Wl," C_LINK_SHL='${CC} -shared -qmkshrobj' SHLIB_EXT=so # Note that the full line should be more like # $CLINKER -shared -qmkshrobj -Wl,-h,$libbase.$slsuffix -o ../shared/$libbase.$slsuffix *.o $OtherLibs # for the appropriate values of $libbase and $slsuffix # The -h name sets the name of the object; this is necessary to # ensure that the dynamic linker can find the proper shared library. ;; *) AC_MSG_ERROR([Unknown value $enable_sharedlibs for enable-sharedlibs. Values should be gcc or osx-gcc]) enable_sharedlibs=no ;; esac # Check for the shared-library extension PAC_CC_SHLIB_EXT dnl AC_SUBST(CC_SHL) AC_SUBST(C_LINK_SHL) AC_SUBST(C_LINKPATH_SHL) AC_SUBST(SHLIB_EXT) AC_SUBST(SHLIB_FROM_LO) AC_SUBST(SHLIB_INSTALL) ]) dnl /*D dnl PAC_xx_SHAREDLIBS - Get compiler and linker for shared libraries dnl These routines may be used to determine the compiler and the dnl linker to be used in creating shared libraries dnl Rather than set predefined variable names, they set an argument dnl (if provided) dnl dnl Synopsis dnl PAC_CC_SHAREDLIBS(type,CCvar,CLINKvar) dnl D*/ AC_DEFUN([PAC_CC_SHAREDLIBS], [ pac_kinds=$1 ifelse($1,,[ pac_prog="" AC_CHECK_PROG(pac_prog,gcc,yes,no) # If we are gcc but OS X, set the special type # We need a similar setting for cygwin if test "$pac_prog" = yes ; then osname=`uname -s` case $osname in *Darwin*|*darwin*) pac_kinds=gcc-osx ;; *) pac_kinds=gcc ;; esac fi pac_prog="" AC_CHECK_PROG(pac_prog,libtool,yes,no) if test "$pac_prog" = yes ; then pac_kinds="$pac_kinds libtool" ; fi ]) for pac_arg in $pac_kinds ; do case $pac_arg in gcc) # For example, include the libname as ${LIBNAME_SHL} #C_LINK_SHL='${CC} -shared -Wl,-h,' pac_cc_sharedlibs='gcc -shared' # Make sure we select the correct fpic option PAC_C_CHECK_COMPILER_OPTION(-fPIC,fPIC_OK=yes,fPIC_OK=no) if test "$fPIC_OK" != yes ; then PAC_C_CHECK_COMPILER_OPTION(-fpic,fpic_ok=yes,fpic_ok=no) if test "$fpic_ok" != yes ; then AC_MSG_ERROR([Neither -fpic nor -fPIC accepted by $CC]) else pac_cc_sharedlibs="$pac_cc_sharedlibs -fpic" fi else pac_cc_sharedlibs="$pac_cc_sharedlibs -fPIC" fi pac_clink_sharedlibs='gcc -shared' pac_type_sharedlibs=gcc ;; gcc-osx|osx-gcc) pac_clink_sharedlibs='${CC} -dynamiclib -undefined suppress -single_module -flat_namespace' pac_cc_sharedlibs='${CC} -fPIC' pac_type_sharedlibs=gcc-osx ;; libtool) AC_CHECK_PROGS(LIBTOOL,libtool,false) if test "$LIBTOOL" = "false" ; then AC_MSG_WARN([Could not find libtool]) else # Likely to be # either CC or CC_SHL is libtool $cc pac_cc_sharedlibs'${LIBTOOL} -mode=compile ${CC}' pac_clink_sharedlibs='${LIBTOOL} -mode=link ${CC} -rpath ${libdir}' pac_type_sharedlibs=libtool fi ;; *) ;; esac if test -n "$pac_cc_sharedlibs" ; then break ; fi done if test -z "$pac_cc_sharedlibs" ; then pac_cc_sharedlibs=true ; fi if test -z "$pac_clink_sharedlibs" ; then pac_clink_sharedlibs=true ; fi ifelse($2,,CC_SHL=$pac_cc_sharedlibs,$2=$pac_cc_sharedlibs) ifelse($3,,C_LINK_SHL=$pac_clink_sharedlibs,$3=$pac_clink_sharedlibs) ifelse($4,,SHAREDLIB_TYPE=$pac_type_sharedlibs,$4=$pac_type_sharedlibs) ]) dnl This macro ensures that all of the necessary substitutions are dnl made by any subdirectory configure (which may simply SUBST the dnl necessary values rather than trying to determine them from scratch) dnl This is a more robust (and, in the case of libtool, only dnl managable) method. AC_DEFUN([PAC_CC_SUBDIR_SHLIBS],[ AC_SUBST(CC_SHL) AC_SUBST(C_LINK_SHL) AC_SUBST(LIBTOOL) AC_SUBST(ENABLE_SHLIB) AC_SUBST(SHLIB_EXT) if test "$ENABLE_SHLIB" = "libtool" ; then if test -z "$LIBTOOL" ; then AC_MSG_WARN([libtool selected for shared library support but LIBTOOL is not defined]) fi # Libtool needs master_top_builddir if test "X$master_top_builddir" = "X" ; then AC_MSG_ERROR([Libtool requires master_top_builddir - check configure.ac sources]) fi AC_SUBST(master_top_builddir) fi ]) dnl PAC_CC_SHLIB_EXT - get the extension for shared libraries dnl Set the variable SHLIB_EXT if it is other than unknown. AC_DEFUN([PAC_CC_SHLIB_EXT],[ # Not all systems use .so as the extension for shared libraries (cygwin # and OSX are two important examples). If we did not set the SHLIB_EXT, # then try and determine it. We need this to properly implement # clean steps that look for libfoo.$SHLIB_EXT . if test "$SHLIB_EXT" = "unknown" ; then osname=`uname -s` case $osname in *Darwin*|*darwin*) SHLIB_EXT=dylib ;; *CYGWIN*|*cygwin*) SHLIB_EXT=dll ;; *Linux*|*LINUX*|*SunOS*) SHLIB_EXT=so ;; esac fi ]) dnl PAC_COMPILER_SHLIB_FLAGS(compiler-var,output-file) dnl dnl Uses confdb/config.rpath to determine important linking flags and dnl information. This is mainly intended to support the compiler wrapper dnl scripts in MPICH ("mpicc" and friends) which cannot directly use libtool to dnl handle linking. MPICH's compiler wrappers attempt to link executables with dnl an rpath by default. The resulting variable assignment statements will be dnl placed into "output-file", which is then suitable for AC_SUBST_FILE or dnl sourcing in a shell script (including configure itself). dnl dnl This macro assumes that the basic tests associated with "compiler-var" have dnl been run already, but does not AC_REQUIRE them in order to prevent problems dnl with "expanded before required" when requiring the AC_PROG_{CC,F77,FC,CXX} dnl macros. dnl dnl Example usage: dnl dnl ----8<---- dnl # compute flags for linking executables against shared libraries when using dnl # the modern Fortran compiler ($FC). dnl PAC_COMPILER_SHLIB_FLAGS([FC],[src/env/fc_shlib.conf]) dnl ----8<---- AC_DEFUN([PAC_COMPILER_SHLIB_FLAGS],[ AC_REQUIRE_AUX_FILE([config.rpath]) AC_REQUIRE([AC_CANONICAL_HOST]) # It appears that the libtool dynamic linking strategy on Darwin is this: # 1. Link all shared libs with "-install_name /full/path/to/libfoo.dylib" # 2. Don't do anything special when linking programs, since it seems that the # darwin dynamic linker will always use the "install_name" field from the lib # that was found at program link-time. (CONFIRMED) This is in opposition to # the way that Linux does it, where specifying a "-rpath" argument at program # link-time is important. # # There is an alternative darwin strategy for versions # >= 10.5, see this: http://www.cmake.org/pipermail/cmake/2010-August/038970.html # (goodell@ 2011-06-17) AC_MSG_CHECKING([for shared library (esp. rpath) characteristics of $1]) # unfortunately, config.rpath expects the compiler in question is always CC and # uses several other environment variables as input PAC_PUSH_FLAG([CC]) PAC_PUSH_FLAG([GCC]) PAC_PUSH_FLAG([LD]) # these two don't currently get overridden, but we push/pop them for safety in # case they do in the future PAC_PUSH_FLAG([LDFLAGS]) PAC_PUSH_FLAG([with_gnu_ld]) PAC_PUSH_FLAG([use_new_dtags]) # set the temporary override values (if any) m4_case([$1], [CC], [:], dnl do nothing special for CC, values are already correct [F77], [CC="$$1" GCC="$G77" LD="$LD_F77"], [FC], [CC="$$1" GCC="$GCC_FC" LD="$LD_FC"], [CXX], [CC="$$1" GCC="$GXX" LD="$LD_CXX"], [m4_fatal([unknown compiler argument "$1"])]) # ensure the values are available to the script export CC export GCC export LDFLAGS export LD export with_gnu_ld export use_new_dtags AS_IF([$ac_aux_dir/config.rpath "$host" > $2],[:],[AC_MSG_ERROR([unable to execute $ac_aux_dir/config.rpath])]) C_LINKPATH_SHL="" AC_SUBST([C_LINKPATH_SHL]) rm -f conftest.out # restore the old values PAC_POP_FLAG([use_new_dtags]) PAC_POP_FLAG([with_gnu_ld]) PAC_POP_FLAG([LD]) PAC_POP_FLAG([LDFLAGS]) PAC_POP_FLAG([GCC]) PAC_POP_FLAG([CC]) AC_MSG_RESULT([done (results in $2)]) ])