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

ifeq (,$(filter-out WIN95 WINCE WINMO, $(OS_TARGET)))
CSRCS =          \
    ntmisc.c \
    ntsec.c   \
    ntsem.c   \
    ntinrval.c \
    ntgc.c \
	w95thred.c \
	w95io.c \
	w95cv.c \
	w32rng.c \
	w95sock.c \
	win32_errors.c \
    w32ipcsem.c \
    w32poll.c \
    w32shm.c \
    w95dllmain.c \
    $(NULL)
else
CSRCS =          \
    ntdllmn.c \
    ntmisc.c \
    ntsec.c   \
    ntsem.c   \
    ntinrval.c \
    ntgc.c \
    ntthread.c \
    ntio.c    \
	win32_errors.c \
    w32ipcsem.c \
    w32poll.c \
    w32rng.c \
    w32shm.c \
    $(NULL)
endif

TARGETS	= $(OBJS)

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

DEFINES += -D_NSPR_BUILD_

include $(topsrcdir)/config/rules.mk

export:: $(TARGETS)

# Bug 122433 workaround: disable global optimization (-Og-) on ntio.c.
ifdef MOZ_OPTIMIZE
ifeq ($(OS_TARGET), WINNT)
ifndef NS_USE_GCC
$(OBJDIR)/ntio.$(OBJ_SUFFIX): ntio.c
	@$(MAKE_OBJDIR)
	$(CC) -Fo$@ -c $(CFLAGS) -Og- $<
endif
endif
endif
