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"
177 where="$( which "${item}" 2>/dev/null )"
178 if [ -z "${where}" ]; then
181 elif [ -n "${ver}" ]; then
182 str=$( LC_ALL=C "${where}" --version 2>&1 \
186 if [ -z "${str}" ]; then
195 if [ -z "${status}" ]; then
202 if [ -n "${inc}" ]; then
203 for item in ${inc}; do
204 printf "Checking for '${item}'... "
205 if printf "#include \"${item}\"" |gcc -x c -c - -o /dev/null >/dev/null 2>&1; then
212 if [ -z "${status}" ]; then
219 if [ -n "${lib}" ]; then
220 if [ -z "${lib_exts}" ]; then
221 do_error "check_for: no library extension specified for '${lib}'"
223 for item in ${lib}; do
224 for ext in ${lib_exts}; do
225 printf "Checking for '${item}.${ext}'... "
226 where="$( gcc -print-file-name="${item}.${ext}" )"
227 if [ "${where}" != "${item}.${ext}" ]; then
228 where="$( readlink "${where}" )"
235 if [ -z "${status}" ]; then
242 if [ -n "${var}" ]; then
243 eval ${var}='"'"${where}"'"'
245 if [ -n "${kconfig}" ]; then
250 # This function checks for a tool, and aborts if not found
251 # See check_for(), above, for how to call has_or_abort
253 # We declare these 6 variables here, although they are
254 # set in check_for(), called below
256 local var ver err kconfig
258 if ! check_for "$@"; then
259 printf " * A mandatory dependency is missing, or version mis-match:\n"
260 printf " * - ${err:-${prog}${inc}${lib}: none found}\n"
261 if [ -n "${var}" ]; then
262 printf " * --> You can give the path to this tool using: --with-${var}=PATH\n"
265 # Bail out if --force is not specified
266 [ -z "${FORCE}" ] && do_error "Bailing out..."
268 printf "<* FORCE in action: *>\n"
269 printf "<* Continuing despite missing pre-requisite *>\n"
270 printf "<* Prepare for breakage *>\n"
276 # This function checks for a tool, and warns if not found
277 # See check_for(), above, for how to call has_or_abort
278 # Note: if err is not set, then no error message is printed
280 # We declare these 6 variables here, although they are
281 # set in check_for(), called below
283 local var ver err kconfig
285 if ! check_for "$@"; then
286 printf " * An optional dependency is missing, some features will be disabled"
287 printf "${err:+:\n * - ${err}}\n"
288 if [ -n "${var}" ]; then
289 printf " * --> You can give the path to this tool using: --with-${var}=PATH\n"
296 \`configure' configures crosstool-NG-${VERSION} to adapt to many kind of systems.
298 USAGE: ./configure [OPTION]...
300 Defaults for the options are specified in brackets.
303 -h, --help display this help and exit
304 --force force configure to continue, even in case
305 some pre-requisites are missing
307 Installation directories:
308 --prefix=PREFIX install files in PREFIX [${PREFIX_DEFAULT}]
309 --local don't install, and use current directory
311 By default, \`make install' will install all the files in
312 \`${PREFIX_DEFAULT}/bin', \`${PREFIX_DEFAULT}/lib' etc. You can specify
313 an installation prefix other than \`${PREFIX_DEFAULT}' using \`--prefix',
314 for instance \`--prefix=\${HOME}'.
316 For better control, use the options below.
318 Fine tuning of the installation directories:
319 --bindir=DIR user executables [PREFIX/bin]
320 --libdir=DIR object code libraries [PREFIX/lib]
321 --docdir=DIR info documentation [PREFIX/share/doc]
322 --mandir=DIR man documentation [PREFIX/share/man]
325 --with-install=PATH Specify the full PATH to GNU install
326 --with-make=PATH Specify the full PATH to GNU make >= 3.80
327 --with-grep=PATH Specify the full PATH to GNU grep
328 --with-sed=PATH Specify the full PATH to GNU sed
329 --with-bash=PATH Specify the full PATH to bash >= 3.0
333 #---------------------------------------------------------------------
336 while [ $# -ne 0 ]; do
338 --local) LOCAL_set="y"; shift;;
339 --prefix*) set_prefix "$1" "$2" && shift || shift 2;;
340 --bindir*) set_bindir "$1" "$2" && shift || shift 2;;
341 --libdir*) set_libdir "$1" "$2" && shift || shift 2;;
342 --docdir*) set_docdir "$1" "$2" && shift || shift 2;;
343 --mandir*) set_mandir "$1" "$2" && shift || shift 2;;
344 --with-*) set_tool "$1" "$2" && shift || shift 2;;
345 --force) FORCE=1; shift;;
346 --help|-h) do_help; exit 0;;
347 # Skip, auto-stuff compatibility
348 --build=*|--host=*|--infodir=*|--datadir=*|--sysconfdir=*|--localstatedir=*) shift;;
349 --build|--host|--infodir|--datadir|--sysconfdir|--localstatedir) shift 2;;
350 --enable-shared|--disable-shared|--enable-static|--disable-static) shift;;
351 --program-prefix=*) shift;;
352 --program-prefix) shift 2;;
353 *) printf "Unrecognised option: '${1}'\n"; do_help; exit 1;;
358 [ -z "${PREFIX}" ] && set_prefix "" "${PREFIX_DEFAULT}"
360 # Special case when installing locally
361 if [ "${LOCAL_set}" = "y" ]; then
362 set_prefix "" "$( pwd )"
363 set_bindir "" "$( pwd )"
364 set_libdir "" "$( pwd )"
365 set_docdir "" "$( pwd )/docs"
366 set_mandir "" "$( pwd )/docs"
369 #---------------------------------------------------------------------
370 # Some sanity checks, now
372 # We check for grep and sed manually, because they are used in check_for()
373 printf "Checking for 'grep'... "
374 if [ -n "${grep}" ]; then
375 printf "${grep} (cached)\n"
377 grep="$( which grep 2>/dev/null )"
378 if [ -z "${grep}" ]; then
382 printf "Checking whether '${grep}' supports -E... "
383 if echo 'foo' |"${grep}" -E 'foo' >/dev/null 2>&1; then
391 if [ -z "${grep}" ]; then
392 printf "Either you are missing entirely the needed tool,\n"
393 printf "or the version you have is too old.\n"
394 printf "You can give the path to this tool using: --with-grep=PATH\n"
395 do_error "Bailing out..."
399 printf "Checking for 'sed'... "
400 if [ -n "${sed}" ]; then
401 printf "${sed} (cached)\n"
403 sed="$( which sed 2>/dev/null )"
404 if [ -z "${sed}" ]; then
408 printf "Checking whether '${sed}' supports -i and -e... "
409 touch .ct-ng.sed.test
410 if "${sed}" -r -i -e 's/foo/bar/' .ct-ng.sed.test >/dev/null 2>&1; then
416 rm -f .ct-ng.sed.test
419 if [ -z "${sed}" ]; then
420 printf "Either you are missing entirely the needed tool,\n"
421 printf "or the version you have is too old.\n"
422 printf "You can give the path to this tool using: --with-sed=PATH\n"
423 do_error "Bailing out..."
427 # The regular list of tools we can now easily check for
428 has_or_abort prog=bash \
430 ver='^GNU bash, version (3\.[1-9]|4)' \
431 err="'bash' 3.1 or above was not found"
432 has_or_abort prog=cut
433 has_or_abort prog=install var=install
434 has_or_abort prog=make \
436 ver='^GNU Make (3.[89][[:digit:]]|[4-9])' \
437 err="GNU 'make' 3.80 or above was not found"
438 has_or_abort prog=gcc
439 has_or_abort prog="awk gawk" ver='^GNU Awk' err="GNU 'awk' was not found"
440 has_or_abort prog=bison
441 has_or_abort prog=flex
442 has_or_abort prog=makeinfo
443 has_or_abort prog=automake \
444 ver='\(GNU automake\) (1\.[[:digit:]]{2,}|[2-9][[:digit:]]*\.)' \
445 err="'automake' 1.10 or above was not found"
446 has_or_abort prog=libtool \
448 ver='\(GNU libtool.*\) (2[[:digit:]]*\.|1\.6[[:digit:]]*\.|1\.5\.[2-9][[:digit:]]+)' \
449 err="'libtool' 1.5.26 or above was not found"
450 has_or_abort prog=stat
451 has_or_abort prog="curl wget"
452 has_or_abort prog=patch
453 has_or_abort prog=tar
454 has_or_abort prog=gzip
455 has_or_abort prog=bzip2
456 has_or_abort prog=lzma
457 has_or_abort prog=readlink
458 has_or_abort prog=objcopy var=objcopy
459 has_or_abort prog=objdump var=objdump
460 has_or_abort prog=readelf var=readelf
461 has_or_abort prog=patch var=patch
462 has_or_warn prog=cvs \
464 err="it will not be possible to use newlib cvs snapshots"
465 has_or_abort prog=svn \
467 err="subversion is required to download eglibc"
471 printf "Checking for host system... "
473 printf "%s\n" "${host}"
478 printf " * Runing under %s is not fully tested\n" "${host}"
479 printf " * You may encounter some weird behavior\n"
483 printf "Checking if static linking is possible... "
488 if gcc -xc - -static -o "${tmp}" >/dev/null 2>&1 <<-_EOF_
489 int main() { return 0; }
497 if [ "${static_link_ok}" = "y" ]; then
503 printf " * An optional host feature is missing, some features will be disabled:\n"
504 printf " * - It will not be possible to statically link toolchain's binaries\n"
506 add_to_kconfig_list static_link_ok
510 if [ "${static_link_ok}" = "y" ]; then
511 libs_exts="${libs_exts} a"
514 ncurses_hdrs="ncurses/ncurses.h ncurses/curses.h ncurses.h curses.h"
515 ncurses_libs="libncursesw libncurses libcurses"
516 has_or_abort lib="${ncurses_libs}" \
517 lib_exts="${libs_exts}" \
518 inc="${ncurses_hdrs}" \
519 err="The 'ncurses' library is needed fo the menuconfig frontend"
521 has_or_abort lib="libstdc++" \
522 lib_exts="${libs_exts}" \
523 err="The 'libstdc++' library is needed to build gcc"
525 # Yes, we may be checking twice for libstdc++.a
526 # The first is because we need one instance of libstdc++ (shared or static)
527 # because it is needed for PPL; the second is because the static version is
528 # required for static-linking, and if missing, the option is removed.
529 has_or_warn lib="libstdc++" \
531 err="static 'libstdc++' is needed to statically link the toolchain's executables" \
532 kconfig=has_static_libstdcxx \
533 skip="${static_link_ko}"
535 has_or_warn inc="expat.h" \
537 lib_exts="${libs_exts}" \
538 err="The 'expat' header file and library are needed to link cross-gdb's executables" \
541 # Yes, we may be checking twice for libexpat.a
542 # The first is because we need one instance of libexpat (shared or static)
543 # because it is needed for cross-gdb; the second is because the static version
544 # is required for static-linking, and if missing, the option is removed.
545 has_or_warn lib="libexpat" \
547 err="static 'expat' is needed to statically link cross-gdb's executables" \
548 kconfig=has_static_expat \
549 skip="${static_link_ko}"
552 python_incs="${python_incs} python2.${v}/Python.h"
553 python_libs="${python_libs} libpython2.${v}"
555 has_or_warn inc="${python_incs}" \
556 lib="${python_libs}" \
557 lib_exts="${libs_exts}" \
558 err="The 'python' header file and library are needed for some features of cross-gdb"
560 #---------------------------------------------------------------------
561 # Compute the version string
563 # If this version is n hg clone, try to get the revision number
564 # If we can't get the revision number, use date
565 printf "\nComputing version string... "
568 REVISION="$( hg id -n 2>/dev/null || true )"
569 case "${REVISION}" in
571 VERSION="${VERSION}_unknown@$( date +%Y%m%d.%H%M%S )";;
573 VERSION="${VERSION}_$( hg id -b )@${REVISION%%+}_$( hg id -i )"
576 # Arrange to have no / in the directory name, no need to create an
577 # arbitrarily deep directory structure
578 VERSION="$( printf "${VERSION}\n" |"${sed}" -r -e 's|/+|_|g;' )"
581 printf "${VERSION}\n"
583 #---------------------------------------------------------------------
584 # Compute and check install paths
586 # Now we have the version string, we can build up the paths
587 [ -z "${BINDIR_set}" ] && BINDIR="${PREFIX}/bin"
588 [ -z "${LIBDIR_set}" ] && LIBDIR="${PREFIX}/lib"
589 [ -z "${DOCDIR_set}" ] && DOCDIR="${PREFIX}/share/doc"
590 [ -z "${MANDIR_set}" ] && MANDIR="${PREFIX}/share/man"
592 # Install support files in our own sub-dir, so as not to mangle (system)
593 # files and dirs, but only if not --local
594 if [ -z "${LOCAL_set}" ]; then
595 LIBDIR="${LIBDIR}/ct-ng-${VERSION}"
596 DOCDIR="${DOCDIR}/ct-ng-${VERSION}"
599 # Check that install PATHs are absolute
600 for p in BIN LIB DOC MAN; do
602 eval v='"${'"${var}"'}"'
605 *) do_error "'${var}' is not an absolute path: '${v}'"
609 #---------------------------------------------------------------------
612 printf "Building up Makefile... "
613 var_sed="$( for var_name in ${var_list}; do
614 eval echo 's,@@${var_name}@@,${'"${var_name}"'},g'
617 kconfig_sed="s/@@KCONFIG@@/$( for k_name in ${kconfig_list}; do
618 eval printf \"${k_name}=\${${k_name}} \"
621 "${sed}" -r -e "s,@@BINDIR@@,${BINDIR},g" \
622 -e "s,@@LIBDIR@@,${LIBDIR},g" \
623 -e "s,@@DOCDIR@@,${DOCDIR},g" \
624 -e "s,@@MANDIR@@,${MANDIR},g" \
625 -e "s,@@VERSION@@,${VERSION},g" \
626 -e "s,@@DATE@@,${DATE},g" \
627 -e "s,@@LOCAL@@,${LOCAL_set},g" \
629 -e "${kconfig_sed}" \
636 crosstool-NG configured as follows:
646 if [ "${LOCAL_set}" != "y" ]; then
647 printf " make install\n"