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: benoit@2485: # Extract field $3 from version $1 with separator $2 benoit@2485: getVersionField() { benoit@2485: local version="$1" benoit@2485: local sep="$2" benoit@2485: local field="$3" benoit@2485: benoit@2485: echo "${version}${sep}${sep}${sep}${sep}" |cut -d ${sep} -f ${field} benoit@2485: } benoit@2485: 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@2412: local file="$2" 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@2412: [ -f "${file}" ] || return 0 yann@2412: 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@2412: if grep -E "^config ${config_ver_option}$" "${file}" >/dev/null 2>&1; then yann@1200: echo "'${tool}': version '${version}' already present:" yann@2412: grep -A1 -B0 -n \ yann@2412: -E "^(config ${config_ver_option}| {4}prompt \"${version}\")$" \ yann@2412: "${file}" /dev/null 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 benoit@2485: ver_M=$(getVersionField "${version}" . 1) benoit@2485: ver_m=$(getVersionField "${version}" . 2) yann@2441: if [ \( ${ver_M} -eq 4 -a ${ver_m} -eq 6 \) ]; then yann@2441: SedExpr1="${SedExpr1}\n select CC_GCC_4_6" yann@2441: elif [ \( ${ver_M} -eq 4 -a ${ver_m} -eq 5 \) ]; then yann@2441: SedExpr1="${SedExpr1}\n select CC_GCC_4_5" yann@2441: elif [ \( ${ver_M} -eq 4 -a ${ver_m} -eq 4 \) ]; then yann@2441: SedExpr1="${SedExpr1}\n select CC_GCC_4_4" yann@2441: elif [ \( ${ver_M} -eq 4 -a ${ver_m} -eq 3 \) ]; then yann@2441: SedExpr1="${SedExpr1}\n select CC_GCC_4_3" yann@2441: elif [ \( ${ver_M} -eq 4 -a ${ver_m} -eq 2 \) ]; then yann@2441: SedExpr1="${SedExpr1}\n select CC_GCC_4_2" yann@1692: fi yann@1692: ;; benoit@2488: binutils) benoit@2488: # Extract 'M'ajor and 'm'inor from version string benoit@2488: ver_M=$(getVersionField "${version}" . 1) benoit@2488: ver_m=$(getVersionField "${version}" . 2) benoit@2488: if [ \( ${ver_M} -eq 2 -a ${ver_m} -eq 21 \) ]; then benoit@2488: SedExpr1="${SedExpr1}\n select BINUTILS_2_21_or_later" benoit@2488: elif [ \( ${ver_M} -eq 2 -a ${ver_m} -eq 20 \) ]; then benoit@2488: SedExpr1="${SedExpr1}\n select BINUTILS_2_20_or_later" benoit@2488: elif [ \( ${ver_M} -eq 2 -a ${ver_m} -eq 19 \) ]; then benoit@2488: SedExpr1="${SedExpr1}\n select BINUTILS_2_19_or_later" benoit@2488: elif [ \( ${ver_M} -eq 2 -a ${ver_m} -eq 18 \) ]; then benoit@2488: SedExpr1="${SedExpr1}\n select BINUTILS_2_18_or_later" benoit@2488: fi benoit@2488: ;; benoit@2489: eglibc) benoit@2489: # Extract 'M'ajor and 'm'inor from version string benoit@2489: ver_M=$(getVersionField "${version}" . 1) benoit@2489: ver_m=$(getVersionField "${version}" . 2) benoit@2489: if [ \( ${ver_M} -eq 2 -a ${ver_m} -eq 13 \) ]; then benoit@2489: SedExpr1="${SedExpr1}\n select LIBC_EGLIBC_2_13_or_later" benoit@2489: elif [ \( ${ver_M} -eq 2 -a ${ver_m} -eq 12 \) ]; then benoit@2489: SedExpr1="${SedExpr1}\n select LIBC_EGLIBC_2_12_or_later" benoit@2489: elif [ \( ${ver_M} -eq 2 -a ${ver_m} -eq 11 \) ]; then benoit@2489: SedExpr1="${SedExpr1}\n select LIBC_EGLIBC_2_11_or_later" benoit@2489: elif [ \( ${ver_M} -eq 2 -a ${ver_m} -eq 10 \) ]; then benoit@2489: SedExpr1="${SedExpr1}\n select LIBC_EGLIBC_2_10_or_later" benoit@2489: elif [ \( ${ver_M} -eq 2 -a ${ver_m} -eq 9 \) ]; then benoit@2489: SedExpr1="${SedExpr1}\n select LIBC_EGLIBC_2_9_or_later" benoit@2489: fi benoit@2489: ;; yann@1734: uClibc) yann@1734: # uClibc-0.9.30 and above need some love benoit@2485: ver_M=$(getVersionField "${version}" . 1) benoit@2485: ver_m=$(getVersionField "${version}" . 2) benoit@2485: ver_p=$(getVersionField "${version}" . 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@1852: gdb) yann@1852: # gdb-7.0 and above have special handling benoit@2485: ver_M=$(getVersionField "${version}" . 1) yann@1852: if [ ${ver_M} -ge 7 ]; then yann@1852: SedExpr1="${SedExpr1}\n select GDB_7_0_or_later" yann@1852: fi yann@1852: ;; 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: --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@1872: --libelf) EXP=; OBS=; cat=LIBELF; tool=libelf; 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@2412: file_base="config/${tool_prefix}/${tool}.in" yann@2412: # Components have their version selection either yann@2412: # in the .in or the .in.2 file. Handle both. yann@2412: addToolVersion "$1" "${file_base}" yann@2412: addToolVersion "$1" "${file_base}.2" yann@1173: ;; yann@1: esac yann@1173: shift yann@1: done