我正在尝试使用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进行比较,应告诉我是否有足够新版本的{{ 1}}:
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)
得到什么价值,测试总是成功的。当我在发出上面第一个引用块的系统上运行它时,它应该成功,但我然后尝试将测试值增加到10129以说服自己它会沿着故障路径走下去,但事实并非如此!我后来在LIBXSLT_VERSION
1.1.17的系统上运行它,它也沿着成功路径运行。
我尝试使用libxslt
和GREATER 10126
等来翻转逻辑(即VERSION_LESS
)。我也尝试将裸整数切换为字符串,取消引用变量名称,因此它是一个直接的字符串到字符串比较等。没有任何帮助。
我主要使用CMake 2.6和2.8。
答案 0 :(得分:4)
这看起来像是正则表达式处理的一个问题。
致电时:
string(REGEX MATCH "libxslt [0-9]+" LIBXSLT_VERSION ${XSLTPROC_VERSION})
LIBXSLT_VERSION
的值为libxslt 10128
,不裸版10128
。
您可以通过将正则表达式修改为"libxslt ([0-9]+)"
来捕获版本号,并在变量CMAKE_MATCH_1
中引用捕获的匹配项(CMAKE_MATCH_0
包含完整匹配项;相当于{{1}这里,即${LIBXSLT_VERSION}
)。
所以,你应该可以这样做:
libxslt 10128