mingw.rules revision 11d341ca
1/*
2 * Cygwin shared library rules (DLL versions)
3 */
4
5#define HasSharedLibraries      YES
6#define NeedLibInsideFlag	NO
7#define ForceNormalLib		NO
8#define NormalLibX11            NO
9# define SharedLibFont		NO
10# define SharedLibFontEnc	NO
11# define SharedLibWindowsWM	NO
12# define SharedLibxkbfile	YES
13
14#ifndef SharedDataSeparation
15# define SharedDataSeparation	NO
16#endif
17#ifndef SharedCodeDef
18#define SharedCodeDef /**/
19#endif
20#ifndef SharedLibraryDef
21#define SharedLibraryDef /**/
22#endif
23#ifndef ShLibIncludeFile
24#define ShLibIncludeFile <mingw.tmpl>
25#endif
26#ifndef SharedLibraryLoadFlags
27#define SharedLibraryLoadFlags -dll /**/
28#endif
29#ifndef PositionIndependentCFlags
30#define PositionIndependentCFlags -D_DLL
31#endif
32#ifndef PositionIndependentCplusplusFlags
33#define PositionIndependentCplusplusFlags -D_DLL
34#endif
35#ifndef UseExportLists
36#define UseExportLists YES
37#endif
38
39#define SharedLibraryName(libname, rev) \
40Concat3(lib,libname,-$(shell echo rev|sed s=\\..*==).dll)
41
42#define ImportLibraryName(libname, rev) \
43Concat3(lib,libname,-$(shell echo rev|sed s=\\..*==).dll.a)
44
45#define ShortImportLibraryName(libname, rev) \
46Concat3(lib,libname,.dll.a)
47
48/*
49 * SharedDepLibraryTarget - generate rules to create a shared library.
50 */
51
52#ifndef SharedDepLibraryTarget
53# ifdef UseInstalled
54#  ifndef LinkBuildSonameLibrary
55#   define LinkBuildSonameLibrary(lib)
56#  endif
57# else /* !UseInstalled */
58#  ifndef LinkBuildSonameLibrary
59#   define LinkBuildSonameLibrary(lib) (RemoveFile($(BUILDLIBDIR)/lib); @@\
60	cd $(BUILDLIBDIR); $(LN) $(BUILDINCTOP)/$(CURRENT_DIR)/lib .)
61#  endif
62# endif /* UseInstalled */
63
64
65/*
66 * SharedDepLibraryTarget
67 */
68
69#define SharedDepLibraryTarget(libname,rev,deplist,solist,down,up)	@@\
70AllTarget(SharedLibraryName(libname,rev))                             @@\
71									@@\
72SharedLibraryName(libname,rev): deplist 				@@\
73	RemoveFile(ImportLibraryName(libname,rev))			@@\
74	RemoveFile(SharedLibraryName(libname,rev))			@@\
75	MakeDLL(libname,solist,rev)					@@\
76	LinkBuildLibrary(ImportLibraryName(libname,rev))		@@\
77	LinkImportLibrary(ImportLibraryName(libname,rev),LibraryTargetName(libname))	@@\
78	LinkBuildDLL(SharedLibraryName(libname,rev))			@@\
79									@@\
80clean::									@@\
81	RemoveFile(ImportLibraryName(libname,rev))				@@\
82	RemoveFile(SharedLibraryName(libname,rev))			@@\
83
84#endif /* SharedDepLibraryTarget */
85
86/*
87 * SharedDepCplusplusLibraryTarget - generate rules to create a shared library.
88 */
89
90#ifndef SharedDepCplusplusLibraryTarget
91# ifdef UseInstalled
92#  ifndef LinkBuildSonameLibrary
93#   define LinkBuildSonameLibrary(lib)
94#  endif
95# else /* !UseInstalled */
96#  ifndef LinkBuildSonameLibrary
97#   define LinkBuildSonameLibrary(lib) (RemoveFile($(BUILDLIBDIR)/lib); @@\
98	cd $(BUILDLIBDIR); $(LN) $(BUILDINCTOP)/$(CURRENT_DIR)/lib .)
99#  endif
100# endif /* UseInstalled */
101
102
103/*
104 * SharedDepCplusplusLibraryTarget
105 */
106
107#define SharedDepCplusplusLibraryTarget(libname,rev,deplist,solist,down,up) @@\
108AllTarget(SharedLibraryName(libname,rev))                             @@\
109                                                                            @@\
110SharedLibraryName(libname,rev): deplist					@@\
111	RemoveFile(ImportLibraryName(libname,rev))                      @@\
112	RemoveFile(SharedLibraryName(libname,rev))                      @@\
113	MakeCplusplusDLL(libname,solist,rev)                            @@\
114	LinkBuildLibrary(ImportLibraryName(libname,rev))                @@\
115	LinkImportLibrary(ImportLibraryName(libname,rev),LibraryTargetName(libname))	@@\
116	LinkBuildDLL(SharedLibraryName(libname,rev))                    @@\
117                                                                        @@\
118clean::                                                                 @@\
119	RemoveFile(ImportLibraryName(libname,rev))                      @@\
120	RemoveFile(SharedLibraryName(libname,rev))                      @@\
121
122#endif /* SharedDepCplusplusLibraryTarget */
123
124
125/*
126 * SharedDepModuleTarget
127 */
128
129#ifndef SharedDepModuleTarget
130#define SharedDepModuleTarget(name,deps,solist)				@@\
131AllTarget(name)								@@\
132									@@\
133name: deps								@@\
134	$(CC) -o $@ $(SHLIBLDFLAGS) solist $(REQUIREDLIBS) BaseShLibReqs @@\
135									@@\
136clean::									@@\
137	RemoveFile(name)
138#endif /* SharedDepModuleTarget */
139
140
141/*
142 * SharedLibraryDataTarget - generate rules to create shared data file
143 */
144
145#ifndef SharedLibraryDataTarget
146#define SharedLibraryDataTarget(libname,rev,salist)
147#endif
148
149
150/*
151 * InstallSharedLibraryData - generate rules to install the shared library data
152 */
153
154#ifndef InstallSharedLibraryData
155#define InstallSharedLibraryData(libname,rev,dest)
156#endif /* InstallSharedLibraryData */
157
158/*
159 * MakeDllProg
160 */ 
161    
162#define MakeDLLProg(libname,solist,prog,rev)			        @@\
163	prog -shared -Wl,--out-implib=ImportLibraryName(libname,rev) -Wl,--enable-auto-import,--enable-runtime-pseudo-reloc -Wl,--exclude-libs,ALL -o SharedLibraryName(libname,rev) solist $(REQUIREDLIBS) -lws2_32
164    
165/*
166 * MakeDll
167 */
168
169#define MakeDLL(libname,solist,rev)					@@\
170    MakeDLLProg(libname,solist,$(CC),rev)
171
172/*
173 * MakeCplusplusDll
174 */
175
176#define MakeCplusplusDLL(libname,solist,rev)				@@\
177    MakeDLLProg(libname,solist,$(CXX),rev)
178
179
180
181/*
182 * SharedLibraryTarget
183 */
184
185#define SharedLibraryTarget(libname,rev,solist,down,up)                 @@\
186AllTarget(SharedLibraryName(libname,rev))				@@\
187                                                                        @@\
188SharedLibraryName(libname,rev): solist					@@\
189	RemoveFile(ImportLibraryName(libname,rev))			@@\
190	RemoveFile(SharedLibraryName(libname,rev))			@@\
191	MakeDLL(libname,solist,rev)					@@\
192	LinkBuildLibrary(ImportLibraryName(libname,rev))		@@\
193	LinkImportLibrary(ImportLibraryName(libname,rev),LibraryTargetName(libname))	@@\
194	LinkBuildDLL(SharedLibraryName(libname,rev))			@@\
195clean::									@@\
196	RemoveFile(ImportLibraryName(libname,rev))			@@\
197	RemoveFile(SharedLibraryName(libname,rev))			@@\
198
199
200/*
201 * InstallLink
202 */
203
204#ifndef InstallLink
205#define InstallLink(step, file, link, dest)                             @@\
206step::                                                                  @@\
207	MakeDir($(DESTDIR)dest)                                         @@\
208	$(LN) -sf file $(DESTDIR)dest/link
209#endif
210
211/*
212 * InstallSharedLibrary
213 */
214
215#define InstallSharedLibrary(libname,rev,dest)                          @@\
216InstallTarget(install,ImportLibraryName(libname,rev),$(INSTLIBFLAGS),$(USRLIBDIR)) @@\
217InstallTarget(install,SharedLibraryName(libname,rev),$(INSTBINFLAGS),$(BINDIR)) @@\
218InstallLink(install,ImportLibraryName(libname,rev),ShortImportLibraryName(libname,rev),$(USRLIBDIR))
219
220
221/*
222 * ProgramTargetName - This can be simply 'target' or 'target.exe' when
223 * building on Cygwin proper, as Cygwin automatically appends .exe to compiled
224 * executables and make, rm, ln, etc. will automatically search for a file
225 * with .exe appended if the raw file name cannot be found.  However,
226 * building with a cross compiler requires 'target.exe', as the cross
227 * compiler doesn't know to append .exe, nor do the cross compiler tools
228 * know to search for files with .exe appended if the raw file name cannot
229 * be found.
230 */
231
232#define ProgramTargetName(target) Concat(target,.exe)
233
234
235/*
236 * HostProgramTargetName - Don't add .exe if cross-compiling.
237 */
238
239#ifndef HostProgramTargetName
240# if CrossCompiling
241#  define HostProgramTargetName(target) target
242# else
243#  define HostProgramTargetName(target) ProgramTargetName(target)
244# endif
245#endif
246
247
248/*
249 * LinkBuildDLL - Cygwin only rule, similar to LinkBuildModule.
250 * Unfortunately, we have to create a copy of each DLL in xc/exports/bin;
251 * linking doesn't work, the executables (e.g. xkbcomp) will report
252 * that they cannot find DLLs (e.g. libX11.dll).
253 */
254
255#ifdef UseInstalled
256#define LinkBuildDLL(lib) $(_NULLCMD_)
257#else
258#define LinkBuildDLL(lib) MakeDir($(BUILDBINDIR))			@@\
259	RemoveFile($(BUILDBINDIR)/lib)					@@\
260	cd $(BUILDBINDIR) && $(CP) $(BUILDBINTOP)/$(CURRENT_DIR)/lib .
261#endif
262
263#ifndef LinkImportLibrary
264#ifdef UseInstalled
265#define LinkImportLibrary(lib, importlib) $(_NULLCMD_)
266#else
267#define LinkImportLibrary(lib, importlib) MakeDir($(BUILDLIBDIR))     @@\
268	RemoveFile($(BUILDLIBDIR)/importlib)                            @@\
269	cd $(BUILDLIBDIR) && $(LN) lib importlib
270#endif
271#endif /* LinkImportLibrary */
272
273
274/*
275 * LinkBuildBinary - This rule normally creates a link in xc/exports/bin
276 * to a binary, but we create an actual copy of the binary.
277 * Creating a link causes the DLLs that the binary depend on, such as
278 * libX11.dll, not to be found.  Copying the binary causes the runtime
279 * directory to be xc/exports/bin, which is the location of the DLLs, thus,
280 * the DLLs can now be found by the binary.  Phew...
281 *
282 * Note that sometimes the binary is not an executable.  One example
283 * is the rgb binary file.
284 *
285 * Passing -p preserves the attributes as the date and prevents useless
286 * rebuilds.
287 *
288 * ProgramTargetName is passed to LinkBuildBinary if the binary
289 * is actually an executable; thus, we do not wrap the binary name
290 * with ProgramTargetName here.
291 */
292
293#ifndef LinkBuildBinary
294#define LinkBuildBinary(binary)						@@\
295all:: binary								@@\
296	MakeDir($(BUILDBINDIR))						@@\
297	RemoveFile($(BUILDBINDIR)/binary)				@@\
298	cd $(BUILDBINDIR) && $(CP) -p $(BUILDBINTOP)/$(CURRENT_DIR)/binary .
299#endif /* LinkBuildBinary */
300
301/*
302 * ProfiledRelocatableTarget - generate rules to produce a  profiled
303 * relocatable object file instead of a library.  Differs from Imake.rules
304 * by passing '--oformat pe-i386' to ld.
305 */
306
307#ifndef ProfiledRelocatableTarget
308#define	ProfiledRelocatableTarget(objname,objlist)			@@\
309AllTarget(Concat(objname,_p.Osuf))					@@\
310									@@\
311Concat(objname,_p.Osuf): objlist $(EXTRALIBRARYDEPS)			@@\
312	RemoveFile($@)							@@\
313	$(LD) -X -r --oformat pe-i386 objlist -o $@
314
315#endif /* ProfiledRelocatableTarget */
316
317
318/*
319 * DebuggedRelocatableTarget - generate rules to produce a debuggable
320 * relocatable object file instead of a library.  Differs from Imake.rules
321 * by passing '--oformat pe-i386' to ld.
322 */
323
324#ifndef DebuggedRelocatableTarget
325#define	DebuggedRelocatableTarget(objname,objlist)			@@\
326AllTarget(Concat(objname,_d.Osuf))					@@\
327									@@\
328Concat(objname,_d.Osuf): objlist $(EXTRALIBRARYDEPS)			@@\
329	RemoveFile($@)							@@\
330	$(LD) -X -r --oformat pe-i386 objlist -o $@
331
332#endif /* DebuggedRelocatableTarget */
333
334
335/*
336 * DependDependencyStatement - Imake.rules wraps $(DEPEND) in
337 * ProgramTargetName(), which causes cross compiling to think that
338 * $(DEPEND) hasn't been built, as $(DEPEND) is a host tool, and should
339 * not be wrapped with ProgramTargetName().  Perhaps there should be
340 * a HostProgramTargetName()...
341 */
342
343#ifndef DependDependencyStatement
344#if HasMakefileSafeInclude
345#define DependDependencyStatement()					@@\
346DependFileName:: $(DEPEND)
347#else
348#define DependDependencyStatement()					@@\
349depend:: $(DEPEND)
350#endif
351#endif
352
353
354/*
355 * DependDependency - Imake.rules wraps $(DEPEND) in ProgramTargetName().
356 * This doesn't work when cross compiling, see the locally defined
357 * DependDependencyStatement comment (above) for more information.
358 */
359
360#ifndef DependDependency
361#ifdef UseInstalled
362#define DependDependency() /**/
363#else
364#define DependDependency()						@@\
365DependDependencyStatement()						@@\
366									@@\
367NoCmpScript($(DEPEND))							@@\
368									@@\
369$(DEPEND):								@@\
370	@echo "checking $@ over in $(DEPENDSRC) first..."; \		@@\
371	cd $(DEPENDSRC) && $(MAKE) makedependonly; \			@@\
372	echo "okay, continuing in $(CURRENT_DIR)"
373
374#endif /* UseInstalled */
375#endif /* DependDependency */
376
377
378/*
379 * ImakeDependency - Imake.rules wraps $(IMAKE) in ProgramTargetName(),
380 * which doesn't work when cross compiling, as imake is supposed to be a
381 * host program.  See the locally defined DependDependencyStatement
382 * comment (above) for more information.
383 */
384
385#ifndef ImakeDependency
386#ifdef UseInstalled
387#define ImakeDependency(target) /**/
388#else
389#define ImakeDependency(target)						@@\
390target:: $(IMAKE)							@@\
391									@@\
392NoCmpScript($(IMAKE) $(IMAKE).Osuf)					@@\
393									@@\
394$(IMAKE) $(IMAKE).Osuf:							@@\
395	-@(cd $(IMAKESRC) && if [ -f Makefile ]; then \			@@\
396	echo "checking $@ in $(IMAKESRC) first..."; $(MAKE) imakeonly; else \	@@\
397	echo "bootstrapping $@ from Makefile.ini in $(IMAKESRC) first..."; \	@@\
398	$(MAKE) -f Makefile.ini BOOTSTRAPCFLAGS="$(BOOTSTRAPCFLAGS)"; fi; \	@@\
399	echo "okay, continuing in $(CURRENT_DIR)")
400#endif /* UseInstalled */
401#endif /* ImakeDependency */
402
403
404/*
405 * ResourceObjectRule - Build a Windows resouce file (.res) into
406 * an object file (.o) that can be linked in with the executable
407 * or library being built.
408 */
409
410#ifndef ResourceObjectRule
411#define ResourceObjectRule(basename,depends,options)			@@\
412AllTarget(basename.RESsuf)						@@\
413basename.RESsuf: basename.RCsuf depends					@@\
414	RemoveFile($@)							@@\
415	ClearmakeOSName \						@@\
416	WindresCmd basename.RCsuf options -O coff -o basename.RESsuf	@@\
417clean::									@@\
418	RemoveFiles(basename.RESsuf)
419
420#endif /* ResourceObjectRule */
421
422/* The arglist can get quite long. Make sure we can delete it though */
423#ifndef MakeFonts
424# define MakeFonts()							@@\
425all::  $(OBJS)								@@\
426									@@\
427MakeFontsDir($(OBJS))							@@\
428									@@\
429clean::									@@\
430	find -name "*.pcf" -o -name "*.pcf.Z" -o -name "*.pcf.gz" | xargs -r rm
431#endif /* MakeFonts */
432
433#ifndef IncludeMakefile
434#define IncludeMakefile(file) @@sinclude file
435#endif
436
437
438#ifndef ProjectUnsharedLibReferences
439#define ProjectUnsharedLibReferences(varname,libname,libsource,buildlibdir)	@@\
440Concat3(DEP,varname,LIB) = _UseCat($(USRLIBDIR)/,buildlibdir/,LibraryTargetName(libname))	@@\
441Concat(varname,LIB) = LoaderLibPrefix Concat(-l,libname) $(Concat(varname,EXTLIB)) @@\
442LintLibReferences(varname,libname,libsource)
443#endif
444
445XONLYEXTLIB = -lwsock32
446