#
# 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/.

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

include $(DEPTH)/config/autoconf.mk

# For sanity's sake, we compile nsinstall without the wrapped system
# headers, so that we can use it to set up the wrapped system headers.
VISIBILITY_FLAGS =

ifneq (WINNT,$(HOST_OS_ARCH))
HOST_PROGRAM	= nsinstall_real$(HOST_BIN_SUFFIX)
endif

# IMPORTANT: Disable NSBUILDROOT for this directory only, otherwise we have
# a recursive rule for finding nsinstall and the Perl scripts.
ifdef NSBUILDROOT
override NSBUILDROOT :=
endif

ifdef GNU_CC
MODULE_OPTIMIZE_FLAGS = -O3
endif

include $(topsrcdir)/config/config.mk

# Do not install util programs
NO_INSTALL=1

# Force wrap zlib system header if building js as a shared library.
ifneq (,$(JS_SHARED_LIBRARY)$(MOZ_NATIVE_ZLIB))
DEFINES += -DMOZ_NATIVE_ZLIB=1
endif

ifneq (WINNT,$(HOST_OS_ARCH))
# Ensure nsinstall is atomically created
nsinstall$(HOST_BIN_SUFFIX): $(HOST_PROGRAM)
	cp $^ $@.tmp
	mv $@.tmp $@

NSINSTALL_FILES := nsinstall$(HOST_BIN_SUFFIX)
NSINSTALL_DEST := $(DIST)/bin
NSINSTALL_TARGET := export
INSTALL_TARGETS += NSINSTALL
endif

include $(topsrcdir)/config/rules.mk

HOST_CFLAGS += -DUNICODE -D_UNICODE

ifdef WRAP_SYSTEM_INCLUDES
export:: \
  $(call mkdir_deps,system_wrappers_js) \
  $(NULL)
	$(PYTHON) $(srcdir)/Preprocessor.py $(DEFINES) $(ACDEFINES) \
		$(srcdir)/system-headers | $(PERL) $(srcdir)/make-system-wrappers.pl system_wrappers_js
	$(INSTALL) system_wrappers_js $(DIST)

GARBAGE_DIRS += system_wrappers_js
endif

GARBAGE += $(srcdir)/*.pyc *.pyc

FORCE:
