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@1623: # It is expected that this script is only to be run from the yann@1623: # source directory of crosstool-NG, so it is trivial to find yann@1623: # paths.mk (we can't use ". paths.mk", as POSIX states that yann@1623: # $PATH should be searched for, and $PATH most probably doe yann@1623: # not include "."), hence the "./". yann@1623: . "./paths.mk" yann@1174: yann@1: doHelp() { yann@1: cat <<-EOF yann@1722: Usage: ${myname} <--tool> <[options] version [...]> ... yann@1722: 'tool' in one of: yann@1723: gcc, binutils, glibc, eglibc, uClibc, newlib, linux, gdb, dmalloc, yann@1723: duma, strace, ltrace, libelf, gmp, mpfr, ppl, cloog, mpc yann@1722: yann@1722: Valid options for all tools: yann@1722: --stable, -s, +x (default) yann@1722: mark the version as being stable (as opposed to experimental, below) yann@1722: yann@1722: --experimental, -x, +s yann@1722: mark the version as being experimental (as opposed to stable, above) yann@1722: yann@1722: --current, -c, +o (default) yann@1722: mark the version as being cuurent (as opposed to obsolete, below) yann@1722: yann@1722: --obsolete, -o, +c yann@1722: mark the version as being obsolete (as opposed to current, above) yann@1722: yann@1722: Note: setting a new tool resets to the defaults: 'stable' and 'current'. yann@1722: yann@1722: 'version' is a valid version for the specified tool. yann@1722: yann@1722: Examples: yann@1722: add stable current version 2.6.19.2 to linux kernel: yann@1722: ${myname} --linux 2.6.19.2 yann@1722: yann@1722: add experimental obsolete version 2.3.5 and stable current versions 2.6.1 yann@1722: and 2.6.2 to glibc, add stable obsolete version 3.3.3 to gcc: yann@1722: ${myname} --glibc -x -o 2.3.5 -s -c 2.6.1 2.6.2 --gcc -o 3.3.3 yann@1722: 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@1734: local deps v ver_M ver_m ver_p 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@1692: case "${tool}" in yann@1692: gcc) yann@1692: # Extract 'M'ajor and 'm'inor from version string yann@1692: ver_M=$(echo "${version}...." |cut -d . -f 1) yann@1692: ver_m=$(echo "${version}...." |cut -d . -f 2) yann@1692: if [ ${ver_M} -gt 4 \ yann@1692: -o \( ${ver_M} -eq 4 -a ${ver_m} -ge 3 \) ]; then yann@1692: SedExpr1="${SedExpr1}\n select CC_GCC_4_3_or_later" yann@1692: fi yann@1692: if [ ${ver_M} -gt 4 \ yann@1692: -o \( ${ver_M} -eq 4 -a ${ver_m} -ge 4 \) ]; then yann@1692: SedExpr1="${SedExpr1}\n select CC_GCC_4_4_or_later" yann@1692: fi yann@1692: ;; yann@1734: uClibc) yann@1734: # uClibc-0.9.30 and above need some love yann@1734: ver_M=$(echo "${version}...." |cut -d . -f 1) yann@1734: ver_m=$(echo "${version}...." |cut -d . -f 2) yann@1734: ver_p=$(echo "${version}...." |cut -d . -f 3) yann@1734: if [ ${ver_M} -ge 1 \ yann@1734: -o ${ver_M} -eq 0 -a ${ver_m} -ge 10 \ yann@1734: -o ${ver_M} -eq 0 -a ${ver_m} -eq 9 -a ${ver_p} -ge 30 ]; then yann@1734: SedExpr1="${SedExpr1}\n select LIBC_UCLIBC_0_9_30_or_later" yann@1734: fi yann@1734: ;; yann@1692: esac yann@1721: SedExpr2=" default \"${version}\" if ${config_ver_option}" 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@1722: --gcc) EXP=; OBS=; cat=CC; tool=gcc; tool_prefix=cc;; yann@1722: --binutils) EXP=; OBS=; cat=BINUTILS; tool=binutils; tool_prefix=binutils;; yann@1722: --glibc) EXP=; OBS=; cat=LIBC_GLIBC; tool=glibc; tool_prefix=libc;; yann@1722: --eglibc) EXP=; OBS=; cat=LIBC_EGLIBC; tool=eglibc; tool_prefix=libc;; yann@1722: --uClibc) EXP=; OBS=; cat=LIBC_UCLIBC; tool=uClibc; tool_prefix=libc;; yann@1723: --newlib) EXP=; OBS=; cat=LIBC_NEWLIB; tool=newlib; tool_prefix=libc;; yann@1722: --linux) EXP=; OBS=; cat=KERNEL; tool=linux; tool_prefix=kernel;; yann@1722: --gdb) EXP=; OBS=; cat=GDB; tool=gdb; tool_prefix=debug;; yann@1722: --dmalloc) EXP=; OBS=; cat=DMALLOC; tool=dmalloc; tool_prefix=debug;; yann@1722: --duma) EXP=; OBS=; cat=DUMA; tool=duma; tool_prefix=debug;; yann@1722: --strace) EXP=; OBS=; cat=STRACE; tool=strace; tool_prefix=debug;; yann@1722: --ltrace) EXP=; OBS=; cat=LTRACE; tool=ltrace; tool_prefix=debug;; yann@1722: --libelf) EXP=; OBS=; cat=LIBELF; tool=libelf; tool_prefix=tools;; yann@1722: --gmp) EXP=; OBS=; cat=GMP; tool=gmp; tool_prefix=companion_libs;; yann@1722: --mpfr) EXP=; OBS=; cat=MPFR; tool=mpfr; tool_prefix=companion_libs;; yann@1722: --ppl) EXP=; OBS=; cat=PPL; tool=ppl; tool_prefix=companion_libs;; yann@1722: --cloog) EXP=; OBS=; cat=CLOOG; tool=cloog; tool_prefix=companion_libs;; yann@1722: --mpc) EXP=; OBS=; cat=MPC; tool=mpc; 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