Crypto++  8.6
Free C++ class library of cryptographic schemes
config_dll.h
Go to the documentation of this file.
1 // config_dll.h - written and placed in public domain by Jeffrey Walton
2 // the bits that make up this source file are from the
3 // library's monolithic config.h.
4 
5 /// \file config_dll.h
6 /// \brief Library configuration file
7 /// \details <tt>config_dll.h</tt> provides defines for shared objects and
8 /// dynamic libraries. Generally speaking the macros are used to export
9 /// classes and template classes from the Win32 dynamic link library.
10 /// When not building the Win32 dynamic link library they are mostly an extern
11 /// template declaration.
12 /// \details In practice they are a furball coughed up by a cat and then peed
13 /// on by a dog. They are awful to get just right because of inconsistent
14 /// compiler support for extern templates, manual instantiation and the FIPS DLL.
15 /// \details <tt>config.h</tt> was split into components in May 2019 to better
16 /// integrate with Autoconf and its feature tests. The splitting occurred so
17 /// users could continue to include <tt>config.h</tt> while allowing Autoconf
18 /// to write new <tt>config_asm.h</tt> and new <tt>config_cxx.h</tt> using
19 /// its feature tests.
20 /// \note You should include <tt>config.h</tt> rather than <tt>config_dll.h</tt>
21 /// directly.
22 /// \sa <A HREF="https://github.com/weidai11/cryptopp/issues/835">Issue 835,
23 /// Make config.h more autoconf friendly</A>,
24 /// <A HREF="https://www.cryptopp.com/wiki/Configure.sh">Configure.sh script</A>,
25 /// <A HREF="https://www.cryptopp.com/wiki/Visual_Studio">Visual Studio</A>,
26 /// and <A HREF="https://www.cryptopp.com/wiki/FIPS_DLL">FIPS DLL</A>
27 /// on the Crypto++ wiki
28 /// \since Crypto++ 8.3
29 
30 #ifndef CRYPTOPP_CONFIG_DLL_H
31 #define CRYPTOPP_CONFIG_DLL_H
32 
33 #include "config_os.h"
34 
35 #if defined(CRYPTOPP_DOXYGEN_PROCESSING)
36 
37  /// \brief Win32 define for dynamic link libraries
38  /// \details CRYPTOPP_IMPORTS is set in the Visual Studio project files.
39  /// When the macro is set, <tt>CRYPTOPP_DLL</tt> is defined to
40  /// <tt>__declspec(dllimport)</tt>.
41  /// \details This macro has no effect on Unix &amp; Linux.
42  /// \sa <A HREF="https://www.cryptopp.com/wiki/Visual_Studio">Visual Studio</A>,
43  /// and <A HREF="https://www.cryptopp.com/wiki/FIPS_DLL">FIPS DLL</A>
44  /// on the Crypto++ wiki
45  #define CRYPTOPP_IMPORTS ...
46 
47  /// \brief Win32 define for dynamic link libraries
48  /// \details CRYPTOPP_EXPORTS is set in the Visual Studio project files.
49  /// When the macro is set, <tt>CRYPTOPP_DLL</tt> is defined to
50  /// <tt>__declspec(dllexport)</tt>.
51  /// \details This macro has no effect on Unix &amp; Linux.
52  /// \sa <A HREF="https://www.cryptopp.com/wiki/Visual_Studio">Visual Studio</A>,
53  /// and <A HREF="https://www.cryptopp.com/wiki/FIPS_DLL">FIPS DLL</A>
54  /// on the Crypto++ wiki
55  #define CRYPTOPP_EXPORTS ...
56 
57  /// \brief Win32 define for dynamic link libraries
58  /// \details CRYPTOPP_IS_DLL is set in the Visual Studio project files.
59  /// \sa <A HREF="https://www.cryptopp.com/wiki/Visual_Studio">Visual Studio</A>,
60  /// and <A HREF="https://www.cryptopp.com/wiki/FIPS_DLL">FIPS DLL</A>
61  /// on the Crypto++ wiki
62  #define CRYPTOPP_IS_DLL
63 
64  /// \brief Instantiate templates in a dynamic library
65  /// \details CRYPTOPP_DLL_TEMPLATE_CLASS decoration should be used
66  /// for classes intended to be exported from dynamic link libraries.
67  /// \details This macro is primarily used on Win32, but sees some
68  /// action on Unix &amp; Linux due to the source file <tt>dll.cpp</tt>.
69  /// \sa <A HREF="https://www.cryptopp.com/wiki/Visual_Studio">Visual Studio</A>,
70  /// and <A HREF="https://www.cryptopp.com/wiki/FIPS_DLL">FIPS DLL</A>
71  /// on the Crypto++ wiki
72  #define CRYPTOPP_DLL_TEMPLATE_CLASS ...
73 
74  /// \brief Instantiate templates in a dynamic library
75  /// \details CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS decoration should be used
76  /// for template classes intended to be exported from dynamic link libraries.
77  /// \details This macro is primarily used on Win32, but sees some
78  /// action on Unix &amp; Linux due to the source file <tt>dll.cpp</tt>.
79  /// \sa <A HREF="https://www.cryptopp.com/wiki/Visual_Studio">Visual Studio</A>,
80  /// and <A HREF="https://www.cryptopp.com/wiki/FIPS_DLL">FIPS DLL</A>
81  /// on the Crypto++ wiki
82  #define CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS ...
83 
84  /// \brief Instantiate templates in a dynamic library
85  /// \details CRYPTOPP_STATIC_TEMPLATE_CLASS decoration should be used
86  /// for template classes intended to be exported from dynamic link libraries.
87  /// \details This macro is primarily used on Win32, but sees some
88  /// action on Unix &amp; Linux due to the source file <tt>dll.cpp</tt>.
89  /// \sa <A HREF="https://www.cryptopp.com/wiki/Visual_Studio">Visual Studio</A>,
90  /// and <A HREF="https://www.cryptopp.com/wiki/FIPS_DLL">FIPS DLL</A>
91  /// on the Crypto++ wiki
92  #define CRYPTOPP_STATIC_TEMPLATE_CLASS ...
93 
94  /// \brief Instantiate templates in a dynamic library
95  /// \details CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS decoration should be used
96  /// for template classes intended to be exported from dynamic link libraries.
97  /// \details This macro is primarily used on Win32, but sees some
98  /// action on Unix &amp; Linux due to the source file <tt>dll.cpp</tt>.
99  /// \sa <A HREF="https://www.cryptopp.com/wiki/Visual_Studio">Visual Studio</A>,
100  /// and <A HREF="https://www.cryptopp.com/wiki/FIPS_DLL">FIPS DLL</A>
101  /// on the Crypto++ wiki
102  #define CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS ...
103 
104  /// \brief Override for internal linkage
105  /// \details CRYPTOPP_TABLE can be used to override internal linkage
106  /// on tables with the <tt>const</tt> qualifier. According to C++ rules
107  /// a decalration with <tt>const</tt> qualifier is internal linkage.
108  /// \note The name CRYPTOPP_TABLE was chosen because it is often used to
109  /// export a table, like AES or SHA constants. The name avoids collisions
110  /// with the DLL gear macros, like CRYPTOPP_EXPORTS and CRYPTOPP_EXTERN.
111  #define CRYPTOPP_TABLE extern
112 
113  /// \brief Win32 calling convention
114  /// \details CRYPTOPP_API sets the calling convention on Win32.
115  /// On Win32 CRYPTOPP_API is <tt>__cedcl</tt>. On Unix &amp; Linux
116  /// CRYPTOPP_API is defined to nothing.
117  /// \sa <A HREF="https://www.cryptopp.com/wiki/Visual_Studio">Visual Studio</A>
118  /// on the Crypto++ wiki
119  #define CRYPTOPP_API ...
120 
121 #else // CRYPTOPP_DOXYGEN_PROCESSING
122 
123 #if defined(CRYPTOPP_WIN32_AVAILABLE)
124 
125  #if defined(CRYPTOPP_EXPORTS)
126  # define CRYPTOPP_IS_DLL
127  # define CRYPTOPP_DLL __declspec(dllexport)
128  #elif defined(CRYPTOPP_IMPORTS)
129  # define CRYPTOPP_IS_DLL
130  # define CRYPTOPP_DLL __declspec(dllimport)
131  #else
132  # define CRYPTOPP_DLL
133  #endif
134 
135  // C++ makes const internal linkage
136  #define CRYPTOPP_TABLE extern
137  #define CRYPTOPP_API __cdecl
138 
139 #else // not CRYPTOPP_WIN32_AVAILABLE
140 
141  // C++ makes const internal linkage
142  #define CRYPTOPP_TABLE extern
143  #define CRYPTOPP_DLL
144  #define CRYPTOPP_API
145 
146 #endif // CRYPTOPP_WIN32_AVAILABLE
147 
148 #if defined(__MWERKS__)
149 # define CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS extern class CRYPTOPP_DLL
150 #elif defined(__BORLANDC__) || defined(__SUNPRO_CC)
151 # define CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS template class CRYPTOPP_DLL
152 #else
153 # define CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS extern template class CRYPTOPP_DLL
154 #endif
155 
156 #if defined(CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES) && !defined(CRYPTOPP_IMPORTS)
157 # define CRYPTOPP_DLL_TEMPLATE_CLASS template class CRYPTOPP_DLL
158 #else
159 # define CRYPTOPP_DLL_TEMPLATE_CLASS CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS
160 #endif
161 
162 #if defined(__MWERKS__)
163 # define CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS extern class
164 #elif defined(__BORLANDC__) || defined(__SUNPRO_CC)
165 # define CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS template class
166 #else
167 # define CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS extern template class
168 #endif
169 
170 #if defined(CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES) && !defined(CRYPTOPP_EXPORTS)
171 # define CRYPTOPP_STATIC_TEMPLATE_CLASS template class
172 #else
173 # define CRYPTOPP_STATIC_TEMPLATE_CLASS CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS
174 #endif
175 
176 #endif // CRYPTOPP_DOXYGEN_PROCESSING
177 
178 #endif // CRYPTOPP_CONFIG_DLL_H
config_os.h
Library configuration file.