gpt4 book ai didi

cmake - 如何从目标中获取包含目录以在 add_custom_target 中使用?

转载 作者:行者123 更新时间:2023-12-04 00:02:17 26 4
gpt4 key购买 nike

我正在使用 target_link_libraries 对依赖项进行建模,就像在 this 博客文章中所做的那样。

target_link_libraries(Foo
LibraryA
LibraryB
)

这很好用,但由于各种原因,我需要使用 add_custom_target 通过自定义命令预处理文件。问题是,这个自定义目标取决于 LibraryA 和 LibraryB 的包含。我真的希望像 target_link_libraries 的工作方式一样执行以下操作(请参阅 LibraryA 和 LibraryB 位):
add_custom_target(Bar ALL
COMMAND ${CMAKE_C_COMPILER} thing.cpp LibraryA LibraryB /P
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/Path/Here
COMMENT "Preprocessing to a file"
VERBATIM
)

但是,这不起作用。 LibraryA 和 LibraryB 按它们出现的方式放入。即使它确实有效,我想我会得到比包含更多的东西,因为我认为目标也包括库。也许这不是一个好方法。

那么,我可以在这里做什么?如何从每个目标中提取包含目录,以便在自定义命令中使用?我发现如果我 find_package(Foo REQUIRED) 我可以访问 Foo_DIR ,但这指向构建目录而不是包含所在的源目录。

最佳答案

您可以使用 get_target_property() 从每个目标中提取包含目录。目标的 INCLUDE_DIRECTORIES 属性包含该目标的包含目录。由于您有两个目标, LibraryALibraryB ,我们必须调用它两次。然后,我们可以使用 foreach() 将包含目录列表连接在一起。如果您将这些用作编译器命令(例如 MSVC)中的包含目录,您还可以将 /I compiler option 附加到循环中的每个目录:

# Get the include directories for the target.
get_target_property(LIBA_INCLUDES LibraryA INCLUDE_DIRECTORIES)
get_target_property(LIBB_INCLUDES LibraryB INCLUDE_DIRECTORIES)

# Construct the compiler string for the include directories.
foreach(dir ${LIBA_INCLUDES} ${LIBB_INCLUDES})
string(APPEND INCLUDE_COMPILER_STRING "/I${dir} ")
endforeach()

然后,您可以使用构造的 INCLUDE_COMPILER_STRING 变量调用自定义目标命令:
add_custom_target(Bar ALL
COMMAND ${CMAKE_C_COMPILER} thing.cpp ${INCLUDE_COMPILER_STRING} /P
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/Path/Here
COMMENT "Preprocessing to a file"
VERBATIM
)

如果您想要更简洁的内容,您可以使用生成器表达式示例 here ,它在您的自定义目标命令中获取目标的包含目录并内联扩展它们。像这样的东西也可以工作:
add_custom_target(Bar ALL
COMMAND ${CMAKE_C_COMPILER} thing.cpp
"/I$<JOIN:$<TARGET_PROPERTY:LibraryA,INCLUDE_DIRECTORIES>,;/I>"
"/I$<JOIN:$<TARGET_PROPERTY:LibraryB,INCLUDE_DIRECTORIES>,;/I>"
/P
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/Path/Here
COMMENT "Preprocessing to a file"
VERBATIM
COMMAND_EXPAND_LISTS
)

关于cmake - 如何从目标中获取包含目录以在 add_custom_target 中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58759647/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com