configure
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Thu Oct 09 19:17:49 2008 +0000 (2008-10-09)
changeset 914 0b164a321177
parent 876 24e131e13113
child 937 12e98d88cf09
permissions -rwxr-xr-x
Remove CT_BROKEN.
Only one component is actually BROKEN (libelf), make it depend on EXPERIMENTAL, but state BROKEN in the prompt.
ltrace (which depends on libelf) is now marked as EXPERIMENTAL, with the reference to the BROKEN libelf in the help entry.

/trunk/docs/overview.txt | 6 0 6 0 ------
/trunk/config/debug/ltrace.in | 7 4 3 0 ++++---
/trunk/config/global/ct-behave.in | 8 0 8 0 --------
/trunk/config/tools/libelf.in | 5 3 2 0 +++--
4 files changed, 7 insertions(+), 19 deletions(-)
yann@182
     1
#!/bin/sh
yann@182
     2
yann@334
     3
VERSION=$(cat .version)
yann@182
     4
DATE=$(date +%Y%m%d)
yann@182
     5
yann@673
     6
# All absolutely required tools, one per line to ease diff.
yann@673
     7
# See function 'has_or_abort, below, for syntax
yann@673
     8
#  - Hopefully, if gcc is present, then all associated tools will be
yann@673
     9
#  - awk must be GNU awk
yann@673
    10
#  - makeinfo for building docs, even if discarded later on
yann@673
    11
#  - others obvious... :-/
yann@876
    12
#
yann@876
    13
# Format of a pattern to check for, one per line:
yann@876
    14
#   pattern := tool_test  OR  pattern|tool_test
yann@876
    15
#   tool_test := tool/regexp
yann@876
    16
#   tool := name of the tool  OR  absolute pathname to the tool
yann@876
    17
#   regexp := valid grep(1) extended regular expression  OR  empty
yann@876
    18
#
yann@876
    19
# In case a pattern list is given (eg foo|bar|buz), then tests are performed
yann@876
    20
# from left to right, stopping at the first matching test (like the shell
yann@876
    21
# would parse 'foo || bar || buz' ).
yann@876
    22
#
yann@876
    23
# Examples:
yann@876
    24
#    /bin/bash/^GNU bash, version 3\.
yann@876
    25
#       will ensure that /bin/bash exists, and that $(/bin/bash --version)
yann@876
    26
#       matches the regexp '^GNU bash, version 3\.'
yann@876
    27
#    autoconf/(GNU Autoconf)|autoconf2.50/
yann@876
    28
#       will ensure that:
yann@876
    29
#         - 'autoconf' is to be found in the PATH, and that $(autoconf
yann@876
    30
#           --version) matches the regexp '(GNU Autoconf)' (which btw is
yann@876
    31
#           the signature of autoconf >= 2.50),
yann@876
    32
#       OR that:
yann@876
    33
#         - 'autoconf2.50' is to be found in the PATH
yann@876
    34
#
yann@673
    35
TOOLS_TO_CHECK='
yann@870
    36
/bin/bash/^GNU bash, version 3\.
yann@870
    37
make/^GNU Make
yann@876
    38
gcc/
yann@870
    39
awk/^GNU Awk
yann@876
    40
sed/
yann@876
    41
bison/
yann@876
    42
flex/
yann@876
    43
makeinfo/
yann@876
    44
automake/
yann@876
    45
libtool/
yann@876
    46
patch/
yann@876
    47
tar/
yann@876
    48
gzip/
yann@876
    49
bzip2/
yann@673
    50
'
yann@673
    51
yann@183
    52
PREFIX_DEFAULT=/usr/local
yann@182
    53
yann@182
    54
BINDIR_set=
yann@182
    55
LIBDIR_set=
yann@182
    56
DOCDIR_set=
yann@182
    57
MANDIR_set=
yann@285
    58
LOCAL_set=
yann@182
    59
yann@680
    60
FORCE=0
yann@680
    61
yann@641
    62
do_quit=
yann@614
    63
CONTRIB_list=
yann@614
    64
yann@673
    65
# Simply print the error message, and exit. Obvious, he?
yann@673
    66
do_error() {
yann@673
    67
    echo "${@}"
yann@673
    68
    exit 1
yann@673
    69
}
yann@673
    70
yann@673
    71
# A small function to test for existence of various tools
yann@876
    72
# Usage: has_or_abort test_pattern (see top of file, TOOLS_TO_CHECK, for
yann@876
    73
#                                   complete pattern format)
yann@673
    74
has_or_abort() {
yann@876
    75
    { IFS="|"; for item in ${1}; do
yann@876
    76
          tool="${item%/*}"
yann@876
    77
          regexp="${item##*/}"
yann@876
    78
          printf "Checking for '${tool}'... "
yann@876
    79
          where=$(which "${tool}" 2>/dev/null || true)
yann@876
    80
          if [ -z "${where}" ]; then
yann@876
    81
              echo "not found"
yann@876
    82
              where=
yann@876
    83
              continue
yann@876
    84
          else
yann@876
    85
              if [ -n "${regexp}" ]; then
yann@876
    86
                  str=$(${tool} --version 2>&1 |grep -E "${regexp}" |head -n 1)
yann@876
    87
                  if [ -z "${str}" ]; then
yann@876
    88
                      echo "wrong version string"
yann@876
    89
                      where=""
yann@876
    90
                      continue
yann@876
    91
                  fi
yann@876
    92
              fi
yann@876
    93
              echo "${where}"
yann@876
    94
              return 0
yann@876
    95
          fi
yann@876
    96
      done;
yann@876
    97
    }
yann@876
    98
    [ ${FORCE} -eq 0 ] && do_error "Bailing out..."
yann@673
    99
    return 0
yann@673
   100
}
yann@673
   101
yann@641
   102
# Given an option string and the following argument,
yann@641
   103
# echoes the value of the option.
yann@641
   104
# If --var=val => echoes val and returns 0, meaning second arg was not consumed
yann@641
   105
# If --var val => echoes val and returns non null, meaning second arg was used
yann@182
   106
get_optval(){
yann@182
   107
    local ret
yann@182
   108
    case "$1" in
yann@182
   109
        --*=?*)
yann@193
   110
            echo "${1}" |cut -d '=' -f 2-
yann@182
   111
            ret=0
yann@182
   112
            ;;
yann@182
   113
        *)
yann@182
   114
            echo "${2}"
yann@182
   115
            ret=1
yann@182
   116
            ;;
yann@182
   117
    esac
yann@182
   118
    return ${ret}
yann@182
   119
}
yann@182
   120
yann@641
   121
# The set_xxx functions will set the corresponding configuration variable
yann@641
   122
# They return 0 if second arg was not consumed, and non-zero if it was consumed.
yann@182
   123
set_prefix() {
yann@182
   124
    PREFIX=$(get_optval "$1" "$2")
yann@376
   125
    return $?
yann@182
   126
}
yann@182
   127
set_bindir() {
yann@376
   128
    BINDIR_set=1
yann@182
   129
    BINDIR=$(get_optval "$1" "$2")
yann@376
   130
    return $?
yann@182
   131
}
yann@182
   132
set_libdir() {
yann@376
   133
    LIBDIR_set=1
yann@182
   134
    LIBDIR=$(get_optval "$1" "$2")
yann@376
   135
    return $?
yann@182
   136
}
yann@182
   137
set_docdir() {
yann@376
   138
    DOCDIR_set=1
yann@182
   139
    DOCDIR=$(get_optval "$1" "$2")
yann@376
   140
    return $?
yann@182
   141
}
yann@182
   142
set_mandir() {
yann@376
   143
    MANDIR_set=1
yann@182
   144
    MANDIR=$(get_optval "$1" "$2")
yann@376
   145
    return $?
yann@182
   146
}
yann@182
   147
yann@641
   148
# The set_contrib function is different in that it will work like the others,
yann@641
   149
# except in two cases:
yann@641
   150
# If all => replaces all with the list of all available contribs
yann@641
   151
# If list => just echoes the list of all available contribs, and instructs
yann@641
   152
# caller to quit immediately by setting do_quit to non null.
yann@641
   153
# (can't use the return code, see above).
yann@614
   154
set_contrib() {
yann@614
   155
    opt_val=$(get_optval "$1" "$2")
yann@614
   156
    local ret=$?
yann@614
   157
    case "${opt_val}" in
yann@614
   158
        all)
yann@641
   159
            CONTRIB_list=$(LC_ALL=C ls -1 contrib/*.patch.lzma  \
yann@641
   160
                           |xargs -I {} basename {} .patch.lzma \
yann@641
   161
                           |sed -r -e ':a; /$/N; s/\n/,/; ta;'
yann@641
   162
                          )
yann@614
   163
            ;;
yann@614
   164
        list)
yann@614
   165
            do_quit=1
yann@614
   166
            echo "Available contributions:"
yann@641
   167
            LC_ALL=C ls -1 contrib/*.patch.lzma     \
yann@641
   168
            |xargs -I {} basename {} .patch.lzma    \
yann@641
   169
            |sed -r -e 's/^/  /;'
yann@614
   170
            ;;
yann@614
   171
        *)  CONTRIB_list="${CONTRIB_list},${opt_val}";;
yann@614
   172
    esac
yann@614
   173
    return $ret
yann@614
   174
}
yann@614
   175
yann@183
   176
do_help() {
yann@183
   177
    cat <<__EOF__
yann@197
   178
\`configure' configures crosstool-NG ${VERSION} to adapt to many kind of systems.
yann@183
   179
yann@183
   180
USAGE: ./configure [OPTION]...
yann@183
   181
yann@183
   182
Defaults for the options are specified in brackets.
yann@183
   183
yann@183
   184
Configuration:
yann@183
   185
  -h, --help              display this help and exit                                                                                                                  
yann@683
   186
      --force             force ./configure to complete, even if one or more
yann@683
   187
                          tools were not found. Use at your own risk, only if
yann@683
   188
                          you know what you are doing!
yann@615
   189
yann@615
   190
Installation directories:
yann@185
   191
  --prefix=PREFIX         install files in PREFIX [${PREFIX_DEFAULT}]
yann@285
   192
  --local                 don't install, and use current directory
yann@183
   193
yann@183
   194
By default, \`make install' will install all the files in
yann@183
   195
\`${PREFIX_DEFAULT}/bin', \`${PREFIX_DEFAULT}/lib' etc.  You can specify
yann@183
   196
an installation prefix other than \`${PREFIX_DEFAULT}' using \`--prefix',
yann@183
   197
for instance \`--prefix=\${HOME}'.
yann@183
   198
yann@183
   199
For better control, use the options below.
yann@183
   200
yann@183
   201
Fine tuning of the installation directories:
yann@683
   202
  --bindir=DIR            user executables [PREFIX/bin]
yann@683
   203
  --libdir=DIR            object code libraries [PREFIX/lib]
yann@683
   204
  --docdir=DIR            info documentation [PREFIX/share/doc]
yann@683
   205
  --mandir=DIR            man documentation [PREFIX/share/man]
yann@614
   206
yann@614
   207
Optional Features:
yann@683
   208
  --with-contrib=XXX      Include externally contributed features found in the
yann@683
   209
                          contrib/ sub-directory. Set to a comma-separated list
yann@683
   210
                          of features. Use 'all' to use all contributions, and
yann@683
   211
                          'list' to see which are available.
yann@183
   212
__EOF__
yann@183
   213
}
yann@183
   214
yann@376
   215
#---------------------------------------------------------------------
yann@376
   216
# Set user's options
yann@376
   217
yann@182
   218
while [ $# -ne 0 ]; do
yann@182
   219
    case "$1" in
yann@182
   220
        --prefix*)  set_prefix "$1" "$2" && shift || shift 2;;
yann@182
   221
        --bindir*)  set_bindir "$1" "$2" && shift || shift 2;;
yann@182
   222
        --libdir*)  set_libdir "$1" "$2" && shift || shift 2;;
yann@182
   223
        --docdir*)  set_docdir "$1" "$2" && shift || shift 2;;
yann@182
   224
        --mandir*)  set_mandir "$1" "$2" && shift || shift 2;;
yann@285
   225
        --local)    LOCAL_set=1; shift;;
yann@680
   226
        --force)    FORCE=1; shift;;
yann@614
   227
        --with-contrib*)
yann@614
   228
                    set_contrib "$1" "$2" && shift || shift 2
yann@614
   229
                    [ "${do_quit}" = "1" ] && exit 0
yann@614
   230
                    ;;
yann@183
   231
        --help|-h)  do_help; exit 0;;
yann@183
   232
        *)          do_help; exit 1;;
yann@182
   233
    esac
yann@182
   234
done
yann@182
   235
yann@641
   236
# Use defaults
yann@185
   237
[ -z "${PREFIX}" ] && set_prefix "" "${PREFIX_DEFAULT}"
yann@641
   238
yann@641
   239
# Special case when installing locally
yann@285
   240
if [ "${LOCAL_set}" = "1" ]; then
yann@285
   241
    set_prefix "" $(pwd)
yann@285
   242
    set_bindir "" $(pwd)
yann@285
   243
    set_libdir "" $(pwd)
yann@285
   244
    set_docdir "" $(pwd)/docs
yann@285
   245
    set_mandir "" $(pwd)/docs
yann@285
   246
fi
yann@183
   247
yann@376
   248
#---------------------------------------------------------------------
yann@376
   249
# Some sanity checks, now
yann@376
   250
yann@435
   251
# If this version is a svn snapshot, try to get the revision number
yann@435
   252
# If we can't get the revision number, use date
yann@641
   253
printf "Computing version string... "
yann@435
   254
case "${VERSION}" in
yann@435
   255
  *+svn)
yann@542
   256
    REVISION=$(LC_ALL=C svnversion)
yann@444
   257
    case "${REVISION}" in
yann@444
   258
      exported)
yann@554
   259
        VERSION="${VERSION}unknown@$(date +%Y%m%d.%H%M%S)";;
yann@444
   260
      *)
yann@542
   261
        URL=$(LC_ALL=C svn info 2>/dev/null |egrep 'URL: ' |cut -d ' ' -f 2-)
yann@542
   262
        ROOT=$(LC_ALL=C svn info 2>/dev/null |egrep 'Repository Root: ' |cut -d ' ' -f 3-)
yann@554
   263
        VERSION="${VERSION}${URL#${ROOT}}@${REVISION}"
yann@444
   264
        ;;
yann@444
   265
    esac
yann@641
   266
    # Arrange to have no / in the directory name, no need to create an
yann@641
   267
    # arbitrarily deep directory structure
yann@641
   268
    VERSION=$(echo "${VERSION}" |sed -r -e 's|/+|_|g;')
yann@435
   269
    ;;
yann@435
   270
esac
yann@553
   271
echo "${VERSION}"
yann@435
   272
yann@614
   273
# Now we have the version string, we can build up the paths
yann@554
   274
[ -z "${BINDIR_set}" ] && BINDIR="${PREFIX}/bin"
yann@554
   275
[ -z "${LIBDIR_set}" ] && LIBDIR="${PREFIX}/lib/ct-ng-${VERSION}"
yann@554
   276
[ -z "${DOCDIR_set}" ] && DOCDIR="${PREFIX}/share/doc/ct-ng-${VERSION}"
yann@554
   277
[ -z "${MANDIR_set}" ] && MANDIR="${PREFIX}/share/man/man1"
yann@554
   278
yann@673
   279
# Check the existence of absolutely required tools
yann@870
   280
{ IFS='
yann@870
   281
';
yann@870
   282
  for tool in ${TOOLS_TO_CHECK}; do
yann@870
   283
      has_or_abort "${tool}"
yann@870
   284
  done;
yann@870
   285
}
yann@673
   286
yann@641
   287
# It's safer to change all ',' to spaces rather than setting IFS
yann@641
   288
CONTRIB_list=$(echo "${CONTRIB_list}" |sed -r -e 's/,+/ /g;')
yann@673
   289
if [ -n "${CONTRIB_list}" ]; then
yann@673
   290
    has_or_abort lzcat
yann@673
   291
    printf "Applying contributed code: "
yann@673
   292
    for c in ${CONTRIB_list}; do
yann@673
   293
        printf "${c}, "
yann@673
   294
        if [ ! -f "contrib/${c}.patch.lzma" ]; then
yann@673
   295
            do_error "Contribution '${c}' does not exist"
yann@673
   296
        fi
yann@673
   297
        lzcat "contrib/${c}.patch.lzma" |patch -p1 >/dev/null 2>&1
yann@673
   298
    done
yann@673
   299
    echo "done"
yann@673
   300
fi
yann@614
   301
yann@641
   302
printf "Building up Makefile... "
yann@182
   303
sed -r -e "s,@@BINDIR@@,${BINDIR},g;"   \
yann@182
   304
       -e "s,@@LIBDIR@@,${LIBDIR},g;"   \
yann@182
   305
       -e "s,@@DOCDIR@@,${DOCDIR},g;"   \
yann@182
   306
       -e "s,@@MANDIR@@,${MANDIR},g;"   \
yann@182
   307
       -e "s,@@VERSION@@,${VERSION},g;" \
yann@182
   308
       -e "s,@@DATE@@,${DATE},g;"       \
yann@285
   309
       -e "s,@@LOCAL@@,${LOCAL_set},g;" \
yann@185
   310
       Makefile.in >Makefile
yann@673
   311
echo "done"
yann@185
   312
yann@185
   313
cat <<__EOF__
yann@673
   314
yann@197
   315
crosstool-NG configured as follows:
yann@554
   316
  PREFIX='${PREFIX}'
yann@554
   317
  BINDIR='${BINDIR}'
yann@554
   318
  LIBDIR='${LIBDIR}'
yann@554
   319
  DOCDIR='${DOCDIR}'
yann@554
   320
  MANDIR='${MANDIR}'
yann@641
   321
  CONTRIB='${CONTRIB_list}'
yann@185
   322
__EOF__