aboutsummaryrefslogtreecommitdiff
path: root/ports/winnt/include/msvc_ssl_autolib.h
diff options
context:
space:
mode:
Diffstat (limited to 'ports/winnt/include/msvc_ssl_autolib.h')
-rw-r--r--ports/winnt/include/msvc_ssl_autolib.h94
1 files changed, 94 insertions, 0 deletions
diff --git a/ports/winnt/include/msvc_ssl_autolib.h b/ports/winnt/include/msvc_ssl_autolib.h
new file mode 100644
index 000000000000..688b5e262007
--- /dev/null
+++ b/ports/winnt/include/msvc_ssl_autolib.h
@@ -0,0 +1,94 @@
+/*
+ * 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.
+ *
+ * To use this feature, it is recommended to use the precompiled
+ * VC binaries from Shining Light Productions:
+ * https://slproweb.com/products/Win32OpenSSL.html
+ * These are installed in (OPENSSL_LIB)/vc.
+ *
+ * As an alternative, create the set of build variants of OpenSSL you
+ * need, implementing the following naming scheme:
+ *
+ * basename<width><RT><DebRel>.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")
+#else
+/* ---------------------------------------------------------------- */
+/* 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
+
+#endif /*!defined(OPENSSL_NO_AUTOLINK)*/