cmake 是否在命令行上获取/查询/打印生成设置?

gwo2fgha  于 2023-01-26  发布在  其他
关注(0)|答案(2)|浏览(149)

让我们假设我有一个Cmake C项目,并且我在项目中有如下内容:

project(my_project C CXX ASM)
set(my_executable_sources
    main.c
    file_one.c
   )
set(my_executable_sources ${my_executable_sources} file_two.c)
add_executable(my_executable
               ${my_executable_sources}
               file_three.c
              )

假设我在./build子文件夹中,并且cmake ../ -G "Unix Makefiles"已经成功通过。
我可以使用cmake从命令行查询构建信息吗?
例如,这里我感兴趣的是my_executable的源文件的 final 列表;有没有一个命令可以很容易地检索它们?比如说,像下面的伪代码:

$ cmake --pseudo-query-build --project="my_project" --target="my_executable" --query="source_files"
my_executable source files:
main.c
file_one.c
file_two.c
file_three.c
toe95027

toe950271#

我没有看到任何独立于cmake生成器的方法来实现这一点,即使你知道生成器在使用生成的项目文件。
您可以修改您的项目以包括一个打印源代码的自定义目标:

add_custom_target(print_my_executable_sources COMMAND ${CMAKE_COMMAND} -E echo "$<TARGET_PROPERTY:my_executable,SOURCES>" COMMAND_EXPAND_LISTS)

这允许您使用

cmake --build <binary_dir> [--config <configuration>] --target print_my_executable_sources

以打印源,即使源中使用了生成器表达式。
注意:这将在一行中打印所有文件;要在单独的行中获取所有文件名,您可以使用-P选项运行cmake,通过-D传递源,并添加逻辑以在cmake脚本文件中每行打印一个文件名。
另外,在配置过程中将CMAKE_EXPORT_COMPILE_COMMANDS变量设置为True可能会生成允许提取信息的json文件,但您需要一个json解析器来提取信息。此外,这种方法只适用于Makefile和Ninja CMake生成器。另外,我不确定您是否可以在所有情况下分辨出源文件属于哪个目标。

xfyts7mz

xfyts7mz2#

首先通过以下行获取目标的源代码(add_executable之后):

get_target_property(MY_TARGET_SOURCES my_executable SOURCES)

然后在文件末尾(add_executable之后)继续执行一个简单的行

message(STATUS ${MY_TARGET_SOURCES})

编辑:有关可用目标属性的完整列表,请参阅此链接。
编辑2:正如我现在注意到的,您可能只打算在CLI中使用它,那么对于我的解决方案,您还必须使用if/endif来封装它,该if/endif检查definition(例如if(SOURCES_DEBUG_INFO)),然后使用-DSOURCES_DEBUG_INFO=TRUE来运行它

相关问题