1 /* $OpenLDAP: pkg/ldap/include/ldap_cdefs.h,v 1.29.2.4 2008/02/11 23:26:40 kurt Exp $ */ 2 /* This work is part of OpenLDAP Software <http://www.openldap.org/>. 3 * 4 * Copyright 1998-2008 The OpenLDAP Foundation. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted only as authorized by the OpenLDAP 9 * Public License. 10 * 11 * A copy of this license is available in file LICENSE in the 12 * top-level directory of the distribution or, alternatively, at 13 * <http://www.OpenLDAP.org/license.html>. 14 */ 15 /* LDAP C Defines */ 16 17 #ifndef _LDAP_CDEFS_H 18 #define _LDAP_CDEFS_H 19 20 #if defined(__cplusplus) || defined(c_plusplus) 21 # define LDAP_BEGIN_DECL extern "C" { 22 # define LDAP_END_DECL } 23 #else 24 # define LDAP_BEGIN_DECL /* begin declarations */ 25 # define LDAP_END_DECL /* end declarations */ 26 #endif 27 28 #if !defined(LDAP_NO_PROTOTYPES) && ( defined(LDAP_NEEDS_PROTOTYPES) || \ 29 defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus) ) 30 31 /* ANSI C or C++ */ 32 # define LDAP_P(protos) protos 33 # define LDAP_CONCAT1(x,y) x ## y 34 # define LDAP_CONCAT(x,y) LDAP_CONCAT1(x,y) 35 # define LDAP_STRING(x) #x /* stringify without expanding x */ 36 # define LDAP_XSTRING(x) LDAP_STRING(x) /* expand x, then stringify */ 37 38 #ifndef LDAP_CONST 39 # define LDAP_CONST const 40 #endif 41 42 #else /* no prototypes */ 43 44 /* traditional C */ 45 # define LDAP_P(protos) () 46 # define LDAP_CONCAT(x,y) x/**/y 47 # define LDAP_STRING(x) "x" 48 49 #ifndef LDAP_CONST 50 # define LDAP_CONST /* no const */ 51 #endif 52 53 #endif /* no prototypes */ 54 55 #if (__GNUC__) * 1000 + (__GNUC_MINOR__) >= 2006 56 # define LDAP_GCCATTR(attrs) __attribute__(attrs) 57 #else 58 # define LDAP_GCCATTR(attrs) 59 #endif 60 61 /* 62 * Support for Windows DLLs. 63 * 64 * When external source code includes header files for dynamic libraries, 65 * the external source code is "importing" DLL symbols into its resulting 66 * object code. On Windows, symbols imported from DLLs must be explicitly 67 * indicated in header files with the __declspec(dllimport) directive. 68 * This is not totally necessary for functions because the compiler 69 * (gcc or MSVC) will generate stubs when this directive is absent. 70 * However, this is required for imported variables. 71 * 72 * The LDAP libraries, i.e. liblber and libldap, can be built as 73 * static or shared, based on configuration. Just about all other source 74 * code in OpenLDAP use these libraries. If the LDAP libraries 75 * are configured as shared, 'configure' defines the LDAP_LIBS_DYNAMIC 76 * macro. When other source files include LDAP library headers, the 77 * LDAP library symbols will automatically be marked as imported. When 78 * the actual LDAP libraries are being built, the symbols will not 79 * be marked as imported because the LBER_LIBRARY or LDAP_LIBRARY macros 80 * will be respectively defined. 81 * 82 * Any project outside of OpenLDAP with source code wanting to use 83 * LDAP dynamic libraries should explicitly define LDAP_LIBS_DYNAMIC. 84 * This will ensure that external source code appropriately marks symbols 85 * that will be imported. 86 * 87 * The slapd executable, itself, can be used as a dynamic library. 88 * For example, if a backend module is compiled as shared, it will 89 * import symbols from slapd. When this happens, the slapd symbols 90 * must be marked as imported in header files that the backend module 91 * includes. Remember that slapd links with various static libraries. 92 * If the LDAP libraries were configured as static, their object 93 * code is also part of the monolithic slapd executable. Thus, when 94 * a backend module imports symbols from slapd, it imports symbols from 95 * all of the static libraries in slapd as well. Thus, the SLAP_IMPORT 96 * macro, when defined, will appropriately mark symbols as imported. 97 * This macro should be used by shared backend modules as well as any 98 * other external source code that imports symbols from the slapd 99 * executable as if it were a DLL. 100 * 101 * Note that we don't actually have to worry about using the 102 * __declspec(dllexport) directive anywhere. This is because both 103 * MSVC and Mingw provide alternate (more effective) methods for exporting 104 * symbols out of binaries, i.e. the use of a DEF file. 105 * 106 * NOTE ABOUT BACKENDS: Backends can be configured as static or dynamic. 107 * When a backend is configured as dynamic, slapd will load the backend 108 * explicitly and populate function pointer structures by calling 109 * the backend's well-known initialization function. Because of this 110 * procedure, slapd never implicitly imports symbols from dynamic backends. 111 * This makes it unnecessary to tag various backend functions with the 112 * __declspec(dllimport) directive. This is because neither slapd nor 113 * any other external binary should ever be implicitly loading a backend 114 * dynamic module. 115 * 116 * Backends are supposed to be self-contained. However, it appears that 117 * back-meta DOES implicitly import symbols from back-ldap. This means 118 * that the __declspec(dllimport) directive should be marked on back-ldap 119 * functions (in its header files) if and only if we're compiling for 120 * windows AND back-ldap has been configured as dynamic AND back-meta 121 * is the client of back-ldap. When client is slapd, there is no effect 122 * since slapd does not implicitly import symbols. 123 * 124 * TODO(?): Currently, back-meta nor back-ldap is supported for Mingw32. 125 * Thus, there's no need to worry about this right now. This is something that 126 * may or may not have to be addressed in the future. 127 */ 128 129 /* LBER library */ 130 #if defined(_WIN32) && \ 131 ((defined(LDAP_LIBS_DYNAMIC) && !defined(LBER_LIBRARY)) || \ 132 (!defined(LDAP_LIBS_DYNAMIC) && defined(SLAPD_IMPORT))) 133 # define LBER_F(type) extern __declspec(dllimport) type 134 # define LBER_V(type) extern __declspec(dllimport) type 135 #else 136 # define LBER_F(type) extern type 137 # define LBER_V(type) extern type 138 #endif 139 140 /* LDAP library */ 141 #if defined(_WIN32) && \ 142 ((defined(LDAP_LIBS_DYNAMIC) && !defined(LDAP_LIBRARY)) || \ 143 (!defined(LDAP_LIBS_DYNAMIC) && defined(SLAPD_IMPORT))) 144 # define LDAP_F(type) extern __declspec(dllimport) type 145 # define LDAP_V(type) extern __declspec(dllimport) type 146 #else 147 # define LDAP_F(type) extern type 148 # define LDAP_V(type) extern type 149 #endif 150 151 /* AVL library */ 152 #if defined(_WIN32) && defined(SLAPD_IMPORT) 153 # define LDAP_AVL_F(type) extern __declspec(dllimport) type 154 # define LDAP_AVL_V(type) extern __declspec(dllimport) type 155 #else 156 # define LDAP_AVL_F(type) extern type 157 # define LDAP_AVL_V(type) extern type 158 #endif 159 160 /* LDIF library */ 161 #if defined(_WIN32) && defined(SLAPD_IMPORT) 162 # define LDAP_LDIF_F(type) extern __declspec(dllimport) type 163 # define LDAP_LDIF_V(type) extern __declspec(dllimport) type 164 #else 165 # define LDAP_LDIF_F(type) extern type 166 # define LDAP_LDIF_V(type) extern type 167 #endif 168 169 /* LUNICODE library */ 170 #if defined(_WIN32) && defined(SLAPD_IMPORT) 171 # define LDAP_LUNICODE_F(type) extern __declspec(dllimport) type 172 # define LDAP_LUNICODE_V(type) extern __declspec(dllimport) type 173 #else 174 # define LDAP_LUNICODE_F(type) extern type 175 # define LDAP_LUNICODE_V(type) extern type 176 #endif 177 178 /* LUTIL library */ 179 #if defined(_WIN32) && defined(SLAPD_IMPORT) 180 # define LDAP_LUTIL_F(type) extern __declspec(dllimport) type 181 # define LDAP_LUTIL_V(type) extern __declspec(dllimport) type 182 #else 183 # define LDAP_LUTIL_F(type) extern type 184 # define LDAP_LUTIL_V(type) extern type 185 #endif 186 187 /* REWRITE library */ 188 #if defined(_WIN32) && defined(SLAPD_IMPORT) 189 # define LDAP_REWRITE_F(type) extern __declspec(dllimport) type 190 # define LDAP_REWRITE_V(type) extern __declspec(dllimport) type 191 #else 192 # define LDAP_REWRITE_F(type) extern type 193 # define LDAP_REWRITE_V(type) extern type 194 #endif 195 196 /* SLAPD (as a dynamic library exporting symbols) */ 197 #if defined(_WIN32) && defined(SLAPD_IMPORT) 198 # define LDAP_SLAPD_F(type) extern __declspec(dllimport) type 199 # define LDAP_SLAPD_V(type) extern __declspec(dllimport) type 200 #else 201 # define LDAP_SLAPD_F(type) extern type 202 # define LDAP_SLAPD_V(type) extern type 203 #endif 204 205 /* SLAPD (as a dynamic library exporting symbols) */ 206 #if defined(_WIN32) && defined(SLAPD_IMPORT) 207 # define LDAP_SLAPI_F(type) extern __declspec(dllimport) type 208 # define LDAP_SLAPI_V(type) extern __declspec(dllimport) type 209 #else 210 # define LDAP_SLAPI_F(type) extern type 211 # define LDAP_SLAPI_V(type) extern type 212 #endif 213 214 /* SLAPD (as a dynamic library exporting symbols) */ 215 #if defined(_WIN32) && defined(SLAPD_IMPORT) 216 # define SLAPI_F(type) extern __declspec(dllimport) type 217 # define SLAPI_V(type) extern __declspec(dllimport) type 218 #else 219 # define SLAPI_F(type) extern type 220 # define SLAPI_V(type) extern type 221 #endif 222 223 /* 224 * C library. Mingw32 links with the dynamic C run-time library by default, 225 * so the explicit definition of CSTATIC will keep dllimport from 226 * being defined, if desired. 227 * 228 * MSVC defines the _DLL macro when the compiler is invoked with /MD or /MDd, 229 * which means the resulting object code will be linked with the dynamic 230 * C run-time library. 231 * 232 * Technically, it shouldn't be necessary to redefine any functions that 233 * the headers for the C library should already contain. Nevertheless, this 234 * is here as a safe-guard. 235 * 236 * TODO: Determine if these macros ever get expanded for Windows. If not, 237 * the declspec expansion can probably be removed. 238 */ 239 #if (defined(__MINGW32__) && !defined(CSTATIC)) || \ 240 (defined(_MSC_VER) && defined(_DLL)) 241 # define LDAP_LIBC_F(type) extern __declspec(dllimport) type 242 # define LDAP_LIBC_V(type) extern __declspec(dllimport) type 243 #else 244 # define LDAP_LIBC_F(type) extern type 245 # define LDAP_LIBC_V(type) extern type 246 #endif 247 248 #endif /* _LDAP_CDEFS_H */ 249