# 
# 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.11 2008/10/20 22:38:45 christophe.ravel.bugs%sun.com Exp $"
#

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

NAME        = sun-nspr
ifndef RPM_RELEASE
RPM_RELEASE = 1
endif
TOPDIR      = /usr/src/redhat
VERSION     = `grep PR_VERSION $(dist_includedir)/prinit.h \
                  | sed -e 's/"$$//' -e 's/.*"//' -e 's/ .*//'`

SPECFILE    = $(NAME).spec

include $(MOD_DEPTH)/config/autoconf.mk

# Force i386 for non 64 bit build
ifneq ($(USE_64),1)
	RPMTARGET = "--target=i386"
	RPMLIBDIR = lib
else
	RPMLIBDIR = lib64
endif

publish:
	$(MAKE) clean
	mkdir -p SOURCES SRPMS RPMS BUILD
	(cd $(dist_libdir) && tar cphf - libnspr4.so libplds4.so libplc4.so) \
	| (mkdir -p opt/sun/private/$(RPMLIBDIR) && cd opt/sun/private/$(RPMLIBDIR) && tar xvfBp -)
	(cd $(dist_includedir) && tar cphf - .) \
	| (mkdir -p opt/sun/private/include/nspr && cd opt/sun/private/include/nspr && tar xvfBp -)
	(cd opt/sun/private/include/nspr && \
		rm -rf md)
	tar czvf SOURCES/$(NAME)-$(VERSION).tar.gz opt
	echo "%define name $(NAME)" >$(SPECFILE)
	echo "%define version $(VERSION)" >>$(SPECFILE)
	echo "%define release $(RPM_RELEASE)" >>$(SPECFILE)
	echo "%define buildroot `pwd`/$(NAME)-root" >>$(SPECFILE)
	echo "%define _topdir `pwd`" >>$(SPECFILE)
	echo "%define _unpackaged_files_terminate_build 0" >>$(SPECFILE)
	cat $(srcdir)/$(NAME).spec >>$(SPECFILE)
	echo "" >>$(SPECFILE)
	echo "%files" >>$(SPECFILE)
	echo "%defattr(-,root,root)" >>$(SPECFILE)
	echo "%dir /opt" >>$(SPECFILE)
	echo "%dir /opt/sun" >>$(SPECFILE)
	echo "%dir /opt/sun/private" >>$(SPECFILE)
	echo "%dir /opt/sun/private/$(RPMLIBDIR)" >>$(SPECFILE)
	find opt \( -name "*.so" \) | sed -e "s-^-/-" >>$(SPECFILE)
	echo "" >>$(SPECFILE)
	echo "%files devel" >>$(SPECFILE)
	echo "%defattr(-,root,root)" >>$(SPECFILE)
	echo "%dir /opt" >>$(SPECFILE)
	echo "%dir /opt/sun" >>$(SPECFILE)
	echo "%dir /opt/sun/private" >>$(SPECFILE)
	echo "%dir /opt/sun/private/include" >>$(SPECFILE)
	echo "%dir /opt/sun/private/include/nspr" >>$(SPECFILE)
	echo "%dir /opt/sun/private/include/nspr/obsolete" >>$(SPECFILE)
	echo "%dir /opt/sun/private/include/nspr/private" >>$(SPECFILE)
	find opt -type f \( -name "*.h" \) \
		| sed -e "s-^-/-" >>$(SPECFILE)
	rpmbuild $(RPMTARGET) -bb $(SPECFILE)

clean:
	rm -rf $(TOPDIR)/BUILD/$(NAME)
	rm -rf SOURCES SRPMS RPMS BUILD
	rm -rf RPMS SRPMS opt
	rm -f $(NAME)-$(VERSION).tar.gz
