[英]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 顯然無關緊要,因為大多數編輯工具已經基於文件夾。
我試試了你的例子,這是我的兩個變種:
使用BUILDSYSTEM_TARGETS
和SUBDIRECTORIES
目錄屬性目錄中的評估對象的名單是“不包括任何進口目標或別名目標”:
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)
通過將FOLDER
目標屬性轉換為從同名的目錄屬性繼承的內容。 這可以使用define_property()
將FOLDER
屬性重新定義為INHERITED
:
使用
INHERITED
選項時,如果未在命令的作用域中設置請求的屬性,則get_property()命令將鏈接到下一個更高的作用域。DIRECTORY
范圍鏈到GLOBAL
。TARGET
,SOURCE
和TEST
鏈到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.