regpkg revision 1.8
1#! /bin/sh
2#
3# $NetBSD: regpkg,v 1.8 2006/01/03 18:31:09 apb Exp $
4#
5# Copyright (c) 2003 Alistair G. Crooks.  All rights reserved.
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions
9# are met:
10# 1. Redistributions of source code must retain the above copyright
11#    notice, this list of conditions and the following disclaimer.
12# 2. Redistributions in binary form must reproduce the above copyright
13#    notice, this list of conditions and the following disclaimer in the
14#    documentation and/or other materials provided with the distribution.
15# 3. All advertising materials mentioning features or use of this software
16#    must display the following acknowledgement:
17#	This product includes software developed by Alistair G. Crooks.
18#	for the NetBSD project.
19# 4. The name of the author may not be used to endorse or promote
20#    products derived from this software without specific prior written
21#    permission.
22#
23# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
24# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
27# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
29# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
31# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34#
35
36# Usage: regpkg set pkgname
37
38rundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/"
39
40SYSPKGROOT="${PKG_DBDIR:-/var/db/pkg}"
41case "${SYSPKG_DBDIR}" in
42"")	;;
43*)	SYSPKGROOT="${SYSPKG_DBDIR}" ;;
44esac
45
46PLIST="/tmp/.PLIST.$$"
47
48verbose=""
49while [ $# -gt 2 ]; do
50	case "$1" in
51	-v)	verbose="$1" ;;
52	*)	break ;;
53	esac
54	shift
55done
56
57if [ $# -ne 2 ]; then
58	echo "Usage: regpkg set pkgname"
59	exit 1
60fi
61
62pkgset="$1"
63
64pkg="$2"
65
66case "${verbose}" in
67-v)	echo "Making PLIST for \"${pkgset}\" set and \"${pkg}\" package" ;;
68esac
69
70# create the skeleton PLIST from the pkgset description
71"${rundir}/makeplist" "${pkgset}" "${pkg}" > "${PLIST}"
72
73# create the pkg tiny version
74case "${SYSPKG_DATES}" in
75"")	tinyvers="$(${AWK} '$1 ~ '/"${pkg}"/' { print $2 }' "${rundir}/versions")"
76	case "${tinyvers}" in
77	"")	tinyvers=0
78		;;
79	esac
80	if [ -f ../../sys/conf/osrelease.sh ]; then
81		osvers="$(${HOST_SH} ../../sys/conf/osrelease.sh)"
82		method=osreleases
83	else
84		osvers="$(${UNAME} -r)"
85		method=uname
86	fi
87	t="${osvers}.${tinyvers}"
88	;;
89*)	args="$(${AWK} '
90		/^@cwd/ { prefix = $2; next }
91		/^@dirrm/ { next }
92		{ printf("%s%s\n", prefix, $0) }' "${PLIST}")"
93	# first try for any RCS identifiers in the files
94	t=0
95	case "${args}" in
96	"")	;;
97	*)	t="$(${IDENT} ${args} 2>/dev/null | ${AWK} '
98			BEGIN { last = 0 }
99			$2 == "crt0.c,v" { next }
100			NF == 8 { t = $4; gsub("/", "", t); if (t > last) last = t; }
101			END { print last }')"
102		method=ident
103		;;
104	esac
105	case "${t}" in
106	0)	# we need the last mtime of the files which make up the package
107		t="$(${ENV_CMD} TZ=UTC LOCALE=C ${LS} -lT ${args} | ${AWK} '
108			BEGIN { newest = 0 }
109			{
110				t = $9 "";
111				if ($6 == "Jan") t = t "01";
112				if ($6 == "Feb") t = t "02";
113				if ($6 == "Mar") t = t "03";
114				if ($6 == "Apr") t = t "04";
115				if ($6 == "May") t = t "05";
116				if ($6 == "Jun") t = t "06";
117				if ($6 == "Jul") t = t "07";
118				if ($6 == "Aug") t = t "08";
119				if ($6 == "Sep") t = t "09";
120				if ($6 == "Oct") t = t "10";
121				if ($6 == "Nov") t = t "11";
122				if ($6 == "Dec") t = t "12";
123				if ($7 < 10) t = t "0";
124				t = t $7;
125				#these next two lines add the 24h clock onto the date
126				#gsub(":", "", $8);
127				#t = sprintf("%s.%4.4s", t, $8);
128				if (t > newest) newest = t;
129			}
130			END { print newest }')"
131		method=ls
132		;;
133	esac
134	;;
135esac
136
137# print version number that we're using
138case "${verbose}" in
139-v)	echo "${pkg} - ${t} version using ${method} method" ;;
140esac
141
142# create the directory and minimal contents
143SYSPKGDIR="${SYSPKGROOT}/${pkg}-${t}"
144if [ -d "${SYSPKGDIR}" ]; then
145	echo "There is already a ${pkg}-${t} package installed (${SYSPKGDIR})"
146	exit 1
147fi
148
149mkdir -p "${SYSPKGDIR}"
150
151# add the dependencies
152${AWK} '$1 ~ '/"${pkg}"/' { print $2 }' "${rundir}/deps" | ${SORT} | \
153    ${AWK} '{ print "@pkgdep " $1 "-[0-9]*" }' >> "${PLIST}"
154
155# create the comment
156comment="$(${AWK} '$1 ~ '/"${pkg}"/' { print substr($0, length($1) + 2) }' \
157	"${rundir}/comments")"
158case "${comment}" in
159"")	echo "***WARNING ***: no comment for \"${pkg}\"" 2>&1
160	comment="System package for ${pkg}"
161	;;
162esac
163echo "${comment}" > "${SYSPKGDIR}/+COMMENT"
164
165# create the description
166descr="$(${AWK} '$1 ~ '/"${pkg}"/' { print substr($0, length($1) + 2) }' \
167	"${rundir}/descrs")"
168case "${descr}" in
169"")	echo "***WARNING ***: no description for \"${pkg}\"" 2>&1
170	descr="System package for ${pkg}"
171	;;
172esac
173echo "${descr}" > "${SYSPKGDIR}/+DESC"
174${PRINTF} "\nHomepage:\nhttp://www.NetBSD.org/\n" >> "${SYSPKGDIR}/+DESC"
175
176# create the build information
177if [ x"${BUILD_INFO_CACHE}" = x ]; then
178	{
179	echo "OPSYS=$(${UNAME} -s)"
180	echo "OS_VERSION=$(${UNAME} -r)"
181	${MAKE} -f- all <<EOF
182.include <bsd.own.mk>
183all:
184	@echo OBJECT_FMT=${OBJECT_FMT}
185	@echo MACHINE_ARCH=${MACHINE_ARCH}
186	@echo MACHINE_GNU_ARCH=${MACHINE_GNU_ARCH}
187EOF
188	echo "_PKGTOOLS_VER=$(${PKG_CREATE} -V)"
189	} > "${SYSPKGDIR}/+BUILD_INFO"
190else
191	cp "${BUILD_INFO_CACHE}" "${SYSPKGDIR}/+BUILD_INFO"
192fi
193
194# test for attributes
195args=""
196attrs="$(${AWK} '$1 ~ '/"${pkg}"/' { print substr($0, length($1) + 2) }' \
197	"${rundir}/attrs")"
198for a in "${attrs}"; do
199	case "${attrs}" in
200	"")		;;
201	preserve)	echo "${pkg}-${t}" > "${SYSPKGDIR}/+PRESERVE"
202			args="${args} -n ${SYSPKGDIR}/+PRESERVE"
203			;;
204	esac
205done
206
207${PKG_CREATE} -v -c "${SYSPKGDIR}/+COMMENT" \
208	-d "${SYSPKGDIR}/+DESC" \
209	${args} \
210	-f "${PLIST}" -l -b /dev/null -B "${SYSPKGDIR}/+BUILD_INFO" \
211	-s /dev/null -S /dev/null -O "${pkg}-${t}.tgz" \
212		> "${SYSPKGDIR}/+CONTENTS"
213
214rm "${PLIST}"
215