update Tue May 18 00:37:00 PDT 2010
[pkgsrc.git] / mk / bulk / pre-build
1 #!/bin/sh
2 # $NetBSD: pre-build,v 1.76 2010/05/11 18:36:15 mbalmer Exp $
3 #
4 # Clean up system to be ready for bulk pkg build
5 #
6 # (c) 2000 Hubert Feyrer, All Rights Reserved.
7 #
8
9 #set -v         # Debug
10
11 # Pull in USR_PKGSRC:
12 if [ -f "$BULK_BUILD_CONF" ]; then
13     . "$BULK_BUILD_CONF"
14 else
15     . `dirname $0`/build.conf
16 fi
17
18 PRUNEDISTFILES=${PRUNEDISTFILES:-"no"}
19 PRUNEPACKAGES=${PRUNEPACKAGES:-"yes"}
20 PRUNELINKS=${PRUNEPACKAGES:-"yes"}
21 PKG_ADMIN="pkg_admin"
22 PKG_INFO="pkg_info"
23
24 some_package_dir=${USR_PKGSRC}/pkgtools/lintpkgsrc
25
26 # Extract the name of the files used for the build log and broken build log.
27 # These have defaults set by bsd.bulk-pkg.mk and may be overridden in
28 # /etc/mk.conf
29 BULKFILESDIR=`( cd ${some_package_dir} ; ${BMAKE} show-var VARNAME=BULKFILESDIR )`;
30 if [ "$BULKFILESDIR" = "" ]; then
31         echo "pre-build> Had problems determining the directory of .broken* files"
32         exit 1
33 fi
34 BROKENF=`( cd ${some_package_dir} ; ${BMAKE} show-var VARNAME=BROKENFILE )`;
35 if [ "$BROKENF" = "" ]; then
36         echo "pre-build> Had problems determining the name of the .broken files"
37         exit 1
38 fi
39 NOTAVAILF=`( cd ${some_package_dir} ; ${BMAKE} show-var VARNAME=NOT_AVAILABLE_FILE )`;
40 if [ "$NOTAVAILF" = "" ]; then
41         echo "pre-build> Had problems determining the name of the .bulk-not_available files"
42         exit 1
43 fi
44 BRKWRKLOG=`( cd ${some_package_dir} ; ${BMAKE} show-var VARNAME=BROKENWRKLOG )`;
45 if [ "$BRKWRKLOG" = "" ]; then
46         echo "pre-build> Had problems determining the name of the .broken.work files"
47         exit 1
48 fi
49 BLDLOG=`( cd ${some_package_dir} ; ${BMAKE} show-var VARNAME=BUILDLOG )`;
50 if [ "$BLDLOG" = "" ]; then
51         echo "pre-build> Had problems determining the name of the .make files"
52         exit 1
53 fi
54 LINTPKGSRC_DB=`( cd ${some_package_dir} ; ${BMAKE} show-var VARNAME=LINTPKGSRC_DB )`;
55 if [ "$LINTPKGSRC_DB" = "" ]; then
56         echo "pre-build> Had problems determining the name of the .lintpkgsrc.db file"
57         exit 1
58 fi
59 STARTFILE=`( cd ${some_package_dir} ; ${BMAKE} show-var VARNAME=STARTFILE )`;
60 if [ "$STARTFILE" = "" ]; then
61         echo "pre-build> Had problems determining the name of the .start file"
62         exit 1
63 fi
64
65 LOCALBASE=`( cd ${some_package_dir} ; ${BMAKE} show-var VARNAME=LOCALBASE )`;
66 X11BASE=`( cd ${some_package_dir} ; ${BMAKE} show-var VARNAME=X11BASE )`;
67 DISTDIR=`( cd ${some_package_dir} ; ${BMAKE} show-var VARNAME=DISTDIR )`;
68
69 # Create ${BULKFILESDIR} if necessary
70 echo "pre-build> Creating ${BULKFILESDIR} if necessary"
71 mkdir -p "${BULKFILESDIR}"
72
73 # Make sure the pkg-vulnerabilities file is up to date
74 _INFO_VER=`${PKG_INFO} -V`;
75 echo "pre-build> Making sure vulnerability-list is up to date:"
76 if [ -z "$UPDATE_VULNERABILITY_LIST" -o "$UPDATE_VULNERABILITY_LIST" = yes ]; then
77         _PKGVULNDIR=`audit-packages ${AUDIT_PACKAGES_FLAGS} -Q PKGVULNDIR`
78         download-vulnerability-list ${DOWNLOAD_VULNERABILITY_LIST_FLAGS}
79         if [ "x${_PKGVULNDIR}" != "x${DISTDIR}" ]; then
80                 cp ${_PKGVULNDIR}/pkg-vulnerabilities ${DISTDIR}
81         fi
82         echo 'pre-build> done.'
83 else
84         echo 'pre-build> (skipped)'
85 fi
86
87 # On non-NetBSD platforms we need to keep the bootstrap-files!
88 if [ x"$BMAKE" = x"bmake" ]; then
89         ( cd "$LOCALBASE" && tar cf /tmp/$$.tar \
90                 sbin/audit-packages sbin/download-vulnerability-list         \
91                 sbin/pkg_add sbin/pkg_admin sbin/pkg_create                  \
92                 sbin/pkg_delete sbin/pkg_info \
93                 share/mk/sys.mk share/mk/bsd.dep.mk share/mk/bsd.depall.mk   \
94                 share/mk/bsd.files.mk share/mk/bsd.hostprog.mk               \
95                 share/mk/bsd.doc.mk share/mk/bsd.inc.mk share/mk/bsd.info.mk \
96                 share/mk/bsd.kernobj.mk share/mk/bsd.kinc.mk                 \
97                 share/mk/bsd.kmod.mk share/mk/bsd.lib.mk                     \
98                 share/mk/bsd.links.mk share/mk/bsd.man.mk                    \
99                 share/mk/bsd.nls.mk share/mk/bsd.obj.mk                      \
100                 share/mk/bsd.prog.mk share/mk/bsd.subdir.mk                  \
101                 share/mk/bsd.sys.mk share/mk/bsd.own.mk share/mk/bsd.README  \
102                 bin/bmake bin/nawk bin/nbsed bin/pdksh bin/install-sh        \
103                 man/cat1/nbsed.0 man/cat1/pkg_add.0 man/cat1/pkg_admin.0     \
104                 man/cat1/pkg_create.0 man/cat1/pkg_delete.0                  \
105                 man/cat1/pkg_info.0 man/cat5/pkg_install.conf.0              \
106                 man/cat5/pkg_summary.0 man/cat7/pkgsrc.0 man/man1/bmake.1    \
107                 man/man1/nawk.1 man/man1/nbsed.1 man/man1/pkg_add.1          \
108                 man/man1/pkg_admin.1 man/man1/pkg_create.1                   \
109                 man/man1/pkg_delete.1 man/man1/pkg_info.1 man/man1/pdksh.1   \
110                 man/man5/pkg_install.conf.5 man/man5/pkg_summary.5           \
111                 man/man7/pkgsrc.7 etc/mk.conf )
112 fi
113
114 #
115 # Clean out everything and its mother
116 #
117 PKG_DBDIR=`(cd "${some_package_dir}" && ${BMAKE} show-var VARNAME=PKG_DBDIR)`
118 DEPOTBASE=`(cd "${some_package_dir}" && ${BMAKE} show-var VARNAME=DEPOTBASE)`
119 PKG_TOOLS_BIN=`(cd "${some_package_dir}" && ${BMAKE} show-var VARNAME=PKG_TOOLS_BIN)`
120
121 for dbdir in "${PKG_DBDIR}" "${DEPOTBASE}"; do
122         echo "pre-build> Removing all installed packages in ${dbdir}"
123
124         # The Solaris /bin/sh requires the following weird-looking code.
125         if (cd "$dbdir" 1>/dev/null 2>&1); then
126                 cd "$dbdir"
127
128                 for pkg in *
129                 do
130                         if ${PKG_TOOLS_BIN}/pkg_info -K "$dbdir" -qe "$pkg"; then
131                                 echo "pre-build> ${PKG_TOOLS_BIN}/pkg_delete -r ${pkg}"
132                                 ${PKG_TOOLS_BIN}/pkg_delete -K "$dbdir" -r "$pkg"
133                         fi
134                 done
135                 #
136                 # this should have removed everything.
137                 # Now force any broken pkgs to deinstall.
138                 #
139                 for pkg in *
140                 do
141                         if ${PKG_TOOLS_BIN}/pkg_info -K "$dbdir" -qe "$pkg"; then
142                                 echo "pre-build> ${PKG_TOOLS_BIN}/pkg_delete -f ${pkg}"
143                                 ${PKG_TOOLS_BIN}/pkg_delete -K "$dbdir" -f "$pkg"
144                         fi
145                 done
146
147                 # We've tried our best to get rid of the pkgs, now do it
148                 # the hard way.  If it wasn't for stuff in $X11BASE, I
149                 # wouldn't have hard feelings about this!
150                 rm -fr *
151         fi
152 done
153
154 cd "$LOCALBASE" && rm -fr * && rm -fr .??*;
155 if [ x"$BMAKE" = x"bmake" ]; then
156         ( cd "$LOCALBASE" && tar xf /tmp/$$.tar )
157 fi
158
159 # Stuff known to be broken
160 rm -fr "$X11BASE/share/gimp"
161 rm -fr "$X11BASE/share/gnome"
162 rm -fr "$X11BASE/share/kde"
163 rm -fr "$X11BASE/share/netscape"
164 rm -fr /var/tmp/inst*
165 rm -fr "$X11BASE/lib/libgimp"*  # gimp doesn't build with old libs around
166 rm -fr /nonexistent             # broken useradd on pop3d
167 rm -fr /home/majordom           # mail/majordomo pkg
168 rm -fr /home/nut                # sysutils/ups-net
169 rm -fr /var/wwwoffle            # www/wwwoffle
170 rm -fr /tmp/config-guess-*
171 rm -fr /tmp/mod*
172
173
174 # Clean up state files
175 cd "${USR_PKGSRC}"
176 echo "pre-build> Cleaning up leftover state files from previous runs"
177 rm -f "${BULKFILESDIR}"/*/*/$BROKENF "${BULKFILESDIR}"/*/*/$BRKWRKLOG "${BULKFILESDIR}"/*/*/$BLDLOG
178 rm -f "${BULKFILESDIR}"/*/*/$NOTAVAILF
179 rm -f "${BULKFILESDIR}/$BROKENF" "${BULKFILESDIR}/$BRKWRKLOG" "${BULKFILESDIR}/$BLDLOG" "$STARTFILE"
180
181
182 #
183 # Remove old/broken distfiles and binary packages
184 #
185 PACKAGES=`( cd "${some_package_dir}" && ${BMAKE} show-var VARNAME=PACKAGES )`
186
187 case "$LINTPKGSRC_CACHE$PRUNEDISTFILES$PRUNEPACKAGES" in
188 *yes*|*YES*)
189         # install lintpkgsrc to support any of these options
190         ( cd "${USR_PKGSRC}/pkgtools/lintpkgsrc" && ${BMAKE} PRECLEAN=yes bulk-install )
191         ;;
192 esac
193
194 case "$LINTPKGSRC_CACHE" in
195 yes|YES)
196         echo "pre-build> Creating lintpkgsrc cache database."
197         lintpkgsrc -K "$PACKAGES" -P "$USR_PKGSRC" -M "$DISTDIR" -E "$LINTPKGSRC_DB"
198         lintpkgsrc_cache="-I $LINTPKGSRC_DB"
199         echo "pre-build> done."
200         ;;
201 *)
202         lintpkgsrc_cache=''
203         ;;
204 esac
205
206 case "$PRUNEDISTFILES" in
207 yes|YES)
208         echo "pre-build> Removing old/broken distfiles"
209         lintpkgsrc $lintpkgsrc_cache -K "$PACKAGES" -P "$USR_PKGSRC" -M "$DISTDIR" -o -m -r
210         echo "pre-build> done."
211         ;;
212 *)
213         echo "pre-build> Skipping distfile pruning."
214         ;;
215 esac
216
217 case "$PRUNEPACKAGES" in
218 yes|YES)
219         echo "pre-build> Removing old (out of date) binary packages"
220         lintpkgsrc $lintpkgsrc_cache -K "$PACKAGES" -P "$USR_PKGSRC" -M "$DISTDIR" -p -r
221         echo "pre-build> done."
222         ;;
223 *)
224         echo "pre-build> Skipping packages pruning."
225         ;;
226 esac
227
228 case "$PRUNELINKS" in
229 yes|YES)
230         echo "pre-build> Checking for and removing orphaned packages links"
231         find "$PACKAGES" -type l -print |  \
232         while read f
233         do
234                 if [ ! -d "$f" -a ! -f "$f" ]; then
235                         echo "pre-build> Removing orphaned link: \"$f\""
236                         rm "$f"
237                 fi
238         done
239         echo "pre-build> done."
240         ;;
241 *)
242         echo "pre-build> Skipping pruning of packages links."
243         ;;
244 esac
245
246 # Clean out the packages added above so that the real bulk build
247 # is started in a consistent state.
248 for dbdir in "${PKG_DBDIR}" "${DEPOTBASE}"; do
249         echo "pre-build> Removing all installed packages in ${dbdir}"
250         if [ -d "$dbdir" ]; then
251                 cd "$dbdir"
252                 for pkg in *
253                 do
254                         if ${PKG_TOOLS_BIN}/pkg_info -K "$dbdir" -qe "$pkg"; then
255                                 echo "pre-build> ${PKG_TOOLS_BIN}/pkg_delete -r ${pkg}"
256                                 ${PKG_TOOLS_BIN}/pkg_delete -K "$dbdir" -r "$pkg"
257                         fi
258                 done
259         fi
260 done
261
262 # on non-NetBSD, we don't want these to build as they overwrite
263 # bootstrap-pkgsrc generated files and thus would break the following builds.
264
265 if [ x"$BMAKE" = x"bmake" ]; then
266         for pkg in devel/bmake devel/mk-files lang/nawk \
267             pkgtools/bootstrap-mk-files pkgtools/bootstrap-extras \
268             pkgtools/pkg_install \
269             shells/pdksh sysutils/install-sh textproc/nbsed; do
270                 mkdir -p "${BULKFILESDIR}/${pkg}"
271                 echo "Don't blow away bootstrap-pkgsrc stuff!" \
272                 > "${BULKFILESDIR}/${pkg}/${BROKENF}"
273         done
274 fi
275
276 cd "${USR_PKGSRC}"
277
278 if [ -f mk/bulk/pre-build.local ]; then
279         export BROKENF
280         . mk/bulk/pre-build.local
281 fi
282
283 if [ ! -d "${PKG_DBDIR}" ]; then
284         mkdir -p "${PKG_DBDIR}"
285 fi
286
287 echo "This file marks the start time of the bulk build." > "$STARTFILE"