Browse Source

First draft of symbol visibility macros

For GCC 4+ these now produce a nice clean build when compiling the split
compiler source files.  Without these, the result is quite messy.

MSVC symbol visibility macros are based on feedback from David Demelier.
They seem to now allow a Windows DLL build (__declspec(dllimport) and
__declspec(dllexport)).
v1.0-maintenance
Sami Vaarala 10 years ago
parent
commit
293c4e10b8
  1. 92
      src/duk_features.h.in

92
src/duk_features.h.in

@ -1897,6 +1897,98 @@ typedef FILE duk_file;
#define DUK_UNLIKELY(x) (x)
#endif
/*
* Symbol visibility macros
*/
/* XXX: add support for at least clang */
/* XXX: user override for these? user override for just using the default visibility macros? */
#if defined(DUK_F_GCC_VERSION)
#if (DUK_F_GCC_VERSION >= 40000)
#define DUK_F_GCC_SYMBOL_VISIBILITY
#endif
#endif
#if defined(_WIN32) && (defined(_MSC_VER) || defined(__GNUC__))
/* MSVC, also MinGW on Windows. */
#define DUK_F_MSVC_SYMBOL_VISIBILITY
#endif
/* FIXME: separate macros for functions and data may be necessary. */
#if defined(DUK_F_GCC_SYMBOL_VISIBILITY)
/* GCC 4+ visibility */
#if defined(DUK_SINGLE_FILE)
#define DUK_EXTERNAL_DECL __attribute__ ((visibility("default"))) extern
#define DUK_EXTERNAL __attribute__ ((visibility("default")))
#define DUK_INTERNAL_DECL static
#define DUK_INTERNAL static
#define DUK_LOCAL_DECL static
#define DUK_LOCAL static
#else /* DUK_SINGLE_FILE */
#define DUK_EXTERNAL_DECL __attribute__ ((visibility("default"))) extern
#define DUK_EXTERNAL __attribute__ ((visibility("default")))
#define DUK_INTERNAL_DECL __attribute__ ((visibility("hidden"))) extern
#define DUK_INTERNAL __attribute__ ((visibility("hidden")))
#define DUK_LOCAL_DECL static
#define DUK_LOCAL static
#endif
#elif defined(DUK_F_MSVC_SYMBOL_VISIBILITY)
/* MSVC dllexport/dllimport: appropriate __declspec depends on whether we're
* compiling Duktape or the application.
*/
#if defined(DUK_SINGLE_FILE)
#if defined(DUK_COMPILING_DUKTAPE)
#define DUK_EXTERNAL_DECL extern __declspec(dllexport)
#define DUK_EXTERNAL __declspec(dllexport)
#define DUK_INTERNAL_DECL static
#define DUK_INTERNAL static
#define DUK_LOCAL_DECL static
#define DUK_LOCAL static
#else
#define DUK_EXTERNAL_DECL extern __declspec(dllimport)
#define DUK_EXTERNAL should_not_happen
#define DUK_INTERNAL_DECL static
#define DUK_INTERNAL static
#define DUK_LOCAL_DECL static
#define DUK_LOCAL static
#endif /* DUK_COMPILING_DUKTAPE */
#else /* DUK_SINGLE_FILE */
#if defined(DUK_COMPILING_DUKTAPE)
#define DUK_EXTERNAL_DECL extern __declspec(dllexport)
#define DUK_EXTERNAL __declspec(dllexport)
#define DUK_INTERNAL_DECL extern
#define DUK_INTERNAL /*empty*/
#define DUK_LOCAL_DECL static
#define DUK_LOCAL static
#else
#define DUK_EXTERNAL_DECL extern __declspec(dllexport)
#define DUK_EXTERNAL should_not_happen
#define DUK_INTERNAL_DECL extern
#define DUK_INTERNAL /*empty*/
#define DUK_LOCAL_DECL static
#define DUK_LOCAL static
#endif /* DUK_COMPILING_DUKTAPE */
#endif /* DUK_SINGLE_FILE */
#else
/* Default visibility */
#if defined(DUK_SINGLE_FILE)
#define DUK_EXTERNAL_DECL extern
#define DUK_EXTERNAL /*empty*/
#define DUK_INTERNAL_DECL static
#define DUK_INTERNAL static
#define DUK_LOCAL_DECL static
#define DUK_LOCAL static
#else /* DUK_SINGLE_FILE */
#define DUK_EXTERNAL_DECL extern
#define DUK_EXTERNAL /*empty*/
#define DUK_INTERNAL_DECL extern
#define DUK_INTERNAL /*empty*/
#define DUK_LOCAL_DECL static
#define DUK_LOCAL static
#endif
#endif
/*
* __FILE__, __LINE__, __func__ are wrapped. Especially __func__ is a
* problem because it is not available even in some compilers which try

Loading…
Cancel
Save