CMake целочисленное сравнение не работает

Я пытаюсь использовать CMake, чтобы проверить, есть ли в системе xsltproc установлено, и что это происходит от libxslt версия 1.1.27 или выше. (В более ранних версиях есть ошибка, которую я не хочу обойти.)

Когда ты бежишь xsltproc --version, вы получите вывод, как это:

Using libxml 20900, libxslt 10128 and libexslt 817
xsltproc was compiled against libxml 20900, libxslt 10128 and libexslt 817
libxslt 10128 was compiled against libxml 20900
libexslt 817 was compiled against livxml 20900

Я написал этот код CMake для анализа второго целого числа из первой строки и пытаюсь сравнить его с 10127, который должен сказать мне, если у меня есть достаточно новая версия xsltproc:

execute_process(COMMAND xsltproc --version
    OUTPUT_VARIABLE XSLTPROC_VERSION ERROR_QUIET)
if(XSLTPROC_VERSION)
    string(REGEX MATCH "libxslt [0-9]+" LIBXSLT_VERSION
        ${XSLTPROC_VERSION})
    if(LIBXSLT_VERSION LESS 10127)  # Always succeeds!  Why?
        message(STATUS "xsltproc found, but it's too old!")
    else()
        message(STATUS "xstlproc found, and new enough")
        set(WORKING_XSLTPROC 1)
    endif()
endif(XSLTPROC_VERSION)

Проблема в том, какую ценность я получу в LIBXSLT_VERSION Тест всегда проходит успешно. Когда я запустил его в системе, которая выпустила первый приведенный выше блок, он прошел как надо, но затем я попытался увеличить значение теста до 10129, чтобы убедить себя, что он пойдет по пути отказа, но этого не произошло! Я позже запустил его в системе с libxslt 1.1.17, и он также бежал по пути успеха.

Я попытался перевернуть логику (т.е. GREATER 10126), с помощью VERSION_LESS а также STRLESS и т. д. Я также пытался переключить пустое целое число на строку, разыменовать имя переменной, чтобы было прямое сравнение строк и т. д. Ничего не помогает.

В основном я работаю с CMake 2.6 и 2.8.

1 ответ

Решение

Это похоже на проблему с обработкой регулярных выражений.

Когда вы звоните:

string(REGEX MATCH "libxslt [0-9]+" LIBXSLT_VERSION ${XSLTPROC_VERSION})

значение LIBXSLT_VERSION будет libxslt 10128, не голая версия 10128,


Вы можете захватить только номер версии, изменив свое регулярное выражение на "libxslt ([0-9]+)" и ссылка на захваченное совпадение в переменной CMAKE_MATCH_1 (CMAKE_MATCH_0 содержит полное совпадение; эквивалентно ${LIBXSLT_VERSION} здесь, т.е. libxslt 10128).

Итак, вы должны быть в состоянии сделать что-то вроде:

if(XSLTPROC_VERSION)
    string(REGEX MATCH "libxslt ([0-9]+)" LIBXSLT_VERSION ${XSLTPROC_VERSION})
    if(NOT CMAKE_MATCH_1)
        message(AUTHOR_WARNING "Error during check for xslt version.")
    elseif(CMAKE_MATCH_1 LESS 10127)
        message(STATUS "xsltproc found, but it's too old!")
    else()
        message(STATUS "xstlproc found, and new enough")
        set(WORKING_XSLTPROC 1)
    endif()
endif()
Другие вопросы по тегам