summaryrefslogtreecommitdiff
path: root/woe32dll
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2009-04-19 22:28:35 +0200
committerBruno Haible <bruno@clisp.org>2009-04-19 22:28:35 +0200
commitac7526fb13c91cef4fe569ddf7e6ee189fa74180 (patch)
treeffdb6d2a181bc079f97286f598507de20419f5cb /woe32dll
parent9c3f20cc1cae69edbb237cb07dbc9e3a8cf93528 (diff)
downloadlibunistring-ac7526fb13c91cef4fe569ddf7e6ee189fa74180.tar.gz
Support for building as shared library on Cygwin and mingw.
Diffstat (limited to 'woe32dll')
-rw-r--r--woe32dll/export.h106
-rw-r--r--woe32dll/unistring-exports.c141
2 files changed, 247 insertions, 0 deletions
diff --git a/woe32dll/export.h b/woe32dll/export.h
new file mode 100644
index 0000000..3e8a21f
--- /dev/null
+++ b/woe32dll/export.h
@@ -0,0 +1,106 @@
+/* Exporting symbols from Cygwin shared libraries.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* There are four ways to build shared libraries on Cygwin:
+
+ - Export only functions, no variables.
+ This has the drawback of severely affecting the programming style in use.
+ It does not let the programmer use full ANSI C. It lets one platform
+ dictate the code style on all platforms. This is unacceptable.
+
+ - Use the GNU ld --enable-auto-import option. It is the default on Cygwin
+ since July 2005. But it has three fatal drawbacks:
+ - It produces executables and shared libraries with relocations in the
+ .text segment, defeating the principles of virtual memory.
+ - For some constructs such as
+ extern int var;
+ int * const b = &var;
+ it creates an executable that will give an error at runtime, rather
+ than either a compile-time or link-time error or a working executable.
+ (This is with both gcc and g++.) Whereas this code, not relying on
+ auto-import:
+ extern __declspec (dllimport) int var;
+ int * const b = &var;
+ gives a compile-time error with gcc and works with g++.
+ - It doesn't work in some cases (references to a member field of an
+ exported struct variable, or to a particular element of an exported
+ array variable), requiring code modifications. Again one platform
+ dictates code modifications on all platforms.
+
+ This is unacceptable. Therefore we disable this option, through the
+ woe32-dll.m4 autoconf macro.
+
+ - Define a macro that expands to __declspec(dllexport) when building
+ the library and to __declspec(dllimport) when building code outside
+ the library, and use it in all header files of the library.
+ This is acceptable if
+ 1. the header files are unique to this library (not shared with
+ other packages), and
+ 2. the library sources are contained in one directory, making it easy
+ to define a -DBUILDING_LIBXYZ flag for the library.
+ Example:
+ #ifdef BUILDING_LIBASPRINTF
+ #define LIBASPRINTF_DLL_EXPORTED __declspec(dllexport)
+ #else
+ #define LIBASPRINTF_DLL_EXPORTED __declspec(dllimport)
+ #endif
+
+ We use this technique for the libintl and the libasprintf libraries.
+
+ - Define a macro that expands to __declspec(dllimport) always, and use
+ it in all header files of the library. Use an explicit export list for
+ the library.
+ This is acceptable if
+ 1. the programming language is not C++ (because the name mangling of
+ static struct/class fields and of variables in namespaces makes it
+ hard to maintain an export list).
+ The benefit of this approach is that the partitioning of the source files
+ into libraries (which source file goes into which library) does not
+ affect the source code; only the Makefiles reflect it.
+ The performance loss due to the unnecessary indirection for references
+ to variables from within the library defining the variable is acceptable.
+
+ We use this technique for libgettextlib (because it contains many gnulib
+ modules) and for libgettextsrc (because this makes it easy to move source
+ code from an msg* program to libgettextsrc). The macro is called
+ DLL_VARIABLE.
+
+ This file allows building an explicit export list. You can either
+ - specify the variables to be exported, and use the GNU ld option
+ --export-all-symbols to export all function names, or
+ - specify the variables and functions to be exported explicitly.
+
+ Note: --export-all-symbols is the default when no other symbol is explicitly
+ exported. This means, the use of an explicit export on the variables has
+ the effect of no longer exporting the functions! - until the option
+ --export-all-symbols is used. */
+
+ /* IMP(x) is a symbol that contains the address of x. */
+#define IMP(x) _imp__##x
+
+ /* Ensure that the variable x is exported from the library, and that a
+ pseudo-variable IMP(x) is available. */
+#define VARIABLE(x) \
+ /* Export x without redefining x. This code was found by compiling a \
+ snippet: \
+ extern __declspec(dllexport) int x; int x = 42; */ \
+ asm (".section .drectve\n"); \
+ asm (".ascii \" -export:" #x ",data\"\n"); \
+ asm (".data\n"); \
+ /* Allocate a pseudo-variable IMP(x). */ \
+ extern int x; \
+ void * IMP(x) = &x;
diff --git a/woe32dll/unistring-exports.c b/woe32dll/unistring-exports.c
new file mode 100644
index 0000000..d10bd7e
--- /dev/null
+++ b/woe32dll/unistring-exports.c
@@ -0,0 +1,141 @@
+/* List of exported symbols of libunistring on Cygwin.
+ Copyright (C) 2006, 2009 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "woe32dll/export.h"
+
+/* Variables declared in unictype.h */
+VARIABLE(UC_CATEGORY_C)
+VARIABLE(UC_CATEGORY_Cc)
+VARIABLE(UC_CATEGORY_Cf)
+VARIABLE(UC_CATEGORY_Cn)
+VARIABLE(UC_CATEGORY_Co)
+VARIABLE(UC_CATEGORY_Cs)
+VARIABLE(UC_CATEGORY_L)
+VARIABLE(UC_CATEGORY_Ll)
+VARIABLE(UC_CATEGORY_Lm)
+VARIABLE(UC_CATEGORY_Lo)
+VARIABLE(UC_CATEGORY_Lt)
+VARIABLE(UC_CATEGORY_Lu)
+VARIABLE(UC_CATEGORY_M)
+VARIABLE(UC_CATEGORY_Mc)
+VARIABLE(UC_CATEGORY_Me)
+VARIABLE(UC_CATEGORY_Mn)
+VARIABLE(UC_CATEGORY_N)
+VARIABLE(UC_CATEGORY_Nd)
+VARIABLE(UC_CATEGORY_Nl)
+VARIABLE(UC_CATEGORY_No)
+VARIABLE(UC_CATEGORY_P)
+VARIABLE(UC_CATEGORY_Pc)
+VARIABLE(UC_CATEGORY_Pd)
+VARIABLE(UC_CATEGORY_Pe)
+VARIABLE(UC_CATEGORY_Pf)
+VARIABLE(UC_CATEGORY_Pi)
+VARIABLE(UC_CATEGORY_Po)
+VARIABLE(UC_CATEGORY_Ps)
+VARIABLE(UC_CATEGORY_S)
+VARIABLE(UC_CATEGORY_Sc)
+VARIABLE(UC_CATEGORY_Sk)
+VARIABLE(UC_CATEGORY_Sm)
+VARIABLE(UC_CATEGORY_So)
+VARIABLE(UC_CATEGORY_Z)
+VARIABLE(UC_CATEGORY_Zl)
+VARIABLE(UC_CATEGORY_Zp)
+VARIABLE(UC_CATEGORY_Zs)
+VARIABLE(UC_PROPERTY_ALPHABETIC)
+VARIABLE(UC_PROPERTY_ASCII_HEX_DIGIT)
+VARIABLE(UC_PROPERTY_BIDI_ARABIC_DIGIT)
+VARIABLE(UC_PROPERTY_BIDI_ARABIC_RIGHT_TO_LEFT)
+VARIABLE(UC_PROPERTY_BIDI_BLOCK_SEPARATOR)
+VARIABLE(UC_PROPERTY_BIDI_BOUNDARY_NEUTRAL)
+VARIABLE(UC_PROPERTY_BIDI_COMMON_SEPARATOR)
+VARIABLE(UC_PROPERTY_BIDI_CONTROL)
+VARIABLE(UC_PROPERTY_BIDI_EMBEDDING_OR_OVERRIDE)
+VARIABLE(UC_PROPERTY_BIDI_EUROPEAN_DIGIT)
+VARIABLE(UC_PROPERTY_BIDI_EUR_NUM_SEPARATOR)
+VARIABLE(UC_PROPERTY_BIDI_EUR_NUM_TERMINATOR)
+VARIABLE(UC_PROPERTY_BIDI_HEBREW_RIGHT_TO_LEFT)
+VARIABLE(UC_PROPERTY_BIDI_LEFT_TO_RIGHT)
+VARIABLE(UC_PROPERTY_BIDI_NON_SPACING_MARK)
+VARIABLE(UC_PROPERTY_BIDI_OTHER_NEUTRAL)
+VARIABLE(UC_PROPERTY_BIDI_PDF)
+VARIABLE(UC_PROPERTY_BIDI_SEGMENT_SEPARATOR)
+VARIABLE(UC_PROPERTY_BIDI_WHITESPACE)
+VARIABLE(UC_PROPERTY_COMBINING)
+VARIABLE(UC_PROPERTY_COMPOSITE)
+VARIABLE(UC_PROPERTY_CURRENCY_SYMBOL)
+VARIABLE(UC_PROPERTY_DASH)
+VARIABLE(UC_PROPERTY_DECIMAL_DIGIT)
+VARIABLE(UC_PROPERTY_DEFAULT_IGNORABLE_CODE_POINT)
+VARIABLE(UC_PROPERTY_DEPRECATED)
+VARIABLE(UC_PROPERTY_DIACRITIC)
+VARIABLE(UC_PROPERTY_EXTENDER)
+VARIABLE(UC_PROPERTY_FORMAT_CONTROL)
+VARIABLE(UC_PROPERTY_GRAPHEME_BASE)
+VARIABLE(UC_PROPERTY_GRAPHEME_EXTEND)
+VARIABLE(UC_PROPERTY_GRAPHEME_LINK)
+VARIABLE(UC_PROPERTY_HEX_DIGIT)
+VARIABLE(UC_PROPERTY_HYPHEN)
+VARIABLE(UC_PROPERTY_IDEOGRAPHIC)
+VARIABLE(UC_PROPERTY_IDS_BINARY_OPERATOR)
+VARIABLE(UC_PROPERTY_IDS_TRINARY_OPERATOR)
+VARIABLE(UC_PROPERTY_ID_CONTINUE)
+VARIABLE(UC_PROPERTY_ID_START)
+VARIABLE(UC_PROPERTY_IGNORABLE_CONTROL)
+VARIABLE(UC_PROPERTY_ISO_CONTROL)
+VARIABLE(UC_PROPERTY_JOIN_CONTROL)
+VARIABLE(UC_PROPERTY_LEFT_OF_PAIR)
+VARIABLE(UC_PROPERTY_LINE_SEPARATOR)
+VARIABLE(UC_PROPERTY_LOGICAL_ORDER_EXCEPTION)
+VARIABLE(UC_PROPERTY_LOWERCASE)
+VARIABLE(UC_PROPERTY_MATH)
+VARIABLE(UC_PROPERTY_NON_BREAK)
+VARIABLE(UC_PROPERTY_NOT_A_CHARACTER)
+VARIABLE(UC_PROPERTY_NUMERIC)
+VARIABLE(UC_PROPERTY_OTHER_ALPHABETIC)
+VARIABLE(UC_PROPERTY_OTHER_DEFAULT_IGNORABLE_CODE_POINT)
+VARIABLE(UC_PROPERTY_OTHER_GRAPHEME_EXTEND)
+VARIABLE(UC_PROPERTY_OTHER_ID_CONTINUE)
+VARIABLE(UC_PROPERTY_OTHER_ID_START)
+VARIABLE(UC_PROPERTY_OTHER_LOWERCASE)
+VARIABLE(UC_PROPERTY_OTHER_MATH)
+VARIABLE(UC_PROPERTY_OTHER_UPPERCASE)
+VARIABLE(UC_PROPERTY_PAIRED_PUNCTUATION)
+VARIABLE(UC_PROPERTY_PARAGRAPH_SEPARATOR)
+VARIABLE(UC_PROPERTY_PATTERN_SYNTAX)
+VARIABLE(UC_PROPERTY_PATTERN_WHITE_SPACE)
+VARIABLE(UC_PROPERTY_PRIVATE_USE)
+VARIABLE(UC_PROPERTY_PUNCTUATION)
+VARIABLE(UC_PROPERTY_QUOTATION_MARK)
+VARIABLE(UC_PROPERTY_RADICAL)
+VARIABLE(UC_PROPERTY_SENTENCE_TERMINAL)
+VARIABLE(UC_PROPERTY_SOFT_DOTTED)
+VARIABLE(UC_PROPERTY_SPACE)
+VARIABLE(UC_PROPERTY_TERMINAL_PUNCTUATION)
+VARIABLE(UC_PROPERTY_TITLECASE)
+VARIABLE(UC_PROPERTY_UNASSIGNED_CODE_VALUE)
+VARIABLE(UC_PROPERTY_UNIFIED_IDEOGRAPH)
+VARIABLE(UC_PROPERTY_UPPERCASE)
+VARIABLE(UC_PROPERTY_VARIATION_SELECTOR)
+VARIABLE(UC_PROPERTY_WHITE_SPACE)
+VARIABLE(UC_PROPERTY_XID_CONTINUE)
+VARIABLE(UC_PROPERTY_XID_START)
+VARIABLE(UC_PROPERTY_ZERO_WIDTH)
+/* Variables declared in uninorm.h */
+VARIABLE(uninorm_nfc)
+VARIABLE(uninorm_nfd)
+VARIABLE(uninorm_nfkc)
+VARIABLE(uninorm_nfkd)