summaryrefslogtreecommitdiff
path: root/sysutils
diff options
context:
space:
mode:
authorjmmv <jmmv@pkgsrc.org>2002-11-28 19:57:28 +0000
committerjmmv <jmmv@pkgsrc.org>2002-11-28 19:57:28 +0000
commitb8aab8e1f0c84a5f5ab8c7118e3f10eba1ad0bf4 (patch)
treeda14a35f9214f1aa4f86caa031844c5567308e28 /sysutils
parentd5b16e46ee861c41f801baa4236d957f2edb37f3 (diff)
downloadpkgsrc-b8aab8e1f0c84a5f5ab8c7118e3f10eba1ad0bf4.tar.gz
Initial import of sysbuild-1.0. Description follows:
sysbuild is a script that simplifies the process of building NetBSD releases and kernels as an unprivileged user. It should be clear enough that it does not add any kind of magic to the NetBSD build system. It just automates boring steps, like setup of permissions, directories, execution of the build process, etc. It also provides enough functionality to automatically update CVS source trees. sysbuild can be easily used from command line or as a cron job, so you can schedule most of the build jobs (really, it has been designed to run perfectly from cron). Approved by wiz.
Diffstat (limited to 'sysutils')
-rw-r--r--sysutils/sysbuild/DESCR10
-rw-r--r--sysutils/sysbuild/INSTALL32
-rw-r--r--sysutils/sysbuild/MESSAGE15
-rw-r--r--sysutils/sysbuild/Makefile67
-rw-r--r--sysutils/sysbuild/PLIST6
-rw-r--r--sysutils/sysbuild/files/crontab19
-rw-r--r--sysutils/sysbuild/files/default.conf49
-rw-r--r--sysutils/sysbuild/files/sysbuild.8439
-rw-r--r--sysutils/sysbuild/files/sysbuild.sh570
9 files changed, 1207 insertions, 0 deletions
diff --git a/sysutils/sysbuild/DESCR b/sysutils/sysbuild/DESCR
new file mode 100644
index 00000000000..1bc2a3abb16
--- /dev/null
+++ b/sysutils/sysbuild/DESCR
@@ -0,0 +1,10 @@
+sysbuild is a script that simplifies the process of building NetBSD
+releases and kernels as an unprivileged user. It should be clear enough
+that it does not add any kind of magic to the NetBSD build system. It
+just automates boring steps, like setup of permissions, directories,
+execution of the build process, etc. It also provides enough
+functionality to automatically update CVS source trees.
+
+sysbuild can be easily used from command line or as a cron job, so
+you can schedule most of the build jobs (really, it has been designed
+to run perfectly from cron).
diff --git a/sysutils/sysbuild/INSTALL b/sysutils/sysbuild/INSTALL
new file mode 100644
index 00000000000..262be46e13c
--- /dev/null
+++ b/sysutils/sysbuild/INSTALL
@@ -0,0 +1,32 @@
+#!/bin/sh
+#
+# $NetBSD: INSTALL,v 1.1.1.1 2002/11/28 19:57:28 jmmv Exp $
+
+SYSBUILD_USER=@SYSBUILD_USER@
+SYSBUILD_HOMEDIR=@SYSBUILD_HOMEDIR@
+EGDIR=@EGDIR@
+
+case ${STAGE} in
+POST-INSTALL)
+ echo "Creating sysbuild's home directory..."
+ if [ ! -d ${SYSBUILD_HOMEDIR} ]; then
+ ${MKDIR} -p ${SYSBUILD_HOMEDIR} > /dev/null 2>&1
+ ${CP} /etc/skel/.[a-z]* ${SYSBUILD_HOMEDIR} > /dev/null 2>&1
+ fi
+ echo "Setting up sysbuild's crontab..."
+ crontab -u ${SYSBUILD_USER} -r > /dev/null 2>&1
+ crontab -u ${SYSBUILD_USER} ${EGDIR}/crontab > /dev/null 2>&1
+ ;;
+
+DEINSTALL)
+ echo "Removing sysbuild's crontab..."
+ crontab -u ${SYSBUILD_USER} -r > /dev/null 2>&1
+ ${CAT} << EOF
+===========================================================================
+If you will not be using sysbuild any longer, you may want to remove
+sysbuild's home directory and all work areas. Just to let you know, work
+areas can be removed using the 'destroy' target of the program.
+===========================================================================
+EOF
+ ;;
+esac
diff --git a/sysutils/sysbuild/MESSAGE b/sysutils/sysbuild/MESSAGE
new file mode 100644
index 00000000000..5d4e4a3fa50
--- /dev/null
+++ b/sysutils/sysbuild/MESSAGE
@@ -0,0 +1,15 @@
+===========================================================================
+$NetBSD: MESSAGE,v 1.1.1.1 2002/11/28 19:57:28 jmmv Exp $
+
+sysbuild has been installed successfully. These lines are a must to get
+started:
+
+ ${PREFIX}/bin/sysbuild config
+ ${PREFIX}/bin/sysbuild init
+
+A sample crontab file for the '${SYSBUILD_USER}' user has been installed.
+Use the following command (as root) to edit it interactively:
+
+ crontab -e -u ${SYSBUILD_USER}
+
+===========================================================================
diff --git a/sysutils/sysbuild/Makefile b/sysutils/sysbuild/Makefile
new file mode 100644
index 00000000000..f82739971e5
--- /dev/null
+++ b/sysutils/sysbuild/Makefile
@@ -0,0 +1,67 @@
+# $NetBSD: Makefile,v 1.1.1.1 2002/11/28 19:57:28 jmmv Exp $
+#
+
+DISTNAME= sysbuild-1.0
+CATEGORIES= sysutils
+MASTER_SITES= # empty
+DISTFILES= # empty
+
+MAINTAINER= jmmv@netbsd.org
+COMMENT= Automate NetBSD system and kernel unprivileged builds
+
+EXTRACT_ONLY= # empty
+NO_CHECKSUM= yes
+NO_PATH= yes
+NO_CONFIGURE= yes
+WRKSRC= ${WRKDIR}
+CHECK_SHLIBS= no
+SHLIB_HANDLING= no
+
+.include "../../mk/bsd.prefs.mk"
+
+# SYSBUILD_HOME - Home directory of SYSBUILD_USER user.
+SYSBUILD_HOMEDIR?= /home/sysbuild
+# SYSBUILD_USER - Unpriviledged user that runs the build script.
+SYSBUILD_USER?= sysbuild
+# SYSBUILD_OBJGROUP - Group that owns build files (should not be shared).
+SYSBUILD_OBJGROUP?= wobj
+# SYSBUILD_SRCGROUP - Group that owns sources (may be shared).
+SYSBUILD_SRCGROUP?= wsrc
+
+FILES_SUBST+= SYSBUILD_HOMEDIR=${SYSBUILD_HOMEDIR}
+FILES_SUBST+= SYSBUILD_USER=${SYSBUILD_USER}
+FILES_SUBST+= SYSBUILD_OBJGROUP=${SYSBUILD_OBJGROUP}
+FILES_SUBST+= SYSBUILD_SRCGROUP=${SYSBUILD_SRCGROUP}
+FILES_SUBST+= EGDIR=${EGDIR}
+MESSAGE_SUBST+= SYSBUILD_USER=${SYSBUILD_USER}
+
+DEINSTALL_EXTRA_TMPL= ${.CURDIR}/INSTALL
+INSTALL_EXTRA_TMPL= ${.CURDIR}/INSTALL
+
+PKG_GROUPS= ${SYSBUILD_OBJGROUP} ${SYSBUILD_SRCGROUP}
+PKG_USERS= ${SYSBUILD_USER}:${SYSBUILD_OBJGROUP}::`hostname`\\ sysbuild\\ output:${SYSBUILD_HOMEDIR}:${SH}
+
+EGDIR= ${PREFIX}/share/examples/sysbuild
+
+do-build:
+ @${ECHO} "Generating sysbuild.sh..."
+ @${SED} ${FILES_SUBST_SED} ${FILESDIR}/sysbuild.sh > \
+ ${WRKSRC}/sysbuild.sh
+ @${ECHO} "Generating sysbuild.8..."
+ @${SED} ${FILES_SUBST_SED} ${FILESDIR}/sysbuild.8 > \
+ ${WRKSRC}/sysbuild.8
+ @${ECHO} "Generating sample default.conf..."
+ @${SED} ${FILES_SUBST_SED} ${FILESDIR}/default.conf > \
+ ${WRKSRC}/default.conf
+ @${ECHO} "Generating sample crontab..."
+ @${SED} ${FILES_SUBST_SED} ${FILESDIR}/crontab > ${WRKSRC}/crontab
+
+do-install:
+ ${INSTALL_DATA_DIR} ${PREFIX}/share/examples/sysbuild
+ ${INSTALL_SCRIPT} ${WRKSRC}/sysbuild.sh ${PREFIX}/bin/sysbuild
+ ${INSTALL_MAN} ${WRKSRC}/sysbuild.8 ${PREFIX}/man/man8/sysbuild.8
+ ${INSTALL_DATA} ${WRKSRC}/default.conf ${EGDIR}/default.conf
+ ${INSTALL_DATA} ${WRKSRC}/crontab ${EGDIR}/crontab
+
+.include "../../mk/bsd.pkg.install.mk"
+.include "../../mk/bsd.pkg.mk"
diff --git a/sysutils/sysbuild/PLIST b/sysutils/sysbuild/PLIST
new file mode 100644
index 00000000000..237c060bae8
--- /dev/null
+++ b/sysutils/sysbuild/PLIST
@@ -0,0 +1,6 @@
+@comment $NetBSD: PLIST,v 1.1.1.1 2002/11/28 19:57:28 jmmv Exp $
+bin/sysbuild
+man/man8/sysbuild.8
+share/examples/sysbuild/crontab
+share/examples/sysbuild/default.conf
+@dirrm share/examples/sysbuild
diff --git a/sysutils/sysbuild/files/crontab b/sysutils/sysbuild/files/crontab
new file mode 100644
index 00000000000..90f5bf23a95
--- /dev/null
+++ b/sysutils/sysbuild/files/crontab
@@ -0,0 +1,19 @@
+# $NetBSD: crontab,v 1.1.1.1 2002/11/28 19:57:29 jmmv Exp $
+#
+# sysbuild - crontab file for '@SYSBUILD_USER@' user
+#
+
+HOME=@SYSBUILD_HOMEDIR@
+SHELL=@SH@
+PATH=/bin:/sbin:/usr/bin:/usr/sbin:@PREFIX@/bin:@PREFIX@/sbin
+
+#minute hour mday month wday command
+
+# Update sources daily
+#0 0 * * * @PREFIX@/bin/sysbuild -m update-srcs
+
+# Build kernel weekly
+#0 4 * * 0 @PREFIX@/bin/sysbuild -m build-kernels
+
+# Build release weekly
+#0 6 * * 0 @PREFIX@/bin/sysbuild -m build-release
diff --git a/sysutils/sysbuild/files/default.conf b/sysutils/sysbuild/files/default.conf
new file mode 100644
index 00000000000..ddea1d2f6b9
--- /dev/null
+++ b/sysutils/sysbuild/files/default.conf
@@ -0,0 +1,49 @@
+# $NetBSD: default.conf,v 1.1.1.1 2002/11/28 19:57:29 jmmv Exp $
+#
+# sysbuild - System wide configuration file
+#
+
+# ----------- Build time setup; be careful if you change these -----------
+HOMEDIR=@SYSBUILD_HOMEDIR@
+USER=@SYSBUILD_USER@
+OBJGROUP=@SYSBUILD_OBJGROUP@
+SRCGROUP=@SYSBUILD_SRCGROUP@
+# ------------------------------------------------------------------------
+
+# Directory that holds all object files and DESTDIR (requires *lots*
+# of space).
+BUILDDIR=/var/sysbuild
+
+# Release directory (it will require around 100-200 Mb).
+RELEASEDIR=/var/sysbuild/NetBSD-1.6/i386
+
+# Source directory.
+SRCDIR=/usr/src
+
+# List of directories that are updated via cvs.
+CVSDIRS="/usr/src /usr/pkgsrc /usr/xsrc"
+
+# Ownerships and permissions to set on CVSDIRS during clean-srcs.
+CVSDIRS_OWNER=$USER
+CVSDIRS_GROUP=$SRCGROUP
+CVSDIRS_PERMS="g+w"
+
+# Base directory of kernel configuration files; sysbuild can only read
+# the ones contained here.
+KERNCONFDIR=$HOMEDIR
+
+# List of kernel names to build (files inside $KERNCONFDIR). You can
+# specify several; the first one is the kernel installed locally.
+KERNCONF="MYKERNEL GENERIC"
+
+# If using the `-m' flag, the user who will receive the logs.
+MAILTO=root
+
+# Set to `yes' to send the entire log of commands through mail.
+# Logs can become *very* big.
+MAIL_CMDLOG=no
+
+# When using the install-sets target, unpack these sets. Note that
+# etc.tgz is not specified, as it is specially installed through the
+# etcupdate target.
+SETS="base.tgz comp.tgz games.tgz man.tgz misc.tgz text.tgz"
diff --git a/sysutils/sysbuild/files/sysbuild.8 b/sysutils/sysbuild/files/sysbuild.8
new file mode 100644
index 00000000000..39e53ba107a
--- /dev/null
+++ b/sysutils/sysbuild/files/sysbuild.8
@@ -0,0 +1,439 @@
+.\" $NetBSD: sysbuild.8,v 1.1.1.1 2002/11/28 19:57:29 jmmv Exp $
+.\"
+.\" sysbuild - Automatic NetBSD system builds
+.\" Copyright (c) 2002, Julio Merino <jmmv@netbsd.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 November 16, 2002
+.Dt SYSBUILD 8
+.Os
+.Sh NAME
+.Nm sysbuild
+.Nd Automates
+.Nx
+release and kernel builds
+.Sh SYNOPSIS
+.Nm
+.Op Fl ms
+.Op Fl c Ar conf
+.Ar target
+.Op Ar target_args ...
+.Sh DESCRIPTION
+The
+.Nm
+utility automates the building process of a
+.Nx
+release and all related stuff (like kernels), everything working as an
+unprivileged, special user.
+It should be clear enough that this program does not add any kind of
+magic to the existing build mechanisms of the
+.Nx
+operating system; it just makes things easier if you want to automate
+them (for example, to run them from a
+.Xr cron 8
+job).
+.Pp
+The following options are recognized:
+.Bl -tag -width indent
+.It Fl c Ar conf
+Specify the name of the configuration file.
+This is not a full name; it is just a symbolic name.
+See
+.Sx CONFIGURATION
+for for information.
+.It Fl m
+Capture all output and send it by mail to the
+.Va MAILTO
+user specified in the configuration file.
+.It Fl s
+Automatically change privileges using
+.Xr su 1 .
+By default the program will
+exit if user credentials for the specified target are incorrect.
+.El
+.Sh EXIT STATUS
+Returns 0 on success, 1 if any error happened.
+.Sh TARGETS
+.Nm
+behavior is controlled through a target.
+A target specifies what the program should do when executed.
+The following targets are recognized:
+.Bl -tag -width ident
+.It build-kernels
+Automatically build all kernels listed in the
+.Va KERNCONF
+variable.
+.Pp
+Each kernel name listed in this variable is configured, cleaned,
+depended and built inside its own directory, which is in turn placed in
+.Pa $BUILDDIR/kernels .
+Note that kernel configuration files must be stored inside the
+directory pointed to by
+.Va KERNCONFDIR .
+.Pp
+This target requires
+.Ql @SYSBUILD_USER@
+privileges.
+.It build-release
+Build a full release of the system.
+A release is formed by all compressed system sets, installation floppy
+disks and standard kernels.
+.Pp
+Release files are placed inside the directory pointed by
+.Va RELEASEDIR .
+During the build,
+.Va BSDOBJDIR
+is set to
+.Pa $BUILDDIR/obj
+and
+.Va DESTDIR
+is set to
+.Pa $BUILDDIR/root .
+.Pp
+Depends on
+.Ql clean .
+.Pp
+This target requires
+.Ql @SYSBUILD_USER@
+privileges.
+.It build-sets
+Build compressed system sets only.
+If you want the sets to install them later on your own system, this is
+the recommended target, as building a release takes much more time.
+.Pp
+Depends on
+.Ql clean .
+.Pp
+This target requires
+.Ql @SYSBUILD_USER@
+privileges.
+.It clean
+Cleanup all work areas.
+This will unconditionally clean all the stuff located under the
+directory specified by
+.Va BUILDDIR ,
+but will not destroy the main directory hierarchy inside it.
+.Pp
+This target requires
+.Ql @SYSBUILD_USER@
+privileges.
+.It clean-srcs Op Ar dir ...
+Cleanup permissions of all source files inside the directories
+specified by
+.Va CVSDIRS ,
+or the ones specified by the optional list
+.Ar dir .
+All files are set to
+.Va CVSDIRS_OWNER
+owner and
+.Va CVSDIRS_GROUP
+group.
+Optional permissions can be provided through
+.Va CVSDIRS_PERMS ,
+which are set on all files using
+.Xr chown 8 .
+.Pp
+This target requires
+.Ql root
+privileges.
+.It config Op Ar conf
+Edit the default configuration file or the one specified by
+.Ar conf ,
+if given (remember that these are symbolic names, not full paths).
+This will run
+.Xr vi 1
+if no editor is specified by the
+.Ev EDITOR
+variable.
+.Pp
+If the specified configuration file does not exist, a sample one is
+copied from
+.Pa @EGDIR@/default.conf .
+.Pp
+This command is interactive, so output cannot be captured with
+.Fl m .
+.Pp
+This target requires
+.Ql root
+privileges.
+.It destroy
+Completely remove the work area specified by
+.Va BUILDDIR .
+You should run this target before deinstalling this program.
+.It etcupdate
+Extract the compressed
+.Pa etc.tgz
+file, generated during the
+.Ql build-sets
+or the
+.Ql build-release
+stages, in a temporary place and then run
+.Xr etcupdate 8
+over it to update your
+.Pa /etc
+directory.
+.Pp
+This command is interactive, so output cannot be captured with
+.Fl m .
+.Pp
+This target requires
+.Ql root
+privileges.
+.It init
+Initialize the work directory specified in
+.Va BUILDDIR
+plus all the subdirectories required inside it.
+Should be run once, after configuring the program with the
+.Ql config
+target (or when creating new configuration files).
+.Pp
+This target requires
+.Ql root
+privileges.
+.It install-kernel Op Ar kernel
+Install the first kernel specified in the
+.Va KERNCONF
+variable or the one supplied by the
+.Ar kernel
+argument.
+.Pp
+This target requires
+.Ql root
+privileges.
+.It install-sets
+Install built system sets, placed inside
+.Pa $RELEASEDIR/binary/sets .
+Only sets specified in the
+.Va SETS
+variable are installed.
+.Pp
+This target requires
+.Ql root
+privileges.
+.It update-srcs Op Ar dir ...
+Use
+.Xr cvs 1
+to update all source trees specified by
+.Va CVSDIRS ,
+or the ones specified by the optional
+.Ar dir
+arguments.
+.Pp
+This target requires
+.Ql @SYSBUILD_USER@
+privileges.
+.El
+.Sh CONFIGURATION
+.Nm
+supports multiple configuration files.
+This is specially useful if you usually need to build different
+versions of
+.Nx ,
+that is, one configuration for each version.
+.Pp
+Configuration files are directly stored inside
+.Pa @SYSBUILD_HOMEDIR@ ,
+and have a
+.Ql .conf
+extension.
+The symbolic name of the configuration file (the one used with the
+.Ar -c
+flag) is formed by the name of the configuration file, without the
+path and without the extension.
+For example, the default configuration file (used when no other one is
+specified) is named
+.Pa @SYSBUILD_HOMEDIR@/default.conf ,
+but you could use
+.Fl c Ar default
+to select it.
+You should not worry about where these files are stored, as the
+.Ql config
+target will take care of it.
+.Pp
+The sample configuration file (copied to all new configurations
+created) is well documented and contains some reasonable
+defaults.
+Even though, a list of all known variables is provided here,
+for reference:
+.Bl -tag -width indent
+.It BUILDDIR
+The directory which holds all working stuff (object files, temporary
+root, etc.).
+You will need lots of space in this directory if you want
+to build full releases.
+.It CVSDIRS
+White-space separated list of directories that are updated using
+.Xr cvs 1
+when executing the
+.Ql update-srcs
+target.
+.It KERNCONF
+White-space separated list of kernels that are built with the
+.Ql build-kernels
+target.
+The first one is the kernel that will be installed when running
+.Ql install-kernel .
+.It KERNCONFDIR
+Directory which holds kernel configuration files.
+Defaults to
+.Pa @SYSBUILD_HOMEDIR@ .
+.It RELEASEDIR
+Base directory which will hold release files.
+.It MAILTO
+User who will receive all logs by mail when using the
+.Fl m
+flag.
+.It MAIL_CMDLOG
+If set to
+.Ql yes ,
+mail the entire log of commands to the user specified in
+.Va MAILTO
+(if using the
+.Fl m
+flag).
+If set to
+.Ql no ,
+logs are left in
+.Pa /tmp .
+A summary of the process is always sent, regardless of this variable.
+Remember that logs can become very big!
+.It SETS
+White-space separated list of compressed sets that should be
+extracted in the machine while running
+.Ql install-sets .
+.It SRCDIR
+Path to
+.Nx
+source directory tree, usually
+.Pa /usr/src .
+.El
+.Sh SEE ALSO
+.Xr crontab 1 ,
+.Xr cvs 1 ,
+.Xr mk.conf 5 ,
+.Xr cron 8 ,
+.Xr etcupdate 8 ,
+.Pa /usr/src/BUILDING
+.Sh CRON JOBS
+.Xr cron 8
+is our best friend to schedule these CPU tasks.
+You can, for example, set a task to build a release while you are
+sleeping, another to install it and when you get up you just have to
+run the interactive
+.Ql etcupdate
+target to finish the process.
+.Pp
+To make this even easier, the
+.Ql @SYSBUILD_USER@
+comes with a sample crontab file, with several (disabled) entries,
+ready to be edited.
+You should note that the
+.Fl m
+flag is a good choice for unattended tasks, because you will get a
+report by mail when they finish.
+.Pp
+To edit it, simply type:
+.Pp
+.Dl crontab -e -u @SYSBUILD_USER@
+.Sh EXAMPLES
+To initialize
+.Nm
+for the first time:
+.Pp
+.Dl sysbuild config
+.Dl sysbuild init
+.Pp
+Once you have configured it properly, you can execute the following, as
+.Ql root ,
+to build your kernels and system sets.
+Note that the
+.Fl s
+flag will automatically downgrade privileges.
+.Pp
+.Dl sysbuild -s build-kernels
+.Dl sysbuild -s build-sets
+.Pp
+And then, as
+.Ql root ,
+you can install the results:
+.Pp
+.Dl sysbuild install-kernel
+.Dl sysbuild install-sets
+.Pp
+Or, if you want to update all your source trees:
+.Pp
+.Dl sysbuild clean-srcs
+.Dl sysbuild -s update-srcs
+.Pp
+The first command should be only required once, the first time you
+want to do this task.
+.Pp
+Note that where we are using the
+.Fl s
+you could as well become the
+.Ql @SYSBUILD_USER@
+user using
+.Xr su 1
+and execute the command from there.
+Read
+.Sx SECURITY CONSIDERATIONS
+for more details on this.
+.Sh SECURITY CONSIDERATIONS
+The unprivileged user
+.Ql @SYSBUILD_USER@
+account is disabled by default.
+This means that root can access it through
+.Xr su 1 ,
+but no other user will be able to run
+.Nm
+properly.
+If you want anybody to be able to use it, just set a password for the
+account, give it to the user, and tell him to use the
+.Fl s
+flag.
+.Sh NOTES
+This program will only work in
+.Nx 1.6
+and above.
+Some targets may work in previous versions, but do not expect it to
+work fine.
+.Sh AUTHORS
+.An Julio Merino Aq jmmv@netbsd.org
+.Sh TO DO
+There are many other things to do, but are left for future releases.
+Here is a small list with some ideas:
+.Bl -bullet -width indent
+.It
+Add support for X11R6 unprivileged builds.
+This will require the use of
+.Xr mount_union 8
+because X11R6 build system creates object files together with sources.
+.It
+Support building for multiple architectures.
+.It
+Add an update flag, so that the user can avoid automatic cleans before
+builds.
+.El
diff --git a/sysutils/sysbuild/files/sysbuild.sh b/sysutils/sysbuild/files/sysbuild.sh
new file mode 100644
index 00000000000..9d029607c79
--- /dev/null
+++ b/sysutils/sysbuild/files/sysbuild.sh
@@ -0,0 +1,570 @@
+#!/bin/sh
+#
+# $NetBSD: sysbuild.sh,v 1.1.1.1 2002/11/28 19:57:29 jmmv Exp $
+#
+# sysbuild - Automatic NetBSD system builds
+# Copyright (c) 2002, Julio Merino <jmmv@netbsd.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.
+#
+
+progname=`basename $0`
+allargs="$*"
+conffile=@SYSBUILD_HOMEDIR@/default.conf
+
+# XXX: This is needed when downgrading privileges with su...
+PATH=/bin:/sbin:/usr/bin:/usr/sbin:@PREFIX@/bin:@PREFIX@/sbin
+
+usage() {
+ echo "usage: sysbuild [-ms] [-c conf] target [target_arguments]"
+ echo
+ echo "Flags:"
+ echo " -c conf Base name of configuration file"
+ echo " -m Send all output by mail instead of console"
+ echo " -s Run 'su' to change privileges if needed"
+ echo
+ echo "Available targets:"
+ echo " build-kernels Build kernels"
+ echo " build-release Build a complete release"
+ echo " build-sets Build system sets only"
+ echo " clean Clean work directories"
+ echo " clean-srcs Fix ownerships in source directories"
+ echo " config Create or edit a configuration file"
+ echo " destroy Remove all build stuff"
+ echo " etcupdate Run etcupdate (interactive)"
+ echo " init Initialize work directories"
+ echo " install-kernel Install a built kernel"
+ echo " install-sets Install system sets"
+ echo " update-srcs Use CVS to update source directories"
+}
+
+err() {
+ echo "$progname: $*"
+ exit 1
+}
+
+# --------------------------------------------------------------------
+# Checks
+# --------------------------------------------------------------------
+
+check_noroot() {
+ if [ "`id -un`" != "$USER" ]; then
+ if [ "$autosu" = "yes" ]; then
+ echo "$progname: downgrading privileges to '$USER'"
+ su -l $USER -c "@PREFIX@/bin/sysbuild $allargs"
+ if [ $? -ne 0 ]; then
+ err "cannot switch privileges; aborting"
+ fi
+ # XXX: After su, terminate inmediately.
+ exit 0
+ else
+ err "this target must be run as '$USER' user (use the '-s' flag)"
+ fi
+ fi
+}
+
+check_root() {
+ if [ `id -u` -ne 0 ]; then
+ if [ "$autosu" = "yes" ]; then
+ echo "$progname: becoming root"
+ su -l root -c "@PREFIX@/bin/sysbuild $allargs"
+ if [ $? -ne 0 ]; then
+ err "cannot switch privileges; aborting"
+ fi
+ # XXX: After su, terminate inmediately.
+ exit 0
+ else
+ err "this target must be run as root (use the '-s' flag)"
+ fi
+ fi
+}
+
+check_init() {
+ _ok=1
+ if [ ! -d $HOMEDIR ]; then _ok=0; fi
+ if [ ! -d $BUILDDIR ]; then _ok=0; fi
+ if [ ! -d $BUILDDIR/kernel ]; then _ok=0; fi
+ if [ ! -d $BUILDDIR/obj ]; then _ok=0; fi
+ if [ ! -d $BUILDDIR/root ]; then _ok=0; fi
+ if [ ! -d $BUILDDIR/tools ]; then _ok=0; fi
+ if [ $_ok -eq 0 ]; then
+ err "trees not initialized; use the 'init' target first"
+ fi
+}
+
+# --------------------------------------------------------------------
+# Kernel related functions
+# --------------------------------------------------------------------
+
+sysbuild_build_kernels() {
+ check_noroot
+ check_init
+
+ _confs="$*"
+ if [ -z "$_confs" ]; then
+ _confs="$KERNCONF"
+ fi
+
+ _log=`mktemp /tmp/sysbuild.XXXX`
+ if [ "$MAIL_CMDLOG" = "yes" ]; then
+ echo "Logging to $_log (will be removed later)"
+ else
+ echo "Logging to $_log (will NOT be removed later)"
+ fi
+ echo
+ for _k in $_confs; do
+ if [ ! -f "$KERNCONFDIR/$_k" ]; then
+ echo "No such kernel configuration $_k"
+ else
+ echo -n "Configuring kernel $_k:"
+ mkdir -p $BUILDDIR/kernel/$_k
+ config -s $SRCDIR/sys -b $BUILDDIR/kernel/$_k $KERNCONFDIR/$_k >> $_log 2>&1
+ if [ $? -ne 0 ]; then
+ echo " failed."
+ else
+ echo " done."
+ cd $BUILDDIR/kernel/$_k
+
+ echo -n "Cleaning kernel $_k:"
+ make cleandir >> $_log 2>&1
+ echo " done."
+
+ echo -n "Depending kernel $_k:"
+ make depend >> $_log 2>&1
+ if [ $? -ne 0 ]; then
+ echo " failed."
+ else
+ echo " done."
+
+ echo -n "Buildling kernel $_k:"
+ make >> $_log 2>&1
+ if [ $? -ne 0 ]; then
+ echo " failed."
+ else
+ echo " done."
+ echo "Kernel MD5: `md5 netbsd`"
+ fi
+ fi
+ fi
+ fi
+ echo
+ done
+
+ if [ "$MAIL_CMDLOG" = "yes" ]; then
+ echo "Command log follows:"
+ cat $_log
+ rm -f $_log
+ fi
+}
+
+sysbuild_install_kernel() {
+ check_root
+ check_init
+
+ _conf="$*"
+ if [ -z "$_conf" ]; then
+ _conf="$KERNCONF"
+ fi
+ _conf=`echo $_conf | cut -d ' ' -f 1`
+
+ if [ ! -f $BUILDDIR/kernel/$_conf/netbsd ]; then
+ err "kernel $_conf is not built."
+ else
+ cd $BUILDDIR/kernel/$_conf
+ echo "Kernel MD5: `md5 netbsd`"
+ echo "Installing $_conf kernel:"
+ make install
+ fi
+}
+
+# --------------------------------------------------------------------
+# Release related functions
+# --------------------------------------------------------------------
+
+sysbuild_build_release() {
+ check_noroot
+ check_init
+
+ _log=`mktemp /tmp/sysbuild.XXXX`
+
+ sysbuild_clean
+ if [ "$MAIL_CMDLOG" = "yes" ]; then
+ echo "Logging to $_log (will be removed later)"
+ else
+ echo "Logging to $_log (will NOT be removed later)"
+ fi
+ echo -n "Building full release:"
+ mkdir -p $RELEASEDIR
+ cd $SRCDIR
+ BSDOBJDIR=$BUILDDIR/obj ./build.sh -T $BUILDDIR/tools -D $BUILDDIR/root -R $RELEASEDIR -U >> $_log 2>&1
+ if [ $? -ne 0 ]; then
+ echo " failed."
+ else
+ echo " done."
+ fi
+
+ if [ "$MAIL_CMDLOG" != "yes" ]; then
+ echo "Command log follows:"
+ cat $_log
+ rm -f $_log
+ fi
+}
+
+sysbuild_build_sets() {
+ check_noroot
+ check_init
+
+ _log=`mktemp /tmp/sysbuild.XXXX`
+
+ sysbuild_clean
+ if [ "$MAIL_CMDLOG" = "yes" ]; then
+ echo "Logging to $_log (will be removed later)"
+ else
+ echo "Logging to $_log (will NOT be removed later)"
+ fi
+ echo -n "Building system:"
+ cd $SRCDIR
+ BSDOBJDIR=$BUILDDIR/obj ./build.sh -T $BUILDDIR/tools -d -D $BUILDDIR/root -U >> $_log 2>&1
+ if [ $? -ne 0 ]; then
+ echo " failed."
+ else
+ echo " done."
+
+ echo -n "Making sets:"
+ mkdir -p $RELEASEDIR/binary/sets
+ cd $SRCDIR/distrib/sets
+ make sets DESTDIR=$BUILDDIR/root RELEASEDIR=$RELEASEDIR UNPRIVED=yes >> $_log 2>&1
+ if [ $? -ne 0 ]; then
+ echo " failed."
+ else
+ echo " done."
+ fi
+ fi
+
+ if [ "$MAIL_CMDLOG" != "yes" ]; then
+ echo "Command log follows:"
+ cat $_log
+ rm -f $_log
+ fi
+}
+
+sysbuild_install_sets() {
+ check_root
+ check_init
+
+ for _s in $SETS; do
+ echo -n "Installing $_s:"
+ if [ ! -f $RELEASEDIR/binary/sets/$_s ]; then
+ echo " not built yet"
+ else
+ cd / && tar xzpf $RELEASEDIR/binary/sets/$_s > /dev/null 2>&1
+ if [ $? -ne 0 ]; then
+ echo " failed."
+ else
+ echo " done."
+ fi
+ fi
+ done
+ echo
+ echo "You MUST now run 'sysbuild etcupdate' by hand to update /etc."
+}
+
+# --------------------------------------------------------------------
+# Cleanup functions
+# --------------------------------------------------------------------
+
+sysbuild_clean() {
+ check_noroot
+ check_init
+
+ echo -n "Cleaning $BUILDDIR/obj contents:"
+ rm -rf $BUILDDIR/obj/*
+ echo " done."
+
+ echo -n "Cleaning $BUILDDIR/root contents:"
+ rm -rf $BUILDDIR/root/*
+ echo " done."
+
+ echo -n "Cleaning $BUILDDIR/tools contents:"
+ rm -rf $BUILDDIR/tools/*
+ echo " done."
+}
+
+sysbuild_destroy() {
+ check_root
+
+ echo -n "Destroying $BUILDDIR:"
+ rm -rf $BUILDDIR
+ echo " done."
+}
+
+sysbuild_etcupdate() {
+ check_root
+
+ tmp=`mktemp -d /tmp/sysbuild.XXXX`
+ if [ ! -f $RELEASEDIR/binary/sets/etc.tgz ]; then
+ err "etc.tgz is not yet built."
+ fi
+ echo -n "Backing up /etc to /etc.old:"
+ rm -rf /etc.old
+ cp -rf /etc /etc.old > /dev/null 2>&1
+ echo " done."
+ echo -n "Unpacking etc.tgz:"
+ cd $tmp && tar xzpf $RELEASEDIR/binary/sets/etc.tgz > /dev/null 2>&1
+ if [ $? -ne 0 ]; then
+ echo " failed."
+ else
+ echo " done."
+ etcupdate -b $tmp
+ rm -rf $tmp
+ fi
+}
+
+# --------------------------------------------------------------------
+# Initialization and configuration
+# --------------------------------------------------------------------
+
+sysbuild_init() {
+ check_root
+
+ echo -n "Initializing $HOMEDIR:"
+ mkdir -p $HOMEDIR
+ chown $USER:$OBJGROUP $HOMEDIR
+ echo " done."
+
+ echo -n "Initializing $BUILDDIR:"
+ # Make main directory
+ mkdir -p $BUILDDIR
+ chown $USER:$OBJGROUP $BUILDDIR
+ chmod 750 $BUILDDIR
+ # Make kernel work area
+ mkdir -p $BUILDDIR/kernel
+ chown $USER:$OBJGROUP $BUILDDIR/kernel
+ chmod 750 $BUILDDIR/kernel
+ # Make obj work area
+ mkdir -p $BUILDDIR/obj
+ chown $USER:$OBJGROUP $BUILDDIR/obj
+ chmod 750 $BUILDDIR/obj
+ # Make root work area
+ mkdir -p $BUILDDIR/root
+ chown $USER:$OBJGROUP $BUILDDIR/root
+ chmod 750 $BUILDDIR/root
+ # Make tools directory
+ mkdir -p $BUILDDIR/tools
+ chown $USER:$OBJGROUP $BUILDDIR/tools
+ chmod 750 $BUILDDIR/tools
+ echo " done."
+}
+
+sysbuild_config() {
+ check_root
+
+ _conf="$1"
+ if [ -z "$_conf" ]; then
+ _conf="default"
+ fi
+ _conffile="@SYSBUILD_HOMEDIR@/$_conf.conf"
+
+ if [ ! -f "$_conffile" ]; then
+ echo -n "Copying template to $_conffile:"
+ cp @EGDIR@/default.conf $_conffile
+ chmod 644 $_conffile
+ echo " done."
+ fi
+
+ if [ -z "$EDITOR" ]; then
+ vi $_conffile
+ else
+ $EDITOR $_conffile
+ fi
+}
+
+# --------------------------------------------------------------------
+# Source related functions
+# --------------------------------------------------------------------
+
+sysbuild_clean_srcs() {
+ check_root
+
+ _dirs="$*"
+ if [ -z "$_dirs" ]; then
+ _dirs="$CVSDIRS"
+ fi
+
+ for _d in $_dirs; do
+ echo -n "Fixing ownerships and permissions of $_d:"
+ chown -R $CVSDIRS_OWNER:$CVSDIRS_GROUP $_d
+ if [ -n "$CVSDIRS_PERMS" ]; then
+ chmod -R $CVSDIRS_PERMS $_d
+ fi
+ echo " done."
+ done
+}
+
+sysbuild_update_srcs() {
+ check_noroot
+
+ _dirs="$*"
+ if [ -z "$_dirs" ]; then
+ _dirs="$CVSDIRS"
+ fi
+
+ for _d in $_dirs; do
+ echo "Updating source tree $_d"
+ cd $_d && CVS_RSH=ssh cvs -q -z6 update -dP
+ echo
+ done
+}
+
+# --------------------------------------------------------------------
+# Main program
+# --------------------------------------------------------------------
+
+# Parse options
+args=`getopt c:ms $*`
+if [ $? != 0 ]; then
+ usage
+ exit 1
+fi
+set -- $args
+maillog="no"
+autosu="no"
+while [ $# -gt 0 ]; do
+ case "$1" in
+ -c)
+ conffile="@SYSBUILD_HOMEDIR@/$2.conf"
+ shift
+ ;;
+ -m)
+ maillog="yes"
+ maillogfile=`mktemp /tmp/sysbuild.XXXX`
+ ;;
+ -s)
+ autosu="yes"
+ ;;
+ --)
+ shift; break
+ ;;
+ esac
+ shift
+done
+
+if [ $# -lt 1 ]; then
+ usage
+ exit 1
+fi
+
+target="$1"
+shift
+
+# Read configuration file.
+if [ "$target" != "config" -a ! -f $conffile ]; then
+ err "configuration file $conffile not found"
+elif [ "$target" != "config" ]; then
+ . $conffile
+fi
+
+# Parse targets.
+case $target in
+ build-kernels)
+ if [ "$maillog" = "yes" ]; then
+ sysbuild_build_kernels $* >> $maillogfile
+ else
+ sysbuild_build_kernels $*
+ fi
+ ;;
+ build-release)
+ if [ "$maillog" = "yes" ]; then
+ sysbuild_build_release >> $maillogfile
+ else
+ sysbuild_build_release
+ fi
+ ;;
+ build-sets)
+ if [ "$maillog" = "yes" ]; then
+ sysbuild_build_sets >> $maillogfile
+ else
+ sysbuild_build_sets
+ fi
+ ;;
+ clean)
+ if [ "$maillog" = "yes" ]; then
+ sysbuild_clean >> $maillogfile
+ else
+ sysbuild_clean
+ fi
+ ;;
+ clean-srcs)
+ if [ "$maillog" = "yes" ]; then
+ sysbuild_clean_srcs $* >> $maillogfile
+ else
+ sysbuild_clean_srcs $*
+ fi
+ ;;
+ config)
+ sysbuild_config $*
+ ;;
+ destroy)
+ sysbuild_destroy
+ ;;
+ etcupdate)
+ sysbuild_etcupdate
+ ;;
+ init)
+ sysbuild_init
+ ;;
+ install-kernel)
+ if [ "$maillog" = "yes" ]; then
+ sysbuild_install_kernel >> $maillogfile
+ else
+ sysbuild_install_kernel
+ fi
+ ;;
+ install-sets)
+ if [ "$maillog" = "yes" ]; then
+ sysbuild_install_sets >> $maillogfile
+ else
+ sysbuild_install_sets
+ fi
+ ;;
+ update-srcs)
+ if [ "$maillog" = "yes" ]; then
+ sysbuild_update_srcs $* >> $maillogfile 2>&1
+ else
+ sysbuild_update_srcs $*
+ fi
+ ;;
+ *)
+ err "unknown target '$target'"
+ ;;
+esac
+
+if [ "$maillog" = "yes" ]; then
+ mail -s "Output of $target target" $MAILTO < $maillogfile
+ rm -f $maillogfile
+fi
+
+exit 0