scripts/addToolVersion.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Mon Mar 29 00:15:32 2010 +0200 (2010-03-29)
changeset 1864 758d5137fe87
parent 1805 ca5e7981fc24
child 1872 d7787259005e
permissions -rwxr-xr-x
scripts/populate: optimise search loop

Curently, populate will iterate over all ELF (shared objects|executables)
to look for missing NEEDED DSOs, adding to the list at every iterations
of the search loop.

Instead of looking again at previously handled ELF files, recursively
resolve every ELf files.

Also, in case there are a whole lot of files (more than the shell can
accept as arguments list, or creating a command line longer than the
shell can cope with), use a temporary file with the list of files
to search for missing dependencies.
yann@1173
     1
#!/bin/sh
yann@1174
     2
set -e
yann@1
     3
yann@1
     4
# Adds a new version to one of the toolchain component
yann@1
     5
myname="$0"
yann@1
     6
yann@1174
     7
# Parse the tools' paths configuration
yann@1623
     8
# It is expected that this script is only to be run from the
yann@1623
     9
# source directory of crosstool-NG, so it is trivial to find
yann@1623
    10
# paths.mk (we can't use  ". paths.mk", as POSIX states that
yann@1623
    11
# $PATH should be searched for, and $PATH most probably doe
yann@1623
    12
# not include "."), hence the "./".
yann@1623
    13
. "./paths.mk"
yann@1174
    14
yann@1
    15
doHelp() {
yann@1
    16
    cat <<-EOF
yann@1722
    17
		Usage: ${myname} <--tool> <[options] version [...]> ...
yann@1722
    18
		  'tool' in one of:
yann@1723
    19
		    gcc, binutils, glibc, eglibc, uClibc, newlib, linux, gdb, dmalloc,
yann@1723
    20
		    duma, strace, ltrace, libelf, gmp, mpfr, ppl, cloog, mpc
yann@1722
    21
		
yann@1722
    22
		  Valid options for all tools:
yann@1722
    23
		    --stable, -s, +x   (default)
yann@1722
    24
		      mark the version as being stable (as opposed to experimental, below)
yann@1722
    25
		
yann@1722
    26
		    --experimental, -x, +s
yann@1722
    27
		      mark the version as being experimental (as opposed to stable, above)
yann@1722
    28
		
yann@1722
    29
		    --current, -c, +o   (default)
yann@1722
    30
		      mark the version as being cuurent (as opposed to obsolete, below)
yann@1722
    31
		
yann@1722
    32
		    --obsolete, -o, +c
yann@1722
    33
		      mark the version as being obsolete (as opposed to current, above)
yann@1722
    34
		
yann@1722
    35
		  Note: setting a new tool resets to the defaults: 'stable' and 'current'.
yann@1722
    36
		
yann@1722
    37
		  'version' is a valid version for the specified tool.
yann@1722
    38
		
yann@1722
    39
		  Examples:
yann@1722
    40
		    add stable current version 2.6.19.2 to linux kernel:
yann@1722
    41
		      ${myname} --linux 2.6.19.2
yann@1722
    42
		
yann@1722
    43
		    add experimental obsolete version 2.3.5 and stable current versions 2.6.1
yann@1722
    44
		    and 2.6.2 to glibc, add stable obsolete version 3.3.3 to gcc:
yann@1722
    45
		      ${myname} --glibc -x -o 2.3.5 -s -c 2.6.1 2.6.2 --gcc -o 3.3.3
yann@1722
    46
		EOF
yann@1
    47
}
yann@1
    48
yann@1173
    49
# Effectively add a version to the specified tool
yann@1173
    50
# $cat          : tool category
yann@1173
    51
# $tool         : tool name
yann@1173
    52
# $tool_prefix  : tool directory prefix
yann@1173
    53
# $EXP          : set to non empty if experimental, to empty otherwise
yann@1173
    54
# #OBS          : set to non empty if obsolete, to empty otherwise
yann@1173
    55
# $1            : version string to add
yann@1173
    56
addToolVersion() {
yann@1173
    57
    local version="$1"
yann@1173
    58
    local file
yann@1200
    59
    local config_ver_option
yann@1173
    60
    local exp_obs_prompt
yann@1734
    61
    local deps v ver_M ver_m ver_p
yann@1173
    62
    local SedExpr1 SedExpr2
yann@1173
    63
yann@1173
    64
    file="config/${tool_prefix}/${tool}.in"
yann@1174
    65
    v=$(echo "${version}" |"${sed}" -r -e 's/-/_/g; s/\./_/g;')
yann@1173
    66
yann@1200
    67
    config_ver_option="${cat}_V_${v}"
yann@1200
    68
yann@1200
    69
    # Check for existing version: it can be legitimitate for an end-user
yann@1200
    70
    # to try adding a new version if the one he/she wants is not listed.
yann@1200
    71
    # But it can be the case where the version is hidden behind either one
yann@1200
    72
    # of EXPERIMENTAL or OBSOLETE, so warn if the version is already listed.
yann@1200
    73
    if (GREP_OPTIONS= grep -E "^config ${config_ver_option}$" "${file}" >/dev/null 2>&1); then
yann@1200
    74
        echo "'${tool}': version '${version}' already present:"
yann@1200
    75
        GREP_OPTIONS= grep -A3 -B0 -E "^config ${config_ver_option}$" "${file}"
yann@1200
    76
        return 0
yann@1200
    77
    fi
yann@1200
    78
yann@1200
    79
    SedExpr1="${SedExpr1}config ${config_ver_option}\n"
yann@1173
    80
    SedExpr1="${SedExpr1}    bool\n"
yann@1173
    81
    SedExpr1="${SedExpr1}    prompt \"${version}"
yann@1173
    82
    case "${EXP},${OBS}" in
yann@1173
    83
        ,)  ;;
yann@1536
    84
        ,*) exp_obs_prompt=" (OBSOLETE)"
yann@1535
    85
            deps="    depends on OBSOLETE"
yann@1173
    86
            ;;
yann@1536
    87
        *,) exp_obs_prompt=" (EXPERIMENTAL)"
yann@1535
    88
            deps="    depends on EXPERIMENTAL"
yann@1173
    89
            ;;
yann@1536
    90
        *)  exp_obs_prompt=" (EXPERIMENTAL, OBSOLETE)"
yann@1535
    91
            deps="    depends on EXPERIMENTAL \\&\\& OBSOLETE"
yann@1173
    92
            ;;
yann@1173
    93
    esac
yann@1173
    94
    [ -n "${exp_obs_prompt}" ] && SedExpr1="${SedExpr1}${exp_obs_prompt}"
yann@1535
    95
    SedExpr1="${SedExpr1}\""
yann@1535
    96
    [ -n "${deps}" ] && SedExpr1="${SedExpr1}\n${deps}"
yann@1692
    97
    case "${tool}" in
yann@1692
    98
        gcc)
yann@1692
    99
            # Extract 'M'ajor and 'm'inor from version string
yann@1692
   100
            ver_M=$(echo "${version}...." |cut -d . -f 1)
yann@1692
   101
            ver_m=$(echo "${version}...." |cut -d . -f 2)
yann@1692
   102
            if [    ${ver_M} -gt 4                          \
yann@1692
   103
                 -o \( ${ver_M} -eq 4 -a ${ver_m} -ge 4 \)  ]; then
yann@1692
   104
                SedExpr1="${SedExpr1}\n    select CC_GCC_4_4_or_later"
yann@1805
   105
            elif [    ${ver_M} -gt 4                          \
yann@1805
   106
                   -o \( ${ver_M} -eq 4 -a ${ver_m} -ge 3 \)  ]; then
yann@1805
   107
                SedExpr1="${SedExpr1}\n    select CC_GCC_4_3_or_later"
yann@1692
   108
            fi
yann@1692
   109
            ;;
yann@1734
   110
        uClibc)
yann@1734
   111
            # uClibc-0.9.30 and above need some love
yann@1734
   112
            ver_M=$(echo "${version}...." |cut -d . -f 1)
yann@1734
   113
            ver_m=$(echo "${version}...." |cut -d . -f 2)
yann@1734
   114
            ver_p=$(echo "${version}...." |cut -d . -f 3)
yann@1734
   115
            if [    ${ver_M} -ge 1                                      \
yann@1734
   116
                 -o ${ver_M} -eq 0 -a ${ver_m} -ge 10                   \
yann@1734
   117
                 -o ${ver_M} -eq 0 -a ${ver_m} -eq 9 -a ${ver_p} -ge 30 ]; then
yann@1734
   118
                SedExpr1="${SedExpr1}\n    select LIBC_UCLIBC_0_9_30_or_later"
yann@1734
   119
            fi
yann@1734
   120
            ;;
yann@1852
   121
        gdb)
yann@1852
   122
            # gdb-7.0 and above have special handling
yann@1852
   123
            ver_M=$(echo "${version}...." |cut -d . -f 1)
yann@1852
   124
            if [ ${ver_M} -ge 7 ]; then
yann@1852
   125
                SedExpr1="${SedExpr1}\n    select GDB_7_0_or_later"
yann@1852
   126
            fi
yann@1852
   127
            ;;
yann@1692
   128
    esac
yann@1721
   129
    SedExpr2="    default \"${version}\" if ${config_ver_option}"
yann@1542
   130
    "${sed}" -r -i -e 's/^(# CT_INSERT_VERSION_BELOW)$/\1\n\n'"${SedExpr1}"'/;' "${file}"
yann@1535
   131
    "${sed}" -r -i -e 's/^(# CT_INSERT_VERSION_STRING_BELOW)$/\1\n'"${SedExpr2}"'/;' "${file}"
yann@1173
   132
}
yann@1173
   133
yann@96
   134
cat=
yann@1
   135
tool=
yann@1
   136
tool_prefix=
yann@1
   137
VERSION=
yann@43
   138
EXP=
yann@96
   139
OBS=
yann@1
   140
yann@1173
   141
if [ $# -eq 0 ]; then
yann@1173
   142
    doHelp
yann@1173
   143
    exit 1
yann@1173
   144
fi
yann@1173
   145
yann@1173
   146
while [ $# -gt 0 ]; do
yann@1173
   147
    case "$1" in
yann@96
   148
        # Tools:
yann@1722
   149
        --gcc)      EXP=; OBS=; cat=CC;             tool=gcc;       tool_prefix=cc;;
yann@1722
   150
        --binutils) EXP=; OBS=; cat=BINUTILS;       tool=binutils;  tool_prefix=binutils;;
yann@1722
   151
        --glibc)    EXP=; OBS=; cat=LIBC_GLIBC;     tool=glibc;     tool_prefix=libc;;
yann@1722
   152
        --eglibc)   EXP=; OBS=; cat=LIBC_EGLIBC;    tool=eglibc;    tool_prefix=libc;;
yann@1722
   153
        --uClibc)   EXP=; OBS=; cat=LIBC_UCLIBC;    tool=uClibc;    tool_prefix=libc;;
yann@1723
   154
        --newlib)   EXP=; OBS=; cat=LIBC_NEWLIB;    tool=newlib;    tool_prefix=libc;;
yann@1722
   155
        --linux)    EXP=; OBS=; cat=KERNEL;         tool=linux;     tool_prefix=kernel;;
yann@1722
   156
        --gdb)      EXP=; OBS=; cat=GDB;            tool=gdb;       tool_prefix=debug;;
yann@1722
   157
        --dmalloc)  EXP=; OBS=; cat=DMALLOC;        tool=dmalloc;   tool_prefix=debug;;
yann@1722
   158
        --duma)     EXP=; OBS=; cat=DUMA;           tool=duma;      tool_prefix=debug;;
yann@1722
   159
        --strace)   EXP=; OBS=; cat=STRACE;         tool=strace;    tool_prefix=debug;;
yann@1722
   160
        --ltrace)   EXP=; OBS=; cat=LTRACE;         tool=ltrace;    tool_prefix=debug;;
yann@1722
   161
        --libelf)   EXP=; OBS=; cat=LIBELF;         tool=libelf;    tool_prefix=tools;;
yann@1722
   162
        --gmp)      EXP=; OBS=; cat=GMP;            tool=gmp;       tool_prefix=companion_libs;;
yann@1722
   163
        --mpfr)     EXP=; OBS=; cat=MPFR;           tool=mpfr;      tool_prefix=companion_libs;;
yann@1722
   164
        --ppl)      EXP=; OBS=; cat=PPL;            tool=ppl;       tool_prefix=companion_libs;;
yann@1722
   165
        --cloog)    EXP=; OBS=; cat=CLOOG;          tool=cloog;     tool_prefix=companion_libs;;
yann@1722
   166
        --mpc)      EXP=; OBS=; cat=MPC;            tool=mpc;       tool_prefix=companion_libs;;
yann@1173
   167
yann@96
   168
        # Tools options:
yann@1173
   169
        -x|--experimental|+s)   EXP=1;;
yann@1173
   170
        -s|--stable|+x)         EXP=;;
yann@1173
   171
        -o|--obsolete|+c)       OBS=1;;
yann@1173
   172
        -c|--current|+o)        OBS=;;
yann@1173
   173
yann@96
   174
        # Misc:
yann@1173
   175
        -h|--help)  doHelp; exit 0;;
yann@1173
   176
        -*)         echo "Unknown option: '$1' (use -h/--help for help)."; exit 1;;
yann@1173
   177
yann@1173
   178
        # Version string:
yann@1173
   179
        *)  [ -n "${tool}" ] || { doHelp; exit 1; }
yann@1173
   180
            addToolVersion "$1"
yann@1173
   181
            ;;
yann@1
   182
    esac
yann@1173
   183
    shift
yann@1
   184
done