configure
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Sep 28 21:35:44 2008 +0000 (2008-09-28)
changeset 885 4653d6002d37
parent 870 76a65d37807f
child 886 defdd986c14d
permissions -rwxr-xr-x
Had a new known issue: ccache will break the build because we're sym-linking to have our own compiler for host and build systems, but that screws up ccache finding the real compiler.
There is no fix, so the only way to inform the users is to document it: remove ccache.

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