# 
# 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: prototype_i386,v 1.4 2005/02/25 20:20:52 christophe.ravel.bugs%sun.com Exp $"
#
# This required package information file contains a list of package contents.
# The 'pkgmk' command uses this file to identify the contents of a package
# and their location on the development machine when building the package.
# Can be created via a text editor or through use of the 'pkgproto' command.

#!search <pathname pathname ...>	# where to find pkg objects
#!include <filename>			# include another 'prototype' file
#!default <mode> <owner> <group>	# default used if not specified on entry
#!<param>=<value>			# puts parameter in pkg environment

#
# Include ISA independent files (prototype_com)
#
!include prototype_com
#
#
#
# List files which are i386 specific here
#
# source locations relative to the prototype file
#
#
# SUNWpr
#
#64#s none usr/lib/mps/64=amd64
#64#s none usr/lib/mps/secv1/64=amd64
#64#d none usr/lib/mps/amd64 755 root bin
#64#d none usr/lib/mps/secv1/amd64 755 root bin
#64#f none usr/lib/mps/amd64/libnspr4.so 755 root bin
#64#f none usr/lib/mps/amd64/libplc4.so 755 root bin
#64#f none usr/lib/mps/amd64/libplds4.so 755 root bin
#64#s none usr/lib/mps/secv1/amd64/libnspr4.so=../../amd64/libnspr4.so
#64#s none usr/lib/mps/secv1/amd64/libplc4.so=../../amd64/libplc4.so
#64#s none usr/lib/mps/secv1/amd64/libplds4.so=../../amd64/libplds4.so

