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:
parent
4e00abac3b
commit
2a5bf01b6a
5 changed files with 914 additions and 0 deletions
13
pkgtools/pkg_comp/DESCR
Normal file
13
pkgtools/pkg_comp/DESCR
Normal 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.
|
24
pkgtools/pkg_comp/Makefile
Normal file
24
pkgtools/pkg_comp/Makefile
Normal 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
3
pkgtools/pkg_comp/PLIST
Normal 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
|
296
pkgtools/pkg_comp/files/pkg_comp.8
Normal file
296
pkgtools/pkg_comp/files/pkg_comp.8
Normal 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.
|
578
pkgtools/pkg_comp/files/pkg_comp.sh
Normal file
578
pkgtools/pkg_comp/files/pkg_comp.sh
Normal 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
|
||||
|
Loading…
Reference in a new issue