簡體   English   中英

SWIG 和 CMake:利用`target_include_directories()` 提供的信息

[英]SWIG and CMake: make use of information provided by `target_include_directories()`

使用 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 魔法,您可以自動列出庫的接口部分中的所有頭文件並設置包含目錄:

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 獲取接口包含目錄並將它們存儲在變量 MY_INCLUDES 中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM