scripts/addToolVersion.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Thu Apr 28 00:13:41 2011 +0200 (2011-04-28)
changeset 2412 20edcd78cf67
parent 1920 6df2d4f78948
child 2441 4cd9cda2265c
permissions -rwxr-xr-x
scripts/addToolsVersion: versions can be either in the .in or the .in.2

The components have their version selection handled either in the .in
file or the .in.2 file. Handle both cases.

Also, when dumping an existing version, keep the user's grep options
(ie. do override neither options nor colors).

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