将目标属性添加到CMake中的现有导入库中

时间:2019-03-09 20:39:57

标签: cmake

外部项目由CMake构建,并安装在通过CMAKE_PREFIX_PATH可见的目录中。由于是CMake项目,因此会安装正确的.cmake文件。在那些自动生成的文件中,将创建一个EXPORTED目标文件并设置了所有必需的属性。

我想做的是-在不修改原始CMakeLists.txt的情况下-添加一个编译定义,为了正确包含该库中的标头,我需要该编译定义。

到目前为止,我已经尝试了两种方法:

重新添加库并正常指定定义

add_library(_external_lib_name_ INTERFACE IMPORTED)
target_compile_definitions(_external_lib_name_ INTERFACE FOO_BAR)

这不起作用,因为目标的所有已设置属性(如包含目录)都将被忽略。

只需添加定义

target_compile_definitions(_external_lib_name_ INTERFACE FOO_BAR)

这次CMake抱怨:

CMake Error at foo.cmake:1 (target_compile_definitions):
  Cannot specify compile definitions for target "_external_lib_name_" which is not built by this project.

目前,我正在考虑代理目标:

add_library(_proxy_target_ INTERFACE)
target_link_libraries(_proxy_target_ INTERFACE _external_lib_name_)
target_compile_definitions(_proxy_target_ INTERFACE FOO_BAR)

虽然这可能行得通,但是有人知道是否有更好的方法来修改导入的目标吗?

更新

使用Tsyvarev的答案,我可以使其正常运行,但是还有另一个问题:为了正确修改目标,我需要include首先find_package然后{ {1}}。如果我不使用set_property,而是使用标准includeCMakeLists.txt,则目标将保留旧属性。

1 个答案:

答案 0 :(得分:1)

具有 INTERFACE 关键字的

命令target_compile_definitions追加到属性INTERFACE_COMPILE_DEFINITIONS,但不适用于 IMPORTED 目标。您需要使用直接与目标属性配合使用的命令:

set_property(TARGET _external_lib_name_ APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS FOO_BAR)