summaryrefslogtreecommitdiff
path: root/config_dll.h
blob: 8a06397fc427c10a09df3c1ecb263970488cf909 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
// config_dll.h - written and placed in public domain by Jeffrey Walton
//                the bits that make up this source file are from the
//                library's monolithic config.h.

/// \file config_dll.h
/// \brief Library configuration file
/// \details <tt>config_dll.h</tt> provides defines for shared objects and
///  dynamic libraries. Generally speaking the macros are used to export
///  classes and template classes from the Win32 dynamic link library.
///  When not building the Win32 dynamic link library they are mostly an extern
///  template declaration.
/// \details In practice they are a furball coughed up by a cat and then peed
///  on by a dog. They are awful to get just right because of inconsistent
///  compiler support for extern templates, manual instantiation and the FIPS DLL.
/// \details <tt>config.h</tt> was split into components in May 2019 to better
///  integrate with Autoconf and its feature tests. The splitting occurred so
///  users could continue to include <tt>config.h</tt> while allowing Autoconf
///  to write new <tt>config_asm.h</tt> and new <tt>config_cxx.h</tt> using
///  its feature tests.
/// \note You should include <tt>config.h</tt> rather than <tt>config_dll.h</tt>
///  directly.
/// \sa <A HREF="https://github.com/weidai11/cryptopp/issues/835">Issue 835,
///  Make config.h more autoconf friendly</A>,
///  <A HREF="https://www.cryptopp.com/wiki/Configure.sh">Configure.sh script</A>,
///  <A HREF="https://www.cryptopp.com/wiki/Visual_Studio">Visual Studio</A>,
///  and <A HREF="https://www.cryptopp.com/wiki/FIPS_DLL">FIPS DLL</A>
///  on the Crypto++ wiki
/// \since Crypto++ 8.3

#ifndef CRYPTOPP_CONFIG_DLL_H
#define CRYPTOPP_CONFIG_DLL_H

#include "config_os.h"

#if defined(CRYPTOPP_DOXYGEN_PROCESSING)

	/// \brief Win32 define for dynamic link libraries
	/// \details CRYPTOPP_IMPORTS is set in the Visual Studio project files.
	///  When the macro is set, <tt>CRYPTOPP_DLL</tt> is defined to
	///  <tt>__declspec(dllimport)</tt>.
	/// \details This macro has no effect on Unix &amp; Linux.
	/// \sa <A HREF="https://www.cryptopp.com/wiki/Visual_Studio">Visual Studio</A>,
	///  and <A HREF="https://www.cryptopp.com/wiki/FIPS_DLL">FIPS DLL</A>
	///  on the Crypto++ wiki
	#define CRYPTOPP_IMPORTS ...

	/// \brief Win32 define for dynamic link libraries
	/// \details CRYPTOPP_EXPORTS is set in the Visual Studio project files.
	///  When the macro is set, <tt>CRYPTOPP_DLL</tt> is defined to
	///  <tt>__declspec(dllexport)</tt>.
	/// \details This macro has no effect on Unix &amp; Linux.
	/// \sa <A HREF="https://www.cryptopp.com/wiki/Visual_Studio">Visual Studio</A>,
	///  and <A HREF="https://www.cryptopp.com/wiki/FIPS_DLL">FIPS DLL</A>
	///  on the Crypto++ wiki
	#define CRYPTOPP_EXPORTS ...

	/// \brief Win32 define for dynamic link libraries
	/// \details CRYPTOPP_IS_DLL is set in the Visual Studio project files.
	/// \sa <A HREF="https://www.cryptopp.com/wiki/Visual_Studio">Visual Studio</A>,
	///  and <A HREF="https://www.cryptopp.com/wiki/FIPS_DLL">FIPS DLL</A>
	///  on the Crypto++ wiki
	#define CRYPTOPP_IS_DLL

	/// \brief Instantiate templates in a dynamic library
	/// \details CRYPTOPP_DLL_TEMPLATE_CLASS decoration should be used
	///  for classes intended to be exported from dynamic link libraries.
	/// \details This macro is primarily used on Win32, but sees some
	///  action on Unix &amp; Linux due to the source file <tt>dll.cpp</tt>.
	/// \sa <A HREF="https://www.cryptopp.com/wiki/Visual_Studio">Visual Studio</A>,
	///  and <A HREF="https://www.cryptopp.com/wiki/FIPS_DLL">FIPS DLL</A>
	///  on the Crypto++ wiki
	#define CRYPTOPP_DLL_TEMPLATE_CLASS ...

	/// \brief Instantiate templates in a dynamic library
	/// \details CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS decoration should be used
	///  for template classes intended to be exported from dynamic link libraries.
	/// \details This macro is primarily used on Win32, but sees some
	///  action on Unix &amp; Linux due to the source file <tt>dll.cpp</tt>.
	/// \sa <A HREF="https://www.cryptopp.com/wiki/Visual_Studio">Visual Studio</A>,
	///  and <A HREF="https://www.cryptopp.com/wiki/FIPS_DLL">FIPS DLL</A>
	///  on the Crypto++ wiki
	#define CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS ...

	/// \brief Instantiate templates in a dynamic library
	/// \details CRYPTOPP_STATIC_TEMPLATE_CLASS decoration should be used
	///  for template classes intended to be exported from dynamic link libraries.
	/// \details This macro is primarily used on Win32, but sees some
	///  action on Unix &amp; Linux due to the source file <tt>dll.cpp</tt>.
	/// \sa <A HREF="https://www.cryptopp.com/wiki/Visual_Studio">Visual Studio</A>,
	///  and <A HREF="https://www.cryptopp.com/wiki/FIPS_DLL">FIPS DLL</A>
	///  on the Crypto++ wiki
	#define CRYPTOPP_STATIC_TEMPLATE_CLASS ...

	/// \brief Instantiate templates in a dynamic library
	/// \details CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS decoration should be used
	///  for template classes intended to be exported from dynamic link libraries.
	/// \details This macro is primarily used on Win32, but sees some
	///  action on Unix &amp; Linux due to the source file <tt>dll.cpp</tt>.
	/// \sa <A HREF="https://www.cryptopp.com/wiki/Visual_Studio">Visual Studio</A>,
	///  and <A HREF="https://www.cryptopp.com/wiki/FIPS_DLL">FIPS DLL</A>
	///  on the Crypto++ wiki
	#define CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS ...

	/// \brief Override for internal linkage
	/// \details CRYPTOPP_TABLE can be used to override internal linkage
	///  on tables with the <tt>const</tt> qualifier. According to C++ rules
	///  a declaration with <tt>const</tt> qualifier is internal linkage.
	/// \note The name CRYPTOPP_TABLE was chosen because it is often used to
	///  export a table, like AES or SHA constants. The name avoids collisions
	///  with the DLL gear macros, like CRYPTOPP_EXPORTS and CRYPTOPP_EXTERN.
	#define CRYPTOPP_TABLE extern

	/// \brief Win32 calling convention
	/// \details CRYPTOPP_API sets the calling convention on Win32.
	///  On Win32 CRYPTOPP_API is <tt>__cedcl</tt>. On Unix &amp; Linux
	///  CRYPTOPP_API is defined to nothing.
	/// \sa <A HREF="https://www.cryptopp.com/wiki/Visual_Studio">Visual Studio</A>
	///  on the Crypto++ wiki
	#define CRYPTOPP_API ...

#else  // CRYPTOPP_DOXYGEN_PROCESSING

#if defined(CRYPTOPP_WIN32_AVAILABLE)

	#if defined(CRYPTOPP_EXPORTS)
	#  define CRYPTOPP_IS_DLL
	#  define CRYPTOPP_DLL __declspec(dllexport)
	#elif defined(CRYPTOPP_IMPORTS)
	#  define CRYPTOPP_IS_DLL
	#  define CRYPTOPP_DLL __declspec(dllimport)
	#else
	#  define CRYPTOPP_DLL
	#endif

	// C++ makes const internal linkage
	#define CRYPTOPP_TABLE extern
	#define CRYPTOPP_API __cdecl

#else	// not CRYPTOPP_WIN32_AVAILABLE

	// C++ makes const internal linkage
	#define CRYPTOPP_TABLE extern
	#define CRYPTOPP_DLL
	#define CRYPTOPP_API

#endif	// CRYPTOPP_WIN32_AVAILABLE

#if defined(__MWERKS__)
#  define CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS extern class CRYPTOPP_DLL
#elif defined(__BORLANDC__) || defined(__SUNPRO_CC)
#  define CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS template class CRYPTOPP_DLL
#else
#  define CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS extern template class CRYPTOPP_DLL
#endif

#if defined(CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES) && !defined(CRYPTOPP_IMPORTS)
#  define CRYPTOPP_DLL_TEMPLATE_CLASS template class CRYPTOPP_DLL
#else
#  define CRYPTOPP_DLL_TEMPLATE_CLASS CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS
#endif

#if defined(__MWERKS__)
#  define CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS extern class
#elif defined(__BORLANDC__) || defined(__SUNPRO_CC)
#  define CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS template class
#else
#  define CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS extern template class
#endif

#if defined(CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES) && !defined(CRYPTOPP_EXPORTS)
#  define CRYPTOPP_STATIC_TEMPLATE_CLASS template class
#else
#  define CRYPTOPP_STATIC_TEMPLATE_CLASS CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS
#endif

#endif  // CRYPTOPP_DOXYGEN_PROCESSING

#endif  // CRYPTOPP_CONFIG_DLL_H