1#
2# This Source Code Form is subject to the terms of the Mozilla Public
3# License, v. 2.0. If a copy of the MPL was not distributed with this
4# file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
6#! gmake
7
8MOD_DEPTH	= ../..
9topsrcdir	= @top_srcdir@
10srcdir		= @srcdir@
11VPATH		= @srcdir@
12
13include $(MOD_DEPTH)/config/autoconf.mk
14
15include $(topsrcdir)/config/config.mk
16
17DIRS = io linking malloc md memory misc threads
18
19ifeq ($(USE_PTHREADS), 1)
20	DIRS += pthreads
21endif
22
23ifeq ($(USE_BTHREADS), 1)
24	DIRS += bthreads
25endif
26
27ifeq ($(USE_CPLUS), 1)
28	DIRS += cplus
29endif
30
31#
32# Define platform-dependent OS_LIBS
33#
34
35ifeq ($(OS_ARCH),SunOS)
36MAPFILE = $(OBJDIR)/nsprmap.sun
37GARBAGE += $(MAPFILE)
38ifdef NS_USE_GCC
39ifdef GCC_USE_GNU_LD
40MKSHLIB += -Wl,--version-script,$(MAPFILE)
41else
42MKSHLIB += -Wl,-M,$(MAPFILE)
43endif
44else
45MKSHLIB += -M $(MAPFILE)
46endif
47#
48# In Solaris 2.6 or earlier, -lrt is called -lposix4.
49#
50LIBRT_TEST=$(firstword $(sort 5.7 $(OS_RELEASE)))
51ifeq (5.7, $(LIBRT_TEST))
52LIBRT=-lrt
53else
54LIBRT=-lposix4
55endif
56
57ifdef USE_PTHREADS
58OS_LIBS			= -lpthread ${LIBRT} -lsocket -lnsl -ldl -lc
59else
60OS_LIBS			= -lsocket -lnsl -ldl -lc
61endif	# USE_PTHREADS
62ifeq ($(CPU_ARCH),sparc)
63ifndef USE_64
64DSO_LDOPTS	+= -Wl,-f,\$$ORIGIN/cpu/\$$ISALIST/lib$(ULTRASPARC_LIBRARY)$(LIBRARY_VERSION).so
65endif
66endif	# sparc
67endif	# SunOS
68
69ifeq ($(OS_ARCH), IRIX)
70ifeq ($(USE_PTHREADS), 1)
71OS_LIBS = -lpthread
72endif
73OS_LIBS += -lc
74endif
75
76ifeq ($(OS_ARCH),AIX)
77DSO_LDOPTS	+= -binitfini::_PR_Fini
78OS_LIBS		= -lodm -lcfg
79ifeq ($(CLASSIC_NSPR),1)
80ifeq ($(OS_RELEASE),4.1)
81OS_LIBS		+= -lsvld -lc
82else
83OS_LIBS		+= -ldl -lc
84endif
85else
86ifeq ($(OS_RELEASE),4.1)
87OS_LIBS		+= -lpthreads -lsvld -lC_r -lC -lc_r -lm /usr/lib/libc.a
88else
89OS_LIBS		+= -lpthreads -ldl -lC_r -lC -lc_r -lm /usr/lib/libc.a
90endif
91endif
92endif
93
94# On AIX, we override malloc in non-pthread versions.  On AIX 4.2 or
95# above, this requires that we use the rtl-enabled version of libc.a.
96ifeq ($(OS_ARCH),AIX)
97ifneq (,$(filter-out 3.2 4.1,$(OS_RELEASE)))
98ifneq ($(USE_PTHREADS),1)
99BUILD_AIX_RTL_LIBC = 1
100AIX_RTL_LIBC	= $(OBJDIR)/libc.a
101endif
102endif
103endif
104
105ifeq ($(OS_ARCH),OS2)
106MAPFILE = $(OBJDIR)/$(LIBRARY_NAME)$(LIBRARY_VERSION).def
107ADD_TO_DEF_FILE = cat $(srcdir)/os2extra.def >> $(MAPFILE)
108GARBAGE += $(MAPFILE)
109MKSHLIB += $(MAPFILE)
110endif
111
112ifeq ($(OS_ARCH),OSF1)
113ifeq ($(USE_PTHREADS), 1)
114OS_LIBS 	= -lpthread -lrt
115endif
116ifneq ($(OS_RELEASE),V2.0)
117OS_LIBS		+= -lc_r
118endif
119endif
120
121# Linux, GNU/Hurd, and GNU/kFreeBSD systems
122ifneq (,$(filter Linux GNU%,$(OS_ARCH)))
123ifeq ($(USE_PTHREADS), 1)
124ifeq ($(OS_TARGET),Android)
125# Android has no libpthread.so in NDK
126OS_LIBS		= -ldl
127else
128OS_LIBS		= -lpthread -ldl
129endif
130else
131OS_LIBS		= -ldl
132endif
133ifneq ($(OS_TARGET),Android)
134# Android has no librt - realtime functions are in libc
135OS_LIBS		+= -lrt
136endif
137endif
138
139ifeq ($(OS_ARCH),HP-UX)
140ifeq ($(USE_PTHREADS), 1)
141OS_LIBS 	= -lpthread -lrt
142endif
143ifeq ($(PTHREADS_USER), 1)
144OS_LIBS 	= -lpthread
145endif
146ifeq ($(basename $(OS_RELEASE)),A.09)
147OS_LIBS		+= -ldld -L/lib/pa1.1 -lm
148else
149OS_LIBS		+= -ldld -lm -lc
150endif
151ifneq ($(OS_TEST),ia64)
152ifndef USE_64
153DSO_LDOPTS	+= +I PR_HPUX10xInit
154endif
155endif
156endif
157
158ifeq ($(OS_ARCH),UNIXWARE)
159OS_LIBS		= -lsocket -lc
160endif
161
162ifeq ($(OS_ARCH),WINNT)
163ifdef NS_USE_GCC
164OS_LIBS		= -ladvapi32 -lws2_32 -lmswsock -lwinmm
165else
166OS_LIBS		= advapi32.lib ws2_32.lib mswsock.lib winmm.lib
167endif
168endif
169
170ifeq ($(OS_ARCH),WINCE)
171OS_LIBS		= ws2.lib
172endif
173
174ifeq ($(OS_TARGET),Android)
175OS_LIBS		+= -llog
176endif
177
178ifeq ($(OS_TARGET),MacOSX)
179OS_LIBS		= -framework CoreServices -framework CoreFoundation
180endif
181
182EXTRA_LIBS += $(OS_LIBS)
183
184#
185# Define platform-dependent OBJS
186#
187
188OBJS = \
189    $(OBJDIR)/prvrsion.$(OBJ_SUFFIX) \
190    io/$(OBJDIR)/prfdcach.$(OBJ_SUFFIX) \
191    io/$(OBJDIR)/prmwait.$(OBJ_SUFFIX) \
192    io/$(OBJDIR)/prmapopt.$(OBJ_SUFFIX) \
193    io/$(OBJDIR)/priometh.$(OBJ_SUFFIX) \
194    io/$(OBJDIR)/pripv6.$(OBJ_SUFFIX) \
195    io/$(OBJDIR)/prlayer.$(OBJ_SUFFIX) \
196    io/$(OBJDIR)/prlog.$(OBJ_SUFFIX) \
197    io/$(OBJDIR)/prmmap.$(OBJ_SUFFIX) \
198    io/$(OBJDIR)/prpolevt.$(OBJ_SUFFIX) \
199    io/$(OBJDIR)/prprf.$(OBJ_SUFFIX) \
200    io/$(OBJDIR)/prscanf.$(OBJ_SUFFIX) \
201    io/$(OBJDIR)/prstdio.$(OBJ_SUFFIX) \
202    threads/$(OBJDIR)/prcmon.$(OBJ_SUFFIX) \
203	threads/$(OBJDIR)/prrwlock.$(OBJ_SUFFIX) \
204	threads/$(OBJDIR)/prtpd.$(OBJ_SUFFIX) \
205    linking/$(OBJDIR)/prlink.$(OBJ_SUFFIX) \
206    malloc/$(OBJDIR)/prmalloc.$(OBJ_SUFFIX) \
207    malloc/$(OBJDIR)/prmem.$(OBJ_SUFFIX) \
208    md/$(OBJDIR)/prosdep.$(OBJ_SUFFIX) \
209    memory/$(OBJDIR)/prshm.$(OBJ_SUFFIX) \
210    memory/$(OBJDIR)/prshma.$(OBJ_SUFFIX) \
211    memory/$(OBJDIR)/prseg.$(OBJ_SUFFIX) \
212    misc/$(OBJDIR)/pralarm.$(OBJ_SUFFIX) \
213    misc/$(OBJDIR)/pratom.$(OBJ_SUFFIX) \
214    misc/$(OBJDIR)/prcountr.$(OBJ_SUFFIX) \
215    misc/$(OBJDIR)/prdtoa.$(OBJ_SUFFIX) \
216    misc/$(OBJDIR)/prenv.$(OBJ_SUFFIX) \
217    misc/$(OBJDIR)/prerr.$(OBJ_SUFFIX) \
218    misc/$(OBJDIR)/prerror.$(OBJ_SUFFIX) \
219    misc/$(OBJDIR)/prerrortable.$(OBJ_SUFFIX) \
220    misc/$(OBJDIR)/prinit.$(OBJ_SUFFIX) \
221    misc/$(OBJDIR)/prinrval.$(OBJ_SUFFIX) \
222    misc/$(OBJDIR)/pripc.$(OBJ_SUFFIX) \
223    misc/$(OBJDIR)/prlog2.$(OBJ_SUFFIX) \
224    misc/$(OBJDIR)/prlong.$(OBJ_SUFFIX) \
225    misc/$(OBJDIR)/prnetdb.$(OBJ_SUFFIX) \
226    misc/$(OBJDIR)/praton.$(OBJ_SUFFIX) \
227    misc/$(OBJDIR)/prolock.$(OBJ_SUFFIX)	 \
228    misc/$(OBJDIR)/prrng.$(OBJ_SUFFIX)	 \
229    misc/$(OBJDIR)/prsystem.$(OBJ_SUFFIX) \
230    misc/$(OBJDIR)/prthinfo.$(OBJ_SUFFIX) \
231    misc/$(OBJDIR)/prtpool.$(OBJ_SUFFIX) \
232    misc/$(OBJDIR)/prtrace.$(OBJ_SUFFIX) \
233    misc/$(OBJDIR)/prtime.$(OBJ_SUFFIX)
234
235ifdef USE_PTHREADS
236OBJS += \
237    pthreads/$(OBJDIR)/ptsynch.$(OBJ_SUFFIX) \
238    pthreads/$(OBJDIR)/ptio.$(OBJ_SUFFIX) \
239    pthreads/$(OBJDIR)/ptthread.$(OBJ_SUFFIX) \
240    pthreads/$(OBJDIR)/ptmisc.$(OBJ_SUFFIX)
241else
242OBJS += \
243    io/$(OBJDIR)/prdir.$(OBJ_SUFFIX) \
244    io/$(OBJDIR)/prfile.$(OBJ_SUFFIX) \
245    io/$(OBJDIR)/prio.$(OBJ_SUFFIX) \
246    io/$(OBJDIR)/prsocket.$(OBJ_SUFFIX) \
247    misc/$(OBJDIR)/pripcsem.$(OBJ_SUFFIX)
248
249ifndef USE_BTHREADS
250OBJS += \
251	threads/$(OBJDIR)/prcthr.$(OBJ_SUFFIX) \
252	threads/$(OBJDIR)/prdump.$(OBJ_SUFFIX) \
253	threads/$(OBJDIR)/prmon.$(OBJ_SUFFIX) \
254	threads/$(OBJDIR)/prsem.$(OBJ_SUFFIX) \
255	threads/combined/$(OBJDIR)/prucpu.$(OBJ_SUFFIX) \
256	threads/combined/$(OBJDIR)/prucv.$(OBJ_SUFFIX) \
257	threads/combined/$(OBJDIR)/prulock.$(OBJ_SUFFIX) \
258	threads/combined/$(OBJDIR)/prustack.$(OBJ_SUFFIX) \
259	threads/combined/$(OBJDIR)/pruthr.$(OBJ_SUFFIX)
260endif
261
262endif
263
264ifeq ($(USE_CPLUS), 1)
265OBJS += \
266	cplus/$(OBJDIR)/rcbase.$(OBJ_SUFFIX) \
267	cplus/$(OBJDIR)/rccv.$(OBJ_SUFFIX) \
268	cplus/$(OBJDIR)/rcfileio.$(OBJ_SUFFIX) \
269	cplus/$(OBJDIR)/rcinrval.$(OBJ_SUFFIX) \
270	cplus/$(OBJDIR)/rcio.$(OBJ_SUFFIX) \
271	cplus/$(OBJDIR)/rclock.$(OBJ_SUFFIX) \
272	cplus/$(OBJDIR)/rcnetdb.$(OBJ_SUFFIX) \
273	cplus/$(OBJDIR)/rcnetio.$(OBJ_SUFFIX) \
274	cplus/$(OBJDIR)/rcthread.$(OBJ_SUFFIX) \
275	cplus/$(OBJDIR)/rctime.$(OBJ_SUFFIX)
276endif
277
278ifeq ($(OS_ARCH), WINNT)
279RES=$(OBJDIR)/nspr.res
280RESNAME=nspr.rc
281endif # WINNT
282
283include $(srcdir)/md/$(PR_MD_ARCH_DIR)/objs.mk
284ifdef USE_BTHREADS
285include $(srcdir)/bthreads/objs.mk
286endif
287
288LIBRARY_NAME = nspr
289LIBRARY_VERSION = $(MOD_MAJOR_VERSION)
290
291RELEASE_LIBS = $(TARGETS)
292
293include $(topsrcdir)/config/rules.mk
294
295ifeq ($(BUILD_AIX_RTL_LIBC),1)
296TARGETS		+= $(AIX_RTL_LIBC)
297# XXX is this a shared library?
298endif
299
300#
301# Version information generation (begin)
302#
303ECHO = echo
304INCLUDES = -I$(dist_includedir) -I$(topsrcdir)/pr/include -I$(topsrcdir)/pr/include/private
305TINC = $(OBJDIR)/_pr_bld.h
306
307ifeq ($(OS_TARGET),OS2)
308PROD = nspr$(MOD_MAJOR_VERSION).$(DLL_SUFFIX)
309else
310PROD = $(notdir $(SHARED_LIBRARY))
311endif
312
313NOW = $(MOD_DEPTH)/config/$(OBJDIR)/now
314SH_DATE = $(shell date "+%Y-%m-%d %T")
315SH_NOW = $(shell $(NOW))
316
317ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT)
318	SUF = i64
319else
320	SUF = LL
321endif
322
323DEFINES		+= -D_NSPR_BUILD_
324
325GARBAGE += $(TINC)
326
327$(TINC):
328	@$(MAKE_OBJDIR)
329	@$(ECHO) '#define _BUILD_STRING "$(SH_DATE)"' > $(TINC)
330	@if test ! -z "$(SH_NOW)"; then \
331	    $(ECHO) '#define _BUILD_TIME $(SH_NOW)$(SUF)' >> $(TINC); \
332	else \
333	    true; \
334	fi
335	@$(ECHO) '#define _PRODUCTION "$(PROD)"' >> $(TINC)
336
337
338$(OBJDIR)/prvrsion.$(OBJ_SUFFIX): prvrsion.c $(TINC)
339ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT)
340	$(CC) -Fo$@ -c $(CFLAGS) -I$(OBJDIR) $<
341else
342	$(CC) -o $@ -c $(CFLAGS) -I$(OBJDIR) $<
343endif
344#
345# Version information generation (end)
346#
347
348
349# We use a 'build' target here to ensure that we build $(TARGETS) after
350# looping over $(DIRS) to create the object files in a parallel build.
351# Recipe commands are executed sequentially in a parallel build while
352# target dependencies are executed in parallel.
353export::
354	$(MAKE) build
355
356#
357# The Client build wants the shared libraries in $(dist_bindir)
358# so we also install them there.
359#
360
361build:: $(TARGETS)
362	$(INSTALL) -m 444 $(TARGETS) $(dist_libdir)
363ifdef SHARED_LIBRARY
364ifeq ($(OS_ARCH),HP-UX)
365	$(INSTALL) -m 755 $(SHARED_LIBRARY) $(dist_libdir)
366	$(INSTALL) -m 755 $(SHARED_LIBRARY) $(dist_bindir)
367else
368	$(INSTALL) -m 444 $(SHARED_LIBRARY) $(dist_bindir)
369endif
370endif
371
372ifeq ($(BUILD_AIX_RTL_LIBC),1)
373$(AIX_RTL_LIBC): /usr/ccs/lib/libc.a
374	rtl_enable -o $@ $<
375endif
376