rules.mk (14312B)
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/. 6 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 ################################################################################ 40 41 ifndef topsrcdir 42 topsrcdir=$(MOD_DEPTH) 43 endif 44 45 ifndef srcdir 46 srcdir=. 47 endif 48 49 ifndef NSPR_CONFIG_MK 50 include $(topsrcdir)/config/config.mk 51 endif 52 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 64 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 # 75 76 ifdef LIBRARY_NAME 77 ifeq (,$(filter-out WINNT WINCE,$(OS_ARCH))) 78 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,$(OS_TARGET))) 84 SHARED_LIBRARY = $(OBJDIR)/$(LIBRARY_NAME)$(LIBRARY_VERSION).$(DLL_SUFFIX) 85 SHARED_LIB_PDB = $(OBJDIR)/$(LIBRARY_NAME)$(LIBRARY_VERSION).pdb 86 ifdef MSC_VER 87 LIBRARY = $(OBJDIR)/$(LIBRARY_NAME)$(LIBRARY_VERSION)_s.$(LIB_SUFFIX) 88 IMPORT_LIBRARY = $(OBJDIR)/$(LIBRARY_NAME)$(LIBRARY_VERSION).$(LIB_SUFFIX) 89 else 90 LIBRARY = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION)_s.$(LIB_SUFFIX) 91 IMPORT_LIBRARY = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION).$(LIB_SUFFIX) 92 endif 93 else 94 SHARED_LIBRARY = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION).$(DLL_SUFFIX) 95 SHARED_LIB_PDB = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION).pdb 96 LIBRARY = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION)_s.$(LIB_SUFFIX) 97 IMPORT_LIBRARY = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION).$(LIB_SUFFIX) 98 endif 99 100 else 101 102 LIBRARY = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION).$(LIB_SUFFIX) 103 ifeq ($(OS_ARCH)$(OS_RELEASE), AIX4.1) 104 SHARED_LIBRARY = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION)_shr.a 105 else 106 ifdef MKSHLIB 107 SHARED_LIBRARY = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION).$(DLL_SUFFIX) 108 endif 109 endif 110 111 endif 112 endif 113 114 ifndef TARGETS 115 ifeq (,$(filter-out WINNT WINCE,$(OS_ARCH))) 116 TARGETS = $(LIBRARY) $(SHARED_LIBRARY) $(IMPORT_LIBRARY) 117 ifdef MOZ_DEBUG_SYMBOLS 118 ifdef MSC_VER 119 ifneq (,$(filter-out 1100 1200,$(MSC_VER))) 120 TARGETS += $(SHARED_LIB_PDB) 121 endif 122 endif 123 endif 124 else 125 TARGETS = $(LIBRARY) $(SHARED_LIBRARY) 126 endif 127 endif 128 129 # 130 # OBJS is the list of object files. It can be constructed by 131 # specifying CSRCS (list of C source files) and ASFILES (list 132 # of assembly language source files). 133 # 134 135 ifndef OBJS 136 OBJS = $(addprefix $(OBJDIR)/,$(CSRCS:.c=.$(OBJ_SUFFIX))) \ 137 $(addprefix $(OBJDIR)/,$(ASFILES:.$(ASM_SUFFIX)=.$(OBJ_SUFFIX))) 138 endif 139 140 ALL_TRASH = $(TARGETS) $(OBJS) $(RES) $(filter-out . .., $(OBJDIR)) LOGS TAGS $(GARBAGE) \ 141 $(NOSUCHFILE) \ 142 $(OBJS:.$(OBJ_SUFFIX)=.i_o) \ 143 so_locations 144 145 ifndef RELEASE_LIBS_DEST 146 RELEASE_LIBS_DEST = $(RELEASE_LIB_DIR) 147 endif 148 149 define MAKE_IN_DIR 150 $(MAKE) -C $(dir) $@ 151 152 endef # do not remove the blank line! 153 154 ifdef DIRS 155 LOOP_OVER_DIRS = $(foreach dir,$(DIRS),$(MAKE_IN_DIR)) 156 endif 157 158 ################################################################################ 159 160 all:: export 161 162 export:: 163 +$(LOOP_OVER_DIRS) 164 165 libs:: export 166 167 clean:: 168 rm -rf $(OBJS) $(RES) so_locations $(NOSUCHFILE) $(GARBAGE) 169 +$(LOOP_OVER_DIRS) 170 171 clobber:: 172 rm -rf $(OBJS) $(RES) $(TARGETS) $(filter-out . ..,$(OBJDIR)) $(GARBAGE) so_locations $(NOSUCHFILE) 173 +$(LOOP_OVER_DIRS) 174 175 realclean clobber_all:: 176 rm -rf $(wildcard *.OBJ *.OBJD) dist $(ALL_TRASH) 177 +$(LOOP_OVER_DIRS) 178 179 distclean:: 180 rm -rf $(wildcard *.OBJ *.OBJD) dist $(ALL_TRASH) $(DIST_GARBAGE) 181 +$(LOOP_OVER_DIRS) 182 183 install:: $(RELEASE_BINS) $(RELEASE_HEADERS) $(RELEASE_LIBS) 184 ifdef RELEASE_BINS 185 $(NSINSTALL) -t -m 0755 $(RELEASE_BINS) $(DESTDIR)$(bindir) 186 endif 187 ifdef RELEASE_HEADERS 188 $(NSINSTALL) -t -m 0644 $(RELEASE_HEADERS) $(DESTDIR)$(includedir)/$(include_subdir) 189 endif 190 ifdef RELEASE_LIBS 191 $(NSINSTALL) -t -m 0755 $(RELEASE_LIBS) $(DESTDIR)$(libdir)/$(lib_subdir) 192 endif 193 +$(LOOP_OVER_DIRS) 194 195 release:: export 196 ifdef RELEASE_BINS 197 @echo "Copying executable programs and scripts to release directory" 198 @if test -z "$(BUILD_NUMBER)"; then \ 199 echo "BUILD_NUMBER must be defined"; \ 200 false; \ 201 else \ 202 true; \ 203 fi 204 @if test ! -d $(RELEASE_BIN_DIR); then \ 205 rm -rf $(RELEASE_BIN_DIR); \ 206 $(NSINSTALL) -D $(RELEASE_BIN_DIR);\ 207 else \ 208 true; \ 209 fi 210 cp $(RELEASE_BINS) $(RELEASE_BIN_DIR) 211 endif 212 ifdef RELEASE_LIBS 213 @echo "Copying libraries to release directory" 214 @if test -z "$(BUILD_NUMBER)"; then \ 215 echo "BUILD_NUMBER must be defined"; \ 216 false; \ 217 else \ 218 true; \ 219 fi 220 @if test ! -d $(RELEASE_LIBS_DEST); then \ 221 rm -rf $(RELEASE_LIBS_DEST); \ 222 $(NSINSTALL) -D $(RELEASE_LIBS_DEST);\ 223 else \ 224 true; \ 225 fi 226 cp $(RELEASE_LIBS) $(RELEASE_LIBS_DEST) 227 endif 228 ifdef RELEASE_HEADERS 229 @echo "Copying header files to release directory" 230 @if test -z "$(BUILD_NUMBER)"; then \ 231 echo "BUILD_NUMBER must be defined"; \ 232 false; \ 233 else \ 234 true; \ 235 fi 236 @if test ! -d $(RELEASE_HEADERS_DEST); then \ 237 rm -rf $(RELEASE_HEADERS_DEST); \ 238 $(NSINSTALL) -D $(RELEASE_HEADERS_DEST);\ 239 else \ 240 true; \ 241 fi 242 cp $(RELEASE_HEADERS) $(RELEASE_HEADERS_DEST) 243 endif 244 +$(LOOP_OVER_DIRS) 245 246 alltags: 247 rm -f TAGS tags 248 find . -name dist -prune -o \( -name '*.[hc]' -o -name '*.cp' -o -name '*.cpp' \) -print | xargs etags -a 249 find . -name dist -prune -o \( -name '*.[hc]' -o -name '*.cp' -o -name '*.cpp' \) -print | xargs ctags -a 250 251 $(NFSPWD): 252 cd $(@D); $(MAKE) $(@F) 253 254 $(PROGRAM): $(OBJS) 255 @$(MAKE_OBJDIR) 256 ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT) 257 ifdef MOZ_PROFILE_USE 258 # In the second pass, we need to merge the pgc files into the pgd file. 259 # The compiler would do this for us automatically if they were in the right 260 # place, but they're in dist/bin. 261 python $(topsrcdir)/build/win32/pgomerge.py \ 262 $(notdir $(PROGRAM:.exe=)) $(DIST)/bin 263 endif # MOZ_PROFILE_USE 264 $(CC) $(OBJS) -Fe$@ -link $(LDFLAGS) $(OS_LIBS) $(EXTRA_LIBS) 265 ifdef MT 266 @if test -f $@.manifest; then \ 267 $(MT) -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;1; \ 268 rm -f $@.manifest; \ 269 fi 270 endif # MSVC with manifest tool 271 ifdef MOZ_PROFILE_GENERATE 272 # touch it a few seconds into the future to work around FAT's 273 # 2-second granularity 274 touch -t `date +%Y%m%d%H%M.%S -d "now+5seconds"` pgo.relink 275 endif # MOZ_PROFILE_GENERATE 276 else # WINNT && !GCC 277 $(CC) -o $@ $(CFLAGS) $(OBJS) $(LDFLAGS) $(WRAP_LDFLAGS) 278 endif # WINNT && !GCC 279 ifdef ENABLE_STRIP 280 $(STRIP) $@ 281 endif 282 283 # Same as OBJS, but without any file that matches p*vrsion.o, since these 284 # collide for static libraries, and are not useful for that case anyway. 285 STATICLIB_OBJS = $(filter-out $(OBJDIR)/p%vrsion.$(OBJ_SUFFIX),$(OBJS)) 286 $(LIBRARY): $(STATICLIB_OBJS) 287 @$(MAKE_OBJDIR) 288 rm -f $@ 289 $(AR) $(AR_FLAGS) $(STATICLIB_OBJS) $(AR_EXTRA_ARGS) 290 $(RANLIB) $@ 291 292 ifeq (,$(filter-out WIN95 WINCE WINMO,$(OS_TARGET))) 293 # PDBs and import libraries need to depend on the shared library to 294 # order dependencies properly. 295 $(IMPORT_LIBRARY): $(SHARED_LIBRARY) 296 $(SHARED_LIB_PDB): $(SHARED_LIBRARY) 297 endif 298 299 $(SHARED_LIBRARY): $(OBJS) $(RES) $(MAPFILE) 300 @$(MAKE_OBJDIR) 301 rm -f $@ 302 ifeq ($(OS_ARCH)$(OS_RELEASE), AIX4.1) 303 echo "#!" > $(OBJDIR)/lib$(LIBRARY_NAME)_syms 304 nm -B -C -g $(OBJS) \ 305 | awk '/ [T,D] / {print $$3}' \ 306 | sed -e 's/^\.//' \ 307 | sort -u >> $(OBJDIR)/lib$(LIBRARY_NAME)_syms 308 $(LD) $(XCFLAGS) -o $@ $(OBJS) -bE:$(OBJDIR)/lib$(LIBRARY_NAME)_syms \ 309 -bM:SRE -bnoentry $(OS_LIBS) $(EXTRA_LIBS) 310 else # AIX 4.1 311 ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT) 312 ifdef MOZ_PROFILE_USE 313 python $(topsrcdir)/build/win32/pgomerge.py \ 314 $(notdir $(SHARED_LIBRARY:.$(DLL_SUFFIX)=)) $(DIST)/bin 315 endif # MOZ_PROFILE_USE 316 $(LINK_DLL) -MAP $(DLLBASE) $(DLL_LIBS) $(EXTRA_LIBS) $(OBJS) $(RES) 317 ifdef MT 318 @if test -f $@.manifest; then \ 319 $(MT) -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;2; \ 320 rm -f $@.manifest; \ 321 fi 322 endif # MSVC with manifest tool 323 ifdef MOZ_PROFILE_GENERATE 324 touch -t `date +%Y%m%d%H%M.%S -d "now+5seconds"` pgo.relink 325 endif # MOZ_PROFILE_GENERATE 326 else # WINNT && !GCC 327 $(MKSHLIB) $(OBJS) $(RES) $(LDFLAGS) $(WRAP_LDFLAGS) $(EXTRA_LIBS) 328 endif # WINNT && !GCC 329 endif # AIX 4.1 330 ifdef ENABLE_STRIP 331 $(STRIP) $@ 332 endif 333 334 ################################################################################ 335 336 ifdef MOZ_PROFILE_USE 337 ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT) 338 # When building with PGO, we have to make sure to re-link 339 # in the MOZ_PROFILE_USE phase if we linked in the 340 # MOZ_PROFILE_GENERATE phase. We'll touch this pgo.relink 341 # file in the link rule in the GENERATE phase to indicate 342 # that we need a relink. 343 $(SHARED_LIBRARY): pgo.relink 344 345 $(PROGRAM): pgo.relink 346 347 endif # WINNT && !GCC 348 endif # MOZ_PROFILE_USE 349 350 ifneq (,$(MOZ_PROFILE_GENERATE)$(MOZ_PROFILE_USE)) 351 ifdef NS_USE_GCC 352 # Force rebuilding libraries and programs in both passes because each 353 # pass uses different object files. 354 $(PROGRAM) $(SHARED_LIBRARY) $(LIBRARY): FORCE 355 .PHONY: FORCE 356 endif 357 endif 358 359 ################################################################################ 360 361 ifdef MOZ_PROFILE_GENERATE 362 # Clean up profiling data during PROFILE_GENERATE phase 363 export:: 364 ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT) 365 $(foreach pgd,$(wildcard *.pgd),pgomgr -clear $(pgd);) 366 else 367 ifdef NS_USE_GCC 368 -$(RM) *.gcda 369 endif 370 endif 371 endif 372 373 ################################################################################ 374 375 ifeq ($(OS_ARCH),WINNT) 376 $(RES): $(RESNAME) 377 @$(MAKE_OBJDIR) 378 # The resource compiler does not understand the -U option. 379 ifdef NS_USE_GCC 380 $(RC) $(RCFLAGS) $(filter-out -U%,$(DEFINES)) $(INCLUDES:-I%=--include-dir %) -o $@ $< 381 else 382 $(RC) $(RCFLAGS) $(filter-out -U%,$(DEFINES)) $(INCLUDES) -Fo$@ $< 383 endif # GCC 384 @echo $(RES) finished 385 endif 386 387 $(MAPFILE): $(LIBRARY_NAME).def 388 @$(MAKE_OBJDIR) 389 ifeq ($(OS_ARCH),SunOS) 390 grep -v ';-' $< | \ 391 sed -e 's,;+,,' -e 's; DATA ;;' -e 's,;;,,' -e 's,;.*,;,' > $@ 392 endif 393 394 # 395 # Translate source filenames to absolute paths. This is required for 396 # debuggers under Windows to find source files automatically. 397 # 398 399 ifeq (,$(filter-out AIX,$(OS_ARCH))) 400 NEED_ABSOLUTE_PATH = 1 401 endif 402 403 ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT) 404 NEED_ABSOLUTE_PATH = 1 405 endif 406 407 ifdef NEED_ABSOLUTE_PATH 408 # The quotes allow absolute paths to contain spaces. 409 pr_abspath = "$(if $(findstring :,$(1)),$(1),$(if $(filter /%,$(1)),$(1),$(CURDIR)/$(1)))" 410 endif 411 412 $(OBJDIR)/%.$(OBJ_SUFFIX): %.cpp 413 @$(MAKE_OBJDIR) 414 ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT) 415 $(CCC) -Fo$@ -c $(CCCFLAGS) $(call pr_abspath,$<) 416 else 417 ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINCE) 418 $(CCC) -Fo$@ -c $(CCCFLAGS) $< 419 else 420 ifdef NEED_ABSOLUTE_PATH 421 $(CCC) -o $@ -c $(CCCFLAGS) $(call pr_abspath,$<) 422 else 423 $(CCC) -o $@ -c $(CCCFLAGS) $< 424 endif 425 endif 426 endif 427 428 WCCFLAGS1 = $(subst /,\\,$(CFLAGS)) 429 WCCFLAGS2 = $(subst -I,-i=,$(WCCFLAGS1)) 430 WCCFLAGS3 = $(subst -D,-d,$(WCCFLAGS2)) 431 $(OBJDIR)/%.$(OBJ_SUFFIX): %.c 432 @$(MAKE_OBJDIR) 433 ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT) 434 $(CC) -Fo$@ -c $(CFLAGS) $(call pr_abspath,$<) 435 else 436 ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINCE) 437 $(CC) -Fo$@ -c $(CFLAGS) $< 438 else 439 ifdef NEED_ABSOLUTE_PATH 440 $(CC) -o $@ -c $(CFLAGS) $(call pr_abspath,$<) 441 else 442 $(CC) -o $@ -c $(CFLAGS) $< 443 endif 444 endif 445 endif 446 447 448 $(OBJDIR)/%.$(OBJ_SUFFIX): %.s 449 @$(MAKE_OBJDIR) 450 $(AS) -o $@ $(ASFLAGS) -c $< 451 452 %.i: %.c 453 $(CC) -C -E $(CFLAGS) $< > $*.i 454 455 %: %.pl 456 rm -f $@; cp $< $@; chmod +x $@ 457 458 # 459 # HACK ALERT 460 # 461 # The only purpose of this rule is to pass Mozilla's Tinderbox depend 462 # builds (http://tinderbox.mozilla.org/showbuilds.cgi). Mozilla's 463 # Tinderbox builds NSPR continuously as part of the Mozilla client. 464 # Because NSPR's make depend is not implemented, whenever we change 465 # an NSPR header file, the depend build does not recompile the NSPR 466 # files that depend on the header. 467 # 468 # This rule makes all the objects depend on a dummy header file. 469 # Touch this dummy header file to force the depend build to recompile 470 # everything. 471 # 472 # This rule should be removed when make depend is implemented. 473 # 474 475 DUMMY_DEPEND_H = $(topsrcdir)/config/prdepend.h 476 477 $(filter $(OBJDIR)/%.$(OBJ_SUFFIX),$(OBJS)): $(OBJDIR)/%.$(OBJ_SUFFIX): $(DUMMY_DEPEND_H) 478 479 # END OF HACK 480 481 ################################################################################ 482 # Special gmake rules. 483 ################################################################################ 484 485 # 486 # Disallow parallel builds with MSVC < 8 since it can't open the PDB file in 487 # parallel. 488 # 489 ifeq (,$(filter-out 1200 1300 1310,$(MSC_VER))) 490 .NOTPARALLEL: 491 endif 492 493 # 494 # Re-define the list of default suffixes, so gmake won't have to churn through 495 # hundreds of built-in suffix rules for stuff we don't need. 496 # 497 .SUFFIXES: 498 .SUFFIXES: .a .$(OBJ_SUFFIX) .c .cpp .s .h .i .pl 499 500 # 501 # Fake targets. Always run these rules, even if a file/directory with that 502 # name already exists. 503 # 504 .PHONY: all alltags clean export install libs realclean release 505 506 # 507 # List the target pattern of an implicit rule as a dependency of the 508 # special target .PRECIOUS to preserve intermediate files made by 509 # implicit rules whose target patterns match that file's name. 510 # (See GNU Make documentation, Edition 0.51, May 1996, Sec. 10.4, 511 # p. 107.) 512 # 513 .PRECIOUS: $(OBJDIR)/%.$(OBJ_SUFFIX)