Subject: pkg/32471: Modulization of PLIST handling in bsd.pkg.mk
To: None <pkg-manager@netbsd.org, gnats-admin@netbsd.org,>
From: None <jlam@pkgsrc.org>
List: pkgsrc-bugs
Date: 01/06/2006 22:15:00
>Number:         32471
>Category:       pkg
>Synopsis:       Modulization of PLIST handling in bsd.pkg.mk
>Confidential:   no
>Severity:       non-critical
>Priority:       high
>Responsible:    pkg-manager
>State:          open
>Class:          change-request
>Submitter-Id:   net
>Arrival-Date:   Fri Jan 06 22:15:00 +0000 2006
>Originator:     Johnny C. Lam
>Release:        NetBSD 3.0_BETA
>Organization:
	The NetBSD Project
>Environment:
	NetBSD.3.0_BETA/i386 with pkgsrc HEAD
Architecture: i386
Machine: i386
>Description:
	This patch splits out the PLIST handling from bsd.pkg.mk into
	a separate module "plist" and separates out some giant in-line
	awk scripts from make variables into standalone awk scripts.

	This also fixes bugs in the Darwin dylib code that generated
	incorrect absolute path entries in the +CONTENTS file.

	I've tested this on ELF and exercised the code for both the
	a.out and dylib cases.

	I don't have time to deal with this patch.  If this works,
	someone please commit this.

>How-To-Repeat:
	n/a
>Fix:

Index: bsd.pkg.mk
===================================================================
RCS file: /cvsroot/pkgsrc/mk/bsd.pkg.mk,v
retrieving revision 1.1785
diff -u -r1.1785 bsd.pkg.mk
--- bsd.pkg.mk	5 Jan 2006 23:18:26 -0000	1.1785
+++ bsd.pkg.mk	6 Jan 2006 22:06:32 -0000
@@ -93,34 +93,6 @@
 PKGNAME_NOREV=		${PKGNAME}
 .endif
 
-##### PLIST
-
-.if ${PKG_INSTALLATION_TYPE} == "pkgviews"
-PLIST_TYPE?=		dynamic
-.endif
-PLIST_TYPE?=		static
-
-.if !defined(PLIST_SRC)
-.  if exists(${PKGDIR}/PLIST.common)
-PLIST_SRC+=		${PKGDIR}/PLIST.common
-.  endif
-.  if exists(${PKGDIR}/PLIST.${OPSYS})
-PLIST_SRC+=		${PKGDIR}/PLIST.${OPSYS}
-.  endif
-.  if exists(${PKGDIR}/PLIST.${MACHINE_ARCH:C/i[3-6]86/i386/g})
-PLIST_SRC+=		${PKGDIR}/PLIST.${MACHINE_ARCH:C/i[3-6]86/i386/g}
-.  endif
-.  if exists(${PKGDIR}/PLIST.${OPSYS}-${MACHINE_ARCH:C/i[3-6]86/i386/g})
-PLIST_SRC+=		${PKGDIR}/PLIST.${OPSYS}-${MACHINE_ARCH:C/i[3-6]86/i386/g}
-.  endif
-.  if exists(${PKGDIR}/PLIST)
-PLIST_SRC+=		${PKGDIR}/PLIST
-.  endif
-.  if exists(${PKGDIR}/PLIST.common_end)
-PLIST_SRC+=		${PKGDIR}/PLIST.common_end
-.  endif
-.endif # !PLIST_SRC
-
 ##### Others
 
 _DISTDIR?=		${DISTDIR}/${DIST_SUBDIR}
@@ -173,7 +145,6 @@
 DDIR=			${WRKDIR}/.DDIR
 DESCR=			${PKG_DB_TMPDIR}/+DESC
 DLIST=			${WRKDIR}/.DLIST
-PLIST=			${WRKDIR}/.PLIST
 
 # Files to create for versioning and build information
 BUILD_VERSION_FILE=	${PKG_DB_TMPDIR}/+BUILD_VERSION
@@ -210,14 +181,6 @@
 PKG_FAIL_REASON+=	"This package doesn't support PKG_INSTALLATION_TYPE=${PKG_INSTALLATION_TYPE}."
 .endif
 
-.if (${PLIST_TYPE} != "dynamic") && (${PLIST_TYPE} != "static")
-PKG_FAIL_REASON+=	"PLIST_TYPE must be \`\`dynamic'' or \`\`static''."
-.endif
-
-.if (${PKG_INSTALLATION_TYPE} == "overwrite") && (${PLIST_TYPE} != "static")
-PKG_FAIL_REASON+=	"PLIST_TYPE must be \`\`static'' for \`\`overwrite'' packages."
-.endif
-
 # Check that we are using up-to-date pkg_* tools with this file.
 .if !defined(NO_PKGTOOLS_REQD_CHECK)
 .  if ${PKGTOOLS_VERSION} < ${PKGTOOLS_REQD}
@@ -351,22 +314,6 @@
 PKG_FAIL_REASON+=	"DEPOT_SUBDIR may not be empty."
 .endif
 
-.if ${PKG_INSTALLATION_TYPE} == "pkgviews"
-#
-# _PLIST_IGNORE_FILES basically mirrors the list of ignored files found
-# in pkg_views(1).  It's used by the dynamic PLIST generator to skip
-# adding the named files to the PLIST.
-#
-_PLIST_IGNORE_FILES=	+*			# package metadata files
-_PLIST_IGNORE_FILES+=	info/dir
-.if defined(INFO_DIR) && empty(INFO_DIR:Minfo)
-_PLIST_IGNORE_FILES+=	${INFO_DIR}/dir
-.endif
-_PLIST_IGNORE_FILES+=	*[~\#] *.OLD *.orig *,v # scratch config files
-_PLIST_IGNORE_FILES+=	${PLIST_IGNORE_FILES}
-.endif
-BUILD_DEFS+=		_PLIST_IGNORE_FILES
-
 # Automatically increase process limit where necessary for building.
 _ULIMIT_CMD=		${UNLIMIT_RESOURCES:@_lim_@${ULIMIT_CMD_${_lim_}};@}
 
@@ -472,35 +419,6 @@
 .  undef NO_PACKAGE
 .endif
 
-# Set PLIST_SUBST to substitute "${variable}" to "value" in PLIST
-PLIST_SUBST+=	OPSYS=${OPSYS:Q}					\
-		OS_VERSION=${OS_VERSION:Q}				\
-		MACHINE_ARCH=${MACHINE_ARCH:Q}				\
-		MACHINE_GNU_ARCH=${MACHINE_GNU_ARCH:Q}			\
-		MACHINE_GNU_PLATFORM=${MACHINE_GNU_PLATFORM:Q}		\
-		LN=${LN:Q}						\
-		LOWER_VENDOR=${LOWER_VENDOR:Q}				\
-		LOWER_OPSYS=${LOWER_OPSYS:Q}				\
-		LOWER_OS_VERSION=${LOWER_OS_VERSION:Q}			\
-		PKGBASE=${PKGBASE:Q}					\
-		PKGNAME=${PKGNAME_NOREV:Q}				\
-		PKGLOCALEDIR=${PKGLOCALEDIR:Q}				\
-		PKGVERSION=${PKGVERSION:C/nb[0-9]*$//}			\
-		LOCALBASE=${LOCALBASE:Q}				\
-		VIEWBASE=${VIEWBASE:Q}					\
-		X11BASE=${X11BASE:Q}					\
-		X11PREFIX=${X11PREFIX:Q}				\
-		SVR4_PKGNAME=${SVR4_PKGNAME:Q}				\
-		CHGRP=${CHGRP:Q}					\
-		CHMOD=${CHMOD:Q}					\
-		CHOWN=${CHOWN:Q}					\
-		MKDIR=${MKDIR:Q}					\
-		RMDIR=${RMDIR:Q}					\
-		RM=${RM:Q}						\
-		TRUE=${TRUE:Q}						\
-		QMAILDIR=${QMAILDIR:Q}					\
-		PKGMANDIR=${PKGMANDIR:Q}
-
 # Handle alternatives
 #
 .include "../../mk/alternatives.mk"
@@ -710,9 +628,6 @@
       !empty(PKG_SYSCONFBASE:M${PREFIX}/*)
 PKG_SYSCONFDEPOTBASE=	# empty
 PKG_SYSCONFBASEDIR=	${PKG_SYSCONFBASE}
-.    if !empty(CONF_DEPENDS)
-_PLIST_IGNORE_FILES+=	${PKG_SYSCONFDIR:S,^${PREFIX}/,,}
-.    endif
 .  else
 PKG_SYSCONFDEPOTBASE=	${PKG_SYSCONFBASE}/${DEPOT_SUBDIR}
 PKG_SYSCONFBASEDIR=	${PKG_SYSCONFDEPOTBASE}/${PKGNAME}
@@ -2183,249 +2098,6 @@
 .endif
 
 
-
-# Do handling of shared libs for two cases:
-#
-# SHLIB_PLIST_MODE=1: when first called via the ${PLIST} target,
-#                     update the PLIST to contain ELF symlink, run
-#                     ldconfig on a.out,  etc. (used when called via
-#                     the ${PLIST} target). Will update ${PLIST}.
-# SHLIB_PLIST_MODE=0: when called via the real-su-install target,
-#                     actually generate symlinks for ELF, run ldconfig
-#                     for a.out, etc. Will not modify ${PLIST}.
-#
-# XXX This target could need some cleanup after it was ripped out of
-#     real-su-install
-#
-_AOUT_AWK = \
-	BEGIN { linkc = 1 }			\
-	/^@/ { lines[NR] = $$0; next }		\
-	function libtool_release(lib) {		\
-		if (gsub("-[^-]+\\.so\\.", ".so.", lib)) { \
-			if (system("${TEST} -h ${PREFIX}/" lib) == 0) { \
-				rels[NR] = lib; \
-			}			\
-		}				\
-	}					\
-	/.*\/lib[^\/]+\.so\.[0-9]+\.[0-9]+\.[0-9]+$$/ { \
-		libtool_release($$0);		\
-		lines[NR] = $$0;		\
-		sub("\\.[0-9]+$$", "");		\
-		links[linkc++] = $$0;		\
-		sub("\\.[0-9]+$$", "");		\
-		links[linkc++] = $$0;		\
-		sub("\\.[0-9]+$$", "");		\
-		links[linkc++] = $$0;		\
-		if (sub("-[^-]+\\.so$$", ".so")) { \
-			links[linkc++] = $$0;	\
-		}				\
-		next				\
-	}					\
-	/.*\/lib[^\/]+\.so\.[0-9]+\.[0-9]+$$/ {	\
-		libtool_release($$0);		\
-		lines[NR] = $$0;		\
-		sub("\\.[0-9]+$$", "");		\
-		links[linkc++] = $$0;		\
-		sub("\\.[0-9]+$$", "");		\
-		links[linkc++] = $$0;		\
-		if (sub("-[^-]+\\.so$$", ".so")) { \
-			links[linkc++] = $$0;	\
-		}				\
-		next				\
-	}					\
-	{ lines[NR] = $$0 }			\
-	END {					\
-		for (i = 0 ; i <= linkc ; i++)	\
-			for (j = 1 ; j < NR ; j++) \
-				if (lines[j] == links[i]) \
-					lines[j] = "@comment " lines[j]; \
-		if (${SHLIB_PLIST_MODE}) 	\
-			for (i = 1 ; i <= NR ; i++) { \
-				print lines[i]; \
-				if (rels[i] != "") \
-					print rels[i]; \
-			}			\
-	}
-
-_DYLIB_AWK= \
-	/^@/ { lines[NR] = $$0; next }		\
-		function libtool_release(lib) {		\
-		if (gsub("\\.so\\.", ".", lib) || gsub("\\.so$$", "", lib)) { \
-			lib = lib ".dylib"; \
-			if (system("${TEST} -h ${PREFIX}/" lib) == 0) { \
-				rels[NR] = lib; \
-			}			\
-		}				\
-	}					\
-	/.*\/lib[^\/]+\.so\.[0-9]+\.[0-9]+\.[0-9]+$$/ { \
-		libtool_release($$0);		\
-		lines[NR] = $$0;		\
-		links[linkc++] = $$0;		\
-		sub("\\.[0-9]+$$", "");		\
-		links[linkc++] = $$0;		\
-		sub("\\.[0-9]+$$", "");		\
-		links[linkc++] = $$0;		\
-		sub("\\.[0-9]+$$", "");		\
-		links[linkc++] = $$0;		\
-		if (sub("-[^-]+\\.so$$", ".so")) { \
-			links[linkc++] = $$0;	\
-		}				\
-		next				\
-	}					\
-	/.*\/lib[^\/]+\.so\.[0-9]+\.[0-9]+$$/ {	\
-		libtool_release($$0);		\
-		lines[NR] = $$0;		\
-		links[linkc++] = $$0;		\
-		sub("\\.[0-9]+$$", "");		\
-		links[linkc++] = $$0;		\
-		sub("\\.[0-9]+$$", "");		\
-		links[linkc++] = $$0;		\
-		if (sub("-[^-]+\\.so$$", ".so")) { \
-			links[linkc++] = $$0;	\
-		}				\
-		next				\
-	}					\
-	/.*\/lib[^\/]+\.so\.[0-9]+$$/ {		\
-		libtool_release($$0);		\
-		lines[NR] = $$0;		\
-		links[linkc++] = $$0;		\
-		sub("\\.[0-9]+$$", "");		\
-		links[linkc++] = $$0;		\
-		if (sub("-[^-]+\\.so$$", ".so")) { \
-			links[linkc++] = $$0;	\
-		}				\
-		next				\
-	}					\
-	/.*\/lib[^\/]+\.so$$/ {			\
-		lines[NR] = $$0;		\
-		if (system("${TEST} -f ${PREFIX}/" $$0) == 0) { \
-			next;			\
-		}				\
-		libtool_release($$0);		\
-		links[linkc++] = $$0;		\
-		if (sub("-[^-]+\\.so$$", ".so")) { \
-			links[linkc++] = $$0;	\
-		}				\
-		next				\
-	}					\
-	{ lines[NR] = $$0 }			\
-	END {					\
-		for (i = 0 ; i <= linkc ; i++)	\
-			for (j = 1 ; j <= NR ; j++) \
-				if (lines[j] == links[i]) \
-					lines[j] = "@comment " lines[j]; \
-		if (${SHLIB_PLIST_MODE}) 	\
-			for (i = 1 ; i <= NR ; i++) { \
-				print lines[i]; \
-				if (rels[i] != "") { \
-					print rels[i]; \
-					cmd = "${LS} -l ${PREFIX}/" rels[i]; \
-					cmd | getline tgt; \
-					close(cmd); \
-					gsub(".* ", "", tgt); \
-					if (tgts[tgt] == "") { \
-						tgts[tgt] = tgt; \
-						if (index(tgt, "/") == 1) \
-							print tgt; \
-						else { \
-							prefix=""; \
-							if (match(rels[i], ".*/") != 0) \
-								prefix=substr(rels[i],1,RLENGTH); \
-							print prefix tgt; \
-						} \
-					}	\
-				}		\
-			}			\
-	}
-
-# Turn lib*.so.*, lib*.so into lib*.so.  Drop duplicates.
-_AIXLIB_AWK= \
-	/^@/ { lines[NR] = $$0; next }		\
-	/.*\/lib[^\/]+\.so(\.[0-9]+)*$$/ {	\
-		sub("(\\.[0-9]+)*$$", "");	\
-		sub("\\.so$$", ".so");       	\
-		lines[NR] = $$0;     		\
-		next				\
-	}					\
-	{ lines[NR] = $$0 }			\
-	END {					\
-		nlibs = 0;			\
-		for (i = 1; i <= NR; i++) {	\
-			for (j = 0; j < nlibs; j++) { \
-				if (libs[j] == lines[i]) \
-					break;	\
-			}			\
-			if (j >= nlibs)		\
-				print lines[i];	\
-			if (match(lines[i], ".*/lib[^/]+\\.a$$")) { \
-				libs[nlibs] = lines[i]; \
-				nlibs++;	\
-			}			\
-		}				\
-	}
-
-.PHONY: do-shlib-handling
-do-shlib-handling:
-.if ${SHLIB_HANDLING} == "YES"
-	${_PKG_SILENT}${_PKG_DEBUG}					\
-	sos=`${EGREP} -h '^.*/lib[^/]+\.so$$' ${PLIST} || ${TRUE}`;	\
-	if [ "$$sos" != "" ]; then					\
-		shlib_type=`${MAKE} ${MAKEFLAGS} show-shlib-type`;	\
-		if [ "${SHLIB_PLIST_MODE}" = "0" ]; then 		\
-			${ECHO_MSG} "${_PKGSRC_IN}> [Automatic $$shlib_type shared object handling]"; \
-		fi;  							\
-		case "$$shlib_type" in					\
-		ELF) 	;;						\
-		aixlib) ;;						\
-		"a.out") 						\
-			${AWK} '${_AOUT_AWK}' <${PLIST} >${PLIST}.tmp ;	\
-			if [ "${SHLIB_PLIST_MODE}" = "1" ]; then	\
-				${MV} ${PLIST}.tmp ${PLIST};		\
-			else 						\
-				${RM} ${PLIST}.tmp ;			\
-			fi ; 						\
-			cnt=`${EGREP} -c '^@exec[ 	]*${LDCONFIG}$$' ${PLIST} || ${TRUE}`; \
-			if [ "${SHLIB_PLIST_MODE}" = "1" ]; then 	\
-				if [ $$cnt -eq 0 ]; then		\
-					${ECHO} "@exec ${LDCONFIG}" >> ${PLIST}; \
-					${ECHO} "@unexec ${LDCONFIG}" >> ${PLIST}; \
-				fi					\
-			fi;						\
-			if [ "${SHLIB_PLIST_MODE}" = "0" ]; then	\
-				if [ "${PKG_VERBOSE}" != "" ]; then	\
-					${ECHO_MSG} "$$sos";		\
-					${ECHO_MSG} "Running ${LDCONFIG}"; \
-				fi;					\
-				${LDCONFIG} || ${TRUE};			\
-			fi						\
-			;;						\
-		"dylib")						\
-			${AWK} '${_DYLIB_AWK}' <${PLIST} >${PLIST}.tmp && \
-			if [ "${SHLIB_PLIST_MODE}" = "1" ]; then	\
-				${MV} ${PLIST}.tmp ${PLIST};		\
-			else						\
-				${RM} ${PLIST}.tmp ;			\
-			fi ;						\
-			;;						\
-		"*")							\
-			if [ "${SHLIB_PLIST_MODE}" = "0" ]; then 	\
-				${ECHO_MSG} "No shared libraries for ${MACHINE_ARCH}"; \
-			fi ; 						\
-			if [ "${SHLIB_PLIST_MODE}" = "1" ]; then	\
-				for so in $$sos; do			\
-					if [ X"${PKG_VERBOSE}" != X"" ]; then \
-						${ECHO_MSG} >&2 "Ignoring $$so"; \
-					fi;				\
-					${SED} -e "s;^$$so$$;@comment No shared objects - &;" \
-						${PLIST} >${PLIST}.tmp && ${MV} ${PLIST}.tmp ${PLIST};	\
-				done;					\
-			fi ;						\
-			;;						\
-		esac;							\
-	fi
-.endif # SHLIB_HANDLING == "YES"
-
-
 # Check if all binaries and shlibs find their needed libs
 # Must be run after "make install", so that files are installed, and
 # ${PLIST} exists.
@@ -2468,36 +2140,6 @@
 .endif # NO_PKG_REGISTER
 
 
-.if !target(show-shlib-type)
-# Show the shared lib type being built: one of ELF, a.out, dylib, or none
-.PHONY: show-shlib-type
-show-shlib-type:
-.  if empty(USE_LANGUAGES)
-	@${ECHO} "none"
-.  elif ${_OPSYS_SHLIB_TYPE} == "ELF/a.out"
-	@cd ${WRKDIR} &&						\
-	sotype=none;							\
-	if [ "X${MKPIC}" != "Xno" -a "X${NOPIC}" = "X" ]; then		\
-		${ECHO} "int main() { return(0); }" > a.$$$$.c;		\
-		${SETENV} PATH=${PATH:Q}				\
-		${CC} ${CFLAGS} a.$$$$.c -o a.$$$$.out;			\
-		case `${FILE_CMD} a.$$$$.out` in			\
-		*ELF*dynamically*)					\
-			sotype=ELF ;;					\
-		*shared*library*)					\
-			sotype="a.out" ;;				\
-		*dynamically*)						\
-			sotype="a.out" ;;				\
-		esac;							\
-	fi;								\
-	${ECHO} "$$sotype";						\
-	${RM} -f a.$$$$.c a.$$$$.out
-.  else
-	@${ECHO} ${_OPSYS_SHLIB_TYPE}
-.  endif   # USE_LANGUAGES
-.endif
-
-
 .PHONY: acquire-extract-lock acquire-patch-lock acquire-tools-lock
 .PHONY: acquire-wrapper-lock acquire-configure-lock acquire-build-lock
 .PHONY: acquire-install-lock acquire-package-lock
@@ -3996,181 +3638,6 @@
 		${ECHO} "0";						\
 	fi
 
-
-###
-### Automatic PLIST generation
-###  - files & symlinks first
-###  - @dirrm statements last
-###  - empty directories are handled properly
-###  - dirs from mtree files are excluded
-###  - substitute for platform or package specifics substrings
-###
-### Usage:
-###  - make install
-###  - make print-PLIST | brain >PLIST
-###
-
-_PRINT_PLIST_AWK_SUBST={						\
-	gsub(/${OPSYS}/, "$${OPSYS}");					\
-	gsub(/${OS_VERSION:S/./\./g}/, "$${OS_VERSION}");		\
-	gsub(/${MACHINE_GNU_PLATFORM}/, "$${MACHINE_GNU_PLATFORM}");	\
-	gsub(/${MACHINE_ARCH}/, "$${MACHINE_ARCH}");			\
-	gsub(/${MACHINE_GNU_ARCH}/, "$${MACHINE_GNU_ARCH}");
-.if !empty(LOWER_VENDOR)
-_PRINT_PLIST_AWK_SUBST+=	gsub(/${LOWER_VENDOR}/, "$${LOWER_VENDOR}");
-.endif
-_PRINT_PLIST_AWK_SUBST+=						\
-	gsub(/${LOWER_OS_VERSION:S/./\./g}/, "$${LOWER_OS_VERSION}");	\
-	gsub(/${LOWER_OPSYS}/, "$${LOWER_OPSYS}");			\
-	gsub(/${PKGNAME_NOREV}/, "$${PKGNAME}");			\
-	gsub(/${PKGVERSION:S/./\./g:C/nb[0-9]*$$//}/, "$${PKGVERSION}");\
-	gsub(/${PKGLOCALEDIR}\/locale/, "$${PKGLOCALEDIR}/locale");	\
-	gsub("^${PKGMANDIR}\/", "man/");				\
-}
-
-_PRINT_PLIST_AWK_IGNORE=	($$0 ~ /emul\/linux\/proc/)
-_PRINT_PLIST_AWK_IGNORE+=	|| ($$0 ~ /^info\/dir$$/)
-.if defined(INFO_DIR) && empty(INFO_DIR:Minfo)
-_PRINT_PLIST_AWK_IGNORE+=	|| ($$0 ~ /^${INFO_DIR:S|/|\\/|g}\/dir$$/)
-.endif
-.if !empty(INFO_FILES)
-.  for _f_ in ${INFO_FILES}
-_PRINT_PLIST_AWK_IGNORE+=      || ($$0 ~ /^${INFO_DIR:S|/|\\/|g}\/${_f_:S|+|\+|g}(-[0-9]+)?(\.gz)?$$/)
-.  endfor
-.endif
-
-# Common (system) directories not to generate @dirrm statements for
-# Reads MTREE_FILE and generate awk statements that will
-# sort out which directories NOT to include into the PLIST @dirrm list
-.if make(print-PLIST)
-_PRINT_PLIST_COMMON_DIRS!= 	${AWK} 'BEGIN  {			\
-			i=0; 						\
-			stack[i]="${PREFIX}" ; 				\
-			cwd=""; 					\
-		} 							\
-		! ( /^\// || /^\#/ || /^$$/ ) { 			\
-			if ( $$1 == ".." ){ 				\
-				i=i-1;					\
-				cwd = stack[i];				\
-			} else if ( $$1 == "." ){ 			\
-			} else {					\
-				stack[i] = cwd ;			\
-				if ( i == 0 ){ 				\
-					cwd = $$1 ; 			\
-				} else {				\
-					cwd = cwd "\\/" $$1 ; 	\
-				} 					\
-				print "/^" cwd "$$$$/ { next; }";	\
-				i=i+1 ; 				\
-			} 						\
-		} 							\
-		END { print "{ print $$$$0; }"; }			\
-	' <${MTREE_FILE}
-.endif
-
-
-# scan $PREFIX for any files/dirs modified since the package was extracted
-# will emit "@exec mkdir"-statements for empty directories
-# XXX will fail for data files that were copied using tar (e.g. emacs)!
-# XXX should check $LOCALBASE and $X11BASE, and add @cwd statements
-
-_PRINT_PLIST_FILES_CMD=	\
-	${FIND} ${PREFIX}/. -xdev -newer ${_EXTRACT_COOKIE} \! -type d -print
-_PRINT_PLIST_DIRS_CMD=	\
-	${FIND} ${PREFIX}/. -xdev -newer ${_EXTRACT_COOKIE} -type d -print
-_PRINT_LA_LIBNAMES=	${SETENV} ECHO=${ECHO:Q} GREP=${GREP:Q} SORT=${SORT:Q} \
-			${SH} ${.CURDIR}/../../mk/scripts/print-la-libnames
-
-.if !empty(LIBTOOLIZE_PLIST:M[yY][eE][sS])
-_PRINT_PLIST_LIBTOOLIZE_FILTER?=					\
-	(								\
-	  if ${TEST} -d ${WRKDIR}; then					\
-	  	tmpdir="${WRKDIR}";					\
-	  else								\
-	  	tmpdir="$${TMPDIR-/tmp}";				\
-	  fi;								\
-	  fileslist="$$tmpdir/print.plist.files.$$$$";			\
-	  libslist="$$tmpdir/print.plist.libs.$$$$";			\
-	  while read file; do						\
-		case $$file in						\
-		*.la)							\
-			${_PRINT_LA_LIBNAMES} $$file >> $$libslist;	\
-			;;						\
-		esac;							\
-		${ECHO} "$$file";					\
-	  done > $$fileslist;						\
-	  if ${TEST} -f "$$libslist"; then				\
-	  	${GREP} -hvxF "`${SORT} -u $$libslist`" "$$fileslist";	\
-	  else								\
-	  	${CAT} "$$fileslist";					\
-	  fi;								\
-	  ${RM} -f "$$fileslist" "$$libslist";				\
-	)
-.else
-_PRINT_PLIST_LIBTOOLIZE_FILTER?=	${CAT}
-.endif
-
-.PHONY: print-PLIST
-.if !target(print-PLIST)
-print-PLIST:
-	${_PKG_SILENT}${_PKG_DEBUG}\
-	${ECHO} '@comment $$'NetBSD'$$'
-	${_PKG_SILENT}${_PKG_DEBUG}\
-	shlib_type=`${MAKE} ${MAKEFLAGS} show-shlib-type`;		\
-	case $$shlib_type in 						\
-	"a.out")	genlinks=1 ;;					\
-	*)		genlinks=0 ;;					\
-	esac;								\
-	${_PRINT_PLIST_FILES_CMD}					\
-	 | ${_PRINT_PLIST_LIBTOOLIZE_FILTER}				\
-	 | ${SORT}							\
-	 | ${AWK} '							\
-		{ sub("${PREFIX}/\\./", ""); }				\
-		${_PRINT_PLIST_AWK_IGNORE} { next; } 			\
-		${_PRINT_PLIST_AWK_SUBST}				\
-		/^@/ { print $$0; next }				\
-		/.*\/lib[^\/]+\.so\.[0-9]+\.[0-9]+\.[0-9]+$$/ { 	\
-			print $$0;					\
-			sub("\\.[0-9]+$$", "");				\
-			if ('$$genlinks') print $$0;			\
-			sub("\\.[0-9]+$$", "");				\
-			if ('$$genlinks') print $$0;			\
-			sub("\\.[0-9]+$$", "");				\
-			if ('$$genlinks') print $$0;			\
-			next;						\
-		}							\
-		/.*\/lib[^\/]+\.so\.[0-9]+\.[0-9]+$$/ { 		\
-			print $$0;					\
-			sub("\\.[0-9]+$$", "");				\
-			if ('$$genlinks') print $$0;			\
-			sub("\\.[0-9]+$$", "");				\
-			if ('$$genlinks') print $$0;			\
-			next;						\
-		}							\
-		${PRINT_PLIST_AWK}					\
-		{ print $$0; }'
-	${_PKG_SILENT}${_PKG_DEBUG}\
-	for i in `${_PRINT_PLIST_DIRS_CMD}				\
-			| ${SORT} -r					\
-			| ${AWK} '					\
-				/emul\/linux\/proc/ { next; }		\
-				/${PREFIX:S|/|\\/|g}\/\.$$/ { next; }	\
-				{ sub("${PREFIX}/\\\\./", ""); }	\
-				{ sub("^${PKGMANDIR}/", "man/"); }	\
-				${_PRINT_PLIST_COMMON_DIRS}'` ;		\
-	do								\
-		if [ `${LS} -la ${PREFIX}/$$i | ${WC} -l` = 3 ]; then	\
-			${ECHO} @exec \$${MKDIR} %D/$$i | ${AWK} '	\
-			${PRINT_PLIST_AWK}				\
-			{ print $$0; }' ;				\
-		fi ;							\
-		${ECHO} @dirrm $$i | ${AWK} '				\
-			${PRINT_PLIST_AWK}				\
-			{ print $$0; }' ;				\
-	done								\
-	| ${AWK} '${_PRINT_PLIST_AWK_SUBST} { print $$0; }'
-.endif # target(print-PLIST)
-
 # By default, all packages attempt to link into the views.
 .if ${PKG_INSTALLATION_TYPE} == "pkgviews"
 BUILD_VIEWS?=	yes
@@ -4483,184 +3950,6 @@
 tags:
 .endif
 
-# generate ${PLIST} from ${PLIST_SRC} by:
-# - substituting for PLIST_SUBST entries
-# - fixing list of man-pages according to PKGMANDIR, MANZ, MANINSTALL.
-# - adding symlinks for shared libs (ELF) or ldconfig calls (a.out).
-
-# plist awk pattern-action statement to convert man/ to ${PKGMANDIR}/
-_PLIST_AWK_PKGMANDIR=							\
-/^([^\/]*\/)*man\/([^\/]*\/)?(man[1-9ln]\/.*[1-9ln]|cat[1-9ln]\/.*[0-9])$$/ { \
-	sub("^man/", "${PKGMANDIR}/");					\
-}									\
-/^@dirrm man\// {							\
-	sub(" man/", " ${PKGMANDIR}/");					\
-}
-
-# plist awk pattern-action statement to handle MANINSTALL
-_PLIST_AWK_MANINSTALL=							\
-{									\
-	if (!"${MANINSTALL:Mmaninstall}" &&				\
-		match($$0, "^([^/]*/)*man/([^/]*/)?man[1-9ln]") ) {	\
-			next;						\
-	}								\
-	if (!"${MANINSTALL:Mcatinstall}" &&				\
-		match($$0, "^([^/]*/)*man/([^/]*/)?cat[1-9ln]") ) {	\
-			next;						\
-	}								\
-}
-
-# plist awk pattern-action statement to strip '.gz' from man
-# entries
-_PLIST_AWK_STRIP_MANZ=							\
-/^([^\/]*\/)*man\/([^\/]*\/)?(man[1-9ln]\/.*[1-9ln]|cat[1-9ln]\/.*[0-9])\.gz$$/ { \
-	$$0 = substr($$0, 1, length($$0) - 3);				\
-}
-
-# plist awk pattern-action statement to add '.gz' to man entries
-_PLIST_AWK_ADD_MANZ=							\
-/^([^\/]*\/)*man\/([^\/]*\/)?(man[1-9ln]\/.*[1-9ln]|cat[1-9ln]\/.*[0-9])$$/ { \
-	$$0 = $$0 ".gz";						\
-}
-
-# plist awk pattern-action statement to handle PLIST_SUBST substitutions
-# BEWARE: the awk script quote is closed and reopened around the
-# string argument of gsub() calls so historic quoting semantic of
-# PLIST_SUBST is preserved.
-# XXX `_str_quote_{start,end}_' is a gross hack to work around weird word
-# splitting.
-_PLIST_AWK_SUBST= { ${PLIST_SUBST:S|=|\\}/,_str_quote_start_|:S|$|_str_quote_end_);|:S|^|gsub(/\\\$\\{|:S|_str_quote_start_|"'|g:S|_str_quote_end_|'"|g} }
-
-# plist awk pattern-action statement to rewrite "imake installed" catman pages
-# as plain manpages.
-_PLIST_AWK_IMAKE_MAN=							\
-/^([^\/]*\/)*man\/([^\/]*\/)?cat[1-9ln]\/.*0$$/ {			\
-	n = match($$0, "/cat[1-9ln]");					\
-	sect = sprintf(".%s", substr($$0, n + 4, 1));			\
-	sub("/cat", "/man");						\
-	sub("\\.0$$", sect);						\
-}
-
-# plist awk pattern-action statement to handle info files:
-# generate list of files matching
-# ${PREFIX}/${INFO_DIR}/filename(-[0-9]+)?(.gz)?
-# for `filename' being each word of INFO_FILES in turn.
-# Notes:
-# - first the filenames matching ${PREFIX}/${INFO_DIR}/filename*
-# are generated with ls then they are filtered by the exact pattern.
-# - ${PREFIX}/${INFO_DIR}/filename is single quoted and single quote
-# escaped
-# XXX When all info file entries will be removed from PLIST files
-# the non-BEGIN pattern-action statements generated below will be retired.
-_PLIST_AWK_INFO=
-.if ${PLIST_TYPE} == "static"
-.  if !empty(INFO_FILES)
-.    for _f_ in ${INFO_FILES}
-_PLIST_AWK_INFO+=							\
-BEGIN {									\
-	cmd="${_f_}"; gsub("'\''", "\\'\''", cmd);			\
-	sub("^", "${LS} '\''${PREFIX}/${INFO_DIR}/", cmd);		\
-	sub("$$", "'\''*", cmd);					\
-	while ((cmd | getline l) > 0) {					\
-		if (match(l, ".*/${_f_:S|+|\\\+|g}(-[0-9]+)?(\\.gz)?$$")) { \
-			sub("^${PREFIX}/", "", l);			\
-			print l;					\
-		}							\
-	}								\
-	close(cmd);							\
-}									\
-/^${INFO_DIR:S|/|\\/|g}\/${_f_}(-[0-9]+)?$$/ { next; }
-.    endfor
-.  endif
-.endif
-
-# plist awk pattern-action statement to expand libtool archives into
-# shared and/or static libraries.
-#
-.if ${PLIST_TYPE} == "dynamic"
-_PLIST_AWK_LIBTOOL?=	# empty
-.elif empty(LIBTOOLIZE_PLIST:M[yY][eE][sS])
-BROKEN+=		"USE_LIBTOOL requires LIBTOOLIZE_PLIST=yes for proper PLIST generation"
-.else
-_PLIST_AWK_LIBTOOL?=							\
-/^[^@].*\.la$$/ {							\
-	system("cd ${PREFIX} && ${_PRINT_LA_LIBNAMES} " $$0)		\
-}
-.endif
-
-# _PLIST_AWK_SCRIPT hold the complete awk script for plist target.
-#
-_PLIST_AWK_SCRIPT=	'
-# Do the substitutions
-# See comments above about _PLIST_AWK_SUBST: it contains single quotes!
-# So _PLIST_AWK_SCRIPT is intended to be single quoted.
-_PLIST_AWK_SCRIPT+=	${_PLIST_AWK_SUBST}
-# Generated entries for info files
-.if !empty(INFO_FILES)
-_PLIST_AWK_SCRIPT+=	${_PLIST_AWK_INFO}
-.endif
-# Change path to man directory if using custom PKGMANDIR
-_PLIST_AWK_SCRIPT+=	${_PLIST_AWK_PKGMANDIR}
-# Expand libtool archives
-_PLIST_AWK_SCRIPT+=	${_PLIST_AWK_LIBTOOL}
-# Strip the '.gz' suffixes on man entries
-_PLIST_AWK_SCRIPT+=	${_PLIST_AWK_STRIP_MANZ}
-# Deal with MANINSTALL and man entries
-_PLIST_AWK_SCRIPT+=	${_PLIST_AWK_MANINSTALL}
-# Deal with "imake installed" catman pages
-.if (defined(USE_IMAKE) || !empty(USE_TOOLS:Mimake)) && ${_PREFORMATTED_MAN_DIR} == "man"
-_PLIST_AWK_SCRIPT+=	${_PLIST_AWK_IMAKE_MAN}
-.endif
-# Add '.gz' suffixes on man entries if needed
-.if !empty(_MANZ:M[yY][eE][sS])
-_PLIST_AWK_SCRIPT+=	${_PLIST_AWK_ADD_MANZ}
-.endif
-# Print the entry
-_PLIST_AWK_SCRIPT+=	{ print $$0; }
-#
-_PLIST_AWK_SCRIPT+=	'
-
-# GENERATE_PLIST is a sequence of commands, terminating in a semicolon,
-#	that outputs contents for a PLIST to stdout and is appended to
-#	the contents of ${PLIST_SRC}.
-#
-GENERATE_PLIST?=	${TRUE};
-.if ${PLIST_TYPE} == "dynamic"
-_PLIST_IGNORE_CMD=							\
-	( while read i; do						\
-		ignore=no;						\
-		for p in ${_PLIST_IGNORE_FILES}; do			\
-	  		case "$$i" in					\
-			$$p)	ignore=yes; break ;;			\
-			esac;						\
-		done;							\
-		[ "$$ignore" = "yes" ] || ${ECHO} "$$i";		\
-	  done )
-_GENERATE_PLIST=							\
-	${FIND} ${PREFIX} \! -type d -print | ${SORT} |			\
-		${SED} -e "s|^${PREFIX}/||" | 				\
-		${_PLIST_IGNORE_CMD};					\
-	${FIND} ${PREFIX} -type d -print | ${SORT} -r |			\
-		${GREP} -v "^${PREFIX}$$" |				\
-		${_PLIST_IGNORE_CMD} |					\
-		${SED} -e "s|^${PREFIX}/|@unexec ${RMDIR} -p %D/|"	\
-		       -e "s,$$, 2>/dev/null || ${TRUE},";
-.else
-_GENERATE_PLIST=	${CAT} ${PLIST_SRC}; ${GENERATE_PLIST}
-.endif
-
-.PHONY: plist
-plist: ${PLIST}
-.if ${PLIST_TYPE} == "static"
-${PLIST}: ${PLIST_SRC}
-.endif
-${PLIST}:
-	${_PKG_SILENT}${_PKG_DEBUG}					\
-	{ ${_GENERATE_PLIST} } | ${AWK} ${_PLIST_AWK_SCRIPT}		\
-		> ${PLIST}; 						\
-	  ${MAKE} ${MAKEFLAGS} do-shlib-handling			\
-		SHLIB_PLIST_MODE=1
-
 # generate ${MESSAGE} from ${MESSAGE_SRC} by substituting
 # for MESSAGE_SUBST entries
 
@@ -4693,6 +3982,8 @@
 	${ECHO} '${HOMEPAGE}'	>>${DESCR}
 .endif
 
+.include "../../mk/plist/bsd.plist.mk"
+
 .include "../../mk/subst.mk"
 
 #
Index: plist/bsd.plist.mk
===================================================================
RCS file: plist/bsd.plist.mk
diff -N plist/bsd.plist.mk
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ plist/bsd.plist.mk	6 Jan 2006 22:06:32 -0000
@@ -0,0 +1,544 @@
+##### PLIST
+
+.if ${PKG_INSTALLATION_TYPE} == "pkgviews"
+PLIST_TYPE?=	dynamic
+.endif
+PLIST_TYPE?=	static
+
+.if !defined(PLIST_SRC)
+.  if exists(${PKGDIR}/PLIST.common)
+PLIST_SRC+=	${PKGDIR}/PLIST.common
+.  endif
+.  if exists(${PKGDIR}/PLIST.${OPSYS})
+PLIST_SRC+=	${PKGDIR}/PLIST.${OPSYS}
+.  endif
+.  if exists(${PKGDIR}/PLIST.${MACHINE_ARCH:C/i[3-6]86/i386/g})
+PLIST_SRC+=	${PKGDIR}/PLIST.${MACHINE_ARCH:C/i[3-6]86/i386/g}
+.  endif
+.  if exists(${PKGDIR}/PLIST.${OPSYS}-${MACHINE_ARCH:C/i[3-6]86/i386/g})
+PLIST_SRC+=	${PKGDIR}/PLIST.${OPSYS}-${MACHINE_ARCH:C/i[3-6]86/i386/
+g}
+.  endif
+.  if exists(${PKGDIR}/PLIST)
+PLIST_SRC+=	${PKGDIR}/PLIST
+.  endif
+.  if exists(${PKGDIR}/PLIST.common_end)
+PLIST_SRC+=	${PKGDIR}/PLIST.common_end
+.  endif
+.endif # !PLIST_SRC
+
+PLIST=		${WRKDIR}/.PLIST
+
+.if ${PKG_INSTALLATION_TYPE} == "pkgviews"
+#
+# _PLIST_IGNORE_FILES basically mirrors the list of ignored files found
+# in pkg_views(1).  It's used by the dynamic PLIST generator to skip
+# adding the named files to the PLIST.
+#
+_PLIST_IGNORE_FILES+=	+*			# package metadata files
+_PLIST_IGNORE_FILES+=	info/dir
+.  if defined(INFO_DIR) && empty(INFO_DIR:Minfo)
+_PLIST_IGNORE_FILES+=	${INFO_DIR}/dir
+.  endif
+_PLIST_IGNORE_FILES+=	*[~\#] *.OLD *.orig *,v	# scratch config files
+.  if !empty(CONF_DEPENDS)
+_PLIST_IGNORE_FILES+=	${PKG_SYSCONFDIR:S,^${PREFIX}/,,}
+.  endif
+_PLIST_IGNORE_FILES+=	${PLIST_IGNORE_FILES}
+.endif
+BUILD_DEFS+=		_PLIST_IGNORE_FILES
+
+# Set PLIST_SUBST to substitute "${variable}" to "value" in PLIST
+PLIST_SUBST+=	OPSYS=${OPSYS:Q}					\
+		OS_VERSION=${OS_VERSION:Q}				\
+		MACHINE_ARCH=${MACHINE_ARCH:Q}				\
+		MACHINE_GNU_ARCH=${MACHINE_GNU_ARCH:Q}			\
+		MACHINE_GNU_PLATFORM=${MACHINE_GNU_PLATFORM:Q}		\
+		LN=${LN:Q}						\
+		LOWER_VENDOR=${LOWER_VENDOR:Q}				\
+		LOWER_OPSYS=${LOWER_OPSYS:Q}				\
+		LOWER_OS_VERSION=${LOWER_OS_VERSION:Q}			\
+		PKGBASE=${PKGBASE:Q}					\
+		PKGNAME=${PKGNAME_NOREV:Q}				\
+		PKGLOCALEDIR=${PKGLOCALEDIR:Q}				\
+		PKGVERSION=${PKGVERSION:C/nb[0-9]*$//}			\
+		LOCALBASE=${LOCALBASE:Q}				\
+		VIEWBASE=${VIEWBASE:Q}					\
+		X11BASE=${X11BASE:Q}					\
+		X11PREFIX=${X11PREFIX:Q}				\
+		SVR4_PKGNAME=${SVR4_PKGNAME:Q}				\
+		CHGRP=${CHGRP:Q}					\
+		CHMOD=${CHMOD:Q}					\
+		CHOWN=${CHOWN:Q}					\
+		MKDIR=${MKDIR:Q}					\
+		RMDIR=${RMDIR:Q}					\
+		RM=${RM:Q}						\
+		TRUE=${TRUE:Q}						\
+		QMAILDIR=${QMAILDIR:Q}					\
+		PKGMANDIR=${PKGMANDIR:Q}
+
+#
+# Show the shared library type: ELF, a.out, dylib, or none.
+#
+.if !target(show-shlib-type)
+.PHONY: show-shlib-type
+show-shlib-type:
+.  if empty(USE_LANGUAGES)
+	@${ECHO} "none"
+.  elif ${_OPSYS_SHLIB_TYPE} == "ELF/a.out"
+	@cd ${WRKDIR} &&						\
+	sotype=none;							\
+	if [ "X${MKPIC}" != "Xno" -a "X${NOPIC}" = "X" ]; then		\
+		${ECHO} "int main() { return(0); }" > a.$$$$.c;		\
+		${SETENV} PATH=${PATH:Q}				\
+		${CC} ${CFLAGS} a.$$$$.c -o a.$$$$.out;			\
+		case `${FILE_CMD} a.$$$$.out` in			\
+		*ELF*dynamically*)					\
+			sotype=ELF ;;					\
+		*shared*library*)					\
+			sotype="a.out" ;;				\
+		*dynamically*)						\
+			sotype="a.out" ;;				\
+		esac;							\
+	fi;								\
+	${ECHO} "$$sotype";						\
+	${RM} -f a.$$$$.c a.$$$$.out
+.  else
+	@${ECHO} ${_OPSYS_SHLIB_TYPE}
+.  endif
+.endif
+
+# Do handling of shared libs for two cases:
+#
+# SHLIB_PLIST_MODE=1: when first called via the ${PLIST} target,
+#                     update the PLIST to contain ELF symlink, run
+#                     ldconfig on a.out,  etc. (used when called via
+#                     the ${PLIST} target). Will update ${PLIST}.
+# SHLIB_PLIST_MODE=0: when called via the real-su-install target,
+#                     actually generate symlinks for ELF, run ldconfig
+#                     for a.out, etc. Will not modify ${PLIST}.
+#
+# XXX This target could need some cleanup after it was ripped out of
+#     real-su-install
+#
+_SHLIB_AWKFILE.a.out=	${.CURDIR}/../../mk/plist/shlib-aout.awk
+_SHLIB_AWKFILE.dylib=	${.CURDIR}/../../mk/plist/shlib-dylib.awk
+_SHLIB_AWK_ENV=		PREFIX=${PREFIX:Q}				\
+			PRINT_LA_LIBNAMES=${_PRINT_LA_LIBNAMES:Q}	\
+			TEST=${TEST:Q}
+
+.PHONY: do-shlib-handling
+do-shlib-handling:
+.if ${SHLIB_HANDLING} == "YES"
+	${_PKG_SILENT}${_PKG_DEBUG}					\
+	sos=`${EGREP} -h '^.*/lib[^/]+\.so$$' ${PLIST} || ${TRUE}`;	\
+	if [ "$$sos" != "" ]; then					\
+		shlib_type=`${MAKE} ${MAKEFLAGS} show-shlib-type`;	\
+		if [ "${SHLIB_PLIST_MODE}" = "0" ]; then 		\
+			${ECHO_MSG} "${_PKGSRC_IN}> [Automatic $$shlib_type shared object handling]"; \
+		fi;  							\
+		case "$$shlib_type" in					\
+		ELF) 	;;						\
+		aixlib) ;;						\
+		"a.out") 						\
+			${SETENV} ${_SHLIB_AWK_ENV} ${AWK}		\
+				-f ${_SHLIB_AWKFILE.a.out}		\
+				< ${PLIST} > ${PLIST}.tmp ;		\
+			if [ "${SHLIB_PLIST_MODE}" = "1" ]; then	\
+				${MV} ${PLIST}.tmp ${PLIST};		\
+			else 						\
+				${RM} ${PLIST}.tmp ;			\
+			fi ; 						\
+			cnt=`${EGREP} -c '^@exec[ 	]*${LDCONFIG}$$' ${PLIST} || ${TRUE}`; \
+			if [ "${SHLIB_PLIST_MODE}" = "1" ]; then 	\
+				if [ $$cnt -eq 0 ]; then		\
+					${ECHO} "@exec ${LDCONFIG}" >> ${PLIST}; \
+					${ECHO} "@unexec ${LDCONFIG}" >> ${PLIST}; \
+				fi					\
+			fi;						\
+			if [ "${SHLIB_PLIST_MODE}" = "0" ]; then	\
+				if [ "${PKG_VERBOSE}" != "" ]; then	\
+					${ECHO_MSG} "$$sos";		\
+					${ECHO_MSG} "Running ${LDCONFIG}"; \
+				fi;					\
+				${LDCONFIG} || ${TRUE};			\
+			fi						\
+			;;						\
+		"dylib")						\
+			${SETENV} ${_SHLIB_AWK_ENV} ${AWK}		\
+				-f ${_SHLIB_AWKFILE.dylib}		\
+				< ${PLIST} > ${PLIST}.tmp &&		\
+			if [ "${SHLIB_PLIST_MODE}" = "1" ]; then	\
+				${MV} ${PLIST}.tmp ${PLIST};		\
+			else						\
+				${RM} ${PLIST}.tmp ;			\
+			fi ;						\
+			;;						\
+		"*")							\
+			if [ "${SHLIB_PLIST_MODE}" = "0" ]; then 	\
+				${ECHO_MSG} "No shared libraries for ${MACHINE_ARCH}"; \
+			fi ; 						\
+			if [ "${SHLIB_PLIST_MODE}" = "1" ]; then	\
+				for so in $$sos; do			\
+					if [ X"${PKG_VERBOSE}" != X"" ]; then \
+						${ECHO_MSG} >&2 "Ignoring $$so"; \
+					fi;				\
+					${SED} -e "s;^$$so$$;@comment No shared objects - &;" \
+						${PLIST} >${PLIST}.tmp && ${MV} ${PLIST}.tmp ${PLIST};	\
+				done;					\
+			fi ;						\
+			;;						\
+		esac;							\
+	fi
+.endif # SHLIB_HANDLING == "YES"
+
+###
+### Automatic PLIST generation
+###  - files & symlinks first
+###  - @dirrm statements last
+###  - empty directories are handled properly
+###  - dirs from mtree files are excluded
+###  - substitute for platform or package specifics substrings
+###
+### Usage:
+###  - make install
+###  - make print-PLIST | brain >PLIST
+###
+
+_PRINT_PLIST_AWK_SUBST={						\
+	gsub(/${OPSYS}/, "$${OPSYS}");					\
+	gsub(/${OS_VERSION:S/./\./g}/, "$${OS_VERSION}");		\
+	gsub(/${MACHINE_GNU_PLATFORM}/, "$${MACHINE_GNU_PLATFORM}");	\
+	gsub(/${MACHINE_ARCH}/, "$${MACHINE_ARCH}");			\
+	gsub(/${MACHINE_GNU_ARCH}/, "$${MACHINE_GNU_ARCH}");
+.if !empty(LOWER_VENDOR)
+_PRINT_PLIST_AWK_SUBST+=	gsub(/${LOWER_VENDOR}/, "$${LOWER_VENDOR}");
+.endif
+_PRINT_PLIST_AWK_SUBST+=						\
+	gsub(/${LOWER_OS_VERSION:S/./\./g}/, "$${LOWER_OS_VERSION}");	\
+	gsub(/${LOWER_OPSYS}/, "$${LOWER_OPSYS}");			\
+	gsub(/${PKGNAME_NOREV}/, "$${PKGNAME}");			\
+	gsub(/${PKGVERSION:S/./\./g:C/nb[0-9]*$$//}/, "$${PKGVERSION}");\
+	gsub(/${PKGLOCALEDIR}\/locale/, "$${PKGLOCALEDIR}/locale");	\
+	gsub("^${PKGMANDIR}\/", "man/");				\
+}
+
+_PRINT_PLIST_AWK_IGNORE=	($$0 ~ /emul\/linux\/proc/)
+_PRINT_PLIST_AWK_IGNORE+=	|| ($$0 ~ /^info\/dir$$/)
+.if defined(INFO_DIR) && empty(INFO_DIR:Minfo)
+_PRINT_PLIST_AWK_IGNORE+=	|| ($$0 ~ /^${INFO_DIR:S|/|\\/|g}\/dir$$/)
+.endif
+.if !empty(INFO_FILES)
+.  for _f_ in ${INFO_FILES}
+_PRINT_PLIST_AWK_IGNORE+=	|| ($$0 ~ /^${INFO_DIR:S|/|\\/|g}\/${_f_:S|+|\+|g}(-[0-9]+)?(\.gz)?$$/)
+.  endfor
+.endif
+
+# Common (system) directories not to generate @dirrm statements for
+# Reads MTREE_FILE and generate awk statements that will
+# sort out which directories NOT to include into the PLIST @dirrm list
+.if make(print-PLIST)
+_PRINT_PLIST_COMMON_DIRS!=	${AWK} 'BEGIN {				\
+			i=0;						\
+			stack[i]="${PREFIX}" ;				\
+			cwd="";						\
+		}							\
+		! ( /^\// || /^\#/ || /^$$/ ) {				\
+			if ( $$1 == ".." ){				\
+				i=i-1;					\
+				cwd = stack[i];				\
+			} else if ( $$1 == "." ){			\
+			} else {					\
+				stack[i] = cwd ;			\
+				if ( i == 0 ){				\
+					cwd = $$1 ;			\
+				} else {				\
+					cwd = cwd "\\/" $$1 ;		\
+				}					\
+				print "/^" cwd "$$$$/ { next; }";	\
+				i=i+1 ;					\
+			}						\
+		}							\
+		END { print "{ print $$$$0; }"; }			\
+	' <${MTREE_FILE}
+.endif
+
+# scan $PREFIX for any files/dirs modified since the package was extracted
+# will emit "@exec mkdir"-statements for empty directories
+# XXX will fail for data files that were copied using tar (e.g. emacs)!
+# XXX should check $LOCALBASE and $X11BASE, and add @cwd statements
+
+_PRINT_PLIST_FILES_CMD=	\
+	${FIND} ${PREFIX}/. -xdev -newer ${_EXTRACT_COOKIE} \! -type d -print
+_PRINT_PLIST_DIRS_CMD=	\
+	${FIND} ${PREFIX}/. -xdev -newer ${_EXTRACT_COOKIE} -type d -print
+_PRINT_LA_LIBNAMES=	${SETENV} ECHO=${ECHO:Q} GREP=${GREP:Q} SORT=${SORT:Q} \
+			${SH} ${.CURDIR}/../../mk/plist/print-la-libnames
+
+.if !empty(LIBTOOLIZE_PLIST:M[yY][eE][sS])
+_PRINT_PLIST_LIBTOOLIZE_FILTER?=					\
+	(								\
+	  if ${TEST} -d ${WRKDIR}; then					\
+	  	tmpdir="${WRKDIR}";					\
+	  else								\
+	  	tmpdir="$${TMPDIR-/tmp}";				\
+	  fi;								\
+	  fileslist="$$tmpdir/print.plist.files.$$$$";			\
+	  libslist="$$tmpdir/print.plist.libs.$$$$";			\
+	  while read file; do						\
+		case $$file in						\
+		*.la)							\
+			${_PRINT_LA_LIBNAMES} $$file >> $$libslist;	\
+			;;						\
+		esac;							\
+		${ECHO} "$$file";					\
+	  done > $$fileslist;						\
+	  if ${TEST} -f "$$libslist"; then				\
+	  	${GREP} -hvxF "`${SORT} -u $$libslist`" "$$fileslist";	\
+	  else								\
+	  	${CAT} "$$fileslist";					\
+	  fi;								\
+	  ${RM} -f "$$fileslist" "$$libslist";				\
+	)
+.else
+_PRINT_PLIST_LIBTOOLIZE_FILTER?=	${CAT}
+.endif
+
+.PHONY: print-PLIST
+.if !target(print-PLIST)
+print-PLIST:
+	${_PKG_SILENT}${_PKG_DEBUG}\
+	${ECHO} '@comment $$'NetBSD'$$'
+	${_PKG_SILENT}${_PKG_DEBUG}\
+	shlib_type=`${MAKE} ${MAKEFLAGS} show-shlib-type`;		\
+	case $$shlib_type in 						\
+	"a.out")	genlinks=1 ;;					\
+	*)		genlinks=0 ;;					\
+	esac;								\
+	${_PRINT_PLIST_FILES_CMD}					\
+	 | ${_PRINT_PLIST_LIBTOOLIZE_FILTER}				\
+	 | ${SORT}							\
+	 | ${AWK} '							\
+		{ sub("${PREFIX}/\\./", ""); }				\
+		${_PRINT_PLIST_AWK_IGNORE} { next; } 			\
+		${_PRINT_PLIST_AWK_SUBST}				\
+		/^@/ { print $$0; next }				\
+		/.*\/lib[^\/]+\.so\.[0-9]+\.[0-9]+\.[0-9]+$$/ { 	\
+			print $$0;					\
+			sub("\\.[0-9]+$$", "");				\
+			if ('$$genlinks') print $$0;			\
+			sub("\\.[0-9]+$$", "");				\
+			if ('$$genlinks') print $$0;			\
+			sub("\\.[0-9]+$$", "");				\
+			if ('$$genlinks') print $$0;			\
+			next;						\
+		}							\
+		/.*\/lib[^\/]+\.so\.[0-9]+\.[0-9]+$$/ { 		\
+			print $$0;					\
+			sub("\\.[0-9]+$$", "");				\
+			if ('$$genlinks') print $$0;			\
+			sub("\\.[0-9]+$$", "");				\
+			if ('$$genlinks') print $$0;			\
+			next;						\
+		}							\
+		${PRINT_PLIST_AWK}					\
+		{ print $$0; }'
+	${_PKG_SILENT}${_PKG_DEBUG}\
+	for i in `${_PRINT_PLIST_DIRS_CMD}				\
+			| ${SORT} -r					\
+			| ${AWK} '					\
+				/emul\/linux\/proc/ { next; }		\
+				/${PREFIX:S|/|\\/|g}\/\.$$/ { next; }	\
+				{ sub("${PREFIX}/\\\\./", ""); }	\
+				{ sub("^${PKGMANDIR}/", "man/"); }	\
+				${_PRINT_PLIST_COMMON_DIRS}'` ;		\
+	do								\
+		if [ `${LS} -la ${PREFIX}/$$i | ${WC} -l` = 3 ]; then	\
+			${ECHO} @exec \$${MKDIR} %D/$$i | ${AWK} '	\
+			${PRINT_PLIST_AWK}				\
+			{ print $$0; }' ;				\
+		fi ;							\
+		${ECHO} @dirrm $$i | ${AWK} '				\
+			${PRINT_PLIST_AWK}				\
+			{ print $$0; }' ;				\
+	done								\
+	| ${AWK} '${_PRINT_PLIST_AWK_SUBST} { print $$0; }'
+.endif # target(print-PLIST)
+
+# generate ${PLIST} from ${PLIST_SRC} by:
+# - substituting for PLIST_SUBST entries
+# - fixing list of man-pages according to PKGMANDIR, MANZ, MANINSTALL.
+# - adding symlinks for shared libs (ELF) or ldconfig calls (a.out).
+
+# plist awk pattern-action statement to convert man/ to ${PKGMANDIR}/
+_PLIST_AWK_PKGMANDIR=							\
+/^([^\/]*\/)*man\/([^\/]*\/)?(man[1-9ln]\/.*[1-9ln]|cat[1-9ln]\/.*[0-9])$$/ { \
+	sub("^man/", "${PKGMANDIR}/");					\
+}									\
+/^@dirrm man\// {							\
+	sub(" man/", " ${PKGMANDIR}/");					\
+}
+
+# plist awk pattern-action statement to handle MANINSTALL
+_PLIST_AWK_MANINSTALL=							\
+{									\
+	if (!"${MANINSTALL:Mmaninstall}" &&				\
+		match($$0, "^([^/]*/)*man/([^/]*/)?man[1-9ln]") ) {	\
+			next;						\
+	}								\
+	if (!"${MANINSTALL:Mcatinstall}" &&				\
+		match($$0, "^([^/]*/)*man/([^/]*/)?cat[1-9ln]") ) {	\
+			next;						\
+	}								\
+}
+
+# plist awk pattern-action statement to strip '.gz' from man
+# entries
+_PLIST_AWK_STRIP_MANZ=							\
+/^([^\/]*\/)*man\/([^\/]*\/)?(man[1-9ln]\/.*[1-9ln]|cat[1-9ln]\/.*[0-9])\.gz$$/ { \
+	$$0 = substr($$0, 1, length($$0) - 3);				\
+}
+
+# plist awk pattern-action statement to add '.gz' to man entries
+_PLIST_AWK_ADD_MANZ=							\
+/^([^\/]*\/)*man\/([^\/]*\/)?(man[1-9ln]\/.*[1-9ln]|cat[1-9ln]\/.*[0-9])$$/ { \
+	$$0 = $$0 ".gz";						\
+}
+
+# plist awk pattern-action statement to handle PLIST_SUBST substitutions
+# BEWARE: the awk script quote is closed and reopened around the
+# string argument of gsub() calls so historic quoting semantic of
+# PLIST_SUBST is preserved.
+# XXX `_str_quote_{start,end}_' is a gross hack to work around weird word
+# splitting.
+_PLIST_AWK_SUBST= { ${PLIST_SUBST:S|=|\\}/,_str_quote_start_|:S|$|_str_quote_end_);|:S|^|gsub(/\\\$\\{|:S|_str_quote_start_|"'|g:S|_str_quote_end_|'"|g} }
+
+# plist awk pattern-action statement to rewrite "imake installed" catman pages
+# as plain manpages.
+_PLIST_AWK_IMAKE_MAN=							\
+/^([^\/]*\/)*man\/([^\/]*\/)?cat[1-9ln]\/.*0$$/ {			\
+	n = match($$0, "/cat[1-9ln]");					\
+	sect = sprintf(".%s", substr($$0, n + 4, 1));			\
+	sub("/cat", "/man");						\
+	sub("\\.0$$", sect);						\
+}
+
+# plist awk pattern-action statement to handle info files:
+# generate list of files matching
+# ${PREFIX}/${INFO_DIR}/filename(-[0-9]+)?(.gz)?
+# for `filename' being each word of INFO_FILES in turn.
+# Notes:
+# - first the filenames matching ${PREFIX}/${INFO_DIR}/filename*
+# are generated with ls then they are filtered by the exact pattern.
+# - ${PREFIX}/${INFO_DIR}/filename is single quoted and single quote
+# escaped
+# XXX When all info file entries will be removed from PLIST files
+# the non-BEGIN pattern-action statements generated below will be retired.
+_PLIST_AWK_INFO=
+.if ${PLIST_TYPE} == "static"
+.  if !empty(INFO_FILES)
+.    for _f_ in ${INFO_FILES}
+_PLIST_AWK_INFO+=							\
+BEGIN {									\
+	cmd="${_f_}"; gsub("'\''", "\\'\''", cmd);			\
+	sub("^", "${LS} '\''${PREFIX}/${INFO_DIR}/", cmd);		\
+	sub("$$", "'\''*", cmd);					\
+	while ((cmd | getline l) > 0) {					\
+		if (match(l, ".*/${_f_:S|+|\\\+|g}(-[0-9]+)?(\\.gz)?$$")) { \
+			sub("^${PREFIX}/", "", l);			\
+			print l;					\
+		}							\
+	}								\
+	close(cmd);							\
+}									\
+/^${INFO_DIR:S|/|\\/|g}\/${_f_}(-[0-9]+)?$$/ { next; }
+.    endfor
+.  endif
+.endif
+
+# plist awk pattern-action statement to expand libtool archives into
+# shared and/or static libraries.
+#
+.if ${PLIST_TYPE} == "dynamic"
+_PLIST_AWK_LIBTOOL?=	# empty
+.elif empty(LIBTOOLIZE_PLIST:M[yY][eE][sS])
+BROKEN+=		"USE_LIBTOOL requires LIBTOOLIZE_PLIST=yes for proper PLIST generation"
+.else
+_PLIST_AWK_LIBTOOL?=							\
+/^[^@].*\.la$$/ {							\
+	system("cd ${PREFIX} && ${_PRINT_LA_LIBNAMES} " $$0)		\
+}
+.endif
+
+# _PLIST_AWK_SCRIPT hold the complete awk script for plist target.
+#
+_PLIST_AWK_SCRIPT=	'
+# Do the substitutions
+# See comments above about _PLIST_AWK_SUBST: it contains single quotes!
+# So _PLIST_AWK_SCRIPT is intended to be single quoted.
+_PLIST_AWK_SCRIPT+=	${_PLIST_AWK_SUBST}
+# Generated entries for info files
+.if !empty(INFO_FILES)
+_PLIST_AWK_SCRIPT+=	${_PLIST_AWK_INFO}
+.endif
+# Change path to man directory if using custom PKGMANDIR
+_PLIST_AWK_SCRIPT+=	${_PLIST_AWK_PKGMANDIR}
+# Expand libtool archives
+_PLIST_AWK_SCRIPT+=	${_PLIST_AWK_LIBTOOL}
+# Strip the '.gz' suffixes on man entries
+_PLIST_AWK_SCRIPT+=	${_PLIST_AWK_STRIP_MANZ}
+# Deal with MANINSTALL and man entries
+_PLIST_AWK_SCRIPT+=	${_PLIST_AWK_MANINSTALL}
+# Deal with "imake installed" catman pages
+.if (defined(USE_IMAKE) || !empty(USE_TOOLS:Mimake)) && ${_PREFORMATTED_MAN_DIR} == "man"
+_PLIST_AWK_SCRIPT+=	${_PLIST_AWK_IMAKE_MAN}
+.endif
+# Add '.gz' suffixes on man entries if needed
+.if !empty(_MANZ:M[yY][eE][sS])
+_PLIST_AWK_SCRIPT+=	${_PLIST_AWK_ADD_MANZ}
+.endif
+# Print the entry
+_PLIST_AWK_SCRIPT+=	{ print $$0; }
+#
+_PLIST_AWK_SCRIPT+=	'
+
+# GENERATE_PLIST is a sequence of commands, terminating in a semicolon,
+#	that outputs contents for a PLIST to stdout and is appended to
+#	the contents of ${PLIST_SRC}.
+#
+GENERATE_PLIST?=	${TRUE};
+.if ${PLIST_TYPE} == "dynamic"
+_PLIST_IGNORE_CMD=							\
+	( while read i; do						\
+		ignore=no;						\
+		for p in ${_PLIST_IGNORE_FILES}; do			\
+	  		case "$$i" in					\
+			$$p)	ignore=yes; break ;;			\
+			esac;						\
+		done;							\
+		[ "$$ignore" = "yes" ] || ${ECHO} "$$i";		\
+	  done )
+_GENERATE_PLIST=							\
+	${FIND} ${PREFIX} \! -type d -print | ${SORT} |			\
+		${SED} -e "s|^${PREFIX}/||" | 				\
+		${_PLIST_IGNORE_CMD};					\
+	${FIND} ${PREFIX} -type d -print | ${SORT} -r |			\
+		${GREP} -v "^${PREFIX}$$" |				\
+		${_PLIST_IGNORE_CMD} |					\
+		${SED} -e "s|^${PREFIX}/|@unexec ${RMDIR} -p %D/|"	\
+		       -e "s,$$, 2>/dev/null || ${TRUE},";
+.else
+_GENERATE_PLIST=	${CAT} ${PLIST_SRC}; ${GENERATE_PLIST}
+.endif
+
+.PHONY: plist
+plist: ${PLIST}
+.if ${PLIST_TYPE} == "static"
+${PLIST}: ${PLIST_SRC}
+.endif
+${PLIST}:
+	${_PKG_SILENT}${_PKG_DEBUG}					\
+	{ ${_GENERATE_PLIST} } | ${AWK} ${_PLIST_AWK_SCRIPT}		\
+		> ${PLIST}; 						\
+	  ${MAKE} ${MAKEFLAGS} do-shlib-handling			\
+		SHLIB_PLIST_MODE=1
Index: plist/print-la-libnames
===================================================================
RCS file: plist/print-la-libnames
diff -N plist/print-la-libnames
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ plist/print-la-libnames	6 Jan 2006 22:06:33 -0000
@@ -0,0 +1,77 @@
+# /bin/sh
+#
+# $NetBSD: print-la-libnames,v 1.4 2004/11/12 21:21:08 jlam Exp $
+#
+# Copyright (c) 2004 The NetBSD Foundation, Inc.
+# All rights reserved.
+#
+# This code is derived from software contributed to The NetBSD Foundation
+# by Todd Vierling.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+#    must display the following acknowledgement:
+#        This product includes software developed by the NetBSD
+#        Foundation, Inc. and its contributors.
+# 4. Neither the name of The NetBSD Foundation nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+: ${ECHO=echo}
+: ${GREP=grep}
+: ${SORT=sort}
+
+for la
+do
+	dir="${la%/*.la}"
+	library_names=
+	old_library=
+
+	case $dir in
+	$la)	dir= ;;
+	*)	dir="$dir/" ;;
+	esac
+	case $la in
+	/*|./*)	lapath="$la" ;;
+	*)	lapath="./$la" ;;
+	esac
+
+	if [ -r "$lapath" -a ! -h "$lapath" ]; then
+		if ${GREP} -q "libtool library file" "$lapath"; then
+			. "$lapath"
+			if [ "$installed" = "no" ]; then
+				${ECHO} 1>&2 "$0: \`$lapath' was not properly installed"
+				exit 1
+			fi
+			for lib in $library_names $old_library; do
+				libpath="$dir$lib"
+				if [ ! -f "$libpath" ]; then
+					${ECHO} 1>&2 "$0: \`$libpath' was not found"
+				fi
+				${ECHO} "$libpath"
+			done
+		fi
+	else
+		${ECHO} 1>&2 "$0: cannot read libtool archive \`$lapath'"
+	fi
+done | ${SORT} -u
Index: plist/shlib-aout.awk
===================================================================
RCS file: plist/shlib-aout.awk
diff -N plist/shlib-aout.awk
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ plist/shlib-aout.awk	6 Jan 2006 22:06:33 -0000
@@ -0,0 +1,132 @@
+# $NetBSD$
+#
+# Copyright (c) 2006 The NetBSD Foundation, Inc.
+# All rights reserved.
+#
+# This code is derived from software contributed to The NetBSD Foundation
+# by Johnny C. Lam.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+#    must display the following acknowledgement:
+#        This product includes software developed by the NetBSD
+#        Foundation, Inc. and its contributors.
+# 4. Neither the name of The NetBSD Foundation nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+#
+# This awk script is a filter that reads PLIST entries and strips out
+# entries that match ELF library symlinks that aren't installed on a.out
+# platforms.
+#
+
+BEGIN {
+	PREFIX = ENVIRON["PREFIX"]
+	PRINT_LA_LIBNAMES = ENVIRON["PRINT_LA_LIBNAMES"]
+	TEST = ENVIRON["TEST"]
+	nentries = 0;
+}
+
+###
+### Stored special PLIST commands, e.g. @comment, @exec, etc., verbatim
+### in the entries array.
+###
+/^@/ {
+	entries[++nentries] = $0
+	next
+}
+
+###
+### Record all of the library names associated with a libtool archive
+### in the "ltnames" array.  Also, record the libtool archive in the
+### "entries" array.
+###
+/.*\/[^\/]+\.la$/ {
+	entries[++nentries] = $0
+	cmd = TEST " -f " PREFIX "/" $0
+	if (system(cmd) == 0) {
+		cmd = "cd " PREFIX " && " PRINT_LA_LIBNAMES " " $0
+		while (cmd | getline) {
+			ltnames[$0] = $0
+		}
+		close(cmd)
+	}
+	next
+}
+
+###
+### Record all library symlinks derived from a shared library name in the
+### "symlinks" array.  Also, record the full shared library name in the
+### "entries" array.
+###
+/.*\/lib[^\/]+\.so(\.[0-9]+)*$/ {
+	entries[++nentries] = $0
+	while (sub("\.[0-9]+$", "")) {
+		symlinks[$0] = $0
+	}
+	if (sub("-[^-]+\.so$", ".so")) {
+		symlinks[$0] = $0
+	}
+	next
+}
+
+###
+### All other entries are stored verbatim in the entries array.
+###
+{
+	entries[++nentries] = $0
+}
+
+###
+### Print out the PLIST entries to standard output.
+###
+END {
+	# Drop valid library names associated with a libtool archive from
+	# the list of library symlinks that will be removed from the PLIST.
+	#
+	for (j in symlinks) {
+		for (k in ltnames) {
+			if (symlinks[j] == ltnames[k]) {
+				delete symlinks[j]
+				break
+			}
+		}
+	}
+
+	# Remove PLIST entries which match a library symlink.
+	for (i in entries) {
+		for (j in symlinks) {
+			if (entries[i] == symlinks[j]) {
+				delete entries[i]
+				break
+			}
+		}
+	}
+
+	# Output the PLIST entries in order.
+	for (i = 1; i <= nentries; i++) {
+		if (entries[i]) {
+			print entries[i]
+		}
+	}
+}
Index: plist/shlib-dylib.awk
===================================================================
RCS file: plist/shlib-dylib.awk
diff -N plist/shlib-dylib.awk
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ plist/shlib-dylib.awk	6 Jan 2006 22:06:33 -0000
@@ -0,0 +1,181 @@
+# $NetBSD$
+#
+# Copyright (c) 2006 The NetBSD Foundation, Inc.
+# All rights reserved.
+#
+# This code is derived from software contributed to The NetBSD Foundation
+# by Johnny C. Lam.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+#    must display the following acknowledgement:
+#        This product includes software developed by the NetBSD
+#        Foundation, Inc. and its contributors.
+# 4. Neither the name of The NetBSD Foundation nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+#
+# This awk script is a filter that reads PLIST entries and transforms
+# and expands entries that match ELF library into the appropriate Mach-O
+# dylib names.
+#
+
+BEGIN {
+	PREFIX = ENVIRON["PREFIX"]
+	PRINT_LA_LIBNAMES = ENVIRON["PRINT_LA_LIBNAMES"]
+	TEST = ENVIRON["TEST"]
+	nentries = 0;
+}
+
+###
+### add_dylib(lib) adds the named "lib" to the PLIST entries list and
+###	to the dylibs list if we haven't already seen it.
+###
+function add_dylib(lib) {
+	if (dylibs[lib] == "") {
+		dylibs[lib] = lib
+		entries[++nentries] = lib
+	}
+}
+
+###
+### Stored special PLIST commands, e.g. @comment, @exec, etc., verbatim
+### in the entries array.
+###
+/^@/ {
+	entries[++nentries] = $0
+	next
+}
+
+###
+### Record all of the library names associated with a libtool archive
+### in the "ltnames" array.  Also, record the libtool archive in the
+### "entries" array.
+###
+/.*\/[^\/]+\.la$/ {
+	entries[++nentries] = $0
+	cmd = TEST " -f " PREFIX "/" $0
+	if (system(cmd) == 0) {
+		cmd = "cd " PREFIX " && " PRINT_LA_LIBNAMES " " $0
+		while (cmd | getline) {
+			ltnames[$0] = $0
+		}
+		close(cmd)
+	}
+	next
+}
+
+###
+### Convert each ELF shlib entry into a dylib entry.  Also, record all
+### dylib names that can be derived from this entry as dylibs.
+###
+/.*\/lib[^\/]+\.so(\.[0-9]+)+$/ {
+	lib = $0; sub("\.so\.", ".", lib); sub("\.so$", "", lib)
+	lib = lib ".dylib"
+	add_dylib(lib)
+	while (sub("\.[0-9]+$", "")) {
+		lib = $0; sub("\.so\.", ".", lib); sub("\.so$", "", lib)
+		lib = lib ".dylib"
+		add_dylib(lib)
+	}
+	if (sub("\.so$", "")) {
+		lib = $0 ".dylib"
+		add_dylib(lib)
+	}
+	if (sub("-([0-9.]+)$", "")) {
+		lib = $0 ".dylib"
+		add_dylib(lib)
+	}
+	next
+}
+
+###
+### If the ".so" file actually exists, then it's a dynamically loadable
+### module, so the entry should stay.  Convert it into a dylib name as
+### well and record it as a dylib.
+###
+/.*\/lib[^\/]+\.so$/ {
+	cmd = TEST " -f " PREFIX "/" $0
+	if (system(cmd) == 0) {
+		entries[++nentries] = $0
+	}
+	lib = $0; sub("\.so$", "", lib)
+	lib = lib ".dylib"
+	add_dylib(lib)
+	if (sub("-([0-9.]+)$", "")) {
+		lib = $0 ".dylib"
+		add_dylib(lib)
+	}
+	next
+}
+
+###
+### All other entries are stored verbatim in the entries array.
+###
+{
+	entries[++nentries] = $0
+}
+
+###
+### Print out the PLIST entries to standard output.
+###
+END {
+	# Drop valid library names associated with a libtool archive from
+	# the list of dylibs that will be removed from the PLIST.
+	#
+	for (j in dylibs) {
+		for (k in ltnames) {
+			if (dylibs[j] == ltnames[k]) {
+				delete dylibs[j]
+				break
+			}
+		}
+	}
+
+	# Remove dylib entries that *do* exist on the filesystem from the
+	# list of dylibs that will be removed from the PLIST.
+	#
+	for (j in dylibs) {
+		cmd = TEST " -f " PREFIX "/" dylibs[j]
+		if (system(cmd) == 0) {
+			delete dylibs[j]
+		}
+	}
+
+	# Remove PLIST entries that match a non-existent dylib.
+	for (i in entries) {
+		for (j in dylibs) {
+			if (entries[i] == dylibs[j]) {
+				delete entries[i]
+				break
+			}
+		}
+	}
+
+	# Output the PLIST entries in order.
+	for (i = 1; i <= nentries; i++) {
+		if (entries[i]) {
+			print entries[i]
+		}
+	}
+}