From: Alexander Larsson Date: Mon, 30 Jan 2012 15:57:54 +0000 (+0100) Subject: Move constructor macros to an internal header and into generated code X-Git-Tag: 2.31.14~15 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=968f4e8d79b3191266bf327f18b167445db0076e;p=platform%2Fupstream%2Fglib.git Move constructor macros to an internal header and into generated code With this we're not longer exporting the constructor headers, which means we're not tying ourselves to a macro that might need special tweaking on a compiler-by-compiler basis. --- diff --git a/gio/Makefile.am b/gio/Makefile.am index 9ad8434..cf2b7dd 100644 --- a/gio/Makefile.am +++ b/gio/Makefile.am @@ -8,6 +8,11 @@ if OS_UNIX SUBDIRS += xdgmime endif +noinst_PROGRAMS = data-to-c + +data_to_c_SOURCES = data-to-c.c +data_to_c_LDADD = $(top_builddir)/glib/libglib-2.0.la + if OS_WIN32_AND_DLL_COMPILATION if MS_LIB_AVAILABLE noinst_DATA = gio-2.0.lib @@ -601,6 +606,7 @@ gioinclude_HEADERS = \ # these sources (also mentioned above) are generated. BUILT_SOURCES = \ + gconstructor_as_data.h \ gioenumtypes.h \ gioenumtypes.c \ $(NULL) @@ -660,8 +666,12 @@ gio_querymodules_LDADD = \ libgio-2.0.la \ $(NULL) +gconstructor_as_data.h: $(top_srcdir)/glib/gconstructor.h data-to-c$(EXEEXT) + ./data-to-c $(top_srcdir)/glib/gconstructor.h gconstructor_code > gconstructor_as_data.h + glib_compile_schemas_LDADD = $(top_builddir)/glib/libglib-2.0.la glib_compile_schemas_SOURCES = \ + gconstructor_as_data.h \ gvdb/gvdb-format.h \ gvdb/gvdb-builder.h \ gvdb/gvdb-builder.c \ diff --git a/gio/data-to-c.c b/gio/data-to-c.c new file mode 100644 index 0000000..b20369f --- /dev/null +++ b/gio/data-to-c.c @@ -0,0 +1,44 @@ +/* + * Copyright © 2011 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the licence, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + + #include + +int +main (int argc, char **argv) +{ + char *content; + int i; + + if (argc != 3) + return 1; + + if (!g_file_get_contents (argv[1], &content, NULL, NULL)) + return 1; + + g_print ("const char %s[] = \"", argv[2]); + + for (i = 0; content[i] != 0; i++) { + g_print ("\\x%02x", (int)content[i]); + } + + g_print ("\";\n"); + return 0; +} diff --git a/gio/glib-compile-resources.c b/gio/glib-compile-resources.c index eaad38f..d4dc81e 100644 --- a/gio/glib-compile-resources.c +++ b/gio/glib-compile-resources.c @@ -45,6 +45,8 @@ #include #include "gvdb/gvdb-builder.h" +#include "gconstructor_as_data.h" + typedef struct { char *filename; @@ -765,6 +767,7 @@ main (int argc, char **argv) else { static_str = "static "; + fprintf (file, "%s", gconstructor_code); fprintf (file, "\n" "#ifdef G_HAS_CONSTRUCTORS\n" diff --git a/gio/tests/resources.c b/gio/tests/resources.c index 3da0e0a..f19e701 100644 --- a/gio/tests/resources.c +++ b/gio/tests/resources.c @@ -19,6 +19,7 @@ */ #include +#include "gconstructor.h" #include "test_resources2.h" static void diff --git a/glib/gconstructor.h b/glib/gconstructor.h new file mode 100644 index 0000000..c5cff19 --- /dev/null +++ b/glib/gconstructor.h @@ -0,0 +1,91 @@ +/* + If G_HAS_CONSTRUCTORS is true then the compiler support *both* constructors and + destructors, in a sane way, including e.g. on library unload. If not you're on + your own. + + Some compilers need #pragma to handle this, which does not work with macros, + so the way you need to use this is (for constructors): + + #ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA + #pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(my_constructor) + #endif + G_DEFINE_CONSTRUCTOR(my_constructor) + static void my_constructor(void) { + ... + } + +*/ + +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) + +#define G_HAS_CONSTRUCTORS 1 + +#define G_DEFINE_CONSTRUCTOR(_func) static void __attribute__((constructor)) _func (void); +#define G_DEFINE_DESTRUCTOR(_func) static void __attribute__((destructor)) _func (void); + +#elif defined (_MSC_VER) && (_MSC_VER >= 1500) +/* Visual studio 2008 and later has _Pragma */ + +#define G_HAS_CONSTRUCTORS 1 + +#define G_DEFINE_CONSTRUCTOR(_func) \ + static void _func(void); \ + static int _func ## _wrapper(void) { _func(); return 0; } \ + __pragma(section(".CRT$XCU",read)) \ + __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _wrapper; + +#define G_DEFINE_DESTRUCTOR(_func) \ + static void _func(void); \ + static int _func ## _constructor(void) { atexit (_func); return 0; } \ + __pragma(section(".CRT$XCU",read)) \ + __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _constructor; + +#elif defined (_MSC_VER) + +#define G_HAS_CONSTRUCTORS 1 + +/* Pre Visual studio 2008 must use #pragma section */ +#define G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1 +#define G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1 + +#define G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \ + section(".CRT$XCU",read) +#define G_DEFINE_CONSTRUCTOR(_func) \ + static void _func(void); \ + static int _func ## _wrapper(void) { _func(); return 0; } \ + __declspec(allocate(".CRT$XCU")) static int (*p)(void) = _func ## _wrapper; + +#define G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \ + section(".CRT$XCU",read) +#define G_DEFINE_DESTRUCTOR(_func) \ + static void _func(void); \ + static int _func ## _constructor(void) { atexit (_func); return 0; } \ + __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _constructor; + +#elif defined(__SUNPRO_C) + +/* This is not tested, but i believe it should work, based on: + * http://opensource.apple.com/source/OpenSSL098/OpenSSL098-35/src/fips/fips_premain.c + */ + +#define G_HAS_CONSTRUCTORS 1 + +#define G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1 +#define G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1 + +#define G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \ + init(_func) +#define G_DEFINE_CONSTRUCTOR(_func) \ + static void _func(void); + +#define G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \ + fini(_func) +#define G_DEFINE_DESTRUCTOR(_func) \ + static void _func(void); + +#else + +/* constructors not supported for this compiler */ + +#endif + diff --git a/glib/gmacros.h b/glib/gmacros.h index accd55a..2b340cb 100644 --- a/glib/gmacros.h +++ b/glib/gmacros.h @@ -318,97 +318,4 @@ #define GLIB_DEPRECATED_FOR(f) G_DEPRECATED_FOR(f) #endif -/* - If G_HAS_CONSTRUCTORS is true then the compiler support *both* constructors and - destructors, in a sane way, including e.g. on library unload. If not you're on - your own. - - Some compilers need #pragma to handle this, which does not work with macros, - so the way you need to use this is (for constructors): - - #ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA - #pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(my_constructor) - #endif - G_DEFINE_CONSTRUCTOR(my_constructor) - static void my_constructor(void) { - ... - } - -*/ - -#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) - -#define G_HAS_CONSTRUCTORS 1 - -#define G_DEFINE_CONSTRUCTOR(_func) static void __attribute__((constructor)) _func (void); -#define G_DEFINE_DESTRUCTOR(_func) static void __attribute__((destructor)) _func (void); - -#elif defined (_MSC_VER) && (_MSC_VER >= 1500) -/* Visual studio 2008 and later has _Pragma */ - -#define G_HAS_CONSTRUCTORS 1 - -#define G_DEFINE_CONSTRUCTOR(_func) \ - static void _func(void); \ - static int _func ## _wrapper(void) { _func(); return 0; } \ - __pragma(section(".CRT$XCU",read)) \ - __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _wrapper; - -#define G_DEFINE_DESTRUCTOR(_func) \ - static void _func(void); \ - static int _func ## _constructor(void) { atexit (_func); return 0; } \ - __pragma(section(".CRT$XCU",read)) \ - __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _constructor; - -#elif defined (_MSC_VER) - -#define G_HAS_CONSTRUCTORS 1 - -/* Pre Visual studio 2008 must use #pragma section */ -#define G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1 -#define G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1 - -#define G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \ - section(".CRT$XCU",read) -#define G_DEFINE_CONSTRUCTOR(_func) \ - static void _func(void); \ - static int _func ## _wrapper(void) { _func(); return 0; } \ - __declspec(allocate(".CRT$XCU")) static int (*p)(void) = _func ## _wrapper; - -#define G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \ - section(".CRT$XCU",read) -#define G_DEFINE_DESTRUCTOR(_func) \ - static void _func(void); \ - static int _func ## _constructor(void) { atexit (_func); return 0; } \ - __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _constructor; - -#elif defined(__SUNPRO_C) - -/* This is not tested, but i believe it should work, based on: - * http://opensource.apple.com/source/OpenSSL098/OpenSSL098-35/src/fips/fips_premain.c - */ - -#define G_HAS_CONSTRUCTORS 1 - -#define G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1 -#define G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1 - -#define G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \ - init(_func) -#define G_DEFINE_CONSTRUCTOR(_func) \ - static void _func(void); - -#define G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \ - fini(_func) -#define G_DEFINE_DESTRUCTOR(_func) \ - static void _func(void); - -#else - -/* constructors not supported for this compiler */ - -#endif - - - #endif /* __G_MACROS_H__ */