aboutsummaryrefslogtreecommitdiff
path: root/src/Makefile.shlib
blob: f953045631330a9a6c77e3b147baec51e4ac9b96 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
#-------------------------------------------------------------------------
#
# Makefile.shlib
#    Common rules for building shared libraries
#
# Copyright (c) 1998, Regents of the University of California
#
# IDENTIFICATION
#    $Header: /cvsroot/pgsql/src/Makefile.shlib,v 1.14 1999/07/16 22:56:01 tgl Exp $
#
#-------------------------------------------------------------------------

# This file should be included by any Postgres module Makefile that wants
# to build a shared library (if possible for the current platform).
# A static library is also built from the same object files.
# RESTRICTION: only one library can be built per makefile...

# Before including this file, the module Makefile must define these variables:
# NAME				Name of library to build (no suffix nor "lib" prefix)
# SO_MAJOR_VERSION	Major version number to use for shared library
# SO_MINOR_VERSION	Minor version number to use for shared library
# OBJS				List of object files to include in library
# SHLIB_LINK		If shared library relies on other libraries, additional
#					stuff to put in its link command
# (If you want a patchlevel, include it in SO_MINOR_VERSION, eg, "6.2".)
#
# The module Makefile must also include $(SRCDIR)/Makefile.global before
# including this file (Makefile.global sets PORTNAME and other needed symbols).
#
# The first rule in this file is a rule for "all", which causes both the
# static and shared libraries to be built (as well as all the object files).
# If you have other files that need to be made before building object files
# and libraries, put another rule for "all" before you include this file.
#
# Your install rule should look like
#
#	install: install-headers install-lib $(install-shlib-dep)
#
# where install-headers is only needed if you have header files to install
# (and, of course, it has to be provided by your makefile).  The rules
# install-lib and install-shlib are provided by this makefile --- they
# automatically install the plain and shared libraries into $(LIBDIR).
# install-shlib-dep is a variable that expands to install-shlib if the
# shared library needs to be installed, empty if not.
#
# Got that?  Look at src/interfaces/libpq/Makefile.in for an example.


# shlib and install-shlib-dep default to empty, and stay that way if we're
# on a platform where we don't know how to build a shared library.
shlib := 
install-shlib-dep :=

# For each platform we support shlibs on, set shlib and install-shlib-dep,
# and update flags as needed to build a shared lib.  Note we depend on
# Makefile.global (or really Makefile.port) to supply DLSUFFIX and other
# symbols.

# Try to keep the sections in some kind of order, folks...

ifeq ($(PORTNAME), aix)
  install-shlib-dep	:= install-shlib
  shlib				:= lib$(NAME)$(DLSUFFIX)
  SHLIB_LINK		+= -lc
endif

ifeq ($(PORTNAME), bsd)
  ifdef BSD_SHLIB
    install-shlib-dep	:= install-shlib
    shlib		:= lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
    ifdef ELF_SYSTEM
      LDFLAGS_SL	:= -x -Bshareable -soname $(shlib)
    else
      LDFLAGS_SL	:= -x -Bshareable -Bforcearchive
    endif
    CFLAGS		+= $(CFLAGS_SL)
  endif
endif

ifeq ($(PORTNAME), bsdi)
  ifdef BSD_SHLIB
    ifeq ($(DLSUFFIX), .so)
      install-shlib-dep := install-shlib
      shlib			:= lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
      LDFLAGS_SL		+= -shared
      CFLAGS			+= $(CFLAGS_SL)
    endif
    ifeq ($(DLSUFFIX), .o)
      install-shlib-dep	:= install-shlib
      shlib			:= lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
      LD			:= shlicc
      LDFLAGS_SL	 	+= -O -r
      CFLAGS			+= $(CFLAGS_SL)
    endif
  endif
endif

ifeq ($(PORTNAME), freebsd)
  ifdef BSD_SHLIB
    install-shlib-dep	:= install-shlib
    ifdef ELF_SYSTEM
      shlib		:= lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION)
      LDFLAGS_SL	:= -x -shared -soname $(shlib)
    else
      shlib		:= lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
      LDFLAGS_SL	:= -x -Bshareable -Bforcearchive
    endif
    CFLAGS		+= $(CFLAGS_SL)
  endif
endif

ifeq ($(PORTNAME), hpux)
  install-shlib-dep	:= install-shlib
# HPUX doesn't believe in version numbers for shlibs
  shlib				:= lib$(NAME)$(DLSUFFIX)
  LDFLAGS_SL		:= -b
  CFLAGS			+= $(CFLAGS_SL)
endif

ifeq ($(PORTNAME), irix5)
  install-shlib-dep := install-shlib
  shlib := lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
  LDFLAGS_SL := -shared
  CFLAGS += $(CFLAGS_SL)
endif

ifeq ($(PORTNAME), linux)
  install-shlib-dep	:= install-shlib
  shlib				:= lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
  LDFLAGS_SL		:= -Bdynamic -shared -soname $(shlib)
  LDFLAGS_ODBC		:= -Bsymbolic -lc -lm
  SHLIB_LINK		+= -lc
  CFLAGS			+= $(CFLAGS_SL)
endif

ifeq ($(PORTNAME), solaris_i386)
  install-shlib-dep	:= install-shlib
  shlib				:= lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
  LDFLAGS_SL		:= -G
  SHLIB_LINK		+= -ldl -lsocket -lresolv -lnsl -lm -lc
  CFLAGS			+= $(CFLAGS_SL)
endif

ifeq ($(PORTNAME), solaris_sparc)
  install-shlib-dep	:= install-shlib
  shlib				:= lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
  LDFLAGS_SL		:= -G
  SHLIB_LINK		+= -ldl -lsocket -lresolv -lnsl -lm -lc
  CFLAGS			+= $(CFLAGS_SL)
endif

ifeq ($(PORTNAME), alpha)
  install-shlib-dep	:= install-shlib
  shlib			:= lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
  LDFLAGS_SL		+= -shared -expect_unresolved '*'
endif

ifeq ($(PORTNAME), svr4)
  install-shlib-dep	:= install-shlib
  shlib				:= lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
  LDFLAGS_SL		:= -G
  CFLAGS			+= $(CFLAGS_SL)
endif

ifeq ($(PORTNAME), univel)
  install-shlib-dep	:= install-shlib
  shlib				:= lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
  LDFLAGS_SL		:= -G -z text
  CFLAGS			+= $(CFLAGS_SL)
  ifeq ($(CXX), CC)
    CXXFLAGS += -Xw
    COMPILE.cc = $(CXX) $(CXXFLAGS:ll,alloca=ll) $(CPPFLAGS) $(TARGET_ARCH) -c
  endif
endif

ifeq ($(PORTNAME), unixware)
  install-shlib-dep	:= install-shlib
  shlib				:= lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
  LDFLAGS_SL		:= -G -z text
  CFLAGS			+= $(CFLAGS_SL)
  ifeq ($(CXX), CC)
    CXXFLAGS += -Xw
    COMPILE.cc = $(CXX) $(CXXFLAGS:ll,alloca=ll) $(CPPFLAGS) $(TARGET_ARCH) -c
  endif
endif

ifeq ($(PORTNAME), win)
  install-shlib-dep	:= install-shlib
  shlib				:= $(NAME)$(DLSUFFIX)
endif

# Default target definition.  Note shlib is empty if not building a shlib.

all: lib$(NAME).a $(shlib)

# Rules to build regular and shared libraries

ifneq ($(PORTNAME), win)

lib$(NAME).a: $(OBJS)
ifdef MK_NO_LORDER
	$(AR) $(AROPT) $@ $(OBJS) 
else
	$(AR) $(AROPT) $@ `lorder $(OBJS) | tsort`
endif
	$(RANLIB) $@

endif

ifneq ($(shlib),)
ifneq ($(PORTNAME), win)
ifneq ($(PORTNAME), aix)

# Normal case
$(shlib): $(OBJS)
	$(LD) $(LDFLAGS_SL) -o $@ $(OBJS) $(SHLIB_LINK)
	if [ "$(shlib)" != "lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION)" ]; then \
		rm -f lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION); \
		$(LN_S) $(shlib) lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION); \
	fi
	if [ "$(shlib)" != "lib$(NAME)$(DLSUFFIX)" ]; then \
		rm -f lib$(NAME)$(DLSUFFIX); \
		$(LN_S) $(shlib) lib$(NAME)$(DLSUFFIX); \
	fi

else

# AIX case
$(shlib): lib$(NAME).a
	$(MKLDEXPORT) lib$(NAME).a $(LIBDIR) > lib$(NAME)$(EXPSUFF)
	$(LD) -H512 -bM:SRE -bI:$(SRCDIR)/backend/$(POSTGRES_IMP) -bE:lib$(NAME)$(EXPSUFF) -o $@ $< $(LDFLAGS) $(SHLIB_LINK)

endif

else

# WIN case
$(shlib) lib$(NAME).a: $(OBJS) $(SRCDIR)/utils/dllinit.o
	$(DLLTOOL) --export-all --output-def $(NAME).def $(OBJS)
	$(DLLWRAP) -o $(shlib) --dllname $(shlib) --def $(NAME).def $(OBJS) $(SRCDIR)/utils/dllinit.o $(DLLINIT) $(SHLIB_LINK)
	$(DLLTOOL) --dllname $(shlib) --def $(NAME).def --output-lib lib$(NAME).a

$(SRCDIR)/utils/dllinit.o: $(SRCDIR)/utils/dllinit.c
	$(MAKE) -C $(SRCDIR)/utils dllinit.o

endif
endif

# Rules to install regular and shared libraries

.PHONY: all install-lib install-shlib

install-lib: lib$(NAME).a
	$(INSTALL) $(INSTL_LIB_OPTS) lib$(NAME).a $(LIBDIR)/lib$(NAME).a

install-shlib: $(shlib)
	$(INSTALL) $(INSTL_SHLIB_OPTS) $(shlib) $(LIBDIR)/$(shlib)
ifneq ($(PORTNAME), win)
	if [ "$(shlib)" != "lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION)" ]; then \
		cd $(LIBDIR); \
		rm -f lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION); \
		$(LN_S) $(shlib) lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION); \
	fi
	if [ "$(shlib)" != "lib$(NAME)$(DLSUFFIX)" ]; then \
		cd $(LIBDIR); \
		rm -f lib$(NAME)$(DLSUFFIX); \
		$(LN_S) $(shlib) lib$(NAME)$(DLSUFFIX); \
	fi
endif

# Rule to delete shared library during "make clean"

.PHONY: clean-shlib

clean-shlib:
	rm -f $(shlib) lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION) lib$(NAME)$(DLSUFFIX)