summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xconfigure205
1 files changed, 108 insertions, 97 deletions
diff --git a/configure b/configure
index 8d4b8d1..6074cfc 100755
--- a/configure
+++ b/configure
@@ -11,7 +11,8 @@ DATE=$( date +%Y%m%d )
# - others obvious... :-/
#
# Format of a pattern to check for, one per line:
-# pattern := tool_test OR pattern || tool_test
+# pattern := var_name : tool_pattern OR tool_pattern
+# tool_pattern := tool_test OR tool_pattern || tool_test
# tool_test := tool=regexp OR tool
# tool := basename of the tool OR absolute pathname to the tool
# regexp := valid grep(1) extended regular expression, $( tool --version)
@@ -22,24 +23,29 @@ DATE=$( date +%Y%m%d )
# would parse 'foo || bar || buz' ).
#
# Examples:
-# /bin/bash=^GNU bash, version 3\.
-# will ensure that /bin/bash exists, and that $( /bin/bash --version )
+# bash:bash=^GNU bash, version 3\.
+# - if ${bash} is set and non-null, does nothing
+# - else ensures that bash exists in the PATH, and that
+# "$( "$( which bash )" --version |head -n 1 )"
# matches the regexp '^GNU bash, version 3\.'
+# - if so, then sets bash="$( which bash )"
# autoconf=(GNU Autoconf) || autoconf2.50
-# will ensure that:
-# - 'autoconf' is to be found in the PATH, and that $( autoconf --version )
+# - does not look at an existing variable
+# - ensures that:
+# - 'autoconf' is to be found in the PATH, and that $( autoconf --version |head -n 1 )
# matches the regexp '(GNU Autoconf)' (which btw is the signature of
# autoconf >= 2.50),
# OR that:
# - 'autoconf2.50' is to be found in the PATH
#
TOOLS_TO_CHECK='
-/bin/bash=^GNU bash, version 3\.
+bash:bash=^GNU bash, version 3\.
cut
xargs
-make=^GNU Make
+install:install=GNU coreutils
+make:make=^GNU Make
gcc
-gawk=^GNU Awk
+awk:awk=^GNU Awk || gawk=^GNU Awk
bison
flex
makeinfo
@@ -61,7 +67,6 @@ MANDIR_set=
LOCAL_set=
do_quit=
-CONTRIB_list=
# Simply print the error message, and exit. Obvious, he?
do_error() {
@@ -73,8 +78,19 @@ do_error() {
# Usage: has_or_abort test_pattern (see top of file, TOOLS_TO_CHECK, for
# complete pattern format)
has_or_abort() {
+ local save_IFS
+ local var_name
+ local var_value
+ local tool_pattern
+ local field
+
+ var_name="$( echo "${1}" |"${sed}" -r -e 's/^((([^=:]+):.+|[^:=]+)=.+|[^:=]+)$/\3/;' )"
+ field="${var_name:+2}"
+ field="${field:-1}"
+ tool_pattern="$( echo "${1}" |cut -d : -f ${field}- |"${sed}" -r -e 's/ *\|\| */\n/g;' )"
+
save_IFS="${IFS}"
- tool_pattern="$( echo "${1}" |"${sed}" -r -e 's/ *\|\| */\n/g;' )"
+ # Set IFS to \n only
IFS='
'
for item in ${tool_pattern}; do
@@ -87,7 +103,15 @@ has_or_abort() {
regexp=
;;
esac
+
printf "Checking for '${tool}'... "
+ if [ -n "${var_name}" ]; then
+ eval var_value='"${'"${var_name}"'}"'
+ if [ -n "${var_value}" ]; then
+ echo "${var_value} (cached)"
+ return 0
+ fi
+ fi
where=$( which "${tool}" 2>/dev/null )
if [ -z "${where}" ]; then
echo "not found"
@@ -102,9 +126,8 @@ has_or_abort() {
continue
fi
fi
- echo "${where}"
break
- done;
+ done
if [ -z "${where}" ]; then
for item in ${tool_pattern}; do
case "${item}" in
@@ -122,6 +145,11 @@ has_or_abort() {
echo "or the version you have is tool old."
# FORCE can be set in the environment
[ -z "${FORCE}" ] && do_error "Bailing out..."
+ else
+ echo "${where}"
+ if [ -n "${var_name}" ]; then
+ eval ${var_name}='"'"${where}"'"'
+ fi
fi
IFS="${save_IFS}"
return 0
@@ -134,7 +162,7 @@ has_or_abort() {
get_optval(){
case "$1" in
--*=?*)
- echo "${1}" |cut -d '=' -f 2-
+ echo "${1#*=}"
return 0
;;
*)
@@ -165,38 +193,15 @@ set_mandir() {
MANDIR_set=1
MANDIR="$( get_optval "$1" "$2" )"
}
-
-# The set_contrib function is different in that it will work like the others,
-# except in two cases:
-# If all => replaces all with the list of all available contribs
-# If list => just echoes the list of all available contribs, and instructs
-# caller to quit immediately by setting do_quit to non null.
-# (can't use the return code, see above).
-set_contrib() {
- opt_val="$( get_optval "$1" "$2" )"
- ret=$?
- case "${opt_val}" in
- all)
- CONTRIB_list="$( LC_ALL=C ls -1 contrib/*.patch.lzma \
- |xargs -I {} basename {} .patch.lzma \
- |"${sed}" -r -e ':a; /$/N; s/\n/,/; ta;' \
- )"
- ;;
- list)
- do_quit=1
- echo "Available contributions:"
- LC_ALL=C ls -1 contrib/*.patch.lzma \
- |xargs -I {} basename {} .patch.lzma \
- |"${sed}" -r -e 's/^/ /;'
- ;;
- *) CONTRIB_list="${CONTRIB_list},${opt_val}";;
- esac
- return $ret
+set_tool() {
+ local var_name="${1%%=*}"
+ var_name="${var_name#--with-}"
+ eval ${var_name}="\$( get_optval "$1" "$2" )"
}
do_help() {
cat <<__EOF__
-\`configure' configures crosstool-NG ${VERSION} to adapt to many kind of systems.
+\`configure' configures crosstool-NG-${VERSION} to adapt to many kind of systems.
USAGE: ./configure [OPTION]...
@@ -223,58 +228,29 @@ Fine tuning of the installation directories:
--mandir=DIR man documentation [PREFIX/share/man]
Optional Features:
- --with-contrib=XXX Include externally contributed features found in the
- contrib/ sub-directory. Set to a comma-separated list
- of features. Use 'all' to use all contributions, and
- 'list' to see which are available.
+ --with-install=PATH Specify the full PATH to GNU install
+ --with-make=PATH Specify the full PATH to GNU make
+ --with-grep=PATH Specify the full PATH to GNU grep
+ --with-sed=PATH Specify the full PATH to GNU sed
+ --with-awk=PATH Specify the full PATH to GNU awk
+ --with-bash=PATH Specify the full PATH to bash >= 3.0
__EOF__
}
#---------------------------------------------------------------------
-# Some sanity checks, now
-
-# We check for grep and sed manually, because it is used in has_or_abort
-printf "Checking for 'grep'... "
-grep="$( which grep 2>/dev/null )"
-[ -z "${grep}" ] && do_error "not found"
-echo "${grep}"
-printf "Checking whether '${grep}' supports -E... "
-if echo 'foo' |"${grep}" -E 'foo' >/dev/null 2>&1; then
- echo "yes"
-else
- do_error "no"
-fi
-printf "Checking for 'sed'... "
-sed="$( which sed 2>/dev/null )"
-[ -z "${sed}" ] && do_error "not found"
-echo "${sed}"
-
-# Check the existence of absolutely required tools
-save_IFS="${IFS}"
-IFS='
-'
-for tool in ${TOOLS_TO_CHECK}; do
- has_or_abort "${tool}"
-done
-IFS="${save_IFS}"
-
-#---------------------------------------------------------------------
# Set user's options
while [ $# -ne 0 ]; do
case "$1" in
+ --local) LOCAL_set=1; shift;;
--prefix*) set_prefix "$1" "$2" && shift || shift 2;;
--bindir*) set_bindir "$1" "$2" && shift || shift 2;;
--libdir*) set_libdir "$1" "$2" && shift || shift 2;;
--docdir*) set_docdir "$1" "$2" && shift || shift 2;;
--mandir*) set_mandir "$1" "$2" && shift || shift 2;;
- --local) LOCAL_set=1; shift;;
- --with-contrib*)
- set_contrib "$1" "$2" && shift || shift 2
- [ "${do_quit}" = "1" ] && exit 0
- ;;
+ --with-*) set_tool "$1" "$2" && shift || shift 2;;
--help|-h) do_help; exit 0;;
- *) do_help; exit 1;;
+ *) echo "Unrecognised option: '${1}'"; do_help; exit 1;;
esac
done
@@ -291,25 +267,51 @@ if [ "${LOCAL_set}" = "1" ]; then
fi
#---------------------------------------------------------------------
-# Apply contributed code
-
-# It's safer to change all ',' to spaces rather than setting IFS
-CONTRIB_list="$( echo "${CONTRIB_list}" \
- |"${sed}" -r -e 's/,+/ /g; s/ +/ /g; s/^ //g; s/ $//g;' \
- )"
-if [ -n "${CONTRIB_list}" ]; then
- has_or_abort 'lzcat'
- printf "Applying contributed code: "
- for c in ${CONTRIB_list}; do
- printf "${c}, "
- if [ ! -f "contrib/${c}.patch.lzma" ]; then
- do_error "Contribution '${c}' does not exist"
- fi
- lzcat "contrib/${c}.patch.lzma" |patch -p1 >/dev/null 2>&1
- done
- echo "done"
+# Some sanity checks, now
+
+# We check for grep and sed manually, because they are used in has_or_abort
+printf "Checking for 'grep'... "
+if [ -n "${grep}" ]; then
+ echo "${grep} (cached)"
+else
+ grep="$( which grep 2>/dev/null )"
+ [ -z "${grep}" ] && do_error "not found"
+ echo "${grep}"
+fi
+printf "Checking whether '${grep}' supports -E... "
+if echo 'foo' |"${grep}" -E 'foo' >/dev/null 2>&1; then
+ echo "yes"
+else
+ do_error "no"
fi
+printf "Checking for 'sed'... "
+if [ -n "${sed}" ]; then
+ echo "${sed} (cached)"
+else
+ sed="$( which sed 2>/dev/null )"
+ [ -z "${sed}" ] && do_error "not found"
+ echo "${sed}"
+fi
+printf "Checking wether '${sed}' supports -i and -e... "
+touch .ct-ng.sed.test
+if "${sed}" -r -i -e 's/foo/bar/' .ct-ng.sed.test >/dev/null 2>&1; then
+ rm -f .ct-ng.sed.test
+ echo "yes"
+else
+ rm -f .ct-ng.sed.test
+ do_error "no"
+fi
+
+# Check the existence of absolutely required tools
+save_IFS="${IFS}"
+IFS='
+'
+for tool in ${TOOLS_TO_CHECK}; do
+ has_or_abort "${tool}"
+done
+IFS="${save_IFS}"
+
#---------------------------------------------------------------------
# Compute the version string
@@ -364,12 +366,22 @@ done
# That's all, folks!
printf "Building up Makefile... "
+var_list="grep
+ sed
+ $( printf "${TOOLS_TO_CHECK}" \
+ |"${sed}" -r -e 's/^((([^=:]+):.+|[^:=]+)=.+|[^:=]+)$/\3/;'
+ )"
+var_sed="$( for var_name in ${var_list}; do
+ eval echo 's,@@${var_name}@@,${'"${var_name}"'},g'
+ done
+ )"
"${sed}" -r -e "s,@@BINDIR@@,${BINDIR},g
s,@@LIBDIR@@,${LIBDIR},g
s,@@DOCDIR@@,${DOCDIR},g
s,@@MANDIR@@,${MANDIR},g
s,@@VERSION@@,${VERSION},g
s,@@DATE@@,${DATE},g
+ ${var_sed}
s,@@LOCAL@@,${LOCAL_set},g" Makefile.in >Makefile
echo "done"
@@ -381,7 +393,6 @@ crosstool-NG configured as follows:
LIBDIR='${LIBDIR}'
DOCDIR='${DOCDIR}'
MANDIR='${MANDIR}'
- CONTRIB='${CONTRIB_list}'
Now run:
make