/* * msvc_ssl_autolib.h -- automatic link library selection * * Written by Juergen Perlinger (perlinger@ntp.org) for the NTP project. * The contents of 'html/copyright.html' apply. * -------------------------------------------------------------------- * * OpenSSL library names changed over time, at least once when v1.1.0 * emerged. For systems where the build system is inspected before * the build environment is created (autconf, CMake, SCONS,...) this * would be harmless, once it's known what libraries should be looked * for. With MSVC / MSBUILD that's much trickier. * * So instead of manipulating the build environment we use the build * tools themselves to create requests for linking the right library. * * Unless you compile OpenSSL on your own, using the precompiled * VC binaries from Shining Light Productions is probably easiest: * https://slproweb.com/products/Win32OpenSSL.html * * If 'OPENSSL_AUTOLINK_STRICT' is defined, then target bit width, * runtime model and debug/release info are incoded into the library * file name, according to this scheme: * * basename.lib * * so that e.g. libcrypto64MTd.lib is a 64bit binary, using a static * multithreaded runtime in debug version. See the code below how this * is handled. * -------------------------------------------------------------------- */ #pragma once #if !defined(_MSC_VER) # error use this header only with Micro$oft Visual C compilers! #elif defined(OPENSSL_NO_AUTOLINK) # pragma message("automatic OpenSSL library selection disabled") #elif defined(OPENSSL_AUTOLINK_STRICT) /* ---------------------------------------------------------------- */ /* selection dance to get the right libraries linked */ /* ---------------------------------------------------------------- */ /* --*-- check if this a DEBUG or a RELEASE build --*-- * The '_DEBUG' macro is only set for DEBUG build variants */ # ifdef _DEBUG # define LTAG_DEBUG "d" # else # define LTAG_DEBUG "" # endif /* --*-- check platform (32 bit vs. 64 bit) --*-- * '_WIN64' is defined for X64 Platform only */ # ifdef _WIN64 # define LTAG_SIZE "64" # else # define LTAG_SIZE "32" # endif /* --*-- check VC runtime model --*-- * '_DLL' is set if a runtime-in-a-dll code generation model is chosen. * Note that we do not check for the single-threaded static runtime. * This would make no sense, since the Windows Build *uses* threads and * therefore needs a multithread runtime anyway. And Micro$oft decided * somewhere after VS2008 to drop that model anyway, so it's no longer * available on newer platforms. */ # ifdef _DLL # #define LTAG_RTLIB "MD" # else # define LTAG_RTLIB "MT" # endif /* --*-- place linker request in object file --*-- * Here we come to the reason for all that trouble: the library names * to link depend on the OpenSSL version... * * Before v1.1.0, the 'old' (ancient?) name 'libeay32' was used, * no matter what platform. (The corresponding 'ssleay32.lib' was/is * not used by NTP.) Since v1.1.0, the name stems are libcrypto * and libssl, and they contain the platform size (32 or 64). * * So we use '#pragma comment(lib,...)' to place a proper linker * request in the object file, depending on the SSL version and the * build variant. */ # if OPENSSL_VERSION_NUMBER >= 0x10100000L # pragma comment(lib, "libcrypto" LTAG_SIZE LTAG_RTLIB LTAG_DEBUG ".lib") # else # pragma comment(lib, "libeay32" LTAG_RTLIB LTAG_DEBUG ".lib") # endif # else # if OPENSSL_VERSION_NUMBER >= 0x10100000L # pragma comment(lib, "libcrypto.lib") # else # pragma comment(lib, "libeay32.lib") # endif #endif /*!defined(OPENSSL_NO_AUTOLINK)*/