5 VERSION=$( cat .version )
8 PREFIX_DEFAULT=/usr/local
19 # Simply print the error message, and exit. Obvious, he?
21 printf "${myname}: ${@}\n"
25 # Given an option string and the following argument,
26 # echoes the value of the option.
27 # If --var=val => echoes val and returns 0, meaning second arg was not consumed
28 # If --var val => echoes val and returns non null, meaning second arg was used
42 # The set_xxx functions will set the corresponding configuration variable
43 # They return 0 if second arg was not consumed, and non-zero if it was consumed.
45 PREFIX="$( get_optval "$1" "$2" )"
49 BINDIR="$( get_optval "$1" "$2" )"
53 LIBDIR="$( get_optval "$1" "$2" )"
57 DOCDIR="$( get_optval "$1" "$2" )"
61 MANDIR="$( get_optval "$1" "$2" )"
64 local var_name="${1%%=*}"
65 var_name="${var_name#--with-}"
66 eval ${var_name}="\$( get_optval "$1" "$2" )"
69 # var_list is a list of variables, each one holding a path to a
70 # tool, either detected by ./configure, or specified by the user.
74 # This function adds a variable name to the above list of variable names.
75 # $1: the name of the variable to add to the list
78 for v in ${var_list}; do
79 [ "${v}" = "${1}" ] && return 0
81 var_list="${var_list} ${1}"
83 add_to_kconfig_list() {
85 for k in ${kconfig_list}; do
86 [ "${k}" = "${1}" ] && return 0
88 kconfig_list="${kconfig_list} ${1}"
91 # A function to test for required tools/headers/libraries
92 # Return 0 (true) if found, !0 (false) if not found
94 # $*: [prog|inc|lib]=<name[ name...]>
95 # the name(s) of tool(s) to test for
97 # eg: prog=bash prog="curl wget"
99 # the name of the variable to test and set
101 # eg: var=bash if ${bash} is set and non-null, use that,
102 # else check for bash and set bash=$(which bash)
104 # for each 'prog', test if $(prog --version) matches 'regexp'
106 # eg: ver='^GNU bash, version [34]\.'
107 # $*: lib_exts=<extension[ extension...]>
108 # the list of allowed library extension
110 # eg: lib_exts="so dylib" lib_exts="so dylib a"
111 # $*: err=<error_message>
112 # the error message to print if tool is missing
113 # optional, defaults to: '${prog}: none found'
114 # eg: err="'bash' 3.x or above was not found"
115 # Note: err may be printed by caller, not us
116 # $*: kconfig=<var_name>
117 # the name of a variable to pass down to kconfig if
118 # the prog/inc/lib was found
119 # optional, defaults to none
120 # eg: kconfig=has_libncurses
122 # if set to 'y', skip the test, but still register the
123 # kconfig and var variables; if 'n' or empty, do the
125 # optional, default to 'n'
126 # eg: skip="${static_link_ko}"
136 # Note: prog/inc/lib and var/kconfig/ver/err are set here,
137 # but declared by the caller (because it needs it)
138 for item in "${@}"; do
140 prog=*|inc=*|lib=*|var=*|ver=*|err=*|kconfig=*|lib_exts=*|skip=*)
141 eval ${item%%=*}=\"${item#*=}\"
143 *) do_error "check_for: incorrect parameters: '${item}'";;
147 case "${prog}:${inc}:${lib}" in
148 ?*:?*:|?*::?*|:?*:?*|?*:?*:?*)
149 if [ -n "${var}" ]; then
150 do_error "check_for: the use of var is not compatible with passing several of [prog|inc|lib] at once"
153 ::) do_error "check_for: [prog|inc|lib] is mandatory";;
156 if [ -n "${var}" ]; then
157 add_to_var_list "${var}"
159 if [ -n "${kconfig}" ]; then
160 add_to_kconfig_list "${kconfig}"
163 if [ "${skip}" = "y" ]; then
167 if [ -n "${prog}" ]; then
168 for item in ${prog}; do
169 printf "Checking for '${item}'... "
170 if [ -n "${var}" ]; then
171 eval val="\${${var}}"
172 if [ -n "${val}" ]; then
173 status="${val} (cached)\n"
178 where="$( which "${item}" 2>/dev/null )"
179 if [ -z "${where}" ]; then
182 elif [ -n "${ver}" ]; then
183 str=$( LC_ALL=C "${where}" --version 2>&1 \
187 if [ -z "${str}" ]; then
196 if [ -z "${status}" ]; then
203 if [ -n "${inc}" ]; then
204 for item in ${inc}; do
205 printf "Checking for '${item}'... "
206 if printf "#include \"${item}\"" |gcc -x c -c - -o /dev/null >/dev/null 2>&1; then
213 if [ -z "${status}" ]; then
220 if [ -n "${lib}" ]; then
221 if [ -z "${lib_exts}" ]; then
222 do_error "check_for: no library extension specified for '${lib}'"
224 for item in ${lib}; do
225 for ext in ${lib_exts}; do
226 printf "Checking for '${item}.${ext}'... "
227 where="$( gcc -print-file-name="${item}.${ext}" )"
228 if [ "${where}" != "${item}.${ext}" ]; then
229 where="$( readlink "${where}" )"
236 if [ -z "${status}" ]; then
243 if [ -n "${var}" ]; then
244 eval ${var}='"'"${where}"'"'
246 if [ -n "${kconfig}" ]; then
251 # This function checks for a tool, and aborts if not found
252 # See check_for(), above, for how to call has_or_abort
254 # We declare these 6 variables here, although they are
255 # set in check_for(), called below
257 local var ver err kconfig
259 if ! check_for "$@"; then
260 printf " * A mandatory dependency is missing, or version mis-match:\n"
261 printf " * - ${err:-${prog}${inc}${lib}: none found}\n"
262 if [ -n "${var}" ]; then
263 printf " * --> You can give the path to this tool using: --with-${var}=PATH\n"
266 # Bail out if --force is not specified
267 [ -z "${FORCE}" ] && do_error "Bailing out..."
269 printf "<* FORCE in action: *>\n"
270 printf "<* Continuing despite missing pre-requisite *>\n"
271 printf "<* Prepare for breakage *>\n"
277 # This function checks for a tool, and warns if not found
278 # See check_for(), above, for how to call has_or_abort
279 # Note: if err is not set, then no error message is printed
281 # We declare these 6 variables here, although they are
282 # set in check_for(), called below
284 local var ver err kconfig
286 if ! check_for "$@"; then
287 printf " * An optional dependency is missing, some features will be disabled"
288 printf "${err:+:\n * - ${err}}\n"
289 if [ -n "${var}" ]; then
290 printf " * --> You can give the path to this tool using: --with-${var}=PATH\n"
297 \`configure' configures crosstool-NG-${VERSION} to adapt to many kind of systems.
299 USAGE: ./configure [OPTION]...
301 Defaults for the options are specified in brackets.
304 -h, --help display this help and exit
305 --force force configure to continue, even in case
306 some pre-requisites are missing
308 Installation directories:
309 --prefix=PREFIX install files in PREFIX [${PREFIX_DEFAULT}]
310 --local don't install, and use current directory
312 By default, \`make install' will install all the files in
313 \`${PREFIX_DEFAULT}/bin', \`${PREFIX_DEFAULT}/lib' etc. You can specify
314 an installation prefix other than \`${PREFIX_DEFAULT}' using \`--prefix',
315 for instance \`--prefix=\${HOME}'.
317 For better control, use the options below.
319 Fine tuning of the installation directories:
320 --bindir=DIR user executables [PREFIX/bin]
321 --libdir=DIR object code libraries [PREFIX/lib]
322 --docdir=DIR info documentation [PREFIX/share/doc]
323 --mandir=DIR man documentation [PREFIX/share/man]
326 --with-install=PATH Specify the full PATH to GNU install
327 --with-make=PATH Specify the full PATH to GNU make >= 3.80
328 --with-grep=PATH Specify the full PATH to GNU grep
329 --with-sed=PATH Specify the full PATH to GNU sed
330 --with-bash=PATH Specify the full PATH to bash >= 3.0
334 #---------------------------------------------------------------------
337 while [ $# -ne 0 ]; do
339 --local) LOCAL_set="y"; shift;;
340 --prefix*) set_prefix "$1" "$2" && shift || shift 2;;
341 --bindir*) set_bindir "$1" "$2" && shift || shift 2;;
342 --libdir*) set_libdir "$1" "$2" && shift || shift 2;;
343 --docdir*) set_docdir "$1" "$2" && shift || shift 2;;
344 --mandir*) set_mandir "$1" "$2" && shift || shift 2;;
345 --with-*) set_tool "$1" "$2" && shift || shift 2;;
346 --force) FORCE=1; shift;;
347 --help|-h) do_help; exit 0;;
348 # Skip, auto-stuff compatibility
349 --build=*|--host=*|--infodir=*|--datadir=*|--sysconfdir=*|--localstatedir=*) shift;;
350 --build|--host|--infodir|--datadir|--sysconfdir|--localstatedir) shift 2;;
351 --enable-shared|--disable-shared|--enable-static|--disable-static) shift;;
352 --program-prefix=*) shift;;
353 --program-prefix) shift 2;;
354 *) printf "Unrecognised option: '${1}'\n"; do_help; exit 1;;
359 [ -z "${PREFIX}" ] && set_prefix "" "${PREFIX_DEFAULT}"
361 # Special case when installing locally
362 if [ "${LOCAL_set}" = "y" ]; then
363 set_prefix "" "$( pwd )"
364 set_bindir "" "$( pwd )"
365 set_libdir "" "$( pwd )"
366 set_docdir "" "$( pwd )/docs"
367 set_mandir "" "$( pwd )/docs"
370 #---------------------------------------------------------------------
371 # Some sanity checks, now
373 # We check for grep and sed manually, because they are used in check_for()
374 printf "Checking for 'grep'... "
375 if [ -n "${grep}" ]; then
376 printf "${grep} (cached)\n"
378 grep="$( which grep 2>/dev/null )"
379 if [ -z "${grep}" ]; then
383 printf "Checking whether '${grep}' supports -E... "
384 if echo 'foo' |"${grep}" -E 'foo' >/dev/null 2>&1; then
392 if [ -z "${grep}" ]; then
393 printf "Either you are missing entirely the needed tool,\n"
394 printf "or the version you have is too old.\n"
395 printf "You can give the path to this tool using: --with-grep=PATH\n"
396 do_error "Bailing out..."
400 printf "Checking for 'sed'... "
401 if [ -n "${sed}" ]; then
402 printf "${sed} (cached)\n"
404 sed="$( which sed 2>/dev/null )"
405 if [ -z "${sed}" ]; then
409 printf "Checking whether '${sed}' supports -i and -e... "
410 touch .ct-ng.sed.test
411 if "${sed}" -r -i -e 's/foo/bar/' .ct-ng.sed.test >/dev/null 2>&1; then
417 rm -f .ct-ng.sed.test
420 if [ -z "${sed}" ]; then
421 printf "Either you are missing entirely the needed tool,\n"
422 printf "or the version you have is too old.\n"
423 printf "You can give the path to this tool using: --with-sed=PATH\n"
424 do_error "Bailing out..."
428 # The regular list of tools we can now easily check for
429 has_or_abort prog=bash \
431 ver='^GNU bash, version (3\.[1-9]|4)' \
432 err="'bash' 3.1 or above was not found"
433 has_or_abort prog=cut
434 has_or_abort prog=install var=install
435 has_or_abort prog=make \
437 ver='^GNU Make (3.[89][[:digit:]]|[4-9])' \
438 err="GNU 'make' 3.80 or above was not found"
439 has_or_abort prog=gcc
440 has_or_abort prog="awk gawk" ver='^GNU Awk' err="GNU 'awk' was not found"
441 has_or_abort prog=bison
442 has_or_abort prog=flex
443 has_or_abort prog=makeinfo
444 has_or_abort prog=automake \
445 ver='\(GNU automake\) (1\.[[:digit:]]{2,}|[2-9][[:digit:]]*\.)' \
446 err="'automake' 1.10 or above was not found"
447 has_or_abort prog=libtool \
449 ver='\(GNU libtool.*\) (2[[:digit:]]*\.|1\.6[[:digit:]]*\.|1\.5\.[2-9][[:digit:]]+)' \
450 err="'libtool' 1.5.26 or above was not found"
451 has_or_abort prog=libtoolize \
453 ver='\(GNU libtool.*\) (2[[:digit:]]*\.|1\.6[[:digit:]]*\.|1\.5\.[2-9][[:digit:]]+)' \
454 err="'libtoolize' 1.5.26 or above was not found"
455 has_or_abort prog=stat
456 has_or_abort prog="curl wget"
457 has_or_abort prog=patch
458 has_or_abort prog=tar
459 has_or_abort prog=gzip
460 has_or_abort prog=bzip2
461 has_or_abort prog=lzma
462 has_or_abort prog=readlink
463 has_or_abort prog=objcopy var=objcopy
464 has_or_abort prog=objdump var=objdump
465 has_or_abort prog=readelf var=readelf
466 has_or_abort prog=patch var=patch
467 has_or_warn prog=cvs \
469 err="it will not be possible to use newlib cvs snapshots"
470 has_or_abort prog=svn \
472 err="subversion is required to download eglibc"
476 printf "Checking for host system... "
478 printf "%s\n" "${host}"
483 printf " * Runing under %s is not fully tested\n" "${host}"
484 printf " * You may encounter some weird behavior\n"
488 printf "Checking if static linking is possible... "
493 if gcc -xc - -static -o "${tmp}" >/dev/null 2>&1 <<-_EOF_
494 int main() { return 0; }
502 if [ "${static_link_ok}" = "y" ]; then
508 printf " * An optional host feature is missing, some features will be disabled:\n"
509 printf " * - It will not be possible to statically link toolchain's binaries\n"
511 add_to_kconfig_list static_link_ok
515 if [ "${static_link_ok}" = "y" ]; then
516 libs_exts="${libs_exts} a"
519 ncurses_hdrs="ncurses/ncurses.h ncurses/curses.h ncurses.h curses.h"
520 ncurses_libs="libncursesw libncurses libcurses"
521 has_or_abort lib="${ncurses_libs}" \
522 lib_exts="${libs_exts}" \
523 inc="${ncurses_hdrs}" \
524 err="The 'ncurses' library is needed fo the menuconfig frontend"
526 has_or_abort lib="libstdc++" \
527 lib_exts="${libs_exts}" \
528 err="The 'libstdc++' library is needed to build gcc"
530 # Yes, we may be checking twice for libstdc++.a
531 # The first is because we need one instance of libstdc++ (shared or static)
532 # because it is needed for PPL; the second is because the static version is
533 # required for static-linking, and if missing, the option is removed.
534 has_or_warn lib="libstdc++" \
536 err="static 'libstdc++' is needed to statically link the toolchain's executables" \
537 kconfig=has_static_libstdcxx \
538 skip="${static_link_ko}"
540 has_or_warn inc="expat.h" \
542 lib_exts="${libs_exts}" \
543 err="The 'expat' header file and library are needed to link cross-gdb's executables" \
546 # Yes, we may be checking twice for libexpat.a
547 # The first is because we need one instance of libexpat (shared or static)
548 # because it is needed for cross-gdb; the second is because the static version
549 # is required for static-linking, and if missing, the option is removed.
550 has_or_warn lib="libexpat" \
552 err="static 'expat' is needed to statically link cross-gdb's executables" \
553 kconfig=has_static_expat \
554 skip="${static_link_ko}"
557 python_incs="${python_incs} python2.${v}/Python.h"
558 python_libs="${python_libs} libpython2.${v}"
560 has_or_warn inc="${python_incs}" \
561 lib="${python_libs}" \
562 lib_exts="${libs_exts}" \
563 err="The 'python' header file and library are needed for some features of cross-gdb"
565 #---------------------------------------------------------------------
566 # Compute the version string
568 # If this version is n hg clone, try to get the revision number
569 # If we can't get the revision number, use date
570 printf "\nComputing version string... "
573 REVISION="$( hg id -n 2>/dev/null || true )"
574 case "${REVISION}" in
576 VERSION="${VERSION}_unknown@$( date +%Y%m%d.%H%M%S )";;
578 VERSION="${VERSION}_$( hg id -b )@${REVISION%%+}_$( hg id -i )"
581 # Arrange to have no / in the directory name, no need to create an
582 # arbitrarily deep directory structure
583 VERSION="$( printf "${VERSION}\n" |"${sed}" -r -e 's|/+|_|g;' )"
586 printf "${VERSION}\n"
588 #---------------------------------------------------------------------
589 # Compute and check install paths
591 # Now we have the version string, we can build up the paths
592 [ -z "${BINDIR_set}" ] && BINDIR="${PREFIX}/bin"
593 [ -z "${LIBDIR_set}" ] && LIBDIR="${PREFIX}/lib"
594 [ -z "${DOCDIR_set}" ] && DOCDIR="${PREFIX}/share/doc"
595 [ -z "${MANDIR_set}" ] && MANDIR="${PREFIX}/share/man"
597 # Install support files in our own sub-dir, so as not to mangle (system)
598 # files and dirs, but only if not --local
599 if [ -z "${LOCAL_set}" ]; then
600 LIBDIR="${LIBDIR}/ct-ng-${VERSION}"
601 DOCDIR="${DOCDIR}/ct-ng-${VERSION}"
604 # Check that install PATHs are absolute
605 for p in BIN LIB DOC MAN; do
607 eval v='"${'"${var}"'}"'
610 *) do_error "'${var}' is not an absolute path: '${v}'"
614 #---------------------------------------------------------------------
617 printf "Building up Makefile... "
618 var_sed="$( for var_name in ${var_list}; do
619 eval echo 's,@@${var_name}@@,${'"${var_name}"'},g'
622 kconfig_sed="s/@@KCONFIG@@/$( for k_name in ${kconfig_list}; do
623 eval printf \"${k_name}=\${${k_name}} \"
626 "${sed}" -r -e "s,@@BINDIR@@,${BINDIR},g" \
627 -e "s,@@LIBDIR@@,${LIBDIR},g" \
628 -e "s,@@DOCDIR@@,${DOCDIR},g" \
629 -e "s,@@MANDIR@@,${MANDIR},g" \
630 -e "s,@@VERSION@@,${VERSION},g" \
631 -e "s,@@DATE@@,${DATE},g" \
632 -e "s,@@LOCAL@@,${LOCAL_set},g" \
634 -e "${kconfig_sed}" \
641 crosstool-NG configured as follows:
651 if [ "${LOCAL_set}" != "y" ]; then
652 printf " make install\n"