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.
73 # This function adds a variable name to the above list of variable names.
74 # $1: the name of the variable to add to the list
76 var_list="${var_list} ${1}"
79 # A function to test for required tools/headers/libraries
80 # Return 0 (true) if found, !0 (false) if not found
82 # $*: [prog|inc|lib]=<name[ name...]>
83 # the name(s) of tool(s) to test for
85 # eg: prog=bash prog="curl wget"
87 # the name of the variable to test and set
89 # eg: var=bash if ${bash} is set and non-null, use that,
90 # else check for bash and set bash=$(which bash)
92 # for each 'prog', test if $(prog --version) matches 'regexp'
94 # eg: ver='^GNU bash, version [34]\.'
95 # $*: err=<error_message>
96 # the error message to print if tool is missing
97 # optional, defaults to: '${prog}: none found'
98 # eg: err="'bash' 3.x or above was not found"
107 for item in "${@}"; do
109 prog=*|inc=*|lib=*|var=*|ver=*|err=*)
110 eval ${item%%=*}="'${item#*=}'"
112 *) do_error "has_or_abort: incorrect parameters: '$@'";;
116 case "${prog}:${inc}:${lib}" in
118 for item in ${prog}; do
119 printf "Checking for '${item}'... "
120 if [ -n "${var}" ]; then
121 eval val="\${${var}}"
122 if [ -n "${val}" ]; then
123 printf "${val} (cached)\n"
124 add_to_var_list "${var}"
128 where="$( which "${item}" 2>/dev/null )"
129 if [ -z "${where}" ]; then
132 elif [ -n "${ver}" ]; then
133 str=$( "${where}" --version 2>&1 |grep -E "${ver}" |head -n 1 )
134 if [ -z "${str}" ]; then
145 for item in ${inc}; do
146 printf "Checking for '${item}'... "
147 if printf "#include \"${item}\"" |gcc -x c -c - -o /dev/null >/dev/null 2>&1; then
156 for item in ${lib}; do
157 printf "Checking for '${item}'... "
158 where="$( gcc -print-file-name="${item}" )"
159 if [ "${where}" != "${item}" ]; then
160 where="$( readlink -e "${where}" )"
169 if [ -z "${status}" ]; then
170 printf "\n${err:-${prog}${inc}${lib}: none found}\n\n"
171 printf "Either you are missing entirely the needed tool,\n"
172 printf "or the version you have is too old.\n"
173 if [ -n "${var}" ]; then
174 printf "You can give the path to this tool using: --with-${var}=PATH\n"
181 if [ -n "${var}" ]; then
182 eval ${var}='"'"${where}"'"'
183 add_to_var_list "${var}"
188 # This function checks for a tool, and aborts if not found
189 # See check_for(), above, for how to call has_or_abort
191 if ! check_for "$@"; then
192 # FORCE can be set in the environment
193 [ -z "${FORCE}" ] && do_error "Bailing out..."
196 printf "<* FORCE in action: *>\n"
197 printf "<* Continuing despite missing pre-requisite *>\n"
198 printf "<* Prepare for breakage *>\n"
206 \`configure' configures crosstool-NG-${VERSION} to adapt to many kind of systems.
208 USAGE: ./configure [OPTION]...
210 Defaults for the options are specified in brackets.
213 -h, --help display this help and exit
214 --force force configure to continue, even in case
215 some pre-requisites are missing
217 Installation directories:
218 --prefix=PREFIX install files in PREFIX [${PREFIX_DEFAULT}]
219 --local don't install, and use current directory
221 By default, \`make install' will install all the files in
222 \`${PREFIX_DEFAULT}/bin', \`${PREFIX_DEFAULT}/lib' etc. You can specify
223 an installation prefix other than \`${PREFIX_DEFAULT}' using \`--prefix',
224 for instance \`--prefix=\${HOME}'.
226 For better control, use the options below.
228 Fine tuning of the installation directories:
229 --bindir=DIR user executables [PREFIX/bin]
230 --libdir=DIR object code libraries [PREFIX/lib]
231 --docdir=DIR info documentation [PREFIX/share/doc]
232 --mandir=DIR man documentation [PREFIX/share/man]
235 --with-install=PATH Specify the full PATH to GNU install
236 --with-make=PATH Specify the full PATH to GNU make >= 3.80
237 --with-grep=PATH Specify the full PATH to GNU grep
238 --with-sed=PATH Specify the full PATH to GNU sed
239 --with-bash=PATH Specify the full PATH to bash >= 3.0
243 #---------------------------------------------------------------------
246 while [ $# -ne 0 ]; do
248 --local) LOCAL_set="y"; shift;;
249 --prefix*) set_prefix "$1" "$2" && shift || shift 2;;
250 --bindir*) set_bindir "$1" "$2" && shift || shift 2;;
251 --libdir*) set_libdir "$1" "$2" && shift || shift 2;;
252 --docdir*) set_docdir "$1" "$2" && shift || shift 2;;
253 --mandir*) set_mandir "$1" "$2" && shift || shift 2;;
254 --with-*) set_tool "$1" "$2" && shift || shift 2;;
255 --force) FORCE=1; shift;;
256 --help|-h) do_help; exit 0;;
257 *) printf "Unrecognised option: '${1}'\n"; do_help; exit 1;;
262 [ -z "${PREFIX}" ] && set_prefix "" "${PREFIX_DEFAULT}"
264 # Special case when installing locally
265 if [ "${LOCAL_set}" = "y" ]; then
266 set_prefix "" "$( pwd )"
267 set_bindir "" "$( pwd )"
268 set_libdir "" "$( pwd )"
269 set_docdir "" "$( pwd )/docs"
270 set_mandir "" "$( pwd )/docs"
273 #---------------------------------------------------------------------
274 # Some sanity checks, now
276 # We check for grep and sed manually, because they are used in check_for()
277 printf "Checking for 'grep'... "
278 if [ -n "${grep}" ]; then
279 printf "${grep} (cached)\n"
281 grep="$( which grep 2>/dev/null )"
282 if [ -z "${grep}" ]; then
286 printf "Checking whether '${grep}' supports -E... "
287 if echo 'foo' |"${grep}" -E 'foo' >/dev/null 2>&1; then
295 if [ -z "${grep}" ]; then
296 printf "Either you are missing entirely the needed tool,\n"
297 printf "or the version you have is too old.\n"
298 printf "You can give the path to this tool using: --with-grep=PATH\n"
299 do_error "Bailing out..."
303 printf "Checking for 'sed'... "
304 if [ -n "${sed}" ]; then
305 printf "${sed} (cached)\n"
307 sed="$( which sed 2>/dev/null )"
308 if [ -z "${sed}" ]; then
312 printf "Checking whether '${sed}' supports -i and -e... "
313 touch .ct-ng.sed.test
314 if "${sed}" -r -i -e 's/foo/bar/' .ct-ng.sed.test >/dev/null 2>&1; then
320 rm -f .ct-ng.sed.test
323 if [ -z "${sed}" ]; then
324 printf "Either you are missing entirely the needed tool,\n"
325 printf "or the version you have is too old.\n"
326 printf "You can give the path to this tool using: --with-sed=PATH\n"
327 do_error "Bailing out..."
331 # The regular list of tools we can now easily check for
332 has_or_abort prog=bash \
334 ver='^GNU bash, version (3\.[1-9]|4)' \
335 err="'bash' 3.1 or above was not found"
336 has_or_abort prog=cut
337 has_or_abort prog=install var=install
338 has_or_abort prog=make \
340 ver='^GNU Make (3.[89][[:digit:]]|[4-9])' \
341 err="GNU 'make' 3.80 or above was not found"
342 has_or_abort prog=gcc
343 has_or_abort prog="awk gawk" ver='^GNU Awk' err="GNU 'awk' was not found"
344 has_or_abort prog=bison
345 has_or_abort prog=flex
346 has_or_abort prog=makeinfo
347 has_or_abort prog=automake \
348 ver='\(GNU automake\) (1\.[[:digit:]]{2,}|[2-9][[:digit:]]*\.)' \
349 err="'automake' 1.10 or above was not found"
350 has_or_abort prog=libtool \
351 ver='\(GNU libtool.*\) (2[[:digit:]]*\.|1\.6[[:digit:]]*\.|1\.5\.[2-9][[:digit:]]+)' \
352 err="'libtool' 1.5.26 or above was not found"
353 has_or_abort prog=stat ver='GNU coreutils'
354 has_or_abort prog="curl wget"
355 has_or_abort prog=cvs
356 has_or_abort prog=patch
357 has_or_abort prog=tar
358 has_or_abort prog=gzip
359 has_or_abort prog=bzip2
360 has_or_abort prog=lzma
361 has_or_abort prog=readlink
363 has_or_abort inc="ncurses/ncurses.h ncurses/curses.h ncurses.h curses.h" \
364 err="'ncurses' headers files were not found"
366 ncurses_libs="$( for l in ncursesw ncurses curses; do \
367 for x in so a dylib; do \
368 printf "lib$l.$x "; \
372 has_or_abort lib="${ncurses_libs}" \
373 err="'ncurses' library was not found"
375 #---------------------------------------------------------------------
376 # Compute the version string
378 # If this version is a svn snapshot, try to get the revision number
379 # If we can't get the revision number, use date
383 printf "Computing version string... "
384 REVISION="$( hg id -n 2>/dev/null )"
385 case "${REVISION}" in
387 VERSION="${VERSION}_unknown@$( date +%Y%m%d.%H%M%S )";;
389 VERSION="${VERSION}_$( hg id -b )@${REVISION%%+}_$( hg id -i )"
392 # Arrange to have no / in the directory name, no need to create an
393 # arbitrarily deep directory structure
394 VERSION="$( printf "${VERSION}\n" |"${sed}" -r -e 's|/+|_|g;' )"
399 #---------------------------------------------------------------------
400 # Compute and check install paths
402 # Now we have the version string, we can build up the paths
403 [ -z "${BINDIR_set}" ] && BINDIR="${PREFIX}/bin"
404 [ -z "${LIBDIR_set}" ] && LIBDIR="${PREFIX}/lib/ct-ng-${VERSION}"
405 [ -z "${DOCDIR_set}" ] && DOCDIR="${PREFIX}/share/doc/ct-ng-${VERSION}"
406 [ -z "${MANDIR_set}" ] && MANDIR="${PREFIX}/share/man/man1"
408 # Check that install PATHs are absolute
409 for p in BIN LIB DOC MAN; do
411 eval v='"${'"${var}"'}"'
414 *) do_error "'${var}' is not an absolute path: '${v}'"
418 #---------------------------------------------------------------------
421 printf "Building up Makefile... "
422 var_sed="$( for var_name in ${var_list}; do
423 eval echo 's,@@${var_name}@@,${'"${var_name}"'},g'
426 "${sed}" -r -e "s,@@BINDIR@@,${BINDIR},g
427 s,@@LIBDIR@@,${LIBDIR},g
428 s,@@DOCDIR@@,${DOCDIR},g
429 s,@@MANDIR@@,${MANDIR},g
430 s,@@VERSION@@,${VERSION},g
433 s,@@LOCAL@@,${LOCAL_set},g" Makefile.in >Makefile
438 crosstool-NG configured as follows:
448 if [ "${LOCAL_set}" != "y" ]; then
449 printf " make install\n"