summaryrefslogtreecommitdiffstats
path: root/installworld_oldk
diff options
context:
space:
mode:
authorgad <gad@FreeBSD.org>2004-03-03 19:36:20 +0000
committergad <gad@FreeBSD.org>2004-03-03 19:36:20 +0000
commit631c9d292f70a4d4df8980327549da8730b9d523 (patch)
tree837452737e39df915146236521752e4cac4467de /installworld_oldk
parent902e092d18e937bd398302e1ce5156f228194093 (diff)
downloadFreeBSD-src-631c9d292f70a4d4df8980327549da8730b9d523.zip
FreeBSD-src-631c9d292f70a4d4df8980327549da8730b9d523.tar.gz
Commit the first set of files for changing time_t on freebsd/sparc64
from a 32-bit value to a 64-bit value. This commit does not actually change anything. It merely provides instructions, scripts, and a safety measure in Makefile.inc1 for people who want to make the change. The real change to 64-bit time_t's on sparc64 is scheduled to happen on March 10th, assuming that so major problems are found between now and then by early-adopters. Reviewed by: freebsd-sparc64
Diffstat (limited to 'installworld_oldk')
-rwxr-xr-xinstallworld_oldk454
1 files changed, 454 insertions, 0 deletions
diff --git a/installworld_oldk b/installworld_oldk
new file mode 100755
index 0000000..4eb4c47
--- /dev/null
+++ b/installworld_oldk
@@ -0,0 +1,454 @@
+#!/bin/sh
+# -------+---------+---------+---------+---------+---------+---------+---------+
+# Copyright (c) 2004 - Garance Alistair Drosehn <gad@FreeBSD.org>.
+#
+# 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.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+#
+# -------+---------+---------+---------+---------+---------+---------+---------+
+# $FreeBSD$
+# -------+---------+---------+---------+---------+---------+---------+---------+
+#
+# This script does a 'make installworld' using the *old* versions of all
+# commands to do the work. It expects that the new kernel has been installed,
+# but that the system has not been rebooted (and is thus still running on the
+# previous kernel). This is useful when a major incompatible change is made,
+# and you want to do an installworld that uses NFS-mounted directories for
+# /usr/src and /usr/obj. This script was written for the change to
+# 64-bit time_t on FreeBSD/Sparc64, but it is not specific to that.
+#
+# IMPORTANT: This script does require that you are NOT YET running on
+# the new kernel that matches the 'world' that you want to install.
+#
+# -------+---------+---------+---------+---------+---------+---------+---------+
+
+# This script expects that it will be run from /usr/src, or an
+# equivalent (perhaps NFS-mounted) directory.
+if [ -f MAINTAINERS -a -f UPDATING -a -f Makefile -a -f Makefile.inc1 ] ; then
+ SOURCE_BWDIR="`make -V .OBJDIR`"
+else
+ echo "This script must be run from /usr/src! (or equivalent)"
+ exit 1
+fi
+
+DOMAKE=
+DOMINI=
+SETMINPATH=
+SYMLINKS=
+VERBOSE=
+BADOPT=
+while test $# != 0
+do
+ case "$1" in
+ -M) SETMINPATH=yes ;;
+ -N) DOMINI=no ;;
+ -S) echo "-S (symlinks) is ignored in installworld_oldk." ;;
+ -Y) DOMINI=yes ;;
+ -y) DOMAKE=yes ;;
+ -n) DOMAKE=no ;;
+ -v) VERBOSE=yes ;;
+ *) echo "Invalid option: $1" ; BADOPT=yes ;;
+ esac
+ shift 1
+done
+if [ -n "$BADOPT" ] ; then
+ exit 1
+fi
+
+echo "* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - *"
+echo "* This script expects that a 'make installkernel' has already"
+echo "* been done, but that the system is still running the previous"
+echo "* kernel. Ie, that you have not rebooted."
+echo "*"
+echo "* Also note that this only does a PARTIAL installworld. You"
+echo "* will still have to do a full installworld after rebooting."
+echo "* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - *"
+echo ""
+
+# See if the user wants us to create a mini-/bin inside of the
+# newly-installed kernel. These executables would only be used
+# *after* booting into the new kernel, so we want the new-world
+# versions of all files.
+# XXX - This is a idea which could be useful in many situations, but
+# it really should be implemented as an official make-target.
+# It would be particularly nice to make this a statically-linked
+# (and crunchgen-ed) collection of programs...
+if [ -z "${DOMINI}" -a -z "${DOMAKE}" ] ; then
+ echo "Do you want a mini-/bin in that newly-installed /boot/kernel? "
+ read -p "(y/n) ? " DOMINI remline
+ echo " "
+elif [ -z "${DOMINI}" ] ; then
+ DOMINI="${DOMAKE}"
+fi
+if [ -n "`echo /y/yes/okay/ok/ | grep -i \"/${DOMINI}/\"`" ] ; then
+ KERNBINDIR=/boot/kernel/bin
+ if [ -e ${KERNBINDIR} ] ; then
+ rm -Rf ${KERNBINDIR}
+ fi
+ mkdir -p ${KERNBINDIR}
+ # Much of this is done in a subshell, so values of DESTDIR, etc,
+ # will only be in effect for this section of the script.
+ (
+ DESTDIR=${KERNBINDIR}
+ BINDIR=""
+ NOINFO=YES
+ NOMAN=YES
+ export BINDIR DESTDIR NOINFO NOMAN
+ MFLAG=
+ for wantdir in bin/chflags bin/chmod bin/cp bin/ls bin/mkdir bin/mv bin/sh \
+ sbin/ifconfig sbin/mount sbin/mount_nfs sbin/reboot \
+ usr.bin/find usr.bin/xargs ; do
+ if [ -n "$VERBOSE" ] ; then
+ echo ".. Installing ${wantdir} to mini-/bin"
+ fi
+ (cd ${wantdir} && make ${MFLAG} install >/dev/null )
+ if [ $? -ne 0 ] ; then
+ echo "** Error while in ${wantdir} doing 'make install'"
+ echo "** for DESTDIR=${KERNBINDIR}"
+ exit 1
+ fi
+ done
+ echo "Done building ${KERNBINDIR}"
+ echo
+ ) || exit 1
+fi
+
+# Start out with no PATH at all.
+PATH=
+
+# Where all the binaries should be coming from.
+OW_BIN="/bin"
+OW_SBIN="/sbin"
+OW_UBIN="/usr/bin"
+OW_USBIN="/usr/sbin"
+OW_GUBIN="/usr/bin"
+
+MKTEMPCMD=/usr/bin/mktemp
+
+# I intentionally prefer to have a shorter name here... We just need a
+# unique name, we're not likely to be under attack during installworld!
+TMPHOLD=`"${MKTEMPCMD}" -q -d ${TMPDIR:-/tmp}/install-oldk.XXX`
+if [ $? -ne 0 ] ; then
+ echo "** Unable to create temp program-holding directory"
+ exit 1
+fi
+
+# Set the most-restrictive value for PATH that the user is willing to
+# shoot for. The more restrictive we are here, the more likely we
+# will catch all references to "unexpected" executables.
+PATH=${TMPHOLD}:/sbin:/bin:/usr/sbin:/usr/bin
+if [ -n "$SETMINPATH" ] ; then
+ PATH=${TMPHOLD}
+fi
+
+# Find the most-appropriate version of key commands for this script.
+# XXX - It would be nice if we could reliably find the exact kernel that
+# we booted up with, and check for the optional mini-/bin in it.
+COPYCMD=/missing/cp
+for chkexec in "/rescue/cp" /bin/cp ; do
+ if [ -f "${chkexec}" ] ; then
+ COPYCMD="${chkexec} -p"
+ break
+ fi
+done
+LINKCMD=/missing/ln
+for chkexec in "/rescue/ln" /bin/ln ; do
+ if [ -f "${chkexec}" ] ; then
+ LINKCMD="${chkexec}"
+ break
+ fi
+done
+COPYINFO="Copying"
+
+copy_exec () {
+ srcdir="$1"
+ cmdname="$2"
+ alsoln="$3"
+ srcfile="${srcdir}/${cmdname}"
+ resfile="/rescue/${cmdname}"
+
+ if [ -f "${resfile}" -a -x "${resfile}" ] ; then
+ if [ -n "$VERBOSE" ] ; then
+ echo ".. Linking ${TMPHOLD}/RESCUE to ${cmdname}"
+ fi
+ ${LINKCMD} "${TMPHOLD}/RESCUE" "${TMPHOLD}/${cmdname}"
+ if [ $? -ne 0 ] ; then
+ echo "** Error Linking '${cmdname}'"
+ exit 1
+ fi
+ elif [ -f "${srcfile}" -a -x "${srcfile}" ] ; then
+ if [ -n "$VERBOSE" ] ; then
+ echo ".. ${COPYINFO} ${srcfile}"
+ fi
+ ${COPYCMD} "${srcfile}" "${TMPHOLD}"
+ if [ $? -ne 0 ] ; then
+ echo "** Error ${COPYINFO} '${srcfile}'"
+ exit 1
+ fi
+ else
+ echo "** Cannot find ${cmdname} in /rescue or ${srcdir}?"
+ exit 1
+ fi
+
+ if [ -n "${alsoln}" ] ; then
+ if [ -n "$VERBOSE" ] ; then
+ echo ".. Linking '${cmdname}' as '${alsoln}' "
+ fi
+ ${LINKCMD} "${TMPHOLD}/${cmdname}" "${TMPHOLD}/${alsoln}"
+ if [ $? -ne 0 ] ; then
+ echo "** Error Linking '${cmdname}'"
+ exit 1
+ fi
+ fi
+}
+
+# The programs listed in the following `do' loop are all the same programs
+# that the standard 'installworld' target wants to make copies of, except
+# that this has special-cases for `awk', `[', and `egrep'. This script
+# also adds the commands `cp', `install', `id' and `which', because those
+# are also *used* by the standard `make installworld' target, although
+# that target doesn't bother to make copies of those programs. The `sleep'
+# command is also added, but only because it is used in this script. And
+# `script' is included just because it can be useful when testing this script.
+#
+# Note that this means there will be two copies made of these files
+# (because the 'make installworld' target is still going to copy them a
+# second time).
+
+# Do the `cp' command first, because this script does so much with it.
+# This is done as a special case, because it's the initial program
+# from /rescue (if /rescue exists).
+chkfile="/rescue/cp"
+if [ -f "${chkfile}" -a -x "${chkfile}" ] ; then
+ if [ -n "$VERBOSE" ] ; then
+ echo ".. Copying ${chkfile} to 'RESCUE'"
+ fi
+ ${COPYCMD} "${chkfile}" "${TMPHOLD}/RESCUE"
+fi
+copy_exec "${OW_BIN}" cp
+
+# Do the `ln' command as the second one, for similar reasons.
+copy_exec "${OW_BIN}" ln
+
+# Awk is also called 'nawk'
+copy_exec "${OW_UBIN}" nawk awk
+
+# The `install' comand is not a special case in this script,
+# but it is in the installworld_newk script.
+copy_exec "${OW_UBIN}" install
+
+# Worried about the extra disk space that this script uses up in /tmp? Well,
+# just specify the -S option, and this script will create symlinks instead of
+# copying the files. Note that the original files might be NFS-mounted, and
+# /tmp might be a memory-based file system, so the `installworld' might go
+# much faster when copies are done here instead of symlinks.
+if [ -n "$SYMLINKS" ] ; then
+ echo "The -S (symlinks) option is ignored in installworld_oldk"
+ # COPYINFO="Linking to"
+ # COPYCMD="ln -s"
+ # LINKCMD="ln -s"
+fi
+
+for prog in cap_mkdb cat chflags chmod chown date \
+ echo find grep make mkdir mtree mv \
+ pwd_mkdb rm sed sh sysctl test true uname wc zic \
+ hostname id ls sleep script umount which xargs
+do
+ gotmatch=
+ for chkdir in "${OW_BIN}" "${OW_SBIN}" "${OW_UBIN}" "${OW_USBIN}"
+ do
+ if [ -f "${chkdir}/${prog}" -a -x "${chkdir}/${prog}" ] ; then
+ gotmatch=yes
+ copy_exec "${chkdir}" "${prog}"
+ if [ $? -ne 0 ] ; then
+ exit 1
+ fi
+ break
+ fi
+ done
+ if [ -z "$gotmatch" ] ; then
+ echo "** Did not find '${prog}' ?"
+ fi
+done
+
+# Special case to handle '[', which we know is the same as 'test'
+if [ -x ${TMPHOLD}/test ] ; then
+ if [ -n "$VERBOSE" ] ; then
+ echo ".. Linking 'test' as '[' "
+ fi
+ ${LINKCMD} ${TMPHOLD}/test ${TMPHOLD}/[
+fi
+# Special case for 'egrep', which is the same as 'grep'
+if [ -x ${TMPHOLD}/grep ] ; then
+ if [ -n "$VERBOSE" ] ; then
+ echo ".. Linking 'grep' as 'egrep' "
+ fi
+ ${LINKCMD} ${TMPHOLD}/grep ${TMPHOLD}/egrep
+fi
+
+# Have to duplicate the standard makefile, to make a few changes.
+
+# First find the setting of PATH. Insert a line in front of that
+# which uses the (undocumented) .SHELL feature to get 'make' to
+# use the newer version of /bin/sh that we just made a copy of.
+# Then alter the PATH setting so that all make targets check our
+# directory of copied files first. If '-M' was given, then have
+# a PATH setting that looks ONLY at our copied files.
+#
+# XXX - the .SHELL feature did NOT seem to work the way that I
+# wanted it to, but that is not a problem for now. It can
+# be looked into at some later date...
+nawk '/^PATH=/ { \
+ print "# Try to get the make cmd to use an alternate /bin/sh." ; \
+ print ".SHELL : name=sh path=" TDIR "/sh" ; \
+ print "" ; \
+ if (WANTMIN == "yes") \
+ sub(/^PATH *=[ \t]*.*/, "PATH=\t" TDIR ); \
+ else \
+ sub(/^PATH *=[ \t]*/, "PATH=\t" TDIR ":"); \
+ } \
+ /-f Makefile.inc1/ { \
+ sub(/Makefile.inc1/, TDIR "/Makefile.inc1" ); \
+ } \
+ { print $0 }' \
+ "TDIR=${TMPHOLD}" "WANTMIN=${SETMINPATH}" Makefile > ${TMPHOLD}/Makefile
+
+# In the case of this script, we want the new libraries to be the
+# *last* things that are installed (since we will be running some
+# programs which expect the present libraries). However, we do
+# still have the problem that 'make' explicitly uses /bin/sh, so
+# the install of 'bin' must be delayed to after those libraries.
+# [Someone recently committed a total restructuring of Makefile.inc1,
+# so the following has to be setup such that it works with either
+# formats. That's why it seems to be doing everything twice.]
+nawk 'BEGIN { GOTSBIN = 0; } \
+ /^# Put initial settings/ { \
+ print "# Try to get the make cmd to use an alternate /bin/sh." ; \
+ print ".SHELL : name=sh path=" TDIR "/sh" ; \
+ print "" ; \
+ } \
+ /^SUBDIR=[\t ]*share\/info .*bin/ { \
+ print "# Try to get the make cmd to use an alternate /bin/sh." ; \
+ print ".SHELL : name=sh path=" TDIR "/sh" ; \
+ print "" ; \
+ } \
+ /exists\(.*\/sbin\)/ { \
+ if (GOTSBIN == 0) { \
+ GOTSBIN = 1;
+ print "" ; \
+ print "# For installworld_oldk processing, forget" ; \
+ print "# all the subdirectories before sbin..."; \
+ print "SUBDIR=" ; \
+ } \
+ } \
+ /^SUBDIR\+=sbin/ { \
+ if (GOTSBIN == 0) { \
+ GOTSBIN = 1;
+ print "" ; \
+ print "# For installworld_oldk processing, forget" ; \
+ print "# all the subdirectories before sbin..."; \
+ print "SUBDIR=" ; \
+ } \
+ } \
+ /^# These are last, since it is/ { \
+ print "# These dirs are done last for installworld_oldk." ; \
+ print ".if exists(${.CURDIR}/lib)" ; \
+ print "SUBDIR+= lib" ; \
+ print ".endif" ; \
+ print ".if exists(${.CURDIR}/libexec)" ; \
+ print "SUBDIR+= libexec"; \
+ print ".endif"; \
+ print ".if exists(${.CURDIR}/bin)" ; \
+ print "SUBDIR+= bin"; \
+ print ".endif"; \
+ } \
+ /-f Makefile.inc1/ { \
+ sub(/Makefile.inc1/, TDIR "/Makefile.inc1" ); \
+ } \
+ { print $0 } \
+ END { \
+ if (GOTSBIN == 0) { \
+ print "ERROR: No \"sbin\" match in Makefile.inc1" > "/dev/stderr"; \
+ } \
+ }' \
+ "TDIR=${TMPHOLD}" Makefile.inc1 > "${TMPHOLD}/Makefile.inc1"
+
+echo ""
+echo "The key programs needed by 'make installworld' have been copied."
+if [ -n "$VERBOSE" ] ; then
+ ls -C ${TMPHOLD}
+ echo ""
+fi
+
+# XXX - Add some "do-nothing" settings so that we won't clobber any
+# more than we need to. I wish we could avoid having to set
+# them as environment variables, particularly for the case
+# where the user chooses to type in all the commands. The
+# more a user has to type, the more chances for a typo...
+NO_FORTRAN=yes
+NO_RESCUE=yes
+NOGAMES=yes
+NOINFO=yes
+NOMAN=yes
+NOSHARE=yes
+export NO_FORTRAN NO_RESCUE NOGAMES NOINFO NOMAN NOSHARE
+
+# The sparc64_installcheck will want this in the environment.
+NEWSPARC_TIMETYPE=__int64_t
+export NEWSPARC_TIMETYPE
+
+# See if the user wants us to go ahead with 'installworld',
+# or just tell them what steps they need to do.
+if [ -z "${DOMAKE}" ] ; then
+ echo "Do you want to proceed with the abridged 'installworld'? "
+ read -p "(y/n) ? " DOMAKE remline
+ echo " "
+fi
+if [ -n "`echo /y/yes/okay/ok/ | grep -i \"/${DOMAKE}/\"`" ] ; then
+ echo "Okay then, this script has set:"
+ echo " NO_FORTRAN NO_RESCUE NOGAMES NOINFO NOMAN NOSHARE"
+ echo "and:"
+ echo " NEWSPARC_TIMETYPE=__int64_t"
+ echo " PATH=${PATH}"
+ echo "and will now execute the command:"
+ echo " make -f ${TMPHOLD}/Makefile installworld"
+ sleep 4
+ make -f ${TMPHOLD}/Makefile installworld
+else
+ echo "When you are ready to continue, enter the commands:"
+ echo " NO_FORTRAN=yes"
+ echo " NO_RESCUE=yes"
+ echo " NOGAMES=yes"
+ echo " NOINFO=yes"
+ echo " NOMAN=yes"
+ echo " NOSHARE=yes"
+ echo " export NO_FORTRAN NO_RESCUE NOGAMES NOINFO NOMAN NOSHARE"
+ echo " NEWSPARC_TIMETYPE=__int64_t"
+ echo " export NEWSPARC_TIMETYPE"
+ echo "and:"
+ echo " PATH=${PATH}"
+ echo "or:"
+ echo " PATH=${TMPHOLD}:\${PATH}"
+ echo "and:"
+ echo " make -f ${TMPHOLD}/Makefile installworld"
+fi
OpenPOWER on IntegriCloud