print_toolchain_versions.sh 2.07 KB
#!/bin/sh

gcc_version() {
    local cc
    if [ -z "$1" ]; then
        cc=gcc
    else
        cc=$1-gcc
    fi
    local ver=
    if command -v "$cc" 2>&1 >/dev/null; then
        ver=$("$cc" --version | head -n 1)
    fi
    if [ -z "$ver" ]; then
        ver=missing/error
    fi
    printf "%s" "$ver"
}

get_define() {
    local cc="$1"
    local line=
    if command -v "$cc" 2>&1 >/dev/null; then
        line=$(echo "$3" | "$cc" -x c -include "$2" -E -o - - 2>&1 | sed -e '/^[   ]*#/d' -e '/^[  ]*$/d')
    fi
    if [ -z "$line" ]; then
        line=missing/error
    fi
    printf "%s" "$line"
}

newlib_version() {
    if [ -z "$1" ]; then
        cc=gcc
    else
        cc=$1-gcc
    fi
    printf "%s" "$(get_define "$cc" newlib.h _NEWLIB_VERSION)"
}

avr_libc_version() {
    if [ -z "$1" ]; then
        cc=gcc
    else
        cc=$1-gcc
    fi
    printf "%s (%s)" "$(get_define "$cc" avr/version.h __AVR_LIBC_VERSION_STRING__)" "$(get_define "$cc" avr/version.h __AVR_LIBC_DATE_STRING__)"
}

cppcheck_version() {
    local cmd="cppcheck"
    if command -v "$cmd" 2>&1 >/dev/null; then
        ver=$("$cmd" --version | head -n 1)
    else
        ver="missing"
    fi

    printf "%s" "$ver"
}

spatch_version() {
    local cmd="spatch"
    if command -v "$cmd" 2>&1 >/dev/null; then
        ver=$("$cmd" --version | head -n 1)
    else
        ver="missing"
    fi

    printf "%s" "$ver"
}

printf "%s\n" "Installed toolchain versions"
printf "%s\n" "----------------------------"
VER=$(gcc --version | head -n 1)
if [ -n "$VER" ]; then
    printf "%20s: %s\n" "native gcc" "$VER"
fi
for p in msp430 avr arm-none-eabi mips-mti-elf; do
    printf "%20s: %s\n" "$p-gcc" "$(gcc_version "$p")"
done
VER=$(clang --version | head -n 1)
if [ -n "$VER" ]; then
    printf "%20s: %s\n" "clang" "$VER"
fi

for p in arm-none-eabi mips-mti-elf; do
    printf "%20s: %s\n" "$p-newlib" "$(newlib_version "$p")"
done
for p in avr; do
    printf "%20s: %s\n" "$p-libc" "$(avr_libc_version "$p")"
done
printf "%20s: %s\n" "cppcheck" "$(cppcheck_version)"
printf "%20s: %s\n" "coccinelle" "$(spatch_version)"
exit 0