2016-11-25 48 views
1

我正在为外部C库编写FindXXX.cmake脚本。我希望我的脚本提供有关库版本的信息。但是,库仅以一种函数的形式提供此信息,该函数以字符串形式返回版本号。从与CMake的二进制文件中提取库版本

我想我可以提取版本号具有FindXXX.cmake编译在运行下面的C程序:

#include <stdio.h> 
#include "library.h" 

int main() { 
    char version[256]; 
    get_version(version); 
    puts(version); 
    return 0; 
} 

为了这个工作,CMake的应编译并在配置时运行上面的程序,并使用它打印的信息作为版本标识符。我知道怎么做后者(execute_process),而我差不多知道怎么做前者:CheckCSourceRuns想到了,但是我不知道如何捕获生成的可执行文件的stdout。

TL; DR:有没有办法编译一个程序,运行它并在生成时从CMake捕获它的stdout?

回答

2

您可以使用try_run用于这一目的(假定你的源文件被命名为foo_get_version.c):

try_run(foo_run_result foo_compile_result 
     foo_try_run ${CMAKE_CURRENT_LIST_DIR}/foo_get_version.c 
     RUN_OUTPUT_VARIABLE foo_run_output) 

if(NOT foo_compile_result) 
    # ... Failed to compile 
endif() 
if(NOT foo_run_result EQUAL "0") 
    # ... Failed to run 
endif() 

# Now 'foo_run_output' variable contains output of your program. 

注意,不执行try_run交叉编译。相反,CMake希望用户将设置缓存变量foo_run_resultfoo_run_result__TRYRUN_OUTPUT

+0

谢谢,这个作品!不过,我没有得到关于交叉编译的最后一点。谨慎阐述? –

+1

当交叉编译时,你*可能会链接*库(即*编译*你的程序),但**不能加载**库(即*运行*你的程序)。这是因为* host *平台(您运行'cmake'的地方)与* target *平台不同(打算加载库的地方)。在这种情况下,您需要一些其他方式来获取库的版本。例如,您可能会要求用户在* target *机器上运行您的程序,并根据该运行设置某些CMake缓存变量。 – Tsyvarev

相关问题