Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src Replace try_set_TOOLDIR with a new function, print_tooldir_m...



details:   https://anonhg.NetBSD.org/src/rev/df4c35d6ef1d
branches:  trunk
changeset: 747710:df4c35d6ef1d
user:      apb <apb%NetBSD.org@localhost>
date:      Sun Sep 27 22:02:41 2009 +0000

description:
Replace try_set_TOOLDIR with a new function, print_tooldir_make,
which does much of the same work but prints a result instead of
setting a global variable.  Adjust the rebuildmake function to suit.
Improve the comments describing how we try to figure out whether
the existing tooldir make needs to be rebuilt.

diffstat:

 build.sh |  131 +++++++++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 86 insertions(+), 45 deletions(-)

diffs (205 lines):

diff -r 701b17e6cbb1 -r df4c35d6ef1d build.sh
--- a/build.sh  Sun Sep 27 21:50:48 2009 +0000
+++ b/build.sh  Sun Sep 27 22:02:41 2009 +0000
@@ -1,5 +1,5 @@
 #! /usr/bin/env sh
-#      $NetBSD: build.sh,v 1.212 2009/09/27 18:08:24 apb Exp $
+#      $NetBSD: build.sh,v 1.213 2009/09/27 22:02:41 apb Exp $
 #
 # Copyright (c) 2001-2009 The NetBSD Foundation, Inc.
 # All rights reserved.
@@ -901,19 +901,10 @@
        esac
 }
 
-# Try to set a value for TOOLDIR.  This is difficult because of a cyclic
-# dependency: TOOLDIR may be affected by settings in /etc/mk.conf, so
-# we would like to use getmakevar to get the value of TOOLDIR, but we
-# can't use getmakevar before we have an up to date version of nbmake;
-# we might already have an up to date version of nbmake in TOOLDIR, but
-# we don't yet know where TOOLDIR is.
-#
-# In principle, we could break the cycle by building a copy of nbmake
-# in a temporary directory.  However, people who use the default value
-# of TOOLDIR do not like to have nbmake rebuilt every time they run
-# build.sh.
-#
-# We try to please everybody as follows:
+# print_tooldir_make --
+# Try to find and print a path to an existing
+# ${TOOLDIR}/bin/${toolprefix}make, for use by rebuildmake() before a
+# new version of ${toolprefix}make has been built.
 #
 # * If TOOLDIR was set in the environment or on the command line, use
 #   that value.
@@ -925,14 +916,22 @@
 #   in the PATH (this might accidentally find a non-NetBSD version of
 #   make, which will lead to failure in the next step);
 # * If a copy of make was found above, try to use it with
-#   nobomb_getmakevar to find the correct value for TOOLDIR;
-# * If all else fails, leave TOOLDIR unset.  Our caller is expected to
-#   be able to cope with this.  (For example, rebuildmake() handles it
-#   by building nbmake in a temporary directory.)
+#   nobomb_getmakevar to find the correct value for TOOLDIR, and believe the
+#   result only if it's a directory that already exists;
+# * If a value of TOOLDIR was found above, and if
+#   ${TOOLDIR}/bin/${toolprefix}make exists, print that value.
 #
-try_set_TOOLDIR()
+print_tooldir_make()
 {
-       [ -n "${TOOLDIR}" ] && return
+       local possible_TOP_OBJ
+       local possible_TOOLDIR
+       local possible_make
+       local tooldir_make
+
+       if [ -n "${TOOLDIR}" ]; then
+               echo "${TOOLDIR}/bin/${toolprefix}make"
+               return 0
+       fi
 
        # Set host_ostype to something like "NetBSD-4.5.6-i386".  This
        # is intended to match the HOST_OSTYPE variable in <bsd.own.mk>.
@@ -945,7 +944,7 @@
 
        # Look in a few potential locations for
        # ${possible_TOOLDIR}/bin/${toolprefix}make.
-       # If we find it, then set guess_make.
+       # If we find it, then set possible_make.
        #
        # In the usual case (without interference from environment
        # variables or /etc/mk.conf), <bsd.own.mk> should set TOOLDIR to
@@ -957,8 +956,6 @@
        # the correct value.  We also try a few other possibilities, but
        # we do not replicate all the logic of <bsd.obj.mk>.
        #
-       local possible_TOP_OBJ
-       local possible_TOOLDIR
        for possible_TOP_OBJ in \
                "${TOP_objdir}" \
                "${MAKEOBJDIRPREFIX:+${MAKEOBJDIRPREFIX}${TOP}}" \
@@ -968,49 +965,93 @@
        do
                [ -n "${possible_TOP_OBJ}" ] || continue
                possible_TOOLDIR="${possible_TOP_OBJ}/tooldir.${host_ostype}"
-               guess_make="${possible_TOOLDIR}/bin/${toolprefix}make"
-               if [ -x "${guess_make}" ]; then
+               possible_make="${possible_TOOLDIR}/bin/${toolprefix}make"
+               if [ -x "${possible_make}" ]; then
                        break
                else
-                       unset guess_make
+                       unset possible_make
                fi
        done
 
        # If the above didn't work, search the PATH for a suitable
        # ${toolprefix}make, nbmake, bmake, or make.
        #
-       : ${guess_make:=$(find_in_PATH ${toolprefix}make '')}
-       : ${guess_make:=$(find_in_PATH nbmake '')}
-       : ${guess_make:=$(find_in_PATH bmake '')}
-       : ${guess_make:=$(find_in_PATH make '')}
+       : ${possible_make:=$(find_in_PATH ${toolprefix}make '')}
+       : ${possible_make:=$(find_in_PATH nbmake '')}
+       : ${possible_make:=$(find_in_PATH bmake '')}
+       : ${possible_make:=$(find_in_PATH make '')}
 
-       # Use ${guess_make} with nobomb_getmakevar to try to find
-       # the value of TOOLDIR.  If this fails, unset TOOLDIR.
+       # At this point, we don't care whether possible_make is in the
+       # correct TOOLDIR or not; we simply want it to be usable by
+       # getmakevar to help us find the correct TOOLDIR.
+       #
+       # Use ${possible_make} with nobomb_getmakevar to try to find
+       # the value of TOOLDIR.  Believe the result only if it's
+       # a directory that already exists and contains bin/${toolprefix}make.
        #
-       unset TOOLDIR
-       if [ -x "${guess_make}" ]; then
-               TOOLDIR=$(make="${guess_make}" nobomb_getmakevar TOOLDIR)
-               [ $? -eq 0 -a -n "${TOOLDIR}" ] || unset TOOLDIR
+       if [ -x "${possible_make}" ]; then
+               possible_TOOLDIR="$(
+                       make="${possible_make}" nobomb_getmakevar TOOLDIR
+                       )"
+               if [ $? = 0 ] && [ -n "${possible_TOOLDIR}" ] \
+                   && [ -d "${possible_TOOLDIR}" ];
+               then
+                       tooldir_make="${possible_TOOLDIR}/bin/${toolprefix}make"
+                       if [ -x "${tooldir_make}" ]; then
+                               echo "${tooldir_make}"
+                               return 0
+                       fi
+               fi
        fi
+       return 1
 }
 
+# rebuildmake --
+# Rebuild nbmake in a temporary directory if necessary.  Sets $make
+# to a path to the nbmake executable.  Sets done_rebuildmake=true
+# if nbmake was rebuilt.
+#
+# There is a cyclic dependency between building nbmake and choosing
+# TOOLDIR: TOOLDIR may be affected by settings in /etc/mk.conf, so we
+# would like to use getmakevar to get the value of TOOLDIR; but we can't
+# use getmakevar before we have an up to date version of nbmake; we
+# might already have an up to date version of nbmake in TOOLDIR, but we
+# don't yet know where TOOLDIR is.
+#
+# The default value of TOOLDIR also depends on the location of the top
+# level object directory, so $(getmakevar TOOLDIR) invoked before or
+# after making the top level object directory may produce different
+# results.
+#
+# Strictly speaking, we should do the following:
+#
+#    1. build a new version of nbmake in a temporary directory;
+#    2. use the temporary nbmake to create the top level obj directory;
+#    3. use $(getmakevar TOOLDIR) with the temporary nbmake to
+#       get the corect value of TOOLDIR;
+#    4. move the temporary nbake to ${TOOLDIR}/bin/nbmake.
+#
+# However, people don't like building nbmake unnecessarily if their
+# TOOLDIR has not changed since an earlier build.  We try to avoid
+# rebuilding a temporary version of nbmake by taking some shortcuts to
+# guess a value for TOOLDIR, looking for an existing version of nbmake
+# in that TOOLDIR, and checking whether that nbmake is newer than the
+# sources used to build it.
+#
 rebuildmake()
 {
-       # Test make source file timestamps against installed ${toolprefix}make
-       # binary, if TOOLDIR is pre-set or if try_set_TOOLDIR can set it.
-       #
-       try_set_TOOLDIR
-       make="${TOOLDIR:-\$TOOLDIR}/bin/${toolprefix}make"
-       if [ -n "$TOOLDIR" ] && [ -x "${make}" ]; then
+       make="$(print_tooldir_make)"
+       if [ -n "${make}" ] && [ -x "${make}" ]; then
                for f in usr.bin/make/*.[ch] usr.bin/make/lst.lib/*.[ch]; do
                        if [ "${f}" -nt "${make}" ]; then
-                               statusmsg "${make} outdated (older than ${f}), needs building."
+                               statusmsg "${make} outdated" \
+                                       "(older than ${f}), needs building."
                                do_rebuildmake=true
                                break
                        fi
                done
        else
-               statusmsg "No ${make}, needs building."
+               statusmsg "No \$TOOLDIR/bin/${toolprefix}make, needs building."
                do_rebuildmake=true
        fi
 
@@ -1244,7 +1285,7 @@
        eval cat <<EOF ${makewrapout}
 #! ${HOST_SH}
 # Set proper variables to allow easy "make" building of a NetBSD subtree.
-# Generated from:  \$NetBSD: build.sh,v 1.212 2009/09/27 18:08:24 apb Exp $
+# Generated from:  \$NetBSD: build.sh,v 1.213 2009/09/27 22:02:41 apb Exp $
 # with these arguments: ${_args}
 #
 



Home | Main Index | Thread Index | Old Index