使用 CMake 从二进制文件中提取库版本
extract library version from binary with CMake
我正在为外部 C 库编写 FindXXX.cmake
脚本。我希望我的脚本提供有关库版本的信息。但是,该库仅以 returns 版本号作为字符串的函数形式提供此信息。
我想我可以通过 FindXXX.cmake
即时编译以下 C 程序来提取版本号:
#include <stdio.h>
#include "library.h"
int main() {
char version[256];
get_version(version);
puts(version);
return 0;
}
为了让它工作,CMake 应该在配置时编译和 运行 上面的程序,并使用它打印的信息作为版本标识符。我知道如何做后者(想到execute_process
), and I almost know how to do the former: CheckCSourceRuns
,但我不知道如何捕获生成的可执行文件的标准输出。
TL;DR:有没有办法编译一个程序,运行 它并在生成时从 CMake 捕获它的标准输出?
您可以为此目的使用 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
.
我正在为外部 C 库编写 FindXXX.cmake
脚本。我希望我的脚本提供有关库版本的信息。但是,该库仅以 returns 版本号作为字符串的函数形式提供此信息。
我想我可以通过 FindXXX.cmake
即时编译以下 C 程序来提取版本号:
#include <stdio.h>
#include "library.h"
int main() {
char version[256];
get_version(version);
puts(version);
return 0;
}
为了让它工作,CMake 应该在配置时编译和 运行 上面的程序,并使用它打印的信息作为版本标识符。我知道如何做后者(想到execute_process
), and I almost know how to do the former: CheckCSourceRuns
,但我不知道如何捕获生成的可执行文件的标准输出。
TL;DR:有没有办法编译一个程序,运行 它并在生成时从 CMake 捕获它的标准输出?
您可以为此目的使用 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
.