# 
# ***** 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 *****

#! gmake

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

include $(MOD_DEPTH)/config/autoconf.mk

include $(topsrcdir)/config/config.mk

CSRCS = \
	pralarm.c  \
	pratom.c   \
	prcountr.c \
	prdtoa.c   \
	prenv.c    \
	prerr.c  \
	prerror.c  \
	prerrortable.c  \
	prinit.c   \
	prinrval.c \
	pripc.c \
	prlog2.c   \
	prlong.c   \
	prnetdb.c  \
	praton.c  \
	prolock.c  \
	prrng.c    \
	prsystem.c \
	prtime.c   \
	prthinfo.c \
	prtpool.c \
	prtrace.c  \
	$(NULL)

ifndef USE_PTHREADS
CSRCS += \
	pripcsem.c \
	$(NULL)
endif

TARGETS	= $(OBJS)

INCLUDES = -I$(dist_includedir) -I$(topsrcdir)/pr/include -I$(topsrcdir)/pr/include/private

DEFINES	+= -D_NSPR_BUILD_

RELEASE_BINS = $(srcdir)/compile-et.pl $(srcdir)/prerr.properties

include $(topsrcdir)/config/rules.mk

# Prevent floating point errors caused by MSVC 6.0 Processor Pack
# optimizations (bug 207421).  This disables optimizations that
# could change the precision of floating-point calculations for
# this single compilation unit.
ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT)
$(OBJDIR)/prdtoa.$(OBJ_SUFFIX): prdtoa.c
	@$(MAKE_OBJDIR)
ifeq (,$(filter-out 1100 1200 1300 1310,$(MSC_VER)))
	$(CC) -Fo$@ -c $(CFLAGS) -Op $(call pr_abspath,$<)
else
	$(CC) -Fo$@ -c $(CFLAGS) -fp:precise $(call pr_abspath,$<)
endif
endif

#
# Generate prerr.h, prerr.c, and prerr.properties from prerr.et.
#
build_prerr:
	cd $(srcdir); $(PERL) compile-et.pl prerr.et

export:: $(TARGETS)


