366 lines
10 KiB
Bash
Executable File
366 lines
10 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
#
|
|
# Copyright 2019 Google LLC. All Rights Reserved.
|
|
# Copyright 2014-2017 Nest Labs Inc. All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
|
|
#
|
|
# Description:
|
|
# This file is a convenience script that will bootstrap the GNU
|
|
# autotools system for a project after any build system changes.
|
|
#
|
|
|
|
#
|
|
# usage
|
|
#
|
|
# Display program usage.
|
|
#
|
|
usage() {
|
|
name=`basename $0`
|
|
|
|
echo "Usage: ${name} [ options ] [ -w <what> ]"
|
|
|
|
if [ $1 -ne 0 ]; then
|
|
echo "Try '${name} -h' for more information."
|
|
fi
|
|
|
|
if [ $1 -ne 1 ]; then
|
|
echo ""
|
|
echo " -h, --help Print this help, then exit."
|
|
echo " -I DIR Specify directory DIR as the root of the "
|
|
echo " nlbuild-autotools repository."
|
|
echo " -v, --verbose Verbosely report bootstrap progress."
|
|
echo " -w, --what WHAT Specify what part of the package should be "
|
|
echo " bootstrapped: all, config, make, or none "
|
|
echo " (default: all)."
|
|
echo ""
|
|
fi
|
|
|
|
exit $1
|
|
}
|
|
|
|
#
|
|
# check_required_executable <path variable> <executable name>
|
|
#
|
|
# Check to ensure that the named executable with the path in the
|
|
# provided variable exists and is executable by the current user.
|
|
#
|
|
check_required_executable() {
|
|
variable="${1}"
|
|
path="${!variable}"
|
|
name="${2}"
|
|
output="${3}"
|
|
stem="The required executable '${name}'"
|
|
|
|
if [ -z "${path}" ]; then
|
|
echo "${stem} could not be found."
|
|
|
|
eval "${output}"="no"
|
|
|
|
return 1
|
|
elif [ ! -e "${path}" ] || [ ! -x "${path}" ]; then
|
|
stem="${stem} at '${path}'"
|
|
|
|
if [ ! -e ${path} ]; then
|
|
echo "${stem} does not exist."
|
|
elif [ ! -x ${path} ]; then
|
|
echo "${stem} is not executable."
|
|
fi
|
|
|
|
echo "Please ensure '${name}' is available in PATH."
|
|
|
|
eval "${output}"="no"
|
|
|
|
return 1
|
|
fi
|
|
|
|
eval "${output}"="yes"
|
|
|
|
return 0
|
|
}
|
|
|
|
check_required_executables()
|
|
{
|
|
check_required_executable ACLOCAL aclocal have_aclocal
|
|
check_required_executable AUTOCONF autoconf have_autoconf
|
|
check_required_executable AUTOHEADER autoheader have_autoheader
|
|
check_required_executable AUTOMAKE automake have_automake
|
|
check_required_executable LIBTOOLIZE libtoolize have_libtoolize
|
|
check_required_executable M4 m4 have_m4
|
|
|
|
if [ "${have_aclocal}" = "no" ] || [ "${have_autoconf}" = "no" ] || [ "${have_autoheader}" = "no" ] || [ "${have_automake}" = "no" ] || [ "${have_libtoolize}" = "no" ] || [ "${have_m4}" = "no" ]; then
|
|
cat << EOF
|
|
--------------------------------------------------------------------------------
|
|
Your build host system is missing one or more of the above executables required
|
|
for bootstrapping this nlbuild-autotools-based package. You can either install
|
|
these yourself using package management tools available and appropriate for your
|
|
build host platform or you can build preselected versions of these executables
|
|
from source for this package on this build host by invoking:
|
|
|
|
make -C ${nlbuild_autotools_dir} tools
|
|
|
|
and then re-running this script which will use those executables.
|
|
--------------------------------------------------------------------------------
|
|
EOF
|
|
|
|
exit 1
|
|
|
|
fi
|
|
}
|
|
|
|
#
|
|
# removetmp
|
|
#
|
|
# Remove temporary files and directories used during the run of this
|
|
# script.
|
|
#
|
|
removetmp() {
|
|
if [ -n "${LIBTOOLIZE}" ] && [ "${LIBTOOLIZE}" = "${BOOTSTRAP_TMPDIR}/libtoolize" ]; then
|
|
rm -f "${LIBTOOLIZE}"
|
|
fi
|
|
|
|
if [ -n "${AUTOM4TE_CFG}" ]; then
|
|
rm -f "${AUTOM4TE_CFG}"
|
|
fi
|
|
|
|
rm -r -f "${BOOTSTRAP_TMPDIR}"
|
|
}
|
|
|
|
what="all"
|
|
verbose=
|
|
nlbuild_autotools_dir=
|
|
|
|
# Parse out any command line options
|
|
|
|
while [ ${#} -gt 0 ]; do
|
|
case ${1} in
|
|
-h|--help)
|
|
usage 0
|
|
;;
|
|
|
|
-I)
|
|
nlbuild_autotools_dir="${2}"
|
|
shift 2
|
|
;;
|
|
|
|
-v|--verbose)
|
|
verbose="--verbose"
|
|
shift 1
|
|
;;
|
|
|
|
-w|--what)
|
|
case "${2}" in
|
|
|
|
all|make*|conf*|none)
|
|
what="${2}"
|
|
shift 2
|
|
;;
|
|
|
|
*)
|
|
echo "Unknown what value '${2}'." >&2
|
|
usage 1
|
|
;;
|
|
|
|
esac
|
|
;;
|
|
|
|
*)
|
|
usage 1
|
|
;;
|
|
|
|
esac
|
|
done
|
|
|
|
# Check to ensure that the location of the nlbuild-autotools directory
|
|
# is sane.
|
|
|
|
if [ -z "${nlbuild_autotools_dir}" ]; then
|
|
echo "$0: No -I option specified. Please provide the location of the nlbuild-autotools directory." >&2
|
|
exit 1
|
|
|
|
elif [ ! -d "${nlbuild_autotools_dir}" ]; then
|
|
echo "$0: No such directory: ${nlbuild_autotools_dir}. Please provide a valid path to the nlbuild-autotools directory." >&2
|
|
exit 1
|
|
|
|
fi
|
|
|
|
# Establish some key directories
|
|
|
|
srcdir=`dirname ${0}`
|
|
abs_srcdir=`pwd`
|
|
abs_top_srcdir="${abs_srcdir}"
|
|
|
|
abs_top_hostdir="${nlbuild_autotools_dir}/tools/host"
|
|
|
|
# Figure out what sort of build host we are running on, stripping off
|
|
# any trailing version number information typically included on Darwin
|
|
# / Mac OS X.
|
|
|
|
host=`${nlbuild_autotools_dir}/third_party/autoconf/config.guess | sed -e 's/[[:digit:].]*$//g'`
|
|
|
|
# If possible, attempt to be self-sufficient, relying on GNU autotools
|
|
# executables installed along with the SDK itself.
|
|
|
|
if [ -d "${abs_top_hostdir}/${host}/bin" ]; then
|
|
export PATH="${abs_top_hostdir}/${host}/bin:${PATH}"
|
|
fi
|
|
|
|
if [ -d "${abs_top_hostdir}/bin" ]; then
|
|
export PATH="${abs_top_hostdir}/bin:${PATH}"
|
|
fi
|
|
|
|
export ACLOCAL=`which aclocal`
|
|
export AUTOCONF="`which autoconf`"
|
|
export AUTOHEADER="`which autoheader`"
|
|
export AUTOM4TE="`which autom4te`"
|
|
export AUTOMAKE="`which automake`"
|
|
export LIBTOOLIZE="`which libtoolize || which glibtoolize`"
|
|
export M4=`which m4`
|
|
|
|
# Establish, if necessary, some SDK-specific directories needed to
|
|
# override various paths in GNU autotools that otherwise expect to be
|
|
# absolute (e.g. /usr/share, etc.).
|
|
|
|
if [ -d "${abs_top_hostdir}/share" ]; then
|
|
if [ -d "${abs_top_hostdir}/share/autoconf" ]; then
|
|
export AC_MACRODIR="${abs_top_hostdir}/share/autoconf"
|
|
|
|
export autom4te_perllibdir="${abs_top_hostdir}/share/autoconf"
|
|
fi
|
|
|
|
if [ -d "${abs_top_hostdir}/share/automake-1.14" ]; then
|
|
export PERL5LIB="${abs_top_hostdir}/share/automake-1.14:${PERL5LIB}"
|
|
|
|
make_action_options="--libdir ${abs_top_hostdir}/share/automake-1.14"
|
|
fi
|
|
|
|
if [ -d "${abs_top_hostdir}/share/aclocal-1.14" ]; then
|
|
local_action_options="--automake-acdir=${abs_top_hostdir}/share/aclocal-1.14 ${local_action_options}"
|
|
fi
|
|
|
|
if [ -d "${abs_top_hostdir}/share/aclocal" ]; then
|
|
local_action_options="--system-acdir=${abs_top_hostdir}/share/aclocal ${local_action_options}"
|
|
fi
|
|
fi
|
|
|
|
# Both autom4te.cfg and libtoolize, as installed from source, want to
|
|
# use absolute file system paths that cannot be
|
|
# overridden. Consequently, we create temporary, local versions of
|
|
# these, patched up with SDK-specific paths.
|
|
|
|
BOOTSTRAP_TMPDIR="`mktemp -d /tmp/tmp.bootstrapXXXXXX`"
|
|
|
|
trap "removetmp" 1 2 3 9 15
|
|
|
|
#
|
|
# Generate any temporary files that need to be patched at run time
|
|
# with the location of the SDK tree, including:
|
|
#
|
|
# - The autom4te configuration file
|
|
# - The libtoolize executable script
|
|
#
|
|
|
|
if [ -r "${abs_top_hostdir}/share/autoconf/autom4te.cfg" ]; then
|
|
export AUTOM4TE_CFG="${BOOTSTRAP_TMPDIR}/autom4te.cfg"
|
|
|
|
sed -e "s,//share/autoconf,${abs_top_hostdir}/share/autoconf,g" < "${abs_top_hostdir}/share/autoconf/autom4te.cfg" > "${AUTOM4TE_CFG}"
|
|
fi
|
|
|
|
if [ -r "${abs_top_hostdir}/${host}/bin/libtoolize" ]; then
|
|
export LIBTOOLIZE="${BOOTSTRAP_TMPDIR}/libtoolize"
|
|
|
|
sed -e "s,//share/libtool,${abs_top_hostdir}/share/libtool,g" -e "s,//share/aclocal,${abs_top_hostdir}/share/aclocal,g" < "${abs_top_hostdir}/${host}/bin/libtoolize" > "${LIBTOOLIZE}"
|
|
|
|
chmod 775 "${LIBTOOLIZE}"
|
|
fi
|
|
|
|
# Before we get much further, check to ensure that the required
|
|
# executables are available and, if not, provide some actionable
|
|
# guidance.
|
|
|
|
check_required_executables
|
|
|
|
if [ -n "${verbose}" ]; then
|
|
echo PATH="${PATH}"
|
|
|
|
echo ACLOCAL="${ACLOCAL}"
|
|
echo AUTOCONF="${AUTOCONF}"
|
|
echo AUTOHEADER="${AUTOHEADER}"
|
|
echo AUTOM4TE="${AUTOM4TE}"
|
|
echo AUTOMAKE="${AUTOMAKE}"
|
|
echo LIBTOOLIZE="${LIBTOOLIZE}"
|
|
echo M4="${M4}"
|
|
|
|
echo AC_MACRODIR="${AC_MACRODIR}"
|
|
echo AUTOM4TE_CFG="${AUTOM4TE_CFG}"
|
|
echo PERL5LIB="${PERL5LIB}"
|
|
echo autom4te_perllibdir="${autom4te_perllibdir}"
|
|
|
|
echo local_action_options="${local_action_options}"
|
|
echo make_action_options="${make_action_options}"
|
|
fi
|
|
|
|
# Set up the default actions for each bootstrap stage.
|
|
|
|
local_action="${ACLOCAL} ${verbose} ${local_action_options}"
|
|
header_action="${AUTOHEADER} ${verbose}"
|
|
tool_action="${LIBTOOLIZE} ${verbose} --automake --copy --force"
|
|
make_action="${AUTOMAKE} ${verbose} ${make_action_options} --add-missing --copy"
|
|
config_action="${AUTOCONF} ${verbose}"
|
|
|
|
# Determine what needs to be short-circuited based on the
|
|
# user-specified "what".
|
|
|
|
case "${what}" in
|
|
|
|
all)
|
|
;;
|
|
|
|
conf*)
|
|
local_action=true
|
|
header_action=true
|
|
tool_action=true
|
|
make_action=true
|
|
;;
|
|
|
|
make*)
|
|
local_action=true
|
|
header_action=true
|
|
config_action=true
|
|
;;
|
|
|
|
none)
|
|
local_action=true
|
|
header_action=true
|
|
tool_action=true
|
|
make_action=true
|
|
config_action=true
|
|
;;
|
|
|
|
esac
|
|
|
|
# Bootstrap the package.
|
|
|
|
if [ -n "${verbose}" ]; then
|
|
echo "${local_action} && ${tool_action} && ${header_action} && ${make_action} && ${config_action}"
|
|
fi
|
|
|
|
${local_action} && ${tool_action} && ${header_action} && ${make_action} && ${config_action}
|
|
|
|
# Clean up any temporary files created.
|
|
|
|
removetmp
|