Str*_*gos 3 cmake add-custom-command
我正在使用 对依赖项进行建模target_link_libraries,正如本博客文章中所做的那样。
target_link_libraries(Foo
LibraryA
LibraryB
)
Run Code Online (Sandbox Code Playgroud)
这很好用,但由于各种原因,我需要使用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
)
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用。LibraryA 和 LibraryB 按它们出现的方式放入。即使它确实有效,我想我会得到比包含更多的东西,因为我认为目标也包括库。也许这不是一个好方法。
那么,我可以在这里做什么?如何从每个目标中提取包含目录,以便在自定义命令中使用?我发现如果我find_package(Foo REQUIRED)可以访问Foo_DIR,但它指向构建目录而不是包含所在的源目录。
squ*_*les 10
您可以使用get_target_property(). 目标的INCLUDE_DIRECTORIES属性包含该目标的包含目录。由于您有两个目标LibraryA和LibraryB,我们必须调用它两次。然后,我们可以使用 将包含目录列表连接在一起foreach()。如果您将这些用作编译器命令(例如 MSVC)中的包含目录,您还可以将/I 编译器选项附加到循环中的每个目录:
# 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()
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用构造的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
)
Run Code Online (Sandbox Code Playgroud)
如果你想要更简洁的东西,你可以在这里使用生成器表达式示例,它在你的自定义目标命令中获取目标的包含目录并内联扩展它们。像这样的东西也可以工作:
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
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6735 次 |
| 最近记录: |