gpt4 book ai didi

c++ - SWIG 和 CMake : make use of information provided by `target_include_directories()`

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:13:25 31 4
gpt4 key购买 nike

使用 CMake 2.8+,您可以使用 target_include_directories() 避免冗余设置包含目录.

例如通过写作

add_libary(mylib SHARED ${SOURCES})
target_include_directories(mylib PUBLIC ./include)

.. 您只需链接到 mylib 即可将所需的包含文件夹添加到您的目标。

但是,当我必须使用尚未使用此功能的 CMake 模块时,我该如何使用这些信息呢? (在我的例子中是 SWIG)

当我配置 SWIG 项目时,我目前必须对大量信息进行硬编码:

set(SWIG_MODULE_${PYTHON_MODULE_NAME}_EXTRA_DEPS
"../long/relative/path/1/include/some/header1.h"
"../long/relative/path/1/include/some/header2.h"
"../long/relative/path/2/include/some/header1.h"
"../long/relative/path/2/include/some/header2.h")

我还必须使用老式的 include_directories()swig 生成器知道它需要知道什么:

include_directories(
"../long/relative/path/1/include
"../long/relative/path/2/include)

否则 .i 文件中的 %include 语句将不再起作用。

当然我可以设置包含路径的变量,但随后我会提供我想删除的信息..

有没有办法从目标中提取目录信息或(当然更好)让 SWIG CMake 模块正确使用它?

我目前的解决方案:

借助一些(非常漂亮的)CMake 魔法,您可以自动列出库接口(interface)部分的所有头文件并设置包含目录:

function(swig_add_library_dependencies swig_module library_names)
foreach(library_name ${library_names})
get_property(LIBRARY_INCLUDES
TARGET ${library_name}
PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
foreach(INCLUDE_PATH ${LIBRARY_INCLUDES})
include_directories(${INCLUDE_PATH})
file(GLOB_RECURSE header_files "${INCLUDE_PATH}/*.h")
list(APPEND SWIG_MODULE_${swig_module}_EXTRA_DEPS ${header_files})
# export variable to parent scope
set(SWIG_MODULE_${swig_module}_EXTRA_DEPS
${SWIG_MODULE_${swig_module}_EXTRA_DEPS} PARENT_SCOPE)
endforeach()
endforeach()
endfunction()

像这样使用:

swig_add_library_dependencies(<swig_module_name> "library1;library2")

或者像这样离散地:

swig_add_library_dependencies(<swig_module_name> library1)
swig_add_library_dependencies(<swig_module_name> library2)

缺点:

  • 使用GLOB_RECURSE
  • 只有在正确使用 target_include_directories 时才有效
  • 为在包含目录中找到的所有 头文件创建依赖项

最佳答案

查看get_property 的文档:

https://cmake.org/cmake/help/v3.0/command/get_property.html?highlight=get_property

你会做这样的事情:

get_property(MY_INCLUDES TARGET my_target PROPERTY INTERFACE_INCLUDE_DIRECTORIES)

从目标 my_target 获取接口(interface)包含目录并将它们存储在变量 MY_INCLUDES 中

关于c++ - SWIG 和 CMake : make use of information provided by `target_include_directories()` ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37205274/

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