#
# The contents of this file are subject to the Netscape Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/NPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is Netscape
# Communications Corporation.  Portions created by Netscape are
# Copyright (C) 1998 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s): 
#

DEPTH		= .
topsrcdir	= @top_srcdir@
srcdir		= @srcdir@
VPATH		= @srcdir@

include $(DEPTH)/config/autoconf.mk

include $(topsrcdir)/build/unix/modules.mk

ifeq ($(BUILD_MODULES),all)
#
# And now for something completely different...
# Divide the default build into tiers. 
# Tiers must be defined on module boundaries 
#
default: $(SUBMAKEFILES)
	$(RM) -rf $(DIST)/sdk
	$(MAKE) -C config export
	$(MAKE) nspr
	$(MAKE) ldap
	$(MAKE) tier_0
	$(MAKE) tier_1
	$(MAKE) tier_2
	$(MAKE) tier_9
ifdef MOZ_PSM
	$(MAKE) tier_40
endif
	$(MAKE) tier_50
ifdef MOZ_JSDEBUGGER
	$(MAKE) tier_93
endif
ifdef MOZ_EXTENSIONS
	$(MAKE) tier_94
endif
ifdef MOZ_MAIL_NEWS
	$(MAKE) tier_97
endif
ifdef MOZ_CALENDAR
	$(MAKE) tier_98
endif
	$(MAKE) tier_99

# Make sure that the existing rulesets work
DIRS = \
	$(tier_0_dirs) \
	$(tier_1_dirs) \
	$(tier_2_dirs) \
	$(tier_9_dirs) \
	$(tier_40_dirs) \
	$(tier_50_dirs) \
	$(NULL)

ifdef GC_LEAK_DETECTOR
DIRS += gc/boehm
endif

ifdef MOZ_JSDEBUGGER
DIRS += $(tier_93_dirs)
endif
ifdef MOZ_EXTENSIONS
DIRS += $(tier_94_dirs)
endif
ifdef MOZ_MAIL_NEWS
DIRS += $(tier_97_dirs)
endif
ifdef MOZ_CALENDAR
DIRS += $(tier_98_dirs)
endif

DIRS	+= $(tier_99_dirs)

#
# tier 0 - base build config dirs
# 
tier_0_dirs = \
	config \
	build \
	$(NULL)

#
# tier 1 -  3rd party individual libraries
#
tier_1_dirs	+= dbm

ifndef MOZ_NATIVE_JPEG
tier_1_dirs	+= jpeg
endif

ifndef MOZ_NATIVE_ZLIB
tier_1_dirs	+= modules/zlib
endif

# Installer needs standalone libjar, hence standalone zlib
ifdef MOZ_INSTALLER
tier_1_dirs	+= modules/zlib/standalone
endif

ifdef MOZ_INTERNAL_LIBART_LGPL
tier_1_dirs	+= other-licenses/libart_lgpl
endif

#
# tier 2 - base libraries
# 
tier_2_dirs	= \
		js \
		xpcom \
		modules/libreg \
		xpcom/obsolete \
		$(NULL)

ifdef NS_TRACE_MALLOC
tier_2_dirs	+= tools/trace-malloc/lib tools/trace-malloc
endif

#
# tier 9 - core components (necko,gecko)
#

tier_9_dirs += \
		js/src/xpconnect \
		intl \
		modules/libjar \
		$(NULL)

ifdef MOZ_OJI
tier_9_dirs	+= \
		js/src/liveconnect \
		modules/oji \
		$(NULL)
endif

ifdef MOZ_ENABLE_XLIB
tier_9_dirs	+= gfx/src/xlibrgb widget/src/xlibxtbin
endif

ifdef MOZ_ENABLE_GTK
tier_9_dirs	+= widget/src/gtksuperwin widget/src/gtkxtbin
endif

ifdef MOZ_ENABLE_GTK2
tier_9_dirs     += widget/src/gtkxtbin
endif

ifdef MOZ_IPCD
tier_9_dirs += ipc/ipcd
endif

tier_9_dirs	+= \
		modules/libutil \
		netwerk \
		uriloader \
		modules/libpref \
		modules/libimg \
		caps \
		rdf \
		expat \
		htmlparser \
		gfx \
		modules/libpr0n \
		sun-java \
		modules/plugin \
		dom \
		view \
		widget \
		content \
		layout \
		db \
		xpfe/components/shistory \
		docshell \
		webshell \
		profile \
		embedding \
		editor \
		$(NULL)

ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_TOOLKIT)))
tier_9_dirs	+= xpfe/bootstrap/appleevents
endif

ifdef MOZ_THUNDERBIRD
ifdef MOZ_USE_OFFICIAL_BRANDING
tier_9_dirs  += other-licenses/branding/thunderbird
endif
endif

ifdef MOZ_PHOENIX
ifdef MOZ_USE_OFFICIAL_BRANDING
tier_9_dirs  += other-licenses/branding/firefox
endif
endif

tier_9_dirs	+= \
		xpfe/appshell \
		xpfe/browser/public \
		xpfe/components/sidebar/public \
		xpfe/components/xremote/public \
		$(NULL)

ifdef MOZ_XUL
ifdef MOZ_XUL_APP
tier_9_dirs	+= chrome
else
tier_9_dirs	+= rdf/chrome
endif
endif

ifdef ACCESSIBILITY
tier_9_dirs    += accessible
endif

ifdef MOZ_LDAP_XPCOM
tier_9_dirs	+= directory/xpcom
endif

ifndef MOZ_XUL
tier_9_dirs    += embedding/minimo/chromelite
endif

ifdef MOZ_ENABLE_GTK2
tier_9_dirs    += toolkit/components/gnome
endif

#
# tier 40 - security
#
ifdef MOZ_PSM
tier_40_dirs	+= security/manager
endif

# 
# tier 50 - xpfe & toolkit
#

# This must preceed xpfe
ifdef MOZ_JPROF
tier_50_dirs        += tools/jprof
endif

ifdef MOZ_XUL_APP
tier_50_dirs += toolkit/components/history/public
else
tier_50_dirs += xpfe/components/history/public
endif

tier_50_dirs	+= xpfe themes

ifdef MOZ_LEAKY
tier_50_dirs        += tools/leaky
endif

ifdef MOZ_MAPINFO
tier_50_dirs	+= tools/codesighs
endif

ifneq (,$(MOZ_L10N_LANG)$(MOZ_L10N_TOOLS))
tier_50_dirs	+= l10n
endif

ifdef MOZ_XUL_APP
tier_50_dirs	+= toolkit
endif

ifdef MOZ_PHOENIX
#xpfe/components/search depends on nsIBookmarksService.idl
#XXXBlake this shell path is a temp hack; toolkit shouldn't depend on browser
tier_50_dirs    += browser/components/bookmarks/public browser/components/shell/public
endif

# toolkit/xre/ depends on xpinstall, so it must be in tier 50
ifdef MOZ_XPINSTALL
tier_50_dirs     +=  xpinstall
endif

#
# tier 9x - application features
#

ifdef MOZ_JSDEBUGGER
tier_93_dirs	+= js/jsd
endif

ifdef MOZ_EXTENSIONS
tier_94_dirs	+= extensions
endif

ifdef MOZ_MAIL_NEWS
tier_97_dirs	+= mailnews
endif

ifdef MOZ_CALENDAR
tier_98_dirs	+= other-licenses/libical calendar
endif

#
# tier 99 - application binaries
#

ifdef MOZ_COMPONENTLIB
tier_99_dirs   += embedding/componentlib
else
ifneq (,$(MOZ_STATIC_COMPONENTS)$(MOZ_META_COMPONENTS))
tier_99_dirs   += modules/staticmod
endif
endif # MOZ_COMPONENTLIB

ifdef MOZ_PHOENIX
tier_99_dirs	+= browser xpfe/bootstrap/init.d
ifdef MOZ_USE_OFFICIAL_BRANDING
tier_99_dirs += other-licenses/branding/firefox/content
endif
endif

ifdef MOZ_THUNDERBIRD
tier_99_dirs	+= mail xpfe/bootstrap/init.d
ifdef MOZ_USE_OFFICIAL_BRANDING
tier_99_dirs += other-licenses/branding/thunderbird/content
endif
endif

ifdef MOZ_STANDALONE_COMPOSER
tier_99_dirs	+= composer
endif

ifdef MOZ_XUL_APP
ifdef MOZ_INSTALLER
tier_99_dirs     +=  toolkit/mozapps/installer
endif
else
ifneq (,$(MOZ_XPFE_COMPONENTS)$(MOZ_XUL))
tier_99_dirs	+= xpfe/bootstrap
endif
endif

ifneq (,$(MOZ_ENABLE_GTK)$(MOZ_ENABLE_GTK2))
tier_99_dirs	+= embedding/browser/gtk
endif

# viewer
ifneq (,$(ENABLE_TESTS))
tier_99_dirs += webshell/tests
endif

# winembed, mfcembed
ifeq ($(OS_ARCH),WINNT)
ifneq (,$(ENABLE_TESTS)$(MOZILLA_OFFICIAL))
tier_99_dirs += embedding/tests
endif
endif

# os2embed
ifeq ($(OS_ARCH),OS2)
ifneq (,$(ENABLE_TESTS)$(MOZILLA_OFFICIAL))
tier_99_dirs += embedding/tests
endif
endif

else

# Standalone build

DIRS		= $(BUILD_MODULE_DIRS)

# Hack to generate xpidl Makefile
ifneq ($(BUILD_MODULES),all)
ifneq (,$(findstring xpcom, $(BUILD_MODULE_DIRS)))
DIRS		:= xpcom/typelib $(DIRS)
SUBMAKEFILES	:= xpcom/typelib/Makefile
endif
endif

default: $(SUBMAKEFILES)
	$(MAKE) export
	$(MAKE) libs

endif # BUILD_MODULES == all

STATIC_MAKEFILES := nsprpub directory/c-sdk security/nss

GARBAGE_DIRS += dist
DIST_GARBAGE = config.cache config.log config.status config-defs.h \
   dependencies.beos config/autoconf.mk config/myrules.mk config/myconfig.mk \
   unallmakefiles mozilla-config.h \
   $(topsrcdir)/.mozconfig.mk $(topsrcdir)/.mozconfig.out 

# Build pseudo-external modules first when export is explicitly called
export::
	$(RM) -rf $(DIST)/sdk
	$(MAKE) -C config export
	$(MAKE) nspr
	$(MAKE) ldap
ifneq ($(BUILD_MODULES),all)
ifneq (,$(findstring xpcom, $(BUILD_MODULE_DIRS)))
	$(MAKE) -C xpcom/typelib
	$(MAKE) export-idl
endif
endif

install::
ifndef MOZ_NATIVE_NSPR
	$(MAKE) -C nsprpub real_install DESTDIR=$(DESTDIR) libdir=$(mozappdir) includedir=$(includedir)/nspr
	$(RM) -f $(addprefix $(DESTDIR)$(mozappdir)/$(LIB_PREFIX), $(addsuffix .$(LIB_SUFFIX), nspr4 plds4 plc4))
	$(RM) -f $(addprefix $(DESTDIR)$(bindir)/,nspr-config compile-et.pl prerr.properties)
endif
ifdef MOZ_LDAP_XPCOM
	$(MAKE) -C directory/c-sdk real_install DESTDIR=$(DESTDIR) libdir=$(mozappdir) includedir=$(includedir)/ldap
endif

include $(topsrcdir)/config/rules.mk

# Clean up after pseudo-external modules
clean clobber realclean clobber_all distclean::
ifndef MOZ_NATIVE_NSPR
	$(MAKE) -C nsprpub $@
endif
ifdef MOZ_LDAP_XPCOM
	$(MAKE) -C directory/c-sdk $@
endif

tier_%: 
	@echo "$@: $($@_dirs)"
	@$(EXIT_ON_ERROR) \
		for d in $($@_dirs); do $(UPDATE_TITLE) \
			$(MAKE) -C $$d export; \
		done ; \
		$(PERL) $(MOZILLA_DIR)/config/purge-old-headers.pl $(DIST)/include ;\
		for d in $($@_dirs); do $(UPDATE_TITLE) \
			$(MAKE) -C $$d libs; \
		done
#
# Individual modules
#
boehm:
ifdef GC_LEAK_DETECTOR
	$(MAKE) -C gc/boehm
endif

nspr: boehm
ifndef MOZ_NATIVE_NSPR
	$(MAKE) -C nsprpub
endif

ldap:
ifdef MOZ_LDAP_XPCOM
	$(MAKE) -C directory/c-sdk
endif

export::
	@$(PERL) $(MOZILLA_DIR)/config/purge-old-headers.pl $(DIST)/include

distclean::
	cat unallmakefiles | $(XARGS) rm -f
	rm -f unallmakefiles $(DIST_GARBAGE)

ifeq ($(OS_ARCH),WINNT)
rebase:
ifdef MOZILLA_OFFICIAL
	echo rebasing $(DIST)
	/bin/find $(DIST) -name "*.dll" > rebase.lst
	rebase -b 60000000 -R . -G rebase.lst
	rm rebase.lst
endif

splitsymbols:
ifdef MOZILLA_OFFICIAL
ifdef MOZ_DEBUG_SYMBOLS
	echo finding pdb files
	mkdir -p $(DIST)/$(BUILDID)
	-cp `/bin/find . -path "./dist" -prune -o -name "*.dll" | sed "s/\.dll$$/\.pdb/" | xargs` $(DIST)/$(BUILDID)
	-cp `/bin/find . -path "./dist" -prune -o -name "*.exe" | sed "s/\.exe$$/\.pdb/" | xargs` $(DIST)/$(BUILDID)
	-cp `/bin/find . -path "./dist" -prune -o -name "*.EXE" | sed "s/\.EXE$$/\.pdb/" | xargs` $(DIST)/$(BUILDID)
endif # MOZ_DEBUG_SYMBOLS
ifdef MOZ_PROFILE
	echo splitting symbols out of binaries
	/bin/find $(DIST) -name "*.dll" -exec splitsym {} \;
	/bin/find $(DIST) -name "*.exe" -exec splitsym {} \;
	/bin/find $(DIST) -name "*.EXE" -exec splitsym {} \;
	mkdir -p $(DIST)/$(BUILDID)
	/bin/find $(DIST) -name "*.dbg" -exec mv {} $(DIST)/$(BUILDID) \;
endif # MOZ_PROFILE
endif # MOZILLA_OFFICIAL

signnss:
ifdef MOZILLA_OFFICIAL
	echo signing NSS libs
	cd $(DIST)/bin; ./shlibsign.exe -v -i softokn3.dll
endif # MOZILLA_OFFICIAL

BUILDID = $(shell cat $(DEPTH)/config/build_number)
deliver: splitsymbols rebase signnss

endif # WINNT

