pkgsrc/bootstrap/bootstrap

646 lines
18 KiB
Bash
Executable file

#! /bin/sh
# $NetBSD: bootstrap,v 1.22 2004/10/08 17:29:00 tv Exp $
#
#
# Copyright (c) 2001-2002 Alistair G. Crooks. All rights reserved.
#
# 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. All advertising materials mentioning features or use of this software
# must display the following acknowledgement:
# This product includes software developed by Alistair G. Crooks
# for the NetBSD project.
# 4. The name of the author may not be used to endorse or promote
# products derived from this software without specific prior written
# permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
#
#set -x
BOOTSTRAP_VERSION=20041008
# set defaults for system locations
prefix=/usr/pkg
pkgdbdir=/var/db/pkg
sysconfdir=${prefix}/etc
ignorecasecheck=no
ignoreusercheck=no
# where the building takes place
wrkdir=work # default: relative to pkgsrc/bootstrap
bootstrapdir=`pwd`
pkgsrcdir=`dirname $bootstrapdir`
usage="Usage: $0 "'
[ --workdir=<workdir> ]
[ --prefix=<prefix> ]
[ --pkgdbdir=<pkgdbdir> ]
[ --sysconfdir=<sysconfdir> ]
[ --ignore-case-check ]
[ --ignore-user-check ]
[ --help ]'
# this replicates some of the logic in bsd.prefs.mk. until
# bootstrap-pkgsrc is merged into pkgsrc, we need to determine the
# right value for OPSYS and MACHINE_ARCH.
# strip / for BSD/OS
opsys=`uname -s | tr -d /`
die()
{
echo >&2 "$@"
exit 1
}
echo_msg()
{
echo "===> $@"
}
get_abi()
{
abi_opsys=$@
case "$abi_opsys" in
IRIX)
abi=`sed -e 's/.*\(abi=\)\([on]*[36][24]\).*/\2/' /etc/compiler.defaults`
isa=`sed -e 's/.*\(isa=mips\)\([1234]\).*/\2/' /etc/compiler.defaults`
case "$abi" in
o32)
imakeopts="-DBuildO32 -DSgiISAo32=$isa"
abi=""
;;
n32) imakeopts="-DBuildN32 -DSgiISA32=$isa"
abi="32"
;;
64 | n64)
imakeopts="-DBuild64bit -DSgiISA64=$isa"
abi="64"
;;
esac
;;
esac
}
check_prog()
{
_var="$1"; _name="$2"
eval _tmp=\"\$$_var\"
if [ "x$_tmp" != "x" ]; then
# Variable is already set (by the user, for example)
return 0
fi
for _d in `echo $PATH | tr ':' ' '`; do
if [ -x "$_d/$_name" ]; then
# Program found
eval $_var=\""$_d/$_name"\"
return 1
fi
done
die "$_name not found in path."
}
opsys_finish()
{
case "$opsys" in
IRIX)
# setting X11BASE to /usr breaks buildlink
if [ ! -e /usr/X11R6 ]; then
ln -sf /usr /usr/X11R6
fi
if [ ! -z $imakeopts ]; then
echo "IMAKEOPTS+=$imakeopts" >> ${MKCONF_EXAMPLE}
fi
patch -d / --forward --quiet -E -p0 \
< files/irix.patch 2>/dev/null || true
;;
esac
}
is_root()
{
if [ `$idprog -u` != 0 ]; then
return 0
fi
return 1
}
# run a command, abort if it fails
run_cmd()
{
echo_msg "running: $@"
eval "$@"
ret=$?
if [ $ret -ne 0 ]; then
echo_msg "exited with status $ret"
die "aborted."
fi
}
# Some versions of mkdir (notably SunOS) bail out too easily, so use the
# install-sh wrapper instead.
mkdir_p()
{
for dir in $@; do
run_cmd "$shprog $wrkdir/install-sh -d -o $user -g $group $dir"
done
}
copy_src()
{
_src="$1"; _dst="$2"
if [ ! -d $wrkdir/$_dst ]; then
mkdir_p $wrkdir/$_dst
fi
$cpprog -Rp $_src/* $wrkdir/$_dst
}
build_start=`date`
echo_msg "bootstrap command: $0 $@"
echo_msg "bootstrap started: $build_start"
if [ "x${PRESERVE_PATH}" != "xyes" ]; then
PATH="${PATH}:/sbin:/usr/sbin"
fi
overpath=""
root_user=root
case "$opsys" in
Darwin)
root_group=wheel
need_pax=yes
need_mtree=no
need_bsd_install=no
need_sed=no
set_opsys=no
check_prog mtreeprog mtree
machine_arch=`uname -p`
;;
FreeBSD)
root_group=wheel
need_pax=yes
need_mtree=yes
need_bsd_install=no
need_sed=no
set_opsys=no
machine_arch=`uname -p`
;;
HP-UX)
root_group=root
need_pax=yes
need_mtree=yes
need_bsd_install=yes
need_sed=yes
set_opsys=no
;;
IRIX*)
if [ -d "/usr/freeware/bin" ]; then
overpath="/usr/freeware/bin:$overpath"
fi
if [ -d "/usr/bsd/bin" ]; then
overpath="/usr/bsd/bin:$overpath"
fi
root_group=sys
need_mtree=yes
need_bsd_install=yes
need_pax=yes
configargs="--with-machine_arch=mipseb"
get_abi "IRIX"
opsys=IRIX
need_sed=yes
set_opsys=yes
;;
Linux)
if [ -f /etc/debian_version ]; then
DEBIAN=yes
fi
root_group=root
need_pax=yes
need_mtree=yes
need_bsd_install=no
need_sed=no
set_opsys=no
machine_arch=`uname -m | sed -e 's/i.86/i386/'`
;;
NetBSD)
root_group=wheel
need_pax=no
need_mtree=no
need_bsd_install=no
need_sed=no
set_opsys=no
check_prog paxprog pax
check_prog tarprog tar
check_prog mtreeprog mtree
machine_arch=`uname -p`
;;
OpenBSD)
root_group=wheel
need_pax=yes
need_mtree=no
need_bsd_install=no
need_sed=no
set_opsys=no
check_prog mtreeprog mtree
machine_arch=`uname -m`
;;
SunOS)
if [ -d "/usr/xpg4/bin" ]; then
overpath="/usr/xpg4/bin:$overpath"
fi
root_group=root
need_pax=yes
need_mtree=yes
need_bsd_install=no
need_sed=yes
set_opsys=no
whoamiprog=/usr/ucb/whoami
machine_arch=`uname -p | sed -e 's/i86pc/i386/'`
;;
AIX)
root_group=system
need_pax=yes
need_mtree=yes
need_bsd_install=yes
need_sed=yes
need_fixed_strip=yes
set_opsys=no
;;
Interix)
is_root () {
if id -G | grep -q 131616; then
return 1
fi
return 0
}
mkdir_p () {
mkdir -p "$@" # allows umask to take effect
}
default_install_mode=0775
root_user=`id -u`
root_group=131616
need_pax=yes
need_mtree=yes
need_bsd_install=yes
need_sed=yes
set_opsys=no
# only used for unprivileged builds
groupsprog="id -gn"
# for bootstrap only; pkgsrc uses CPPFLAGS
CC="gcc -D_ALL_SOURCE"; export CC
ac_cv_header_poll_h=no; export ac_cv_header_poll_h
ac_cv_func_poll=no; export ac_cv_func_poll
;;
UnixWare)
root_group=sys
need_pax=yes
need_mtree=yes
need_bsd_install=no
BSTRAP_ENV="INSTALL=/usr/ucb/install $BSTRAP_ENV"
need_mkdir=yes
need_sed=yes
whoamiprog=/usr/ucb/whoami
set_opsys=no
CC="gcc -DUNIXWARE"; export CC
;;
*)
echo "This platform ($opsys) is untried - good luck, and thanks for using pkgsrc"
root_group=wheel
need_pax=yes
need_mtree=yes
need_bsd_install=yes
need_sed=yes
set_opsys=no
;;
esac
# export OPSYS and MACHINE_ARCH for pkg_install. we only set
# MACHINE_ARCH on platforms where we override bmake's value.
OPSYS=${opsys}
export OPSYS
if [ "${machine_arch}" != "" ]; then
MACHINE_ARCH=${machine_arch}
export MACHINE_ARCH
fi
if [ "x${PRESERVE_PATH}" != "xyes" ]; then
PATH="$overpath:$PATH"
fi
check_prog awkprog awk
check_prog chmodprog chmod
check_prog cpprog cp
check_prog idprog id
check_prog groupsprog groups
check_prog lsprog ls
check_prog rmdirprog rmdir
check_prog sedprog sed
check_prog shprog sh
check_prog whoamiprog whoami
while [ $# -gt 0 ]; do
case $1 in
--workdir=*) wrkdir=`echo $1 | $sedprog -e 's|--workdir=||'` ;;
--prefix=*) prefix=`echo $1 | $sedprog -e 's|--prefix=||'`
sysconfdir=${prefix}/etc ;;
--pkgdbdir=*) pkgdbdir=`echo $1 | $sedprog -e 's|--pkgdbdir=||'` ;;
--sysconfdir=*) sysconfdir=`echo $1 | $sedprog -e 's|--sysconfdir=||'`;;
--ignore-case-check) ignorecasecheck=yes ;;
--ignore-user-check) ignoreusercheck=yes ;;
--help) echo "$usage"; exit ;;
-h) echo "$usage"; exit ;;
--*) echo "$usage"; exit 1 ;;
esac
shift
done
if [ ! -d ${wrkdir} ]; then
if mkdir ${wrkdir}; then
:
else
echo "Could not create the working directory \"${wrkdir}\". Try $0 -h.";
exit 1
fi
fi
if touch ${wrkdir}/.writeable; then
:
else
echo "\"${wrkdir}\" is not writeable. Try $0 -h.";
exit 1
fi
echo "Working directory is: ${wrkdir}"
if [ ! -x ${wrkdir}/install-sh ]; then
run_cmd "$sedprog -e 's|@DEFAULT_INSTALL_MODE@|'${default_install_mode-0755}'|' files/install-sh.in > $wrkdir/install-sh"
run_cmd "$chmodprog +x $wrkdir/install-sh"
fi
is_root
if [ $? = 1 ]; then
user=$root_user
group=$root_group
else
if [ $ignoreusercheck = "no" ]; then
die "You must be root to install bootstrap-pkgsrc."
fi
user=`$whoamiprog`
group=`$groupsprog | $awkprog '{print $1}'`
echo_msg "building as unprivileged user $user/$group"
# force bmake install target to use $user and $group
echo "BINOWN=$user
BINGRP=$group
LIBOWN=$user
LIBGRP=$group
MANOWN=$user
MANGRP=$group" > ${wrkdir}/Makefile.inc
fi
# make sure we're using a case-sensitive file system on Darwin
if [ $ignorecasecheck = "no" ]; then
case "$opsys" in
Darwin|Interix)
echo_msg "Testing file system case sensitivity"
for fs in "$prefix" "$pkgsrcdir"; do
testdir="pkgsrc-REQUIRES-case-SENSITIVE-filesystem"
testdir_mangled="PKGSRC-requires-CASE-sensitive-FILESYSTEM"
mkdir_p "$fs/$testdir" || die "can't verify filesystem ($fs) case-sensitivity"
if [ -d "$fs/$testdir_mangled" ]; then
$rmdirprog "$fs/$testdir"
die "\"$fs\" needs to be on a case-sensitive filesystem (see README.$opsys)"
fi
$rmdirprog "$fs/$testdir"
done
;;
esac
fi
# export the proper environment
PATH=$prefix/bin:$prefix/sbin:${PATH}; export PATH
if [ -d /usr/ccs/bin -a -x /usr/ccs/bin/make ]; then
PATH=/usr/ccs/bin:$PATH; export PATH
fi
PKG_DBDIR=$pkgdbdir; export PKG_DBDIR
LOCALBASE=$prefix; export LOCALBASE
# build libnbcompat
echo_msg "Building libnbcompat"
copy_src ../pkgtools/libnbcompat/files libnbcompat
run_cmd "(cd $wrkdir/libnbcompat; $shprog ./configure -C --prefix=$prefix --sysconfdir=$sysconfdir && make)"
# set up an example mk.conf file
MKCONF_EXAMPLE=${wrkdir}/mk.conf.example
export MKCONF_EXAMPLE
echo_msg "Creating mk.conf.example in ${wrkdir}"
echo "# Example ${sysconfdir}/mk.conf file produced by bootstrap-pkgsrc" > ${MKCONF_EXAMPLE}
echo "# `date`" >> ${MKCONF_EXAMPLE}
echo "" >> ${MKCONF_EXAMPLE}
echo ".ifdef BSD_PKG_MK # begin pkgsrc settings" >> ${MKCONF_EXAMPLE}
echo "" >> ${MKCONF_EXAMPLE}
# IRIX64 needs to be set to IRIX, for example
if [ "$set_opsys" = "yes" ]; then
echo "OPSYS=$opsys" >> ${MKCONF_EXAMPLE}
fi
if [ ! -z "$abi" ]; then
echo "ABI=$abi" >> ${MKCONF_EXAMPLE}
fi
# save environment in example mk.conf
echo "PKG_DBDIR=$pkgdbdir" >> ${MKCONF_EXAMPLE}
echo "LOCALBASE=$prefix" >> ${MKCONF_EXAMPLE}
if [ "${sysconfdir}" != "${prefix}/etc" ]; then
echo "PKG_SYSCONFBASE=$sysconfdir" >> ${MKCONF_EXAMPLE}
fi
# create directories
mkdir_p $prefix $pkgdbdir $prefix/sbin
mkdir_p $prefix/man/man1 $prefix/man/cat1
mkdir_p $prefix/man/man8 $prefix/man/cat8
# bootstrap make and *.mk files
mkdir_p $prefix/share/mk $prefix/lib
copy_src bmake bmake
(cd ${wrkdir}/bmake/mk;
if [ -f ${bootstrapdir}/mods/mk/$opsys.sys.mk ]; then
run_cmd "$cpprog ${bootstrapdir}/mods/mk/$opsys.sys.mk $prefix/share/mk/sys.mk"
else
run_cmd "$cpprog ${bootstrapdir}/mods/mk/generic.sys.mk $prefix/share/mk/sys.mk"
fi
run_cmd "$cpprog bsd.*.mk $prefix/share/mk")
if [ -f mods/mk/$opsys.bsd.lib.mk ] ; then
run_cmd "$cpprog ${wrkdir}/bmake/mk/bsd.lib.mk ${wrkdir}/bmake/mk/bsd.lib.mk.orig"
run_cmd "$cpprog mods/mk/$opsys.bsd.lib.mk ${wrkdir}/bmake/mk/bsd.lib.mk"
fi
run_cmd "$cpprog ${wrkdir}/bmake/mk/bsd.man.mk ${wrkdir}/bsd.man.mk.orig"
if [ -f mods/mk/$opsys.bsd.man.mk ] ; then
run_cmd "$cpprog mods/mk/$opsys.bsd.man.mk ${wrkdir}/bsd.man.mk"
run_cmd "$cpprog mods/mk/$opsys.bsd.man.mk $prefix/share/mk/bsd.man.mk"
fi
own_mk=mods/mk/bsd.own.mk.in
if [ -f mods/mk/$opsys.bsd.own.mk ] ; then
own_mk=mods/mk/$opsys.bsd.own.mk.in
fi
run_cmd "$sedprog -e 's|@ROOT_GROUP@|'$root_group'|g;s|@ROOT_USER@|'$root_user'|g;s|@SYSCONFDIR@|'$sysconfdir'|g' $own_mk > $prefix/share/mk/bsd.own.mk"
if [ -f mods/mk/$opsys.bsd.prog.mk ] ; then
run_cmd "$cpprog mods/mk/$opsys.bsd.prog.mk $prefix/share/mk/bsd.prog.mk"
fi
if [ -f mods/mk/$opsys.bsd.sys.mk ]; then
run_cmd "$cpprog mods/mk/$opsys.bsd.sys.mk $prefix/share/mk/bsd.sys.mk"
fi
case "$opsys" in
NetBSD) run_cmd "$cpprog mods/bmake/Makefile.in ${wrkdir}/bmake/Makefile.in"
;;
esac
if [ "$need_bsd_install" = "yes" ]; then
echo_msg "Installing BSD compatible install script"
run_cmd "$shprog $wrkdir/install-sh -c -o $user -g $group -m 755 $wrkdir/install-sh $prefix/bin/install-sh"
BSTRAP_ENV="INSTALL='$prefix/bin/install-sh -c' $BSTRAP_ENV"
fi
if [ "$need_fixed_strip" = "yes" ] ; then
echo_msg "Installing fixed strip script"
run_cmd "$shprog $wrkdir/install-sh -c -o $user -g $group -m 755 files/strip-sh $prefix/bin/strip"
fi
if [ "$need_mkdir" = "yes" ]; then
echo_msg "Installing fixed mkdir script \"mkdir-sh\""
run_cmd "$shprog $wrkdir/install-sh -c -o $user -g $group -m 755 files/mkdir-sh $prefix/sbin/mkdir-sh"
fi
echo_msg "Installing bmake"
run_cmd "(cd $wrkdir/bmake; env CPPFLAGS='-I../libnbcompat' LDFLAGS='-L../libnbcompat' LIBS='-lnbcompat' $shprog ./configure --prefix=$prefix --with-default-sys-path=$prefix/share/mk $configargs && make -f makefile.boot bootstrap && env BINDIR=$prefix/bin MANDIR=$prefix/man $BSTRAP_ENV ./bmake -f Makefile install)"
# bootstrap tnftp
case "$DEBIAN" in
yes)
LIBS="-lncurses"
;;
esac
echo_msg "Installing tnftp"
copy_src ../net/tnftp/files tnftp
run_cmd "(cd $wrkdir/tnftp; env $BSTRAP_ENV $shprog ./configure --prefix=$prefix --sysconfdir=$sysconfdir && make && (cd src && make install))"
pkg_install_args="$pkg_install_args --with-ftp=$prefix/bin/ftp"
FETCH_CMD=$prefix/bin/ftp
export FETCH_CMD
echo "FETCH_CMD=$prefix/bin/ftp" >> ${MKCONF_EXAMPLE}
# bootstrap digest
echo_msg "Installing digest"
copy_src ../pkgtools/digest/files digest
run_cmd "(cd $wrkdir/digest; env $BSTRAP_ENV $shprog ./configure -C --prefix=$prefix --sysconfdir=$sysconfdir && make && make install)"
# create the digest package's meta files
digestversion=digest-`$awkprog -F "'" '/^PACKAGE_VERSION=/ {print $2}' $wrkdir/digest/configure`
$lsprog -ld $prefix/bin/digest | $awkprog '{ print $5 }' > $wrkdir/digest/.size
env DIGESTPROG=$prefix/bin/digest PKG_DIGEST=md5 PKG_DBDIR=$pkgdbdir \
$shprog ./pkg.sh create -d $wrkdir/digest/DESCR -O \
-c '-Message digest wrapper utility' -l -p $prefix \
-f $wrkdir/digest/PLIST -s $wrkdir/digest/.size -S $wrkdir/digest/.size $digestversion
# we often need NetBSD's pax as well, nowadays, to make binary packages
case "$need_pax" in
yes) echo_msg "Installing pax"
copy_src ../archivers/pax/files pax
run_cmd "(cd $wrkdir/pax; env $BSTRAP_ENV CPPFLAGS='-I../libnbcompat' LDFLAGS='-L../libnbcompat' LIBS='-lnbcompat' $shprog ./configure -C --prefix=$prefix --sysconfdir=$sysconfdir && $prefix/bin/bmake && $prefix/bin/bmake install)"
echo "PAX=$prefix/bin/pax" >> ${MKCONF_EXAMPLE}
pkg_install_args="$pkg_install_args --with-pax=$prefix/bin/pax --with-tar=$prefix/bin/tar"
;;
*)
pkg_install_args="$pkg_install_args --with-pax=$paxprog --with-tar=$tarprog"
;;
esac
# bootstrap mtree if necessary
case "$need_mtree" in
yes) echo_msg "Installing mtree"
copy_src ../pkgtools/mtree/files mtree
run_cmd "(cd $wrkdir/mtree; env $BSTRAP_ENV CPPFLAGS='-I../libnbcompat' LDFLAGS='-L../libnbcompat' LIBS='-lnbcompat' $shprog ./configure -C --prefix=$prefix --sysconfdir=$sysconfdir && $prefix/bin/bmake && $prefix/bin/bmake install)"
pkg_install_args="$pkg_install_args --with-mtree=$prefix/sbin/mtree"
;;
*) pkg_install_args="$pkg_install_args --with-mtree=$mtreeprog"
;;
esac
# bootstrap sed if necessary
case "$need_sed" in
yes) echo_msg "Installing sed"
copy_src ../textproc/nbsed/files sed
run_cmd "(cd $wrkdir/sed; env $BSTRAP_ENV CPPFLAGS='-I../libnbcompat' LDFLAGS='-L../libnbcompat' LIBS='-lnbcompat' $shprog ./configure -C --prefix=$prefix --sysconfdir=$sysconfdir --program-transform-name='s,sed,nbsed,' && make && make install)"
echo "SED=$prefix/bin/nbsed" >> ${MKCONF_EXAMPLE}
BSTRAP_ENV="SED=\"$prefix/bin/nbsed\" $BSTRAP_ENV"
;;
esac
# bootstrap pkg_install
echo_msg "Installing pkgtools"
copy_src ../pkgtools/pkg_install/files pkg_install
pkg_install_mandir="$prefix/man"
if [ "$prefix" = "/usr" ]; then
pkg_install_mandir="$prefix/share/man"
fi
run_cmd "(cd $wrkdir/pkg_install; env $BSTRAP_ENV CPPFLAGS='-I../libnbcompat -I../../libnbcompat' LDFLAGS='-L../libnbcompat -L../../libnbcompat' LIBS='-lnbcompat' $shprog ./configure -C --prefix=$prefix --sysconfdir=$sysconfdir --with-pkgdbdir=$pkgdbdir --mandir=$pkg_install_mandir $pkg_install_args && $prefix/bin/bmake && $prefix/bin/bmake install)"
# all's ready, install the man page
echo_msg "Installing packages(7) man page"
run_cmd "$shprog $wrkdir/install-sh -c -m 444 files/packages.cat7 $prefix/man/cat7/packages.0"
# opsys specific fiddling
opsys_finish
echo "" >> ${MKCONF_EXAMPLE}
echo ".endif # end pkgsrc settings" >> ${MKCONF_EXAMPLE}
echo ""
echo "Please remember to add $prefix/bin to your PATH environment variable"
echo "and $prefix/man to your MANPATH environment variable, if necessary."
echo ""
echo "An example mk.conf file \"${MKCONF_EXAMPLE}\" with the settings you"
echo "provided to \"bootstrap\" has been created for you."
echo "Please copy ${MKCONF_EXAMPLE} to ${sysconfdir}/mk.conf."
echo ""
echo "You can find extensive documentation of the NetBSD Packages Collection"
echo "in $pkgsrcdir/Packages.txt and packages(7)."
echo ""
echo "Hopefully everything is now complete."
echo "Thank you"
echo_msg "bootstrap started: $build_start"
echo_msg "bootstrap ended: `date`"
exit 0