我想要以下结构A -> B -> C,其中:
C 是样板代码、第三方库的包装器、非常基本的代码等。 B 是特定于项目域的公共类、函数和数据结构。A 是项目本身。我想让它易于重用C或B(+C)将来在我的其他项目中使用。此外,我还有以下要求:
C,C+B并C+B+A一个炮打响。C和C+B将静态库,并且C+B+A将可执行A,B或C文件系统中的位置,它不需要更改多于几行,那就太好了。我对 cmake 很陌生,我什至不明白写文件XXXConfig.cmake或FindXXX.cmake文件更好。另外,我不确定,我应该如何使用X_INCLUDE_DIRS.
首先,我必须承认我同意@Tsyvarev。您的 CMake 环境应适合您的流程/工作流程,并应考虑项目规模和团队结构。或者一般来说,CMake 将被使用的环境。这往往 - 从积极的方面 - 非常活跃。
所以你的这部分问题很难回答,我将专注于技术部分:
if(SomeCompiler)语句function()主体移动到共享的 CMake 包含文件中由于您特别要求使用该find_package()变体,因此请在您的 CMake 项目中使用启用 CMake 的库以及上面列出的内容:
MyCommonCode.cmake
cmake_policy(SET CMP0022 NEW)
function(my_export_target _target _include_dir)
file(
WRITE "${CMAKE_CURRENT_BINARY_DIR}/${_target}Config.cmake"
"
include(\"\$\{CMAKE_CURRENT_LIST_DIR\}/${_target}Targets.cmake\")
set_property(
TARGET ${_target}
APPEND PROPERTY
INTERFACE_INCLUDE_DIRECTORIES \"${_include_dir}\"
)
"
)
export(
TARGETS ${_target}
FILE "${CMAKE_CURRENT_BINARY_DIR}/${_target}Targets.cmake"
EXPORT_LINK_INTERFACE_LIBRARIES
)
export(PACKAGE ${_target})
endfunction(my_export_target)
Run Code Online (Sandbox Code Playgroud)
C/CMakeLists.txt
include(MyCommonCode.cmake)
...
my_export_target(C "${CMAKE_CURRENT_SOURCE_DIR}/include")
Run Code Online (Sandbox Code Playgroud)
B/CMakeLists.txt
include(MyCommonCode.cmake)
find_package(C REQUIRED)
...
target_link_libraries(B C)
my_export_target(B "${CMAKE_CURRENT_SOURCE_DIR}/include")
Run Code Online (Sandbox Code Playgroud)
A/CMakeLists.txt
include(MyCommonCode.cmake)
find_package(B REQUIRED)
...
target_link_libraries(A B)
Run Code Online (Sandbox Code Playgroud)
这将所有 3 个构建环境分开,仅共享相对静态的MyCommonCode.cmake文件。因此,在这种方法中,到目前为止我还没有涵盖您的第一点,但建议使用外部脚本来链接/触发 A/B/C 的构建步骤。
| 归档时间: |
|
| 查看次数: |
3516 次 |
| 最近记录: |