#! gmake

# 
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla 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/MPL/
#
# 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 the Netscape Portable Runtime (NSPR).
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998-2000
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****


MOD_DEPTH	= .
topsrcdir	= @top_srcdir@
srcdir		= @srcdir@
VPATH		= @srcdir@

include $(MOD_DEPTH)/config/autoconf.mk

MAKE := $(patsubst -j%,,$(MAKE)) -j1

DIRS = config pr lib

ifdef MOZILLA_CLIENT
# Make nsinstall use absolute symlinks by default for Mozilla OSX builds
# http://bugzilla.mozilla.org/show_bug.cgi?id=193164
ifeq ($(OS_ARCH),Darwin)
ifndef NSDISTMODE
NSDISTMODE=absolute_symlink
export NSDISTMODE
endif
endif
endif

DIST_GARBAGE = config.cache config.log config.status

all:: config.status export

include $(topsrcdir)/config/rules.mk

config.status:: configure
ifeq ($(OS_ARCH),WINNT)
	sh $(srcdir)/configure --no-create --no-recursion
else
	./config.status --recheck && ./config.status
endif

#
# The -ll option of zip converts CR LF to LF.
#
ifeq ($(OS_ARCH),WINNT)
ZIP_ASCII_OPT = -ll
endif

# Delete config/autoconf.mk last because it is included by every makefile.
distclean::
	@echo "cd pr/tests; $(MAKE) $@"
	@$(MAKE) -C pr/tests $@
	rm -f config/autoconf.mk
	rm -f `cat unallmakefiles` unallmakefiles

release::
	echo $(BUILD_NUMBER) > $(RELEASE_DIR)/$(BUILD_NUMBER)/version.df
	@if test -f imports.df; then \
	    echo "cp -f imports.df $(RELEASE_DIR)/$(BUILD_NUMBER)/imports.df"; \
	    cp -f imports.df $(RELEASE_DIR)/$(BUILD_NUMBER)/imports.df; \
	else \
	    echo "echo > $(RELEASE_DIR)/$(BUILD_NUMBER)/imports.df"; \
	    echo > $(RELEASE_DIR)/$(BUILD_NUMBER)/imports.df; \
	fi
	cd $(RELEASE_DIR)/$(BUILD_NUMBER)/$(OBJDIR_NAME); \
	rm -rf META-INF; mkdir META-INF; cd META-INF; \
	echo "Manifest-Version: 1.0" > MANIFEST.MF; \
	echo "" >> MANIFEST.MF; \
	cd ..; rm -f mdbinary.jar; zip -r mdbinary.jar META-INF bin lib; \
	rm -rf META-INF; \
	cd include; \
	rm -rf META-INF; mkdir META-INF; cd META-INF; \
	echo "Manifest-Version: 1.0" > MANIFEST.MF; \
	echo "" >> MANIFEST.MF; \
	cd ..; rm -f mdheader.jar; zip $(ZIP_ASCII_OPT) -r mdheader.jar *; \
	rm -rf META-INF
ifeq ($(OS_ARCH),WINNT)
	@if test ! -d $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER); then \
		rm -rf $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER); \
		echo "making directory $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)"; \
		mkdir -p $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER); \
	fi
	@if test ! -d $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME); then \
		rm -rf $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME); \
		echo "making directory $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME)"; \
		mkdir -p $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME); \
	fi
else
	@if test ! -d $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER); then \
		rm -rf $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER); \
		echo "making directory $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)"; \
		$(NSINSTALL) -D $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER); \
		chmod 775 $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER); \
	fi
	@if test ! -d $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME); then \
		rm -rf $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME); \
		echo "making directory $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME)"; \
		$(NSINSTALL) -D $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME); \
		chmod 775 $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME); \
	fi
endif
	cd $(RELEASE_DIR)/$(BUILD_NUMBER); \
	cp -f version.df imports.df $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER); \
	chmod 664 $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/version.df; \
	chmod 664 $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/imports.df; \
	cd $(OBJDIR_NAME); \
	cp -f mdbinary.jar $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME); \
	chmod 664 $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME)/mdbinary.jar; \
	cd include; \
	cp -f mdheader.jar $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME); \
	chmod 664 $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME)/mdheader.jar

package:
	@echo "cd pkg; $(MAKE) publish"
	$(MAKE) -C pkg publish

depend:
	@echo "NSPR20 has no dependencies.  Skipped."
