yann@1173: #!/bin/sh yann@1174: set -e yann@1: yann@1: # Adds a new version to one of the toolchain component yann@1: myname="$0" yann@1: yann@1174: # Parse the tools' paths configuration yann@1174: . "paths.mk" yann@1174: yann@1: doHelp() { yann@1: cat <<-EOF yann@1173: Usage: ${myname} <[options] version [...]> ... yann@1: 'tool' in one of: yann@858: --gcc, --binutils, --glibc, --eglibc, --uClibc, --linux, yann@245: --gdb, --dmalloc, --duma, --strace, --ltrace, --libelf yann@1380: --gmp, --mpfr, --ppl, --cloog yann@1: yann@96: Valid options for all tools: yann@1173: --stable, -s, +x (default) yann@1225: mark the version as being stable (as opposed to experimental, below) yann@43: yann@1173: --experimental, -x, +s yann@1225: mark the version as being experimental (as opposed to stable, above) yann@1173: yann@1173: --current, -c, +o (default) yann@1225: mark the version as being cuurent (as opposed to obsolete, below) yann@1173: yann@1173: --obsolete, -o, +c yann@1225: mark the version as being obsolete (as opposed to current, above) yann@1173: yann@1173: Note: setting a new tool resets to the defaults: 'stable' and 'current'. yann@96: yann@1: 'version' is a valid version for the specified tool. yann@1: yann@1: Examples: yann@1173: add stable current version 2.6.19.2 to linux kernel: yann@858: ${myname} --linux 2.6.19.2 yann@1: yann@1173: add experimental obsolete version 2.3.5 and stable current versions 2.6.1 yann@1173: and 2.6.2 to glibc, add stable obsolete version 3.3.3 to gcc: yann@1173: ${myname} --glibc -x -o 2.3.5 -s -c 2.6.1 2.6.2 --gcc -o 3.3.3 yann@1: EOF yann@1: } yann@1: yann@1173: # Effectively add a version to the specified tool yann@1173: # $cat : tool category yann@1173: # $tool : tool name yann@1173: # $tool_prefix : tool directory prefix yann@1173: # $EXP : set to non empty if experimental, to empty otherwise yann@1173: # #OBS : set to non empty if obsolete, to empty otherwise yann@1173: # $1 : version string to add yann@1173: addToolVersion() { yann@1173: local version="$1" yann@1173: local file yann@1200: local config_ver_option yann@1173: local exp_obs_prompt yann@1173: local deps v ver_M ver_m yann@1173: local SedExpr1 SedExpr2 yann@1173: yann@1173: file="config/${tool_prefix}/${tool}.in" yann@1174: v=$(echo "${version}" |"${sed}" -r -e 's/-/_/g; s/\./_/g;') yann@1173: yann@1200: config_ver_option="${cat}_V_${v}" yann@1200: yann@1200: # Check for existing version: it can be legitimitate for an end-user yann@1200: # to try adding a new version if the one he/she wants is not listed. yann@1200: # But it can be the case where the version is hidden behind either one yann@1200: # of EXPERIMENTAL or OBSOLETE, so warn if the version is already listed. yann@1200: if (GREP_OPTIONS= grep -E "^config ${config_ver_option}$" "${file}" >/dev/null 2>&1); then yann@1200: echo "'${tool}': version '${version}' already present:" yann@1200: GREP_OPTIONS= grep -A3 -B0 -E "^config ${config_ver_option}$" "${file}" yann@1200: return 0 yann@1200: fi yann@1200: yann@1200: SedExpr1="${SedExpr1}config ${config_ver_option}\n" yann@1173: SedExpr1="${SedExpr1} bool\n" yann@1173: SedExpr1="${SedExpr1} prompt \"${version}" yann@1173: case "${EXP},${OBS}" in yann@1173: ,) ;; yann@1536: ,*) exp_obs_prompt=" (OBSOLETE)" yann@1535: deps=" depends on OBSOLETE" yann@1173: ;; yann@1536: *,) exp_obs_prompt=" (EXPERIMENTAL)" yann@1535: deps=" depends on EXPERIMENTAL" yann@1173: ;; yann@1536: *) exp_obs_prompt=" (EXPERIMENTAL, OBSOLETE)" yann@1535: deps=" depends on EXPERIMENTAL \\&\\& OBSOLETE" yann@1173: ;; yann@1173: esac yann@1173: [ -n "${exp_obs_prompt}" ] && SedExpr1="${SedExpr1}${exp_obs_prompt}" yann@1535: SedExpr1="${SedExpr1}\"" yann@1535: [ -n "${deps}" ] && SedExpr1="${SedExpr1}\n${deps}" yann@1173: if [ "${tool}" = "gcc" ]; then yann@1173: # Extract 'M'ajor and 'm'inor from version string yann@1173: ver_M=$(echo "${version}...." |cut -d . -f 1) yann@1173: ver_m=$(echo "${version}...." |cut -d . -f 2) yann@1173: if [ ${ver_M} -gt 4 \ yann@1173: -o \( ${ver_M} -eq 4 -a ${ver_m} -ge 3 \) ]; then yann@1535: SedExpr1="${SedExpr1}\n select CC_GCC_4_3_or_later" yann@1441: fi yann@1441: if [ ${ver_M} -gt 4 \ yann@1441: -o \( ${ver_M} -eq 4 -a ${ver_m} -ge 4 \) ]; then yann@1535: SedExpr1="${SedExpr1}\n select CC_GCC_4_4_or_later" yann@1173: fi yann@1173: fi yann@1173: SedExpr2=" default \"${version}\" if ${cat}_V_${v}" yann@1542: "${sed}" -r -i -e 's/^(# CT_INSERT_VERSION_BELOW)$/\1\n\n'"${SedExpr1}"'/;' "${file}" yann@1535: "${sed}" -r -i -e 's/^(# CT_INSERT_VERSION_STRING_BELOW)$/\1\n'"${SedExpr2}"'/;' "${file}" yann@1173: } yann@1173: yann@96: cat= yann@1: tool= yann@1: tool_prefix= yann@1: VERSION= yann@43: EXP= yann@96: OBS= yann@1: yann@1173: if [ $# -eq 0 ]; then yann@1173: doHelp yann@1173: exit 1 yann@1173: fi yann@1173: yann@1173: while [ $# -gt 0 ]; do yann@1173: case "$1" in yann@96: # Tools: yann@1173: --gcc) EXP=; OBS=; cat=CC; tool=gcc; tool_prefix=cc;; yann@1607: --binutils) EXP=; OBS=; cat=BINUTILS; tool=binutils; tool_prefix=binutils;; yann@1173: --glibc) EXP=; OBS=; cat=LIBC; tool=glibc; tool_prefix=libc;; yann@1173: --eglibc) EXP=; OBS=; cat=LIBC; tool=eglibc; tool_prefix=libc;; yann@1173: --uClibc) EXP=; OBS=; cat=LIBC; tool=uClibc; tool_prefix=libc;; yann@1173: --linux) EXP=; OBS=; cat=KERNEL; tool=linux; tool_prefix=kernel;; yann@1173: --gdb) EXP=; OBS=; cat=GDB; tool=gdb; tool_prefix=debug;; yann@1173: --dmalloc) EXP=; OBS=; cat=DMALLOC; tool=dmalloc; tool_prefix=debug;; yann@1173: --duma) EXP=; OBS=; cat=DUMA; tool=duma; tool_prefix=debug;; yann@1173: --strace) EXP=; OBS=; cat=STRACE; tool=strace; tool_prefix=debug;; yann@1173: --ltrace) EXP=; OBS=; cat=LTRACE; tool=ltrace; tool_prefix=debug;; yann@1173: --libelf) EXP=; OBS=; cat=LIBELF; tool=libelf; tool_prefix=tools;; yann@1318: --gmp) EXP=; OBS=; cat=GMP; tool=gmp; tool_prefix=companion_libs;; yann@1318: --mpfr) EXP=; OBS=; cat=MPFR; tool=mpfr; tool_prefix=companion_libs;; yann@1324: --ppl) EXP=; OBS=; cat=PPL; tool=ppl; tool_prefix=companion_libs;; yann@1380: --cloog) EXP=; OBS=; cat=CLOOG; tool=cloog; tool_prefix=companion_libs;; yann@1173: yann@96: # Tools options: yann@1173: -x|--experimental|+s) EXP=1;; yann@1173: -s|--stable|+x) EXP=;; yann@1173: -o|--obsolete|+c) OBS=1;; yann@1173: -c|--current|+o) OBS=;; yann@1173: yann@96: # Misc: yann@1173: -h|--help) doHelp; exit 0;; yann@1173: -*) echo "Unknown option: '$1' (use -h/--help for help)."; exit 1;; yann@1173: yann@1173: # Version string: yann@1173: *) [ -n "${tool}" ] || { doHelp; exit 1; } yann@1173: addToolVersion "$1" yann@1173: ;; yann@1: esac yann@1173: shift yann@1: done