簡體   English   中英

CMake:如何更改子目錄項目目標的屬性?

[英]CMake: How do I change properties on subdirectory project targets?

我試圖在我的子項目(在本例中為 poco)中組織目標,但我發現無法為 ALIAS 目標修改屬性。 我希望我的外部項目中的目標位於它們自己的文件夾中,而不是散布在項目樹中的任何地方(比如 visual studio 生成器)。 有沒有更簡單的方法來添加具有我自己的屬性的項目?

所以不是:

- CMakePredefinedTargets
    - ALL_BUILD
    - INSTALL
    - ...
- MyTargets
    - SomeLibrary
    - SomeExe
- CppUnit
- Crypto
- Data
- ...

我想:

- CMakePredefinedTargets
    - ALL_BUILD
    - INSTALL
    - ...
- MyTargets
    - SomeLibrary
    - SomeExe
- Poco
    - CppUnit
    - Crypto
    - Data
    - ...

我的嘗試:

function(add_subdirectory_with_folder folder_name)
    function(add_library name type)
    _add_library(${ARGV})

    set_target_properties(${name}
        PROPERTIES
        FOLDER "${folder_name}"
    )
    endfunction()
    add_subdirectory(${ARGN})
endfunction()

# External Libs
add_subdirectory_with_folder("Poco" libs/poco)

來自 poco 庫的示例目標:

add_library( "${LIBNAME}" ${LIB_MODE} ${SRCS} )
add_library( "${POCO_LIBNAME}" ALIAS "${LIBNAME}")
set_target_properties( "${LIBNAME}"
    PROPERTIES
    VERSION ${SHARED_LIBRARY_VERSION} SOVERSION ${SHARED_LIBRARY_VERSION}
    OUTPUT_NAME ${POCO_LIBNAME}
    DEFINE_SYMBOL JSON_EXPORTS
    )

我的目標是做到這一點,這樣我就不必分叉和維護我自己的庫版本,我只想使用這些庫來調整生活質量。 我可以使用其他方法來組織 IDE 的項目樹嗎? 我知道 externalproject_add 存在,但我認為它沒有我正在尋找的設施。 我將在未來以 git-submodules 的形式添加其他項目,但取決於是否有更簡單的方法,我將探索其他途徑。

編輯:

澄清一下,我已經為我自己項目的每個模塊使用了一個單獨的 CMakeLists.txt,加上一個將它們聯系在一起的頂級 CMakeLists.txt,以及收集我的目標所依賴的外部庫。 我想修改外部庫的目標而不必自己分叉和維護它們,這樣我在 visual studio、xcode 或其他文件夾中就有了很好的文件夾結構。 Linux 顯然無關緊要,因為大多數編輯工具已經基於文件夾。

我試試了你的例子,這是我的兩個變種:

  1. 使用BUILDSYSTEM_TARGETSSUBDIRECTORIES目錄屬性目錄中的評估對象的名單是“不包括任何進口目標或別名目標”:

     cmake_minimum_required(VERSION 3.7) project(AliasFolderSub) set_property(GLOBAL PROPERTY USE_FOLDERS TRUE) function(get_all_targets _result _dir) get_property(_subdirs DIRECTORY "${_dir}" PROPERTY SUBDIRECTORIES) foreach(_subdir IN LISTS _subdirs) get_all_targets(${_result} "${_subdir}") endforeach() get_property(_sub_targets DIRECTORY "${_dir}" PROPERTY BUILDSYSTEM_TARGETS) set(${_result} ${${_result}} ${_sub_targets} PARENT_SCOPE) endfunction() function(add_subdirectory_with_folder _folder_name _folder) add_subdirectory(${_folder} ${ARGN}) get_all_targets(_targets "${_folder}") foreach(_target IN LISTS _targets) set_target_properties( ${_target} PROPERTIES FOLDER "${_folder_name}" ) endforeach() endfunction() # External Libs add_subdirectory_with_folder("Poco" libs/poco) 
  2. 通過將FOLDER目標屬性轉換為從同名的目錄屬性繼承的內容。 這可以使用define_property()FOLDER屬性重新定義為INHERITED

    使用INHERITED選項時,如果未在命令的作用域中設置請求的屬性,則get_property()命令將鏈接到下一個更高的作用域。 DIRECTORY范圍鏈到GLOBAL TARGETSOURCETEST鏈到DIRECTORY

     cmake_minimum_required(VERSION 2.6) project(AliasFolderSub) set_property(GLOBAL PROPERTY USE_FOLDERS TRUE) define_property( TARGET PROPERTY FOLDER INHERITED BRIEF_DOCS "Set the folder name." FULL_DOCS "Use to organize targets in an IDE." ) function(add_subdirectory_with_folder _folder_name _folder) add_subdirectory(${_folder} ${ARGN}) set_property(DIRECTORY "${_folder}" PROPERTY FOLDER "${_folder_name}") endfunction() # External Libs add_subdirectory_with_folder("Poco" libs/poco) 

    𝓝𝓸𝓽𝓮:使用define_property()重新定義現有屬性的范圍是CMake的未記錄行為。

參考

https://github.com/andry81/tacklelib
https://github.com/andry81/tacklelib/blob/trunk/cmake/tacklelib/Project.cmake

cmake_minimum_required(VERSION 3.14)

# enable project folders
set_property(GLOBAL PROPERTY USE_FOLDERS ON)

## cmake builtin search paths and includes

LIST(APPEND CMAKE_MODULE_PATH "${TACKLELIB_CMAKE_ROOT}")

include(tacklelib/Project)
include(tacklelib/EnableTargetsExtension)

project(MyApp)

set(MYLIB_ROOT ...)

# somewhere at the end ...

## project folders

tkl_set_target_folder(CMAKE_CURRENT_LIST_DIR . * .       UTILITY     . util)
tkl_set_target_folder(CMAKE_CURRENT_LIST_DIR . * "tests" EXECUTABLE  . exe)
tkl_set_target_folder(CMAKE_CURRENT_LIST_DIR . * .       "SHARED_LIBRARY;STATIC_LIBRARY" . lib)

tkl_set_target_folder(MYLIB_ROOT * * .       UTILITY     . _3dparty/utility/mylib/util)
tkl_set_target_folder(MYLIB_ROOT * * "tests" EXECUTABLE  . _3dparty/utility/mylib/exe)
tkl_set_target_folder(MYLIB_ROOT * * .       "SHARED_LIBRARY;STATIC_LIBRARY" . _3dparty/utility/mylib/lib)
tkl_set_target_folder(MYLIB_ROOT * "tests" . * . _3dparty/utility/mylib/tests)

CMake 命令行:

cmake.exe -G "..." "-DTACKLELIB_CMAKE_ROOT=.../_externals/tacklelib/cmake" ...

項目目錄結構:

...
_externals/
_out/
include/
src/
CMakeLists.txt

_out - 具有 cmake 緩存和 output 的目錄

解決方案布局:

_3dparty
  utility
    mylib
      lib
        mylib
CMakePredefinedTargets
  ALL_BUILD
  INSTALL
  ZERO_CHECK
exe
  myapp
util
  bundle

暫無
暫無

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

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