# 
# Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
# 
# ***** 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 *****
#
#ident	"$Id: Makefile.in,v 1.3 2005/02/25 20:20:52 christophe.ravel.bugs%sun.com Exp $"
#

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

include $(MOD_DEPTH)/config/autoconf.mk

abs_dist_libdir := $(shell (cd $(dist_libdir);pwd))
abs_dist_includedir := $(shell (cd $(dist_includedir);pwd))

%: %.ksh
	$(RM) $@
	cp $< $@
	chmod +x $@

DIRS = \
	SUNWpr \
	SUNWprd

include $(srcdir)/Makefile.com

PROTO = \
	$(ROOT) \
	$(ROOT)/usr/lib/mps \
	$(ROOT)/usr/include/mps

ifeq ($(MACH), sparc)
	PROTO += $(ROOT)/usr/lib/mps/cpu/sparcv8plus
endif

ifeq ($(USE_64), 1)
ifeq ($(MACH), sparc)
# Sparc
	PROTO += $(ROOT)/usr/lib/mps/sparcv9
else
# AMD64
	PROTO += $(ROOT)/usr/lib/mps/amd64
endif
	abs_dist64_libdir = $(abs_dist_libdir)
	abs_dist32_libdir = $(shell echo $(abs_dist_libdir) | sed -e "s|_64_OPT|_OPT|g" -e "s|_64_DBG|_DBG|g")
	abs_dist64_includedir = $(abs_dist_includedir)
	abs_dist32_includedir = $(shell echo $(abs_dist_includedir) | sed -e "s|_64_OPT|_OPT|g" -e "s|_64_DBG|_DBG|g")
else
	abs_dist32_libdir = $(abs_dist_libdir)
	abs_dist64_libdir = $(shell echo $(abs_dist_libdir) | sed -e "s|_OPT|_64_OPT|g" -e "s|_DBG|_64_DBG|g")
	abs_dist32_includedir = $(abs_dist_includedir)
	abs_dist64_includedir = $(shell echo $(abs_dist_includedir) | sed -e "s|_OPT|_64_OPT|g" -e "s|_DBG|_64_DBG|g")
endif

awk_pkginfo: bld_awk_pkginfo
	./bld_awk_pkginfo -m $(MACH) -p "$(PRODUCT_VERSION)" -o $@ -v $(PRODUCT_VERSION)

all:: awk_pkginfo $(PROTO)
publish: awk_pkginfo $(PROTO)
	+$(LOOP_OVER_DIRS)

clean clobber::
	$(RM) awk_pkginfo bld_awk_pkginfo
	$(RM) -r $(ROOT)

$(ROOT):
	mkdir -p $@

$(ROOT)/usr/lib/mps/sparcv9:
	mkdir -p $@
	$(CP) -r $(abs_dist64_libdir)/*.so $@
$(ROOT)/usr/lib/mps/amd64:
	mkdir -p $@
	$(CP) -r $(abs_dist64_libdir)/*.so $@
$(ROOT)/usr/lib/mps:
	mkdir -p $@
	$(CP) -r $(abs_dist32_libdir)/*.so $@
$(ROOT)/usr/lib/mps/cpu/sparcv8plus:
	mkdir -p $@
	$(CP) -r $(abs_dist32_libdir)/cpu/sparcv8plus/*.so $@
$(ROOT)/usr/include/mps:
	mkdir -p $@
	$(CP) -r $(abs_dist32_includedir)/* $@
