Tue, 06 Jan 2015 21:39:09 +0100
Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.
1 #! gmake
2 #
3 # This Source Code Form is subject to the terms of the Mozilla Public
4 # License, v. 2.0. If a copy of the MPL was not distributed with this
5 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 ################################################################################
8 # We used to have a 4 pass build process. Now we do everything in one pass.
9 #
10 # export - Create generated headers and stubs. Publish public headers to
11 # dist/<arch>/include.
12 # Create libraries. Publish libraries to dist/<arch>/lib.
13 # Create programs.
14 #
15 # libs - obsolete. Now a synonym of "export".
16 #
17 # all - the default makefile target. Now a synonym of "export".
18 #
19 # install - Install headers, libraries, and programs on the system.
20 #
21 # Parameters to this makefile (set these before including):
22 #
23 # a)
24 # TARGETS -- the target to create
25 # (defaults to $LIBRARY $PROGRAM)
26 # b)
27 # DIRS -- subdirectories for make to recurse on
28 # (the 'all' rule builds $TARGETS $DIRS)
29 # c)
30 # CSRCS -- .c files to compile
31 # (used to define $OBJS)
32 # d)
33 # PROGRAM -- the target program name to create from $OBJS
34 # ($OBJDIR automatically prepended to it)
35 # e)
36 # LIBRARY -- the target library name to create from $OBJS
37 # ($OBJDIR automatically prepended to it)
38 #
39 ################################################################################
41 ifndef topsrcdir
42 topsrcdir=$(MOD_DEPTH)
43 endif
45 ifndef srcdir
46 srcdir=.
47 endif
49 ifndef NSPR_CONFIG_MK
50 include $(topsrcdir)/config/config.mk
51 endif
53 ifdef USE_AUTOCONF
54 ifdef CROSS_COMPILE
55 ifdef INTERNAL_TOOLS
56 CC=$(HOST_CC)
57 CCC=$(HOST_CXX)
58 CFLAGS=$(HOST_CFLAGS)
59 CXXFLAGS=$(HOST_CXXFLAGS)
60 LDFLAGS=$(HOST_LDFLAGS)
61 endif
62 endif
63 endif
65 #
66 # This makefile contains rules for building the following kinds of
67 # libraries:
68 # - LIBRARY: a static (archival) library
69 # - SHARED_LIBRARY: a shared (dynamic link) library
70 # - IMPORT_LIBRARY: an import library, used only on Windows and OS/2
71 #
72 # The names of these libraries can be generated by simply specifying
73 # LIBRARY_NAME and LIBRARY_VERSION.
74 #
76 ifdef LIBRARY_NAME
77 ifeq (,$(filter-out WINNT WINCE OS2,$(OS_ARCH)))
79 #
80 # Win95 and OS/2 require library names conforming to the 8.3 rule.
81 # other platforms do not.
82 #
83 ifeq (,$(filter-out WIN95 WINCE WINMO OS2,$(OS_TARGET)))
84 LIBRARY = $(OBJDIR)/$(LIBRARY_NAME)$(LIBRARY_VERSION)_s.$(LIB_SUFFIX)
85 SHARED_LIBRARY = $(OBJDIR)/$(LIBRARY_NAME)$(LIBRARY_VERSION).$(DLL_SUFFIX)
86 IMPORT_LIBRARY = $(OBJDIR)/$(LIBRARY_NAME)$(LIBRARY_VERSION).$(LIB_SUFFIX)
87 SHARED_LIB_PDB = $(OBJDIR)/$(LIBRARY_NAME)$(LIBRARY_VERSION).pdb
88 else
89 LIBRARY = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION)_s.$(LIB_SUFFIX)
90 SHARED_LIBRARY = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION).$(DLL_SUFFIX)
91 IMPORT_LIBRARY = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION).$(LIB_SUFFIX)
92 SHARED_LIB_PDB = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION).pdb
93 endif
95 else
97 LIBRARY = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION).$(LIB_SUFFIX)
98 ifeq ($(OS_ARCH)$(OS_RELEASE), AIX4.1)
99 SHARED_LIBRARY = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION)_shr.a
100 else
101 ifdef MKSHLIB
102 SHARED_LIBRARY = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION).$(DLL_SUFFIX)
103 endif
104 endif
106 endif
107 endif
109 ifndef TARGETS
110 ifeq (,$(filter-out WINNT WINCE OS2,$(OS_ARCH)))
111 TARGETS = $(LIBRARY) $(SHARED_LIBRARY) $(IMPORT_LIBRARY)
112 ifdef MOZ_DEBUG_SYMBOLS
113 ifdef MSC_VER
114 ifneq (,$(filter-out 1100 1200,$(MSC_VER)))
115 TARGETS += $(SHARED_LIB_PDB)
116 endif
117 endif
118 endif
119 else
120 TARGETS = $(LIBRARY) $(SHARED_LIBRARY)
121 endif
122 endif
124 #
125 # OBJS is the list of object files. It can be constructed by
126 # specifying CSRCS (list of C source files) and ASFILES (list
127 # of assembly language source files).
128 #
130 ifndef OBJS
131 OBJS = $(addprefix $(OBJDIR)/,$(CSRCS:.c=.$(OBJ_SUFFIX))) \
132 $(addprefix $(OBJDIR)/,$(ASFILES:.$(ASM_SUFFIX)=.$(OBJ_SUFFIX)))
133 endif
135 ALL_TRASH = $(TARGETS) $(OBJS) $(RES) $(filter-out . .., $(OBJDIR)) LOGS TAGS $(GARBAGE) \
136 $(NOSUCHFILE) \
137 $(OBJS:.$(OBJ_SUFFIX)=.i_o) \
138 so_locations
140 ifndef RELEASE_LIBS_DEST
141 RELEASE_LIBS_DEST = $(RELEASE_LIB_DIR)
142 endif
144 define MAKE_IN_DIR
145 $(MAKE) -C $(dir) $@
147 endef # do not remove the blank line!
149 ifdef DIRS
150 LOOP_OVER_DIRS = $(foreach dir,$(DIRS),$(MAKE_IN_DIR))
151 endif
153 ################################################################################
155 all:: export
157 export::
158 +$(LOOP_OVER_DIRS)
160 libs:: export
162 clean::
163 rm -rf $(OBJS) $(RES) so_locations $(NOSUCHFILE) $(GARBAGE)
164 +$(LOOP_OVER_DIRS)
166 clobber::
167 rm -rf $(OBJS) $(RES) $(TARGETS) $(filter-out . ..,$(OBJDIR)) $(GARBAGE) so_locations $(NOSUCHFILE)
168 +$(LOOP_OVER_DIRS)
170 realclean clobber_all::
171 rm -rf $(wildcard *.OBJ *.OBJD) dist $(ALL_TRASH)
172 +$(LOOP_OVER_DIRS)
174 distclean::
175 rm -rf $(wildcard *.OBJ *.OBJD) dist $(ALL_TRASH) $(DIST_GARBAGE)
176 +$(LOOP_OVER_DIRS)
178 install:: $(RELEASE_BINS) $(RELEASE_HEADERS) $(RELEASE_LIBS)
179 ifdef RELEASE_BINS
180 $(NSINSTALL) -t -m 0755 $(RELEASE_BINS) $(DESTDIR)$(bindir)
181 endif
182 ifdef RELEASE_HEADERS
183 $(NSINSTALL) -t -m 0644 $(RELEASE_HEADERS) $(DESTDIR)$(includedir)/$(include_subdir)
184 endif
185 ifdef RELEASE_LIBS
186 $(NSINSTALL) -t -m 0755 $(RELEASE_LIBS) $(DESTDIR)$(libdir)/$(lib_subdir)
187 endif
188 +$(LOOP_OVER_DIRS)
190 release:: export
191 ifdef RELEASE_BINS
192 @echo "Copying executable programs and scripts to release directory"
193 @if test -z "$(BUILD_NUMBER)"; then \
194 echo "BUILD_NUMBER must be defined"; \
195 false; \
196 else \
197 true; \
198 fi
199 @if test ! -d $(RELEASE_BIN_DIR); then \
200 rm -rf $(RELEASE_BIN_DIR); \
201 $(NSINSTALL) -D $(RELEASE_BIN_DIR);\
202 else \
203 true; \
204 fi
205 cp $(RELEASE_BINS) $(RELEASE_BIN_DIR)
206 endif
207 ifdef RELEASE_LIBS
208 @echo "Copying libraries to release directory"
209 @if test -z "$(BUILD_NUMBER)"; then \
210 echo "BUILD_NUMBER must be defined"; \
211 false; \
212 else \
213 true; \
214 fi
215 @if test ! -d $(RELEASE_LIBS_DEST); then \
216 rm -rf $(RELEASE_LIBS_DEST); \
217 $(NSINSTALL) -D $(RELEASE_LIBS_DEST);\
218 else \
219 true; \
220 fi
221 cp $(RELEASE_LIBS) $(RELEASE_LIBS_DEST)
222 endif
223 ifdef RELEASE_HEADERS
224 @echo "Copying header files to release directory"
225 @if test -z "$(BUILD_NUMBER)"; then \
226 echo "BUILD_NUMBER must be defined"; \
227 false; \
228 else \
229 true; \
230 fi
231 @if test ! -d $(RELEASE_HEADERS_DEST); then \
232 rm -rf $(RELEASE_HEADERS_DEST); \
233 $(NSINSTALL) -D $(RELEASE_HEADERS_DEST);\
234 else \
235 true; \
236 fi
237 cp $(RELEASE_HEADERS) $(RELEASE_HEADERS_DEST)
238 endif
239 +$(LOOP_OVER_DIRS)
241 alltags:
242 rm -f TAGS tags
243 find . -name dist -prune -o \( -name '*.[hc]' -o -name '*.cp' -o -name '*.cpp' \) -print | xargs etags -a
244 find . -name dist -prune -o \( -name '*.[hc]' -o -name '*.cp' -o -name '*.cpp' \) -print | xargs ctags -a
246 $(NFSPWD):
247 cd $(@D); $(MAKE) $(@F)
249 $(PROGRAM): $(OBJS)
250 @$(MAKE_OBJDIR)
251 ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT)
252 ifdef MOZ_PROFILE_USE
253 # In the second pass, we need to merge the pgc files into the pgd file.
254 # The compiler would do this for us automatically if they were in the right
255 # place, but they're in dist/bin.
256 python $(topsrcdir)/build/win32/pgomerge.py \
257 $(notdir $(PROGRAM:.exe=)) $(DIST)/bin
258 endif # MOZ_PROFILE_USE
259 $(CC) $(OBJS) -Fe$@ -link $(LDFLAGS) $(OS_LIBS) $(EXTRA_LIBS)
260 ifdef MT
261 @if test -f $@.manifest; then \
262 $(MT) -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;1; \
263 rm -f $@.manifest; \
264 fi
265 endif # MSVC with manifest tool
266 ifdef MOZ_PROFILE_GENERATE
267 # touch it a few seconds into the future to work around FAT's
268 # 2-second granularity
269 touch -t `date +%Y%m%d%H%M.%S -d "now+5seconds"` pgo.relink
270 endif # MOZ_PROFILE_GENERATE
271 else # WINNT && !GCC
272 $(CC) -o $@ $(CFLAGS) $(OBJS) $(LDFLAGS) $(WRAP_LDFLAGS)
273 endif # WINNT && !GCC
274 ifdef ENABLE_STRIP
275 $(STRIP) $@
276 endif
278 $(LIBRARY): $(OBJS)
279 @$(MAKE_OBJDIR)
280 rm -f $@
281 $(AR) $(AR_FLAGS) $(OBJS) $(AR_EXTRA_ARGS)
282 $(RANLIB) $@
284 ifeq ($(OS_TARGET), OS2)
285 $(IMPORT_LIBRARY): $(MAPFILE)
286 rm -f $@
287 $(IMPLIB) $@ $(MAPFILE)
288 else
289 ifeq (,$(filter-out WIN95 WINCE WINMO,$(OS_TARGET)))
290 # PDBs and import libraries need to depend on the shared library to
291 # order dependencies properly.
292 $(IMPORT_LIBRARY): $(SHARED_LIBRARY)
293 $(SHARED_LIB_PDB): $(SHARED_LIBRARY)
294 endif
295 endif
297 $(SHARED_LIBRARY): $(OBJS) $(RES) $(MAPFILE)
298 @$(MAKE_OBJDIR)
299 rm -f $@
300 ifeq ($(OS_ARCH)$(OS_RELEASE), AIX4.1)
301 echo "#!" > $(OBJDIR)/lib$(LIBRARY_NAME)_syms
302 nm -B -C -g $(OBJS) \
303 | awk '/ [T,D] / {print $$3}' \
304 | sed -e 's/^\.//' \
305 | sort -u >> $(OBJDIR)/lib$(LIBRARY_NAME)_syms
306 $(LD) $(XCFLAGS) -o $@ $(OBJS) -bE:$(OBJDIR)/lib$(LIBRARY_NAME)_syms \
307 -bM:SRE -bnoentry $(OS_LIBS) $(EXTRA_LIBS)
308 else # AIX 4.1
309 ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT)
310 ifdef MOZ_PROFILE_USE
311 python $(topsrcdir)/build/win32/pgomerge.py \
312 $(notdir $(SHARED_LIBRARY:.$(DLL_SUFFIX)=)) $(DIST)/bin
313 endif # MOZ_PROFILE_USE
314 $(LINK_DLL) -MAP $(DLLBASE) $(DLL_LIBS) $(EXTRA_LIBS) $(OBJS) $(RES)
315 ifdef MT
316 @if test -f $@.manifest; then \
317 $(MT) -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;2; \
318 rm -f $@.manifest; \
319 fi
320 endif # MSVC with manifest tool
321 ifdef MOZ_PROFILE_GENERATE
322 touch -t `date +%Y%m%d%H%M.%S -d "now+5seconds"` pgo.relink
323 endif # MOZ_PROFILE_GENERATE
324 else # WINNT && !GCC
325 $(MKSHLIB) $(OBJS) $(RES) $(LDFLAGS) $(WRAP_LDFLAGS) $(EXTRA_LIBS)
326 endif # WINNT && !GCC
327 endif # AIX 4.1
328 ifdef ENABLE_STRIP
329 $(STRIP) $@
330 endif
332 ################################################################################
334 ifdef MOZ_PROFILE_USE
335 ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT)
336 # When building with PGO, we have to make sure to re-link
337 # in the MOZ_PROFILE_USE phase if we linked in the
338 # MOZ_PROFILE_GENERATE phase. We'll touch this pgo.relink
339 # file in the link rule in the GENERATE phase to indicate
340 # that we need a relink.
341 $(SHARED_LIBRARY): pgo.relink
343 $(PROGRAM): pgo.relink
345 endif # WINNT && !GCC
346 endif # MOZ_PROFILE_USE
348 ifneq (,$(MOZ_PROFILE_GENERATE)$(MOZ_PROFILE_USE))
349 ifdef NS_USE_GCC
350 # Force rebuilding libraries and programs in both passes because each
351 # pass uses different object files.
352 $(PROGRAM) $(SHARED_LIBRARY) $(LIBRARY): FORCE
353 .PHONY: FORCE
354 endif
355 endif
357 ################################################################################
359 ifdef MOZ_PROFILE_GENERATE
360 # Clean up profiling data during PROFILE_GENERATE phase
361 export::
362 ifeq ($(OS_ARCH)_$(NS_USE_GCC), WINNT_)
363 $(foreach pgd,$(wildcard *.pgd),pgomgr -clear $(pgd);)
364 else
365 ifdef NS_USE_GCC
366 -$(RM) *.gcda
367 endif
368 endif
369 endif
371 ################################################################################
373 ifeq ($(OS_ARCH),WINNT)
374 $(RES): $(RESNAME)
375 @$(MAKE_OBJDIR)
376 # The resource compiler does not understand the -U option.
377 ifdef NS_USE_GCC
378 $(RC) $(RCFLAGS) $(filter-out -U%,$(DEFINES)) $(INCLUDES:-I%=--include-dir %) -o $@ $<
379 else
380 $(RC) $(RCFLAGS) $(filter-out -U%,$(DEFINES)) $(INCLUDES) -Fo$@ $<
381 endif # GCC
382 @echo $(RES) finished
383 endif
385 $(MAPFILE): $(LIBRARY_NAME).def
386 @$(MAKE_OBJDIR)
387 ifeq ($(OS_ARCH),SunOS)
388 grep -v ';-' $< | \
389 sed -e 's,;+,,' -e 's; DATA ;;' -e 's,;;,,' -e 's,;.*,;,' > $@
390 endif
391 ifeq ($(OS_ARCH),OS2)
392 echo LIBRARY $(LIBRARY_NAME)$(LIBRARY_VERSION) INITINSTANCE TERMINSTANCE > $@
393 echo PROTMODE >> $@
394 echo CODE LOADONCALL MOVEABLE DISCARDABLE >> $@
395 echo DATA PRELOAD MOVEABLE MULTIPLE NONSHARED >> $@
396 echo EXPORTS >> $@
397 grep -v ';+' $< | grep -v ';-' | \
398 sed -e 's; DATA ;;' -e 's,;;,,' -e 's,;.*,,' -e 's,\([\t ]*\),\1_,' | \
399 awk 'BEGIN {ord=1;} { print($$0 " @" ord " RESIDENTNAME"); ord++;}' >> $@
400 $(ADD_TO_DEF_FILE)
401 endif
403 #
404 # Translate source filenames to absolute paths. This is required for
405 # debuggers under Windows and OS/2 to find source files automatically.
406 #
408 ifeq (,$(filter-out AIX OS2,$(OS_ARCH)))
409 NEED_ABSOLUTE_PATH = 1
410 endif
412 ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT)
413 NEED_ABSOLUTE_PATH = 1
414 endif
416 ifdef NEED_ABSOLUTE_PATH
417 # The quotes allow absolute paths to contain spaces.
418 pr_abspath = "$(if $(findstring :,$(1)),$(1),$(if $(filter /%,$(1)),$(1),$(CURDIR)/$(1)))"
419 endif
421 $(OBJDIR)/%.$(OBJ_SUFFIX): %.cpp
422 @$(MAKE_OBJDIR)
423 ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT)
424 $(CCC) -Fo$@ -c $(CCCFLAGS) $(call pr_abspath,$<)
425 else
426 ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINCE)
427 $(CCC) -Fo$@ -c $(CCCFLAGS) $<
428 else
429 ifdef NEED_ABSOLUTE_PATH
430 $(CCC) -o $@ -c $(CCCFLAGS) $(call pr_abspath,$<)
431 else
432 $(CCC) -o $@ -c $(CCCFLAGS) $<
433 endif
434 endif
435 endif
437 WCCFLAGS1 = $(subst /,\\,$(CFLAGS))
438 WCCFLAGS2 = $(subst -I,-i=,$(WCCFLAGS1))
439 WCCFLAGS3 = $(subst -D,-d,$(WCCFLAGS2))
440 $(OBJDIR)/%.$(OBJ_SUFFIX): %.c
441 @$(MAKE_OBJDIR)
442 ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT)
443 $(CC) -Fo$@ -c $(CFLAGS) $(call pr_abspath,$<)
444 else
445 ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINCE)
446 $(CC) -Fo$@ -c $(CFLAGS) $<
447 else
448 ifdef NEED_ABSOLUTE_PATH
449 $(CC) -o $@ -c $(CFLAGS) $(call pr_abspath,$<)
450 else
451 $(CC) -o $@ -c $(CFLAGS) $<
452 endif
453 endif
454 endif
457 $(OBJDIR)/%.$(OBJ_SUFFIX): %.s
458 @$(MAKE_OBJDIR)
459 $(AS) -o $@ $(ASFLAGS) -c $<
461 %.i: %.c
462 $(CC) -C -E $(CFLAGS) $< > $*.i
464 %: %.pl
465 rm -f $@; cp $< $@; chmod +x $@
467 #
468 # HACK ALERT
469 #
470 # The only purpose of this rule is to pass Mozilla's Tinderbox depend
471 # builds (http://tinderbox.mozilla.org/showbuilds.cgi). Mozilla's
472 # Tinderbox builds NSPR continuously as part of the Mozilla client.
473 # Because NSPR's make depend is not implemented, whenever we change
474 # an NSPR header file, the depend build does not recompile the NSPR
475 # files that depend on the header.
476 #
477 # This rule makes all the objects depend on a dummy header file.
478 # Touch this dummy header file to force the depend build to recompile
479 # everything.
480 #
481 # This rule should be removed when make depend is implemented.
482 #
484 DUMMY_DEPEND_H = $(topsrcdir)/config/prdepend.h
486 $(filter $(OBJDIR)/%.$(OBJ_SUFFIX),$(OBJS)): $(OBJDIR)/%.$(OBJ_SUFFIX): $(DUMMY_DEPEND_H)
488 # END OF HACK
490 ################################################################################
491 # Special gmake rules.
492 ################################################################################
494 #
495 # Disallow parallel builds with MSVC < 8 since it can't open the PDB file in
496 # parallel.
497 #
498 ifeq (,$(filter-out 1200 1300 1310,$(MSC_VER)))
499 .NOTPARALLEL:
500 endif
502 #
503 # Re-define the list of default suffixes, so gmake won't have to churn through
504 # hundreds of built-in suffix rules for stuff we don't need.
505 #
506 .SUFFIXES:
507 .SUFFIXES: .a .$(OBJ_SUFFIX) .c .cpp .s .h .i .pl
509 #
510 # Fake targets. Always run these rules, even if a file/directory with that
511 # name already exists.
512 #
513 .PHONY: all alltags clean export install libs realclean release
515 #
516 # List the target pattern of an implicit rule as a dependency of the
517 # special target .PRECIOUS to preserve intermediate files made by
518 # implicit rules whose target patterns match that file's name.
519 # (See GNU Make documentation, Edition 0.51, May 1996, Sec. 10.4,
520 # p. 107.)
521 #
522 .PRECIOUS: $(OBJDIR)/%.$(OBJ_SUFFIX)