]> granicus.if.org Git - postgresql/blob - src/Makefile.shlib
Revert some careless search-and-replace: "ADD" in comment text should
[postgresql] / src / Makefile.shlib
1 #-------------------------------------------------------------------------
2 #
3 # Makefile.shlib
4 #    Common rules for building shared libraries
5 #
6 # Copyright (c) 1998, Regents of the University of California
7 #
8 # IDENTIFICATION
9 #    $PostgreSQL: pgsql/src/Makefile.shlib,v 1.100 2005/12/09 21:19:34 petere Exp $
10 #
11 #-------------------------------------------------------------------------
12
13 # This file should be included by any Postgres module Makefile that
14 # wants to build a shared library (if possible for the current
15 # platform). A static library is also built from the same object
16 # files. Only one library can be built per makefile.
17 #
18 # Before including this file, the module Makefile must define these
19 # variables:
20 #
21 # NAME                  Name of library to build (no suffix nor "lib" prefix)
22 # SO_MAJOR_VERSION      Major version number to use for shared library
23 # SO_MINOR_VERSION      Minor version number to use for shared library
24 # OBJS                  List of object files to include in library
25 # SHLIB_LINK            If shared library relies on other libraries,
26 #                       additional stuff to put in its link command
27 # (If you want a patchlevel, include it in SO_MINOR_VERSION, e.g., "6.2".)
28 #
29 # Optional flags when building DLL's (only applicable to win32 and cygwin
30 # platforms).
31 # DLLTOOL_DEFFLAGS      Additional flags when creating the dll .def file
32 # DLLTOOL_LIBFLAGS      Additional flags when creating the lib<module>.a file
33 # DLLWRAP_FLAGS         Additional flags to dllwrap
34 # DLL_DEFFILE           Use pre-existing .def file instead of auto-generating
35 #                       one with all exports in it (win32 only).
36 #
37 # The module Makefile must also include
38 # $(top_builddir)/src/Makefile.global before including this file.
39 # (Makefile.global sets PORTNAME and other needed symbols.)
40 #
41 # This makefile provides the following (phony) targets:
42 #
43 # all-lib               build the static and shared (if applicable) libraries
44 # install-lib           install the libraries into $(libdir)
45 # uninstall-lib         remove the libraries from $(libdir)
46 # clean-lib             delete the static and shared libraries from the build dir
47 #
48 # Since `all-lib' is the first rule in this file you probably want to
49 # have the `all' target before including this file. In the most simple
50 # case it would look like this:
51 #
52 #     all: all-lib
53 #
54 # Similarly, the install rule might look like
55 #
56 #     install: install-lib
57 #
58 # plus any additional things you want to install. Et cetera.
59 #
60 # Got that?  Look at src/interfaces/libpq/Makefile for an example.
61 #
62 # While the linker allows creation of most shared libraries,
63 # -Bsymbolic requires resolution of all symbols, making the
64 # compiler a better choice for shared library creation on ELF platforms.
65 # With the linker, -Bsymbolic requires the crt1.o startup object file.
66 # bjm 2001-02-10
67
68
69 COMPILER = $(CC) $(CFLAGS)
70 LINK.static = $(AR) $(AROPT)
71
72
73
74 ifeq ($(enable_shared), yes)
75
76 # Insert -L from LDFLAGS after any -L already present in SHLIB_LINK
77 SHLIB_LINK := $(filter -L%, $(SHLIB_LINK)) $(filter -L%, $(LDFLAGS)) $(filter-out -L%, $(SHLIB_LINK))
78
79 # Need a -L-free version of LDFLAGS to use in combination with SHLIB_LINK
80 LDFLAGS_NO_L := $(filter-out -L%, $(LDFLAGS))
81
82 # Default shlib naming convention used by the majority of platforms
83 shlib           = lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
84 shlib_major     = lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION)
85 shlib_bare      = lib$(NAME)$(DLSUFFIX)
86
87 # For each platform we support shared libraries on, set shlib to the
88 # name of the library (if default above is not right), set
89 # LINK.shared to the command to link the library,
90 # and adjust SHLIB_LINK if necessary.
91
92 # Try to keep the sections in some kind of order, folks...
93
94 override CFLAGS += $(CFLAGS_SL)
95
96 soname = lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION)
97
98 ifeq ($(PORTNAME), aix)
99   shlib                 = lib$(NAME)$(DLSUFFIX)
100 #   SHLIB_LINK          += -lc
101 endif
102
103 ifeq ($(PORTNAME), darwin)
104   ifneq ($(SO_MAJOR_VERSION), 0)
105     version_link        := -compatibility_version $(SO_MAJOR_VERSION) -current_version $(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
106   endif
107   ifeq ($(DLTYPE), library)
108     # linkable library
109     DLSUFFIX            := .dylib
110     LINK.shared         = $(COMPILER) -dynamiclib -install_name $(libdir)/lib$(NAME).$(SO_MAJOR_VERSION)$(DLSUFFIX) $(version_link) -multiply_defined suppress
111   else
112     # loadable module (default case)
113     DLSUFFIX            := .so
114     LINK.shared         = $(COMPILER) -bundle
115   endif
116   shlib                 = lib$(NAME).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)$(DLSUFFIX)
117   shlib_major           = lib$(NAME).$(SO_MAJOR_VERSION)$(DLSUFFIX)
118 endif
119
120 ifeq ($(PORTNAME), openbsd)
121   ifdef ELF_SYSTEM
122     LINK.shared         = $(COMPILER) -shared -Wl,-x,-soname,$(soname)
123     SHLIB_LINK          += -lc
124   else
125     LINK.shared         = $(LD) -x -Bshareable -Bforcearchive
126   endif
127 endif
128
129 ifeq ($(PORTNAME), bsdi)
130   ifeq ($(DLSUFFIX), .so)
131     LINK.shared         = $(COMPILER) -shared -Wl,-x,-soname,$(soname)
132     SHLIB_LINK          += -lc
133   endif
134   ifeq ($(DLSUFFIX), .o)
135     LINK.shared         = shlicc -O $(LDREL)
136   endif
137 endif
138
139 ifeq ($(PORTNAME), freebsd)
140   ifdef ELF_SYSTEM
141     shlib               = lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION)
142     LINK.shared         = $(COMPILER) -shared -Wl,-x,-soname,$(soname)
143   else
144     shlib               = lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
145     LINK.shared         = $(LD) -x -Bshareable -Bforcearchive
146   endif
147 endif
148
149 ifeq ($(PORTNAME), netbsd)
150   ifdef ELF_SYSTEM
151     LINK.shared         = $(COMPILER) -shared -Wl,-x,-soname,$(soname)
152   else
153     LINK.shared         = $(LD) -x -Bshareable -Bforcearchive
154   endif
155 endif
156
157 ifeq ($(PORTNAME), hpux)
158   shlib                 = lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION)
159   ifeq ($(with_gnu_ld), yes)
160     LINK.shared         = $(CC) $(LDFLAGS_NO_L) -shared -Wl,-h -Wl,$(soname)
161   else
162     # can't use the CC-syntax rpath pattern here
163     rpath =
164     ifeq ($(enable_rpath), yes)
165       LINK.shared       = $(LD) +h $(soname) -b +b '$(rpathdir)'
166     else
167       LINK.shared       = $(LD) +h $(soname) -b
168     endif
169     # On HPUX platforms, gcc is usually configured to search for libraries
170     # in /usr/local/lib, but ld won't do so.  Add an explicit -L switch so
171     # ld can find the same libraries gcc does.  Make sure it goes after any
172     # -L switches provided explicitly.
173     ifeq ($(GCC), yes)
174       SHLIB_LINK := $(filter -L%, $(SHLIB_LINK)) -L/usr/local/lib $(filter-out -L%, $(SHLIB_LINK))
175     endif
176   endif
177   # do this last so above filtering doesn't pull out -L switches in LDFLAGS
178   ifeq ($(GCC), yes)
179     SHLIB_LINK          += `$(CC) $(LDFLAGS) -print-libgcc-file-name`
180   endif
181 endif
182
183 ifeq ($(PORTNAME), irix)
184   shlib                 = lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION)
185   LINK.shared           = $(COMPILER) -shared -Wl,-set_version,sgi$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
186 endif
187
188 ifeq ($(PORTNAME), linux)
189   LINK.shared           = $(COMPILER) -shared -Wl,-soname,$(soname)
190 endif
191
192 ifeq ($(PORTNAME), solaris)
193   ifeq ($(GCC), yes)
194     LINK.shared         = $(CC) -shared
195   else
196     LINK.shared         = $(CC) -G
197   endif
198   ifeq ($(with_gnu_ld), yes)
199     LINK.shared         += -Wl,-soname,$(soname)
200   else
201     LINK.shared         += -h $(soname)
202   endif
203 endif
204
205 ifeq ($(PORTNAME), sunos4)
206   LINK.shared           = $(LD) -assert pure-text -Bdynamic
207 endif
208  
209 ifeq ($(PORTNAME), osf)
210   LINK.shared           = $(LD) -shared -expect_unresolved '*'
211 endif
212
213 ifeq ($(PORTNAME), sco)
214   ifeq ($(GCC), yes)
215     LINK.shared         = $(CC) -shared
216   else
217     LINK.shared         = $(CC) -G
218     endif
219   LINK.shared           += -Wl,-z,text -Wl,-h,$(soname)
220 endif
221
222 ifeq ($(PORTNAME), svr4)
223   LINK.shared           = $(LD) -G
224 endif
225
226 ifeq ($(PORTNAME), univel)
227   LINK.shared           = $(LD) -G -z text
228 endif
229
230 ifeq ($(PORTNAME), unixware)
231   ifeq ($(GCC), yes)
232     LINK.shared         = $(CC) -shared
233   else
234     LINK.shared         = $(CC) -G
235   endif
236   LINK.shared           += -Wl,-z,text -Wl,-h,$(soname) 
237 endif
238
239 ifeq ($(PORTNAME), cygwin)
240   shlib                 = cyg$(NAME)$(DLSUFFIX)
241   haslibarule   = yes
242 endif
243
244 ifeq ($(PORTNAME), win32)
245   shlib                 = lib$(NAME)$(DLSUFFIX)
246   haslibarule   = yes
247 endif
248
249 ifeq ($(PORTNAME), beos)
250   shlib                 = lib$(NAME)$(DLSUFFIX)
251   LINK.shared           = $(LD) -nostart
252   SHLIB_LINK            += -ltermcap -lstdc++.r4 -lbind -lsocket -L/boot/develop/lib/x86
253 endif
254
255 ifeq ($(enable_rpath), yes)
256 SHLIB_LINK += $(rpath)
257 endif
258
259 endif # enable_shared
260
261
262
263 ##
264 ## BUILD
265 ##
266
267 .PHONY: all-lib all-static-lib all-shared-lib
268
269 all-lib: all-static-lib all-shared-lib
270
271 all-static-lib: lib$(NAME).a
272
273 all-shared-lib: $(shlib)
274
275 ifndef LORDER
276 MK_NO_LORDER := true
277 endif
278
279 ifndef haslibarule
280 lib$(NAME).a: $(OBJS)
281 ifdef MK_NO_LORDER
282         $(LINK.static) $@ $^
283 else
284         $(LINK.static) $@ `$(LORDER) $^ | tsort`
285 endif
286         $(RANLIB) $@
287 endif #haslibarule
288
289 ifeq ($(enable_shared), yes)
290
291 ifneq ($(PORTNAME), win32)
292 ifneq ($(PORTNAME), cygwin)
293 ifneq ($(PORTNAME), beos)
294 ifneq ($(PORTNAME), aix)
295
296 # Normal case
297 $(shlib): $(OBJS)
298         $(LINK.shared) $(LDFLAGS_SL) $(OBJS) $(SHLIB_LINK) -o $@
299 # If we're using major and minor versions, then make a symlink to major-version-only.
300 ifneq ($(shlib), $(shlib_major))
301         rm -f $(shlib_major)
302         $(LN_S) $(shlib) $(shlib_major)
303 endif
304 # Make sure we have a link to a name without any version numbers
305 ifneq ($(shlib), $(shlib_bare))
306         rm -f $(shlib_bare)
307         $(LN_S) $(shlib) $(shlib_bare)
308 endif
309
310 else # PORTNAME == aix
311
312 # AIX case
313 $(shlib): lib$(NAME).a
314         $(MKLDEXPORT) lib$(NAME).a > lib$(NAME)$(EXPSUFF)
315         $(COMPILER) $(LDFLAGS_NO_L) $(LDFLAGS_SL) -o $@ $< -Wl,-bE:lib$(NAME)$(EXPSUFF) $(SHLIB_LINK)
316         
317 endif # PORTNAME == aix
318
319 else # PORTNAME == beos
320
321 # BEOS case
322 $(shlib): $(OBJS)
323         ln -fs $(top_srcdir)/src/backend/postgres _APP_
324         $(CC) -Xlinker -soname=$@ $(LDFLAGS_SL) -o $@ _APP_ $(OBJS) $(SHLIB_LINK)
325
326 endif # PORTNAME == beos
327
328 else # PORTNAME == cygwin
329
330 # Cygwin case
331 $(shlib) lib$(NAME).a: $(OBJS)
332 ifndef DLL_DEFFILE
333         $(DLLTOOL) --export-all $(DLLTOOL_DEFFLAGS) --output-def $(NAME).def $(OBJS)
334         $(DLLWRAP) $(LDFLAGS_SL) -o $(shlib) --dllname $(shlib) $(DLLWRAP_FLAGS) --def $(NAME).def $(OBJS) $(SHLIB_LINK)
335         $(DLLTOOL) --dllname $(shlib) $(DLLTOOL_LIBFLAGS) --def $(NAME).def --output-lib lib$(NAME).a
336 else
337         $(DLLWRAP) $(LDFLAGS_SL) -o $(shlib) --dllname $(shlib) $(DLLWRAP_FLAGS) --def $(DLL_DEFFILE) $(OBJS) $(SHLIB_LINK)
338         $(DLLTOOL) --dllname $(shlib) $(DLLTOOL_LIBFLAGS) --def $(DLL_DEFFILE) --output-lib lib$(NAME).a
339 endif
340
341 endif # PORTNAME == cygwin
342
343 else # PORTNAME == win32
344
345 # win32 case
346 $(shlib) lib$(NAME).a: $(OBJS)
347 ifndef DLL_DEFFILE
348         $(DLLTOOL) --export-all $(DLLTOOL_DEFFLAGS) --output-def $(NAME).def $(OBJS)
349         $(DLLWRAP) $(LDFLAGS_SL) -o $(shlib) --dllname $(shlib) $(DLLWRAP_FLAGS) --def $(NAME).def $(OBJS) $(SHLIB_LINK)
350         $(DLLTOOL) --dllname $(shlib) $(DLLTOOL_LIBFLAGS) --def $(NAME).def --output-lib lib$(NAME).a
351 else
352         $(DLLWRAP) $(LDFLAGS_SL) -o $(shlib) --dllname $(shlib) $(DLLWRAP_FLAGS) --def $(DLL_DEFFILE) $(OBJS) $(SHLIB_LINK)
353         $(DLLTOOL) --dllname $(shlib) $(DLLTOOL_LIBFLAGS) --def $(DLL_DEFFILE) --output-lib lib$(NAME).a
354 endif
355
356 endif # PORTNAME == win32
357
358 endif # enable_shared
359
360
361 ##
362 ## INSTALL
363 ##
364
365 .PHONY: install-lib install-lib-static install-lib-shared
366 install-lib: install-lib-static install-lib-shared
367
368 install-lib-static: lib$(NAME).a
369         $(INSTALL_STLIB) $< '$(DESTDIR)$(libdir)/lib$(NAME).a'
370 ifeq ($(PORTNAME), darwin)
371         cd '$(DESTDIR)$(libdir)' && \
372         ranlib lib$(NAME).a
373 endif
374
375 ifeq ($(enable_shared), yes)
376 install-lib-shared: $(shlib)
377         $(INSTALL_SHLIB) $< '$(DESTDIR)$(libdir)/$(shlib)'
378 ifneq ($(PORTNAME), cygwin)
379 ifneq ($(PORTNAME), win32)
380 ifneq ($(shlib), $(shlib_major))
381         cd '$(DESTDIR)$(libdir)' && \
382         rm -f $(shlib_major) && \
383         $(LN_S) $(shlib) $(shlib_major)
384 endif
385 ifneq ($(shlib), $(shlib_bare))
386         cd '$(DESTDIR)$(libdir)' && \
387         rm -f $(shlib_bare) && \
388         $(LN_S) $(shlib) $(shlib_bare)
389 endif
390 endif # not win32
391 endif # not cygwin
392 endif # enable_shared
393
394
395 ##
396 ## UNINSTALL
397 ##
398
399 .PHONY: uninstall-lib
400 uninstall-lib:
401         rm -f '$(DESTDIR)$(libdir)/lib$(NAME).a'
402 ifeq ($(enable_shared), yes)
403         rm -f '$(DESTDIR)$(libdir)/$(shlib_bare)' \
404           '$(DESTDIR)$(libdir)/$(shlib_major)' \
405           '$(DESTDIR)$(libdir)/$(shlib)'
406 endif # enable_shared
407
408
409 ##
410 ## CLEAN
411 ##
412
413 .PHONY: clean-lib
414 clean-lib:
415         rm -f lib$(NAME).a
416 ifeq ($(enable_shared), yes)
417         rm -f $(shlib_bare) $(shlib_major) $(shlib)
418 ifdef EXPSUFF
419         rm -f lib$(NAME)$(EXPSUFF)
420 endif
421 endif
422 ifeq ($(PORTNAME), cygwin)
423         rm -f $(NAME).dll $(NAME).def
424 endif
425
426 ifeq ($(PORTNAME), win32)
427         rm -f $(NAME).dll $(NAME).def
428 endif