Initial import of pkg_comp-1.0, a utility that allows retargetable package

building in chrooted environments.
Provided in PR pkg/17986 by Julio Merino <jmmv@hispabsd.org>
This commit is contained in:
rh 2002-09-07 00:08:35 +00:00
parent 4e00abac3b
commit 2a5bf01b6a
5 changed files with 914 additions and 0 deletions

13
pkgtools/pkg_comp/DESCR Normal file
View file

@ -0,0 +1,13 @@
pkg_comp is a small utility designed to build packages inside a
clean chroot tree.
Some ideas about what to use it for (taken from manpage):
* Build packages for other system versions. For example, build
packages for NetBSD 1.5 while you are running NetBSD current.
* Build packages using different options than your current system
like changing the threading library, COPTS, placement of
configuration files, etc.
* Debug the build process of a package, checking if buildlinks
work properly.
* Avoid autoconf's side effects by keeping a separate chroot for
each project, like one for GNOME2 and another one for KDE3.

View file

@ -0,0 +1,24 @@
# $NetBSD: Makefile,v 1.1.1.1 2002/09/07 00:08:35 rh Exp $
DISTNAME= pkg_comp-1.0
CATEGORIES= pkgtools
MASTER_SITES= # empty
DISTFILES= # empty
MAINTAINER= jmmv@hispabsd.org
COMMENT= Build packages inside a chroot jail
EXTRACT_ONLY= # empty
NO_CHECKSUM= YES
NO_PATCH= YES
NO_CONFIGURE= YES
NO_BUILD= YES
WRKSRC= ${WRKDIR}
.include "../../mk/bsd.prefs.mk"
do-install:
${INSTALL_SCRIPT} ${FILESDIR}/pkg_comp.sh ${PREFIX}/sbin/pkg_comp
${INSTALL_MAN} ${FILESDIR}/pkg_comp.8 ${PREFIX}/man/man8/pkg_comp.8
.include "../../mk/bsd.pkg.mk"

3
pkgtools/pkg_comp/PLIST Normal file
View file

@ -0,0 +1,3 @@
@comment $NetBSD: PLIST,v 1.1.1.1 2002/09/07 00:08:35 rh Exp $
sbin/pkg_comp
man/man8/pkg_comp.8

View file

@ -0,0 +1,296 @@
.\" $NetBSD: pkg_comp.8,v 1.1.1.1 2002/09/07 00:08:50 rh Exp $
.\"
.\" pkg_comp - Build packages inside a clean chroot environment
.\" Copyright (c) 2002, Julio Merino <jmmv@hispabsd.org>
.\"
.\" 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. 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.
.\" 3. Neither the name of author 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.
.\"/
.Dd July 26, 2002
.Dt PKG_COMP 8
.Os
.Sh NAME
.Nm pkg_comp
.Nd build packages inside a chroot
.Sh SYNOPSIS
.Nm
.Op Ar -c conf_file
.Ar target
.Op Ar pkg_name ...
.Sh DESCRIPTION
.Nm
is a tool that makes easy the compilation of packages inside a clean
chroot environment. This allows an easy tracking of exact dependancies
and the correct behaviour of a package in a fresh system installation.
.Pp
The behavior of
.Nm
is controlled trought a small configuration file and a target (keep
reading to learn more). The configuration file tells
.Nm
how to configure the new chroot environment, and the target specifies
which action to take.
.Pp
.Ss What to use it for?
You can use
.Nm
to achieve many goals when buildling packages. Here are some ideas:
.Bl -bullet -item
.It
Build packages for other system versions. For example, build packages for
.Nx 1.5
while you are running
.Nx current .
.It
Build packages using different
.Pa mk.conf
options than your current system, like changing the threading library,
.Sy COPTS ,
placement of configuration files, etc.
.It
Debug the build process of a package, checking if buildlinks work
properly.
.It
Avoid autoconf's side effects by keeping a separate chroot for each
project, like one for GNOME2 and another one for KDE3.
.El
.Pp
.Sh CONTROL DIRECTORY
.Nm
needs to store several information when it is running. Instead of
using normal system trees, it uses a special directory inside the
chroot to avoid polluting the system. It stores there scripts, object
files, built packages, etc. This directory is located by default in
.Pa $DESTDIR/pkg_comp .
.Pp
.Sh CONFIGURATION
With
.Nm
you can maintain several configuration files so you can work with
different chroot jails easily. To make this easy, configuration files
are stored inside
.Pa $HOME/pkg_comp ,
followed by the configuration file name and the .conf suffix. The default
configuration file is
.Pa $HOME/pkg_comp/default.conf ,
and is always used if you do not specify another one.
.Pp
Configuration files are simple shell scripts that define
variables. The default values shown here are those written in the
template when issuing a maketemplate.
.Bl -tag -width indent
.It BUILD_TARGET
The target to use when buildling packages. It can contain any target
supported by the pkgsrc system, but reasonable values are:
.Ql install
and
.Ql package .
Defaults to
.Ql package .
.It COPYROOTCFG
If set to
.Ql yes ,
all configuration files (not directories) that reside inside
.Pa /root
are copied to
.Sy $DESTDIR/root .
Defaults to
.Ql no .
.It DESTDIR
The chroot jail directory. Defaults to
.Pa /var/chroot/pkg_comp/default .
.It DISTRIBDIR
This is the directory which holds
.Nb
binary sets and X sets. Its structure is the same as official release
distributions, that is, tgz files must reside inside
.Pa $DISTRIBDIR/binary/sets .
Defaults to
.Pa /var/pub/NetBSD .
.It INSTALL_PACKAGES
A list of packages to automatically install after the
.Sy makeroot
and after installing
.Sy MAKE_PACKAGES .
Each name must be the full package name, including the tgz suffix. Packages
are searched inside
.Pa $REAL_PACKAGES/All .
Defaults to nothing.
.It MAKE_PACKAGES
A list of packages to automatically build after the
.Sy makeroot
target. A package is in the form section/name, like
misc/colorls. Defaults to nothing.
.It PTHREAD_TYPE
The threading type to use when building packages. Defaults to
.Ql pth .
.It ROOTSHELL
The shell of the root user. Defaults to
.Pa /bin/sh .
.It SETS
A list of binary sets to be extracted inside
.Sy DESTDIR .
Defaults to
.Ql base.tgz comp.tgz etc.tgz text.tgz .
.It SETS_X11
A list of binary sets of the X Window system. This has the same behavior
as
.Sy SETS .
If this variable is empty, no X Window is configured inside the chroot
jail and no other X variables take effect. Default to
.Ql xbase.tgz xcomp.tgz xcontrib.tgz xfont.tgz xmisc.tgz xserver.tgz .
.It USE_XF86_4
If set to
.Ql yes ,
sets specified in SETS_X11 contain X Window version 4. Has no effect if
X is unconfigured. Defaults to
.Ql yes .
.It USE_XPKGWEDGE
If set to
.Ql yes ,
you want xpkgwedge to be compiled and installed automatically inside the
chroot. This takes care of setting up
.Pa /etc/profile
and
.Pa /etc/csh.login
for xpkgwedge to work. Has no effect if X is unconfiguerd. Defaults to
.Ql yes .
.El
.Ss Mounted filesystems
In order to avoid duplicating huge system trees,
.Nm
takes advantadge of filesystem layers. By default, it uses
.Xr mount_null 8 ,
which duplicates a filesystem tree into another directory; although
you may want to use
.Xr mount_union 8 ,
or even
.Xr mount_overlay 8 .
If the
content of these variables is empty, that filesystem is not mounted.
.Pp
You can control which layer to use and which options you want with
special configuration options, as explained below.
.Pp
These filesystems are mounted before entering the chroot and unmounted
after exiting. In order to know if filesystems are mounted or not, the
program uses a temporary file, called
.Pa $DESTDIR/pkg_comp/tmp/mount.stat ,
which controls the number of
.Nm
processes using the chroot environment. If some of them crashes
unexpectedly and you notice it does not try to unmount the
filesystems, this status file may get out of sync. Be sure to check if
NO filesystems are mounted when issuing a
.Sy removeroot .
.Bl -tag -width indent
.It REAL_DISTFILES
Specifies where distfiles reside in the real system. Defaults to
.Pa /usr/pkgsrc/distfiles .
.It REAL_DISTFILES_OPTS
Mount options. Defaults to
.Sy -t null -o ro .
.It REAL_PACKAGES
Specifies where to build binary packages. This variable is specially useful.
Defaults to
.Pa /usr/pkgsrc/packages .
.It REAL_PACKAGES_OPTS
Mount options. Defaults to
.Sy -t null -o ro .
.It REAL_PKGSRC
The pkgsrc tree. This can be useful if you want to use several pkgsrc trees
independantly. Defaults to
.Pa /usr/pkgsrc .
.It REAL_PKGSRC_OPTS
Mount options. Defaults to
.Sy -t null -o rw .
.It REAL_SRC
The src system tree. Usually useless, but may be needed by some packages,
like sysutils/aperture. Defaults to
.Pa /usr/src .
.It REAL_SRC_OPTS
Mount options. Defaults to
.Sy -t null -o rw .
.El
.Pp
.Sh TARGETS
A target specifies what
.Nm
should do (as in make). The following list describes all supported targets,
in the logical order you should call them.
.Bl -tag -width indent
.It maketemplate
Create a sample
.Ar conf_file .
You should edit it after the creation as you will probably want to change
the default configuration, specially paths.
.It makeroot
Create the chroot environment, based on the specs of the configuration file.
This step is required before trying any other, except maketemplate .
.It build
Builds the specified packages inside the chroot. You need to pass their
names as relative paths inside pkgsrc, like
.Pa pkgtools/pkg_comp .
.It install
Install the specified binary packages into the chroot. You must specify
the full name of the package and they must be reside inside
.Sy REAL_PACKAGES .
.It chroot
Enters the chroot environment.
.It removepkgs
Remove all the packages in the chroot environment. It starts deleting
packages with
.Xr pkg_delete 1
and then cleans the package tree and the database. This will rebuild
.Sy MAKE_PACKAGES ,
reinstall
.Sy INSTALL_PACKAGES
and xpkgwedge if they are specified in the configuration file.
.It removeroot
Remove the entire chroot tree. You should do it with this target because it
will take care to umount needed mount points.
.It auto
This executes several targets automatically, setting
.Sy BUILD_TARGET
to package. The order is: makeroot, build and removeroot. This is
useful to create binary packages of several pkgsrc and their
dependancies automatically. For this to be useful, you need to set
.Sy REAL_PACKAGES
and use
.Sy MAKE_PACKAGES
or pass package names trought the command line.
.El
.Pp
.Sh NOTES
This program uses nullfs to create virtual copies of real trees inside the
chroot environment.
.Pp
.Sh AUTHORS
Julio Merino <jmmv@hispabsd.org>
.Sh SEE ALSO
.Xr pkg_delete 1 ,
.Xr packages 7 ,
.Xr mount_null 8 .
.Sh BUGS
Probably many, specially error checking.

View file

@ -0,0 +1,578 @@
#!/bin/sh
#
# $NetBSD: pkg_comp.sh,v 1.1.1.1 2002/09/07 00:08:49 rh Exp $
#
# pkg_comp - Build packages inside a clean chroot environment
# Copyright (c) 2002, Julio Merino <jmmv@hispabsd.org>
#
# 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. Neither the name of author 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.
#
# ----------------------------------------------------------------------
# Misc functions
# ----------------------------------------------------------------------
err()
{
echo "$progname: $1"
exit 1
}
usage()
{
echo "usage: $progname [-c conf_file] target [pkg_names]"
exit 1
}
# ----------------------------------------------------------------------
# Filesystem functions
# ----------------------------------------------------------------------
fsmount()
{
echo -n "=> Mounting chroot filesystems:"
if [ -f $fsstate ]; then
count=`cat $fsstate`
count=$(($count + 1))
echo "$count" > $fsstate
echo " already mounted."
return
else
echo "1" > $fsstate
fi
if [ ! -z "$REAL_SRC" ]; then
mount $REAL_SRC_OPTS $REAL_SRC $DESTDIR/usr/src
fi
if [ ! -z "$REAL_PKGSRC" ]; then
mount $REAL_PKGSRC_OPTS $REAL_PKGSRC $DESTDIR/usr/pkgsrc
fi
if [ ! -z "$REAL_DISTFILES" ]; then
mount $REAL_DISTFILES_OPTS $REAL_DISTFILES $DESTDIR/pkg_comp/distfiles
fi
if [ ! -z "$REAL_PACKAGES" ]; then
mount $REAL_PACKAGES_OPTS $REAL_PACKAGES $DESTDIR/pkg_comp/packages
fi
touch $fsstate
echo " done."
}
fsumount()
{
echo -n "=> Unmounting chroot filesystems:"
if [ ! -f $fsstate ]; then
echo " none mounted."
return
fi
count=`cat $fsstate`
if [ $count -gt 1 ]; then
count=$(($count - 1))
echo "$count" > $fsstate
echo " still in use."
return
fi
fsfailed=no
if [ ! -z "$REAL_SRC" ]; then
umount $DESTDIR/usr/src
if [ $? != 0 ]; then fsfailed=yes; fi
fi
if [ ! -z "$REAL_PKGSRC" ]; then
umount $DESTDIR/usr/pkgsrc
if [ $? != 0 ]; then fsfailed=yes; fi
fi
if [ ! -z "$REAL_DISTFILES" ]; then
umount $DESTDIR/pkg_comp/distfiles
if [ $? != 0 ]; then fsfailed=yes; fi
fi
if [ ! -z "$REAL_PACKAGES" ]; then
umount $DESTDIR/pkg_comp/packages
if [ $? != 0 ]; then fsfailed=yes; fi
fi
echo " done."
echo -n "Syncing: 1"
sync ; sleep 1
echo -n " 2"
sync ; sleep 1
echo -n " 3"
sync ; sleep 1
echo " done."
if [ "$fsfailed" = "yes" ]; then
err "FATAL: failed to umount all filesystems"
else
rm $fsstate
fi
}
# ----------------------------------------------------------------------
# maketemplate target
# ----------------------------------------------------------------------
pkg_maketemplate()
{
if [ -f "$conffile" ]; then
err "$conffile already exists"
fi
echo "Creating template: $conffile"
mkdir -p $confdir
cat > $conffile <<EOF
# -*- sh -*-
#
# pkg_comp configuration file
#
DESTDIR="/var/chroot/pkg_comp/default"
ROOTSHELL="/bin/sh"
COPYROOTCFG="no"
COPTS="-pipe"
# Target used to build packages.
BUILD_TARGET="package"
# Binary sets (tgz) are found in \$DISTRIBDIR/binary/sets
DISTRIBDIR="/var/pub/NetBSD"
# These sets are unpacked to setup the initial chroot.
SETS="base.tgz comp.tgz etc.tgz text.tgz"
# X configuration. Leave SETS_X11 empty to disable X11.
SETS_X11="xbase.tgz xcomp.tgz xcontrib.tgz xfont.tgz xmisc.tgz xserver.tgz"
USE_XPKGWEDGE="yes"
USE_XF86_4="yes"
# Threading library to use.
PTHREAD_TYPE="pth"
# Special directories. They are mounted inside the chroot jail using
# mount_null. Leave empty to avoid mounting.
REAL_SRC="/usr/src"
REAL_SRC_OPTS="-t null -o ro"
REAL_PKGSRC="/usr/pkgsrc"
REAL_PKGSRC_OPTS="-t null -o ro"
REAL_DISTFILES="/usr/pkgsrc/distfiles"
REAL_DISTFILES_OPTS="-t null -o rw"
REAL_PACKAGES="/usr/pkgsrc/packages"
REAL_PACKAGES_OPTS="-t null -o rw"
# Specify which packages to build automatically after building the chroot.
MAKE_PACKAGES=""
# Install these packages after building the chroot. They must be present in
# inside REAL_PACKAGES. You must specify the complete name.
INSTALL_PACKAGES=""
EOF
}
# ----------------------------------------------------------------------
# makeroot target
# ----------------------------------------------------------------------
pkg_makeroot()
{
if [ ! -d $DISTRIBDIR ]; then
err "DISTRIBDIR $DISTRIBDIR does not exist"
fi
if [ -d $DESTDIR ]; then
err "DESTDIR $DESTDIR already exists"
fi
mkdir -p $DESTDIR
cd $DESTDIR
echo -n "Unpacking sets:"
allsets="$SETS $SETS_X11"
for s in $allsets; do
echo -n " $s"
tar xzpf $DISTRIBDIR/binary/sets/$s
done
echo
echo -n "Making device nodes:"
cd $DESTDIR/dev
./MAKEDEV all
cd $DESTDIR
echo " done."
echo -n "Setting root's environment:"
chroot $DESTDIR chpass -s $ROOTSHELL
if [ "$COPYROOTCFG" = "yes" ]; then
cp /root/.* $DESTDIR/root 2>&1 | > /dev/null
fi
echo " done."
echo -n "Setting up initial configuration:"
mkdir -p $DESTDIR/usr/src
mkdir -p $DESTDIR/usr/pkgsrc
mkdir -p $DESTDIR/pkg_comp/distfiles
mkdir -p $DESTDIR/pkg_comp/packages
mkdir -p $DESTDIR/pkg_comp/tmp
mkdir -p $DESTDIR/pkg_comp/obj/pkgsrc
# Set sh configuration
echo "umask 022" >> $DESTDIR/etc/profile
echo "ENV=/etc/shrc" >> $DESTDIR/etc/profile
echo "export PS1=\"pkg_comp:`basename $conffile`# \"" >> $DESTDIR/etc/shrc
# Set csh configuration
echo "umask 022" >> $DESTDIR/etc/csh.login
echo "set prompt=\"pkg_comp:`basename $conffile`# \"" >> $DESTDIR/etc/csh.login
echo "set prompt=\"pkg_comp:`basename $conffile`# \"" >> $DESTDIR/etc/csh.cshrc
cp /etc/resolv.conf $DESTDIR/etc/resolv.conf
makeroot_mkconf
echo " done."
makeroot_xpkgwedge
if [ ! -z "$MAKE_PACKAGES" ]; then
pkg_build $MAKE_PACKAGES
fi
if [ ! -z "$INSTALL_PACKAGES" ]; then
pkg_install $INSTALL_PACKAGES
fi
}
makeroot_mkconf()
{
file="$DESTDIR/etc/mk.conf"
echo "OBJMACHINE=yes" >> $file
echo "MKOBJDIRS=yes" >> $file
echo "BSDSRCDIR=/usr/src" >> $file
echo "WRKOBJDIR=/pkg_comp/obj/pkgsrc" >> $file
echo "DISTDIR=/pkg_comp/distfiles" >> $file
echo "PACKAGES=/pkg_comp/packages" >> $file
echo "PKG_DEVELOPER?=yes" >> $file
echo "CLEANDEPENDS?=yes" >> $file
echo "COPTS=$COPTS" >> $file
echo "PTHREAD_TYPE=$PTHREAD_TYPE" >> $file
echo "USE_XF86_4=$USE_XF86_4" >> $file
}
makeroot_xpkgwedge()
{
if [ ! -z "$SETS_X11" ]; then
if [ $USE_XPKGWEDGE = "yes" ]; then
pkg_build "pkgtools/xpkgwedge"
echo "export XAPPLRESDIR=/usr/pkg/lib/X11/app-defaults" >> $DESTDIR/etc/profile
echo "setenv XAPPLRESDIR /usr/pkg/lib/X11/app-defaults" >> $DESTDIR/etc/csh.login
fi
fi
}
# ----------------------------------------------------------------------
# build target
# ----------------------------------------------------------------------
pkg_build()
{
pkgs="$*"
# Check if all packages exist
invalid=""
for p in $pkgs; do
if [ ! -d $REAL_PKGSRC/$p ]; then
invalid="$invalid $p"
fi
done
if [ ! -z "$invalid" ]; then
err "invalid packages:$invalid"
fi
# Build them
fsmount
failed=""
for p in $pkgs; do
echo "=> Building and installing $p"
prefix=`mktemp $DESTDIR/pkg_comp/tmp/pkg_comp-XXXX`
rm $prefix
script="$prefix.sh"
statfile="$prefix.stat"
cat > $script <<EOF
#!/bin/sh
cd /usr/pkgsrc/$p
make $BUILD_TARGET
if [ $? != 0 ]; then
touch /pkg_comp/tmp/`basename $statfile`
fi
make clean
EOF
chmod +x $script
chroot $DESTDIR /pkg_comp/tmp/`basename $script`
rm $script
if [ -f $statfile ]; then
failed="$failed $p"
rm $statfile
fi
done
fsumount
if [ ! -z "$failed" ]; then
echo "Build failed for:$failed"
fi
}
# ----------------------------------------------------------------------
# install target
# ----------------------------------------------------------------------
pkg_install()
{
pkgs="$*"
if [ -z "$REAL_PACKAGES" ]; then
err "REAL_PACKAGES is not set"
fi
fsmount
failed=""
for p in $pkgs; do
if [ -f $DESTDIR/pkg_comp/packages/All/$p ]; then
echo "=> Installing binary package: $p"
stat=$DESTDIR/pkg_comp/tmp/install.sh
cat >> $stat <<EOF
#!/bin/sh
cd /pkg_comp/packages/All
pkg_add $p
EOF
chmod +x $stat
chroot $DESTDIR /pkg_comp/tmp/install.sh
rm $stat
else
failed="$failed $p"
fi
done
fsumount
if [ ! -z "$failed" ]; then
echo "Installation failed for:$failed"
fi
}
# ----------------------------------------------------------------------
# chroot target
# ----------------------------------------------------------------------
pkg_chroot()
{
if [ ! -d $DESTDIR ]; then
err "$DESTDIR does not exist"
fi
fsmount
echo "=> Entering chroot: $DESTDIR"
chroot $DESTDIR $ROOTSHELL
echo
fsumount
}
# ----------------------------------------------------------------------
# removeroot target
# ----------------------------------------------------------------------
pkg_removeroot()
{
if [ -f $fsstate ]; then
err "filesystems may still be mounted; cannot remove"
fi
echo -n "=> Removing:"
rm -rf $DESTDIR
echo " done."
}
# ----------------------------------------------------------------------
# removepkgs target
# ----------------------------------------------------------------------
pkg_removepkgs()
{
echo "=> Removing packages"
cat > $DESTDIR/pkg_comp/tmp/removeall.sh <<EOF
#!/bin/sh
list="`pkg_info`"
while [ ! -z "$list" ]; do
echo "Deleting all (non-recursive)"
pkg_delete "*"
list="`pkg_info`"
done
EOF
chmod +x $DESTDIR/pkg_comp/tmp/removeall.sh
chroot $DESTDIR /pkg_comp/tmp/removeall.sh
rm $DESTDIR/pkg_comp/tmp/removeall.sh
echo -n "Cleaning pkg tree:"
rm -rf $DESTDIR/usr/pkg
echo " done."
echo -n "Cleaning pkg database:"
rm -rf $DESTDIR/var/db/pkg
mkdir -p $DESTDIR/var/db/pkg
echo " done."
makeroot_xpkgwedge
if [ ! -z "$MAKE_PACKAGES" ]; then
pkg_build $MAKE_PACKAGES
fi
if [ ! -z "$INSTALL_PACKAGES" ]; then
pkg_install $INSTALL_PACKAGES
fi
}
# ----------------------------------------------------------------------
# Main program
# ----------------------------------------------------------------------
progname="`basename $0`"
confdir="$HOME/pkg_comp"
# Parse options
args=`getopt c: $*`
if [ $? != 0 ]; then
usage
fi
set -- $args
conffile="$confdir/default.conf"
while [ $# -gt 0 ]; do
case "$1" in
-c)
conffile="$confdir/$2.conf"
shift
;;
--)
shift; break
;;
esac
shift
done
if [ $# -lt 1 ]; then
usage
fi
target="$1"
shift
pkgnames="$*"
readconf()
{
if [ -f $conffile ]; then
if [ `id -u` -ne 0 ]; then
err "must be run as root"
fi
echo "Reading config file: $conffile"
. $conffile
else
err "$conffile does not exist"
fi
fsstate="$DESTDIR/pkg_comp/tmp/mount.stat"
if [ ! -z "$SETS_X11" ]; then
MAKE_PACKAGES="$MAKE_PACKAGES pkgtools/x11-links"
fi
}
checkroot()
{
if [ ! -d "$DESTDIR" ]; then
err "chroot not initialized; use makeroot first."
fi
if [ "$DESTDIR" = "/" ]; then
err "DESTDIR can't be /"
fi
# From now on, filesystems may be mounted, so we need to trap
# signals to umount them.
trap "echo \"*** Process aborted ***\" ; fsumount ; exit 1" INT QUIT
}
case "$target" in
maketemplate)
pkg_maketemplate
exit 0
;;
makeroot)
readconf
pkg_makeroot
exit 0
;;
build)
readconf
checkroot
pkg_build $pkgnames
exit 0
;;
install)
readconf
checkroot
pkg_install $pkgnames
exit 0
;;
chroot)
readconf
checkroot
pkg_chroot
exit 0
;;
removepkgs)
readconf
checkroot
pkg_removepkgs
;;
removeroot)
readconf
checkroot
pkg_removeroot
;;
auto)
readconf
BUILD_TARGET="package"
if [ -z "$REAL_PACKAGES" ]; then
err "this is useless without REAL_PACKAGES"
fi
if [ -z "$MAKE_PACKAGES" -a -z "$pkgnames" ]; then
err "this is useless without MAKE_PACKAGES nor package names"
fi
pkg_makeroot
checkroot
if [ ! -z "$pkgnames" ]; then
pkg_build $pkgnames
fi
pkg_removeroot
;;
*)
err "unknown target '$target'"
;;
esac
exit 0