War*_*ung 2 string comparison integer cmake libxslt
我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)
我编写了这个 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)
Run Code Online (Sandbox Code Playgroud)
问题是,无论我输入什么值LIBXSLT_VERSION,测试总是成功的。当我在发出上面第一个引用块的系统上运行它时,它应该成功,但我随后尝试将测试值增加到 10129 以说服自己它会走上失败路径,但事实并非如此!后来我在1.1.17的系统上运行它libxslt,它也运行成功了。
我尝试过翻转逻辑(即GREATER 10126),使用VERSION_LESSandSTRLESS等。我还尝试将裸整数切换为字符串,取消引用变量名,以便它是直接的字符串到字符串比较,等等。没有任何帮助。
我主要使用 CMake 2.6 和 2.8。
它看起来像是正则表达式处理的问题。
你打电话时:
string(REGEX MATCH "libxslt [0-9]+" LIBXSLT_VERSION ${XSLTPROC_VERSION})
Run Code Online (Sandbox Code Playgroud)
will的值LIBXSLT_VERSION是libxslt 10128,而不是裸版本10128。
您可以通过将正则表达式修改为"libxslt ([0-9]+)"并引用变量中捕获的匹配项来仅捕获版本号CMAKE_MATCH_1(CMAKE_MATCH_0包含完整匹配项;相当于${LIBXSLT_VERSION}此处的 ie 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()
Run Code Online (Sandbox Code Playgroud)