我正在为外部C库编写FindXXX.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
浮现在脑海中,但我不知道如何抓住生成的可执行文件的标准输出。
TL; DR :有没有办法编译程序,运行它并在生成时从CMake捕获它的stdout?
答案 0 :(得分: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_result
和foo_run_result__TRYRUN_OUTPUT
。