2

我正在尝试使用CMake来检查系统是否已xsltproc安装,并且它来自libxslt1.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 以说服自己它会沿着失败路径走下去,但它没有!我后来在一个libxslt1.1.17 的系统上运行它,它也跑到了成功的道路上。

我已经尝试翻转逻辑(即GREATER 10126),使用VERSION_LESSandSTRLESS等。我还尝试将裸整数切换为字符串,取消引用变量名,因此它是直接的字符串到字符串比较等。没有任何帮助。

我主要使用 CMake 2.6 和 2.8。

4

1 回答 1

4

它看起来像是正则表达式处理的问题。

你打电话时:

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

LIBXSLT_VERSIONwill be的值libxslt 10128不是裸版10128


您可以通过修改您的正则表达式来捕获版本号,"libxslt ([0-9]+)"并在变量中引用捕获的匹配项CMAKE_MATCH_1CMAKE_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()
于 2014-09-11T23:31:01.873 回答