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