Mercurial > emacs
comparison gc/Makefile.DLLs @ 51488:5de98dce4bd1
*** empty log message ***
author | Dave Love <fx@gnu.org> |
---|---|
date | Thu, 05 Jun 2003 17:49:22 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
51487:01d68b199093 | 51488:5de98dce4bd1 |
---|---|
1 #-----------------------------------------------------------------------------# | |
2 | |
3 # Makefile.DLLs, version 0.4. | |
4 | |
5 # Contributed by Fergus Henderson. | |
6 | |
7 # This Makefile contains rules for creating DLLs on Windows using gnu-win32. | |
8 | |
9 #-----------------------------------------------------------------------------# | |
10 | |
11 # This rule creates a `.def' file, which lists the symbols that are exported | |
12 # from the DLL. We use `nm' to get a list of all the exported text (`T') | |
13 # symbols and data symbols -- including uninitialized data (`B'), | |
14 # initialized data (`D'), read-only data (`R'), and common blocks (`C'). | |
15 %.def: %.a | |
16 echo EXPORTS > $@ | |
17 nm $< | grep '^........ [BCDRT] _' | sed 's/[^_]*_//' >> $@ | |
18 | |
19 # We need to use macros to access global data: | |
20 # the user of the DLL must refer to `foo' as `(*__imp_foo)'. | |
21 # This rule creates a `_globals.h' file, which contains macros | |
22 # for doing this. | |
23 | |
24 SYM_PREFIX = $(firstword $(SYM_PREFIX-$*) $*) | |
25 DLL_MACRO = $(SYM_PREFIX)_USE_DLL | |
26 IMP_MACRO = $(SYM_PREFIX)_IMP | |
27 GLOBAL_MACRO = $(SYM_PREFIX)_GLOBAL | |
28 | |
29 %_globals.h: %.a | |
30 echo "/* automatically generated by Makefile.DLLs */" > $@ | |
31 echo "#if defined(__GNUC__) && defined(_WIN32) \\" >> $@ | |
32 echo " && defined($(DLL_MACRO))" >> $@ | |
33 echo "# define $(IMP_MACRO)(name) __imp_##name" >> $@ | |
34 echo "# define $(GLOBAL_MACRO)(name) (*$(IMP_MACRO)(name))" >> $@ | |
35 echo "#else" >> $@ | |
36 echo "# define $(GLOBAL_MACRO)(name) name" >> $@ | |
37 echo "#endif" >> $@ | |
38 echo "" >> $@ | |
39 for sym in `nm $< | grep '^........ [BCDR] _' | sed 's/[^_]*_//'`; do \ | |
40 echo "#define $$sym $(GLOBAL_MACRO)($$sym)" >> $@; \ | |
41 done | |
42 | |
43 # This rule creates the export object file (`foo.exp') which contains the | |
44 # jump table array; this export object file becomes part of the DLL. | |
45 # This rule also creates the import library (`foo_dll.a') which contains small | |
46 # stubs for all the functions exported by the DLL which jump to them via the | |
47 # jump table. Executables that will use the DLL must be linked against this | |
48 # stub library. | |
49 %.exp %_dll.a : %.def | |
50 dlltool $(DLLTOOLFLAGS) $(DLLTOOLFLAGS-$*) \ | |
51 --def $< \ | |
52 --dllname $*.dll \ | |
53 --output-exp $*.exp \ | |
54 --output-lib $*_dll.a | |
55 | |
56 # The `sed' commands below are to convert DOS-style `C:\foo\bar' | |
57 # pathnames into Unix-style `//c/foo/bar' pathnames. | |
58 CYGWIN32_LIBS = $(shell echo \ | |
59 -L`dirname \`gcc -print-file-name=libgcc.a | \ | |
60 sed -e 's@^\\\\([A-Za-z]\\\\):@//\\\\1@g' -e 's@\\\\\\\\@/@g' \` ` \ | |
61 -L`dirname \`gcc -print-file-name=libcygwin.a | \ | |
62 sed -e 's@^\\\\([A-Za-z]\\\\):@//\\\\1@g' -e 's@\\\\\\\\@/@g' \` ` \ | |
63 -L`dirname \`gcc -print-file-name=libkernel32.a | \ | |
64 sed -e 's@^\\\\([A-Za-z]\\\\):@//\\\\1@g' -e 's@\\\\\\\\@/@g' \` ` \ | |
65 -lgcc -lcygwin -lkernel32 -lgcc) | |
66 | |
67 RELOCATABLE=yes | |
68 | |
69 ifeq "$(strip $(RELOCATABLE))" "yes" | |
70 | |
71 # to create relocatable DLLs, we need to do two passes | |
72 %.dll: %.exp %.a dll_fixup.o dll_init.o | |
73 $(LD) $(LDFLAGS) $(LDFLAGS-$*) --dll -o $*.base \ | |
74 -e _dll_entry@12 dll_init.o \ | |
75 dll_fixup.o $*.exp $*.a \ | |
76 $(LDLIBS) $(LDLIBS-$*) \ | |
77 $(CYGWIN32_LIBS) | |
78 $(LD) $(LDFLAGS) $(LDFLAGS-$*) --dll --base-file $*.base -o $@ \ | |
79 -e _dll_entry@12 dll_init.o \ | |
80 dll_fixup.o $*.exp $*.a \ | |
81 $(LDLIBS) $(LDLIBS-$*) \ | |
82 $(CYGWIN32_LIBS) | |
83 rm -f $*.base | |
84 else | |
85 | |
86 %.dll: %.exp %.a dll_fixup.o dll_init.o | |
87 $(LD) $(LDFLAGS) $(LDFLAGS-$*) --dll -o $@ \ | |
88 -e _dll_entry@12 dll_init.o \ | |
89 dll_fixup.o $*.exp $*.a \ | |
90 $(LDLIBS) $(LDLIBS-$*) \ | |
91 $(CYGWIN32_LIBS) | |
92 | |
93 endif | |
94 | |
95 # This black magic piece of assembler needs to be linked in in order to | |
96 # properly terminate the list of imported DLLs. | |
97 dll_fixup.s: | |
98 echo '.section .idata$$3' > dll_fixup.s | |
99 echo '.long 0,0,0,0, 0,0,0,0' >> dll_fixup.s | |
100 | |
101 # This bit is necessary to provide an initialization function for the DLL. | |
102 dll_init.c: | |
103 echo '__attribute__((stdcall))' > dll_init.c | |
104 echo 'int dll_entry(int handle, int reason, void *ptr)' >> dll_init.c | |
105 echo '{return 1; }' >> dll_init.c | |
106 | |
107 dont_throw_away: dll_fixup.o dll_init.o |