123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531 |
- #! gmake
- #
- # This Source Code Form is subject to the terms of the Mozilla Public
- # License, v. 2.0. If a copy of the MPL was not distributed with this
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
- ################################################################################
- # We used to have a 4 pass build process. Now we do everything in one pass.
- #
- # export - Create generated headers and stubs. Publish public headers to
- # dist/<arch>/include.
- # Create libraries. Publish libraries to dist/<arch>/lib.
- # Create programs.
- #
- # libs - obsolete. Now a synonym of "export".
- #
- # all - the default makefile target. Now a synonym of "export".
- #
- # install - Install headers, libraries, and programs on the system.
- #
- # Parameters to this makefile (set these before including):
- #
- # a)
- # TARGETS -- the target to create
- # (defaults to $LIBRARY $PROGRAM)
- # b)
- # DIRS -- subdirectories for make to recurse on
- # (the 'all' rule builds $TARGETS $DIRS)
- # c)
- # CSRCS -- .c files to compile
- # (used to define $OBJS)
- # d)
- # PROGRAM -- the target program name to create from $OBJS
- # ($OBJDIR automatically prepended to it)
- # e)
- # LIBRARY -- the target library name to create from $OBJS
- # ($OBJDIR automatically prepended to it)
- #
- ################################################################################
- ifndef topsrcdir
- topsrcdir=$(MOD_DEPTH)
- endif
- ifndef srcdir
- srcdir=.
- endif
- ifndef NSPR_CONFIG_MK
- include $(topsrcdir)/config/config.mk
- endif
- ifdef USE_AUTOCONF
- ifdef CROSS_COMPILE
- ifdef INTERNAL_TOOLS
- CC=$(HOST_CC)
- CCC=$(HOST_CXX)
- CFLAGS=$(HOST_CFLAGS)
- CXXFLAGS=$(HOST_CXXFLAGS)
- LDFLAGS=$(HOST_LDFLAGS)
- endif
- endif
- endif
- #
- # This makefile contains rules for building the following kinds of
- # libraries:
- # - LIBRARY: a static (archival) library
- # - SHARED_LIBRARY: a shared (dynamic link) library
- # - IMPORT_LIBRARY: an import library, used only on Windows and OS/2
- #
- # The names of these libraries can be generated by simply specifying
- # LIBRARY_NAME and LIBRARY_VERSION.
- #
- ifdef LIBRARY_NAME
- ifeq (,$(filter-out WINNT WINCE OS2,$(OS_ARCH)))
- #
- # Win95 and OS/2 require library names conforming to the 8.3 rule.
- # other platforms do not.
- #
- ifeq (,$(filter-out WIN95 WINCE WINMO OS2,$(OS_TARGET)))
- SHARED_LIBRARY = $(OBJDIR)/$(LIBRARY_NAME)$(LIBRARY_VERSION).$(DLL_SUFFIX)
- SHARED_LIB_PDB = $(OBJDIR)/$(LIBRARY_NAME)$(LIBRARY_VERSION).pdb
- ifdef MSC_VER
- LIBRARY = $(OBJDIR)/$(LIBRARY_NAME)$(LIBRARY_VERSION)_s.$(LIB_SUFFIX)
- IMPORT_LIBRARY = $(OBJDIR)/$(LIBRARY_NAME)$(LIBRARY_VERSION).$(LIB_SUFFIX)
- else
- LIBRARY = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION)_s.$(LIB_SUFFIX)
- IMPORT_LIBRARY = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION).$(LIB_SUFFIX)
- endif
- else
- SHARED_LIBRARY = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION).$(DLL_SUFFIX)
- SHARED_LIB_PDB = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION).pdb
- LIBRARY = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION)_s.$(LIB_SUFFIX)
- IMPORT_LIBRARY = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION).$(LIB_SUFFIX)
- endif
- else
- LIBRARY = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION).$(LIB_SUFFIX)
- ifeq ($(OS_ARCH)$(OS_RELEASE), AIX4.1)
- SHARED_LIBRARY = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION)_shr.a
- else
- ifdef MKSHLIB
- SHARED_LIBRARY = $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION).$(DLL_SUFFIX)
- endif
- endif
- endif
- endif
- ifndef TARGETS
- ifeq (,$(filter-out WINNT WINCE OS2,$(OS_ARCH)))
- TARGETS = $(LIBRARY) $(SHARED_LIBRARY) $(IMPORT_LIBRARY)
- ifdef MOZ_DEBUG_SYMBOLS
- ifdef MSC_VER
- ifneq (,$(filter-out 1100 1200,$(MSC_VER)))
- TARGETS += $(SHARED_LIB_PDB)
- endif
- endif
- endif
- else
- TARGETS = $(LIBRARY) $(SHARED_LIBRARY)
- endif
- endif
- #
- # OBJS is the list of object files. It can be constructed by
- # specifying CSRCS (list of C source files) and ASFILES (list
- # of assembly language source files).
- #
- ifndef OBJS
- OBJS = $(addprefix $(OBJDIR)/,$(CSRCS:.c=.$(OBJ_SUFFIX))) \
- $(addprefix $(OBJDIR)/,$(ASFILES:.$(ASM_SUFFIX)=.$(OBJ_SUFFIX)))
- endif
- ALL_TRASH = $(TARGETS) $(OBJS) $(RES) $(filter-out . .., $(OBJDIR)) LOGS TAGS $(GARBAGE) \
- $(NOSUCHFILE) \
- $(OBJS:.$(OBJ_SUFFIX)=.i_o) \
- so_locations
- ifndef RELEASE_LIBS_DEST
- RELEASE_LIBS_DEST = $(RELEASE_LIB_DIR)
- endif
- define MAKE_IN_DIR
- $(MAKE) -C $(dir) $@
- endef # do not remove the blank line!
- ifdef DIRS
- LOOP_OVER_DIRS = $(foreach dir,$(DIRS),$(MAKE_IN_DIR))
- endif
- ################################################################################
- all:: export
- export::
- +$(LOOP_OVER_DIRS)
- libs:: export
- clean::
- rm -rf $(OBJS) $(RES) so_locations $(NOSUCHFILE) $(GARBAGE)
- +$(LOOP_OVER_DIRS)
- clobber::
- rm -rf $(OBJS) $(RES) $(TARGETS) $(filter-out . ..,$(OBJDIR)) $(GARBAGE) so_locations $(NOSUCHFILE)
- +$(LOOP_OVER_DIRS)
- realclean clobber_all::
- rm -rf $(wildcard *.OBJ *.OBJD) dist $(ALL_TRASH)
- +$(LOOP_OVER_DIRS)
- distclean::
- rm -rf $(wildcard *.OBJ *.OBJD) dist $(ALL_TRASH) $(DIST_GARBAGE)
- +$(LOOP_OVER_DIRS)
- install:: $(RELEASE_BINS) $(RELEASE_HEADERS) $(RELEASE_LIBS)
- ifdef RELEASE_BINS
- $(NSINSTALL) -t -m 0755 $(RELEASE_BINS) $(DESTDIR)$(bindir)
- endif
- ifdef RELEASE_HEADERS
- $(NSINSTALL) -t -m 0644 $(RELEASE_HEADERS) $(DESTDIR)$(includedir)/$(include_subdir)
- endif
- ifdef RELEASE_LIBS
- $(NSINSTALL) -t -m 0755 $(RELEASE_LIBS) $(DESTDIR)$(libdir)/$(lib_subdir)
- endif
- +$(LOOP_OVER_DIRS)
- release:: export
- ifdef RELEASE_BINS
- @echo "Copying executable programs and scripts to release directory"
- @if test -z "$(BUILD_NUMBER)"; then \
- echo "BUILD_NUMBER must be defined"; \
- false; \
- else \
- true; \
- fi
- @if test ! -d $(RELEASE_BIN_DIR); then \
- rm -rf $(RELEASE_BIN_DIR); \
- $(NSINSTALL) -D $(RELEASE_BIN_DIR);\
- else \
- true; \
- fi
- cp $(RELEASE_BINS) $(RELEASE_BIN_DIR)
- endif
- ifdef RELEASE_LIBS
- @echo "Copying libraries to release directory"
- @if test -z "$(BUILD_NUMBER)"; then \
- echo "BUILD_NUMBER must be defined"; \
- false; \
- else \
- true; \
- fi
- @if test ! -d $(RELEASE_LIBS_DEST); then \
- rm -rf $(RELEASE_LIBS_DEST); \
- $(NSINSTALL) -D $(RELEASE_LIBS_DEST);\
- else \
- true; \
- fi
- cp $(RELEASE_LIBS) $(RELEASE_LIBS_DEST)
- endif
- ifdef RELEASE_HEADERS
- @echo "Copying header files to release directory"
- @if test -z "$(BUILD_NUMBER)"; then \
- echo "BUILD_NUMBER must be defined"; \
- false; \
- else \
- true; \
- fi
- @if test ! -d $(RELEASE_HEADERS_DEST); then \
- rm -rf $(RELEASE_HEADERS_DEST); \
- $(NSINSTALL) -D $(RELEASE_HEADERS_DEST);\
- else \
- true; \
- fi
- cp $(RELEASE_HEADERS) $(RELEASE_HEADERS_DEST)
- endif
- +$(LOOP_OVER_DIRS)
- alltags:
- rm -f TAGS tags
- find . -name dist -prune -o \( -name '*.[hc]' -o -name '*.cp' -o -name '*.cpp' \) -print | xargs etags -a
- find . -name dist -prune -o \( -name '*.[hc]' -o -name '*.cp' -o -name '*.cpp' \) -print | xargs ctags -a
- $(NFSPWD):
- cd $(@D); $(MAKE) $(@F)
- $(PROGRAM): $(OBJS)
- @$(MAKE_OBJDIR)
- ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT)
- ifdef MOZ_PROFILE_USE
- # In the second pass, we need to merge the pgc files into the pgd file.
- # The compiler would do this for us automatically if they were in the right
- # place, but they're in dist/bin.
- python $(topsrcdir)/build/win32/pgomerge.py \
- $(notdir $(PROGRAM:.exe=)) $(DIST)/bin
- endif # MOZ_PROFILE_USE
- $(CC) $(OBJS) -Fe$@ -link $(LDFLAGS) $(OS_LIBS) $(EXTRA_LIBS)
- ifdef MT
- @if test -f $@.manifest; then \
- $(MT) -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;1; \
- rm -f $@.manifest; \
- fi
- endif # MSVC with manifest tool
- ifdef MOZ_PROFILE_GENERATE
- # touch it a few seconds into the future to work around FAT's
- # 2-second granularity
- touch -t `date +%Y%m%d%H%M.%S -d "now+5seconds"` pgo.relink
- endif # MOZ_PROFILE_GENERATE
- else # WINNT && !GCC
- $(CC) -o $@ $(CFLAGS) $(OBJS) $(LDFLAGS) $(WRAP_LDFLAGS)
- endif # WINNT && !GCC
- ifdef ENABLE_STRIP
- $(STRIP) $@
- endif
- # Same as OBJS, but without any file that matches p*vrsion.o, since these
- # collide for static libraries, and are not useful for that case anyway.
- STATICLIB_OBJS = $(filter-out $(OBJDIR)/p%vrsion.$(OBJ_SUFFIX),$(OBJS))
- $(LIBRARY): $(STATICLIB_OBJS)
- @$(MAKE_OBJDIR)
- rm -f $@
- $(AR) $(AR_FLAGS) $(STATICLIB_OBJS) $(AR_EXTRA_ARGS)
- $(RANLIB) $@
- ifeq ($(OS_TARGET), OS2)
- $(IMPORT_LIBRARY): $(MAPFILE)
- rm -f $@
- $(IMPLIB) $@ $(MAPFILE)
- else
- ifeq (,$(filter-out WIN95 WINCE WINMO,$(OS_TARGET)))
- # PDBs and import libraries need to depend on the shared library to
- # order dependencies properly.
- $(IMPORT_LIBRARY): $(SHARED_LIBRARY)
- $(SHARED_LIB_PDB): $(SHARED_LIBRARY)
- endif
- endif
- $(SHARED_LIBRARY): $(OBJS) $(RES) $(MAPFILE)
- @$(MAKE_OBJDIR)
- rm -f $@
- ifeq ($(OS_ARCH)$(OS_RELEASE), AIX4.1)
- echo "#!" > $(OBJDIR)/lib$(LIBRARY_NAME)_syms
- nm -B -C -g $(OBJS) \
- | awk '/ [T,D] / {print $$3}' \
- | sed -e 's/^\.//' \
- | sort -u >> $(OBJDIR)/lib$(LIBRARY_NAME)_syms
- $(LD) $(XCFLAGS) -o $@ $(OBJS) -bE:$(OBJDIR)/lib$(LIBRARY_NAME)_syms \
- -bM:SRE -bnoentry $(OS_LIBS) $(EXTRA_LIBS)
- else # AIX 4.1
- ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT)
- ifdef MOZ_PROFILE_USE
- python $(topsrcdir)/build/win32/pgomerge.py \
- $(notdir $(SHARED_LIBRARY:.$(DLL_SUFFIX)=)) $(DIST)/bin
- endif # MOZ_PROFILE_USE
- $(LINK_DLL) -MAP $(DLLBASE) $(DLL_LIBS) $(EXTRA_LIBS) $(OBJS) $(RES)
- ifdef MT
- @if test -f $@.manifest; then \
- $(MT) -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;2; \
- rm -f $@.manifest; \
- fi
- endif # MSVC with manifest tool
- ifdef MOZ_PROFILE_GENERATE
- touch -t `date +%Y%m%d%H%M.%S -d "now+5seconds"` pgo.relink
- endif # MOZ_PROFILE_GENERATE
- else # WINNT && !GCC
- $(MKSHLIB) $(OBJS) $(RES) $(LDFLAGS) $(WRAP_LDFLAGS) $(EXTRA_LIBS)
- endif # WINNT && !GCC
- endif # AIX 4.1
- ifdef ENABLE_STRIP
- $(STRIP) $@
- endif
- ################################################################################
- ifdef MOZ_PROFILE_USE
- ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT)
- # When building with PGO, we have to make sure to re-link
- # in the MOZ_PROFILE_USE phase if we linked in the
- # MOZ_PROFILE_GENERATE phase. We'll touch this pgo.relink
- # file in the link rule in the GENERATE phase to indicate
- # that we need a relink.
- $(SHARED_LIBRARY): pgo.relink
- $(PROGRAM): pgo.relink
- endif # WINNT && !GCC
- endif # MOZ_PROFILE_USE
- ifneq (,$(MOZ_PROFILE_GENERATE)$(MOZ_PROFILE_USE))
- ifdef NS_USE_GCC
- # Force rebuilding libraries and programs in both passes because each
- # pass uses different object files.
- $(PROGRAM) $(SHARED_LIBRARY) $(LIBRARY): FORCE
- .PHONY: FORCE
- endif
- endif
- ################################################################################
- ifdef MOZ_PROFILE_GENERATE
- # Clean up profiling data during PROFILE_GENERATE phase
- export::
- ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT)
- $(foreach pgd,$(wildcard *.pgd),pgomgr -clear $(pgd);)
- else
- ifdef NS_USE_GCC
- -$(RM) *.gcda
- endif
- endif
- endif
- ################################################################################
- ifeq ($(OS_ARCH),WINNT)
- $(RES): $(RESNAME)
- @$(MAKE_OBJDIR)
- # The resource compiler does not understand the -U option.
- ifdef NS_USE_GCC
- $(RC) $(RCFLAGS) $(filter-out -U%,$(DEFINES)) $(INCLUDES:-I%=--include-dir %) -o $@ $<
- else
- $(RC) $(RCFLAGS) $(filter-out -U%,$(DEFINES)) $(INCLUDES) -Fo$@ $<
- endif # GCC
- @echo $(RES) finished
- endif
- $(MAPFILE): $(LIBRARY_NAME).def
- @$(MAKE_OBJDIR)
- ifeq ($(OS_ARCH),SunOS)
- grep -v ';-' $< | \
- sed -e 's,;+,,' -e 's; DATA ;;' -e 's,;;,,' -e 's,;.*,;,' > $@
- endif
- ifeq ($(OS_ARCH),OS2)
- echo LIBRARY $(LIBRARY_NAME)$(LIBRARY_VERSION) INITINSTANCE TERMINSTANCE > $@
- echo PROTMODE >> $@
- echo CODE LOADONCALL MOVEABLE DISCARDABLE >> $@
- echo DATA PRELOAD MOVEABLE MULTIPLE NONSHARED >> $@
- echo EXPORTS >> $@
- grep -v ';+' $< | grep -v ';-' | \
- sed -e 's; DATA ;;' -e 's,;;,,' -e 's,;.*,,' -e 's,\([\t ]*\),\1_,' | \
- awk 'BEGIN {ord=1;} { print($$0 " @" ord " RESIDENTNAME"); ord++;}' >> $@
- $(ADD_TO_DEF_FILE)
- endif
- #
- # Translate source filenames to absolute paths. This is required for
- # debuggers under Windows and OS/2 to find source files automatically.
- #
- ifeq (,$(filter-out AIX OS2,$(OS_ARCH)))
- NEED_ABSOLUTE_PATH = 1
- endif
- ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT)
- NEED_ABSOLUTE_PATH = 1
- endif
- ifdef NEED_ABSOLUTE_PATH
- # The quotes allow absolute paths to contain spaces.
- pr_abspath = "$(if $(findstring :,$(1)),$(1),$(if $(filter /%,$(1)),$(1),$(CURDIR)/$(1)))"
- endif
- $(OBJDIR)/%.$(OBJ_SUFFIX): %.cpp
- @$(MAKE_OBJDIR)
- ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT)
- $(CCC) -Fo$@ -c $(CCCFLAGS) $(call pr_abspath,$<)
- else
- ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINCE)
- $(CCC) -Fo$@ -c $(CCCFLAGS) $<
- else
- ifdef NEED_ABSOLUTE_PATH
- $(CCC) -o $@ -c $(CCCFLAGS) $(call pr_abspath,$<)
- else
- $(CCC) -o $@ -c $(CCCFLAGS) $<
- endif
- endif
- endif
- WCCFLAGS1 = $(subst /,\\,$(CFLAGS))
- WCCFLAGS2 = $(subst -I,-i=,$(WCCFLAGS1))
- WCCFLAGS3 = $(subst -D,-d,$(WCCFLAGS2))
- $(OBJDIR)/%.$(OBJ_SUFFIX): %.c
- @$(MAKE_OBJDIR)
- ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT)
- $(CC) -Fo$@ -c $(CFLAGS) $(call pr_abspath,$<)
- else
- ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINCE)
- $(CC) -Fo$@ -c $(CFLAGS) $<
- else
- ifdef NEED_ABSOLUTE_PATH
- $(CC) -o $@ -c $(CFLAGS) $(call pr_abspath,$<)
- else
- $(CC) -o $@ -c $(CFLAGS) $<
- endif
- endif
- endif
- $(OBJDIR)/%.$(OBJ_SUFFIX): %.s
- @$(MAKE_OBJDIR)
- $(AS) -o $@ $(ASFLAGS) -c $<
- %.i: %.c
- $(CC) -C -E $(CFLAGS) $< > $*.i
- %: %.pl
- rm -f $@; cp $< $@; chmod +x $@
- #
- # HACK ALERT
- #
- # The only purpose of this rule is to pass Mozilla's Tinderbox depend
- # builds (http://tinderbox.mozilla.org/showbuilds.cgi). Mozilla's
- # Tinderbox builds NSPR continuously as part of the Mozilla client.
- # Because NSPR's make depend is not implemented, whenever we change
- # an NSPR header file, the depend build does not recompile the NSPR
- # files that depend on the header.
- #
- # This rule makes all the objects depend on a dummy header file.
- # Touch this dummy header file to force the depend build to recompile
- # everything.
- #
- # This rule should be removed when make depend is implemented.
- #
- DUMMY_DEPEND_H = $(topsrcdir)/config/prdepend.h
- $(filter $(OBJDIR)/%.$(OBJ_SUFFIX),$(OBJS)): $(OBJDIR)/%.$(OBJ_SUFFIX): $(DUMMY_DEPEND_H)
- # END OF HACK
- ################################################################################
- # Special gmake rules.
- ################################################################################
- #
- # Disallow parallel builds with MSVC < 8 since it can't open the PDB file in
- # parallel.
- #
- ifeq (,$(filter-out 1200 1300 1310,$(MSC_VER)))
- .NOTPARALLEL:
- endif
- #
- # Re-define the list of default suffixes, so gmake won't have to churn through
- # hundreds of built-in suffix rules for stuff we don't need.
- #
- .SUFFIXES:
- .SUFFIXES: .a .$(OBJ_SUFFIX) .c .cpp .s .h .i .pl
- #
- # Fake targets. Always run these rules, even if a file/directory with that
- # name already exists.
- #
- .PHONY: all alltags clean export install libs realclean release
- #
- # List the target pattern of an implicit rule as a dependency of the
- # special target .PRECIOUS to preserve intermediate files made by
- # implicit rules whose target patterns match that file's name.
- # (See GNU Make documentation, Edition 0.51, May 1996, Sec. 10.4,
- # p. 107.)
- #
- .PRECIOUS: $(OBJDIR)/%.$(OBJ_SUFFIX)
|