Shell (Bash) - проверка инструментов сборки и принудительное использование версий - PullRequest
1 голос
/ 07 ноября 2019

Я хочу написать сценарий оболочки / bash, который может проверить, что все мои инструменты сборки соответствуют определенным требованиям к версии, и вернуть / не пройти.

Пример:

Я использую cmake, makeи gcc.

$ cmake --version

cmake version 3.13.4

CMake suite maintained and supported by Kitware (kitware.com/cmake).

$ make --version

GNU Make 4.2.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

$ gcc --version

gcc (Ubuntu 9.2.1-9ubuntu2) 9.2.1 20191008
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

В первом случае я хотел бы получить пропуск / неудачу, если система точно соответствует этим номерам версий, во 2-м случае я хотел бы получить пропуск / неудачу,система предоставляет минимально номер версии или новее (= больше, в отношении 1.2.2 новее, чем 1.1.3).

Итак, чего я хочу добиться, это:

  • шаг 1: определите номер версии, разделенный точкой, состоящий из 3 цифр (также разрешите конструкции, подобные 123.22.1)
  • шаг 2: разбейте эту строку на 3 раздела: основной, вспомогательный, исправление.

После того, как я смогу сравнить эти строковые значения с моим ожиданием и вернуться с результатом.

Есть ли простое решение с такими инструментами, как awk или аналогичные?

1 Ответ

1 голос
/ 07 ноября 2019

Вот один из способов сделать это, пытаясь реализовать в основном в bash (версия> 4.2), используя функции оболочки.

Это не возвращает окончательный код состояния, просто выводит отчет на стандартный вывод.

#!/usr/bin/env bash


# Compare V1 to V2 return 2 if V2 is higher than V1
function compare_version_strings()
{
    local v1=( $(echo "$1" | tr '.' ' ') )
    local v2=( $(echo "$2" | tr '.' ' ') )
    local len=${#v1[*]}
    if [ "${#v2[*]}" -gt "$len" ] ;
    then
        len="${#v2[*]}" ;
    fi

    for ((i=0; i<len; i++))
    do
        [ "${v1[i]:-0}" -gt "${v2[i]:-0}" ] && return 1  # v1 higher
        [ "${v1[i]:-0}" -lt "${v2[i]:-0}" ] && return 2  # v2 higher
    done
    return 0 # same version
}

# Wrapper around compare_version_strings
function check_tool_version()
{
    local tool="$1" && shift
    local vmin="$1" && shift
    local vact="$1" && shift

    compare_version_strings "$vact" "$vmin"
    local result="$?"
    echo -n checking for $tool $vmin

    if [ "$result" -eq 2 ]; then
        echo " [FAIL] -- found $vact"
    else
        echo " [PASS] -- found $vact"
    fi
}


check_tool_version   cmake   3.11.2   $(cmake  --version | head -1 | awk '{print $3}')
check_tool_version   gcc     4.8      $(gcc --version | head -1 | awk '{print $3}')
check_tool_version   make    9.1      $(make --version | head -1 | awk '{print $3}')

... и пример вывода ...

checking for cmake 3.11.2 [PASS] -- found 3.12.1
checking for gcc 4.8 [PASS] -- found 4.8.5
checking for make 9.1 [FAIL] -- found 3.82
...