williamr@2: // (C) Copyright John Maddock 2003. williamr@2: // Use, modification and distribution are subject to the williamr@2: // Boost Software License, Version 1.0. (See accompanying file williamr@2: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) williamr@2: williamr@2: /* williamr@2: * LOCATION: see http://www.boost.org for most recent version. williamr@2: * FILE auto_link.hpp williamr@2: * VERSION see williamr@2: * DESCRIPTION: Automatic library inclusion for Borland/Microsoft compilers. williamr@2: */ williamr@2: williamr@2: /************************************************************************* williamr@2: williamr@2: USAGE: williamr@2: ~~~~~~ williamr@2: williamr@2: Before including this header you must define one or more of define the following macros: williamr@2: williamr@2: BOOST_LIB_NAME: Required: A string containing the basename of the library, williamr@2: for example boost_regex. williamr@2: BOOST_LIB_TOOLSET: Optional: the base name of the toolset. williamr@2: BOOST_DYN_LINK: Optional: when set link to dll rather than static library. williamr@2: BOOST_LIB_DIAGNOSTIC: Optional: when set the header will print out the name williamr@2: of the library selected (useful for debugging). williamr@2: BOOST_AUTO_LINK_NOMANGLE: Specifies that we should link to BOOST_LIB_NAME.lib, williamr@2: rather than a mangled-name version. williamr@2: williamr@2: These macros will be undef'ed at the end of the header, further this header williamr@2: has no include guards - so be sure to include it only once from your library! williamr@2: williamr@2: Algorithm: williamr@2: ~~~~~~~~~~ williamr@2: williamr@2: Libraries for Borland and Microsoft compilers are automatically williamr@2: selected here, the name of the lib is selected according to the following williamr@2: formula: williamr@2: williamr@2: BOOST_LIB_PREFIX williamr@2: + BOOST_LIB_NAME williamr@2: + "_" williamr@2: + BOOST_LIB_TOOLSET williamr@2: + BOOST_LIB_THREAD_OPT williamr@2: + BOOST_LIB_RT_OPT williamr@2: "-" williamr@2: + BOOST_LIB_VERSION williamr@2: williamr@2: These are defined as: williamr@2: williamr@2: BOOST_LIB_PREFIX: "lib" for static libraries otherwise "". williamr@2: williamr@2: BOOST_LIB_NAME: The base name of the lib ( for example boost_regex). williamr@2: williamr@2: BOOST_LIB_TOOLSET: The compiler toolset name (vc6, vc7, bcb5 etc). williamr@2: williamr@2: BOOST_LIB_THREAD_OPT: "-mt" for multithread builds, otherwise nothing. williamr@2: williamr@2: BOOST_LIB_RT_OPT: A suffix that indicates the runtime library used, williamr@2: contains one or more of the following letters after williamr@2: a hiphen: williamr@2: williamr@2: s static runtime (dynamic if not present). williamr@2: d debug build (release if not present). williamr@2: g debug/diagnostic runtime (release if not present). williamr@2: p STLPort Build. williamr@2: williamr@2: BOOST_LIB_VERSION: The Boost version, in the form x_y, for Boost version x.y. williamr@2: williamr@2: williamr@2: ***************************************************************************/ williamr@2: williamr@2: #ifdef __cplusplus williamr@2: # ifndef BOOST_CONFIG_HPP williamr@2: # include williamr@2: # endif williamr@2: #elif defined(_MSC_VER) && !defined(__MWERKS__) && !defined(__EDG_VERSION__) williamr@2: // williamr@2: // C language compatability (no, honestly) williamr@2: // williamr@2: # define BOOST_MSVC _MSC_VER williamr@2: # define BOOST_STRINGIZE(X) BOOST_DO_STRINGIZE(X) williamr@2: # define BOOST_DO_STRINGIZE(X) #X williamr@2: #endif williamr@2: // williamr@2: // Only include what follows for known and supported compilers: williamr@2: // williamr@2: #if defined(BOOST_MSVC) \ williamr@2: || defined(__BORLANDC__) \ williamr@2: || (defined(__MWERKS__) && defined(_WIN32) && (__MWERKS__ >= 0x3000)) \ williamr@2: || (defined(__ICL) && defined(_MSC_EXTENSIONS) && (_MSC_VER >= 1200)) williamr@2: williamr@2: #ifndef BOOST_VERSION_HPP williamr@2: # include williamr@2: #endif williamr@2: williamr@2: #ifndef BOOST_LIB_NAME williamr@2: # error "Macro BOOST_LIB_NAME not set (internal error)" williamr@2: #endif williamr@2: williamr@2: // williamr@2: // error check: williamr@2: // williamr@2: #if defined(__MSVC_RUNTIME_CHECKS) && !defined(_DEBUG) williamr@2: # pragma message("Using the /RTC option without specifying a debug runtime will lead to linker errors") williamr@2: # pragma message("Hint: go to the code generation options and switch to one of the debugging runtimes") williamr@2: # error "Incompatible build options" williamr@2: #endif williamr@2: // williamr@2: // select toolset if not defined already: williamr@2: // williamr@2: #ifndef BOOST_LIB_TOOLSET williamr@2: // Note: no compilers before 1200 are supported williamr@2: #if defined(BOOST_MSVC) && (BOOST_MSVC < 1300) williamr@2: williamr@2: # ifdef UNDER_CE williamr@2: // vc6: williamr@2: # define BOOST_LIB_TOOLSET "evc4" williamr@2: # else williamr@2: // vc6: williamr@2: # define BOOST_LIB_TOOLSET "vc6" williamr@2: # endif williamr@2: williamr@2: #elif defined(BOOST_MSVC) && (BOOST_MSVC == 1300) williamr@2: williamr@2: // vc7: williamr@2: # define BOOST_LIB_TOOLSET "vc7" williamr@2: williamr@2: #elif defined(BOOST_MSVC) && (BOOST_MSVC == 1310) williamr@2: williamr@2: // vc71: williamr@2: # define BOOST_LIB_TOOLSET "vc71" williamr@2: williamr@2: #elif defined(BOOST_MSVC) && (BOOST_MSVC >= 1400) williamr@2: williamr@2: // vc80: williamr@2: # define BOOST_LIB_TOOLSET "vc80" williamr@2: williamr@2: #elif defined(__BORLANDC__) williamr@2: williamr@2: // CBuilder 6: williamr@2: # define BOOST_LIB_TOOLSET "bcb" williamr@2: williamr@2: #elif defined(__ICL) williamr@2: williamr@2: // Intel C++, no version number: williamr@2: # define BOOST_LIB_TOOLSET "iw" williamr@2: williamr@2: #elif defined(__MWERKS__) && (__MWERKS__ <= 0x31FF ) williamr@2: williamr@2: // Metrowerks CodeWarrior 8.x williamr@2: # define BOOST_LIB_TOOLSET "cw8" williamr@2: williamr@2: #elif defined(__MWERKS__) && (__MWERKS__ <= 0x32FF ) williamr@2: williamr@2: // Metrowerks CodeWarrior 9.x williamr@2: # define BOOST_LIB_TOOLSET "cw9" williamr@2: williamr@2: #endif williamr@2: #endif // BOOST_LIB_TOOLSET williamr@2: williamr@2: // williamr@2: // select thread opt: williamr@2: // williamr@2: #if defined(_MT) || defined(__MT__) williamr@2: # define BOOST_LIB_THREAD_OPT "-mt" williamr@2: #else williamr@2: # define BOOST_LIB_THREAD_OPT williamr@2: #endif williamr@2: williamr@2: #if defined(_MSC_VER) || defined(__MWERKS__) williamr@2: williamr@2: # ifdef _DLL williamr@2: williamr@2: # if (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) && (defined(_STLP_OWN_IOSTREAMS) || defined(__STL_OWN_IOSTREAMS)) williamr@2: williamr@2: # if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG)) williamr@2: # define BOOST_LIB_RT_OPT "-gdp" williamr@2: # elif defined(_DEBUG) williamr@2: # define BOOST_LIB_RT_OPT "-gdp" williamr@2: # pragma message("warning: STLPort debug versions are built with /D_STLP_DEBUG=1") williamr@2: # error "Build options aren't compatible with pre-built libraries" williamr@2: # else williamr@2: # define BOOST_LIB_RT_OPT "-p" williamr@2: # endif williamr@2: williamr@2: # elif defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION) williamr@2: williamr@2: # if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG)) williamr@2: # define BOOST_LIB_RT_OPT "-gdpn" williamr@2: # elif defined(_DEBUG) williamr@2: # define BOOST_LIB_RT_OPT "-gdpn" williamr@2: # pragma message("warning: STLPort debug versions are built with /D_STLP_DEBUG=1") williamr@2: # error "Build options aren't compatible with pre-built libraries" williamr@2: # else williamr@2: # define BOOST_LIB_RT_OPT "-pn" williamr@2: # endif williamr@2: williamr@2: # else williamr@2: williamr@2: # if defined(_DEBUG) williamr@2: # define BOOST_LIB_RT_OPT "-gd" williamr@2: # else williamr@2: # define BOOST_LIB_RT_OPT williamr@2: # endif williamr@2: williamr@2: # endif williamr@2: williamr@2: # else williamr@2: williamr@2: # if (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) && (defined(_STLP_OWN_IOSTREAMS) || defined(__STL_OWN_IOSTREAMS)) williamr@2: williamr@2: # if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG)) williamr@2: # define BOOST_LIB_RT_OPT "-sgdp" williamr@2: # elif defined(_DEBUG) williamr@2: # define BOOST_LIB_RT_OPT "-sgdp" williamr@2: # pragma message("warning: STLPort debug versions are built with /D_STLP_DEBUG=1") williamr@2: # error "Build options aren't compatible with pre-built libraries" williamr@2: # else williamr@2: # define BOOST_LIB_RT_OPT "-sp" williamr@2: # endif williamr@2: williamr@2: # elif defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION) williamr@2: williamr@2: # if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG)) williamr@2: # define BOOST_LIB_RT_OPT "-sgdpn" williamr@2: # elif defined(_DEBUG) williamr@2: # define BOOST_LIB_RT_OPT "-sgdpn" williamr@2: # pragma message("warning: STLPort debug versions are built with /D_STLP_DEBUG=1") williamr@2: # error "Build options aren't compatible with pre-built libraries" williamr@2: # else williamr@2: # define BOOST_LIB_RT_OPT "-spn" williamr@2: # endif williamr@2: williamr@2: # else williamr@2: williamr@2: # if defined(_DEBUG) williamr@2: # define BOOST_LIB_RT_OPT "-sgd" williamr@2: # else williamr@2: # define BOOST_LIB_RT_OPT "-s" williamr@2: # endif williamr@2: williamr@2: # endif williamr@2: williamr@2: # endif williamr@2: williamr@2: #elif defined(__BORLANDC__) williamr@2: williamr@2: // williamr@2: // figure out whether we want the debug builds or not: williamr@2: // williamr@2: #if __BORLANDC__ > 0x561 williamr@2: #pragma defineonoption BOOST_BORLAND_DEBUG -v williamr@2: #endif williamr@2: // williamr@2: // sanity check: williamr@2: // williamr@2: #if defined(__STL_DEBUG) || defined(_STLP_DEBUG) williamr@2: #error "Pre-built versions of the Boost libraries are not provided in STLPort-debug form" williamr@2: #endif williamr@2: williamr@2: # ifdef _RTLDLL williamr@2: williamr@2: # ifdef BOOST_BORLAND_DEBUG williamr@2: # define BOOST_LIB_RT_OPT "-d" williamr@2: # else williamr@2: # define BOOST_LIB_RT_OPT williamr@2: # endif williamr@2: williamr@2: # else williamr@2: williamr@2: # ifdef BOOST_BORLAND_DEBUG williamr@2: # define BOOST_LIB_RT_OPT "-sd" williamr@2: # else williamr@2: # define BOOST_LIB_RT_OPT "-s" williamr@2: # endif williamr@2: williamr@2: # endif williamr@2: williamr@2: #endif williamr@2: williamr@2: // williamr@2: // select linkage opt: williamr@2: // williamr@2: #if (defined(_DLL) || defined(_RTLDLL)) && defined(BOOST_DYN_LINK) williamr@2: # define BOOST_LIB_PREFIX williamr@2: #elif defined(BOOST_DYN_LINK) williamr@2: # error "Mixing a dll boost library with a static runtime is a really bad idea..." williamr@2: #else williamr@2: # define BOOST_LIB_PREFIX "lib" williamr@2: #endif williamr@2: williamr@2: // williamr@2: // now include the lib: williamr@2: // williamr@2: #if defined(BOOST_LIB_NAME) \ williamr@2: && defined(BOOST_LIB_PREFIX) \ williamr@2: && defined(BOOST_LIB_TOOLSET) \ williamr@2: && defined(BOOST_LIB_THREAD_OPT) \ williamr@2: && defined(BOOST_LIB_RT_OPT) \ williamr@2: && defined(BOOST_LIB_VERSION) williamr@2: williamr@2: #ifndef BOOST_AUTO_LINK_NOMANGLE williamr@2: # pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT "-" BOOST_LIB_VERSION ".lib") williamr@2: # ifdef BOOST_LIB_DIAGNOSTIC williamr@2: # pragma message ("Linking to lib file: " BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT "-" BOOST_LIB_VERSION ".lib") williamr@2: # endif williamr@2: #else williamr@2: # pragma comment(lib, BOOST_STRINGIZE(BOOST_LIB_NAME) ".lib") williamr@2: # ifdef BOOST_LIB_DIAGNOSTIC williamr@2: # pragma message ("Linking to lib file: " BOOST_STRINGIZE(BOOST_LIB_NAME) ".lib") williamr@2: # endif williamr@2: #endif williamr@2: williamr@2: #else williamr@2: # error "some required macros where not defined (internal logic error)." williamr@2: #endif williamr@2: williamr@2: williamr@2: #endif // _MSC_VER || __BORLANDC__ williamr@2: williamr@2: // williamr@2: // finally undef any macros we may have set: williamr@2: // williamr@2: #ifdef BOOST_LIB_PREFIX williamr@2: # undef BOOST_LIB_PREFIX williamr@2: #endif williamr@2: #if defined(BOOST_LIB_NAME) williamr@2: # undef BOOST_LIB_NAME williamr@2: #endif williamr@2: // Don't undef this one: it can be set by the user and should be the williamr@2: // same for all libraries: williamr@2: //#if defined(BOOST_LIB_TOOLSET) williamr@2: //# undef BOOST_LIB_TOOLSET williamr@2: //#endif williamr@2: #if defined(BOOST_LIB_THREAD_OPT) williamr@2: # undef BOOST_LIB_THREAD_OPT williamr@2: #endif williamr@2: #if defined(BOOST_LIB_RT_OPT) williamr@2: # undef BOOST_LIB_RT_OPT williamr@2: #endif williamr@2: #if defined(BOOST_LIB_LINK_OPT) williamr@2: # undef BOOST_LIB_LINK_OPT williamr@2: #endif williamr@2: #if defined(BOOST_LIB_DEBUG_OPT) williamr@2: # undef BOOST_LIB_DEBUG_OPT williamr@2: #endif williamr@2: #if defined(BOOST_DYN_LINK) williamr@2: # undef BOOST_DYN_LINK williamr@2: #endif williamr@2: #if defined(BOOST_AUTO_LINK_NOMANGLE) williamr@2: # undef BOOST_AUTO_LINK_NOMANGLE williamr@2: #endif williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: