我想拥有以下结构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
将子组件的相对路径传递给父组件。
答案 0 :(得分:4)
首先,我必须承认我同意@Tsyvarev。您的CMake环境应该适合您的流程/工作流程,并应考虑项目规模和团队结构。或者一般来说,将使用CMake环境。这往往是 - 以积极的方式 - 非常活跃。
因此,这部分问题很难回答,我将专注于技术部分:
if(SomeCompiler)
语句function()
正文移动到共享的CMake包含文件由于您已经明确要求find_package()
变体,因此需要Use CMake-enabled libraries in your CMake project以及上面列出的内容:
<强> 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)
<强> C /的CMakeLists.txt 强>
include(MyCommonCode.cmake)
...
my_export_target(C "${CMAKE_CURRENT_SOURCE_DIR}/include")
<强> B /的CMakeLists.txt 强>
include(MyCommonCode.cmake)
find_package(C REQUIRED)
...
target_link_libraries(B C)
my_export_target(B "${CMAKE_CURRENT_SOURCE_DIR}/include")
<强> A /的CMakeLists.txt 强>
include(MyCommonCode.cmake)
find_package(B REQUIRED)
...
target_link_libraries(A B)
这使得所有3个构建环境保持独立,仅共享相对静态的MyCommonCode.cmake
文件。所以在这种方法中我到目前为止还没有涵盖你的第一点,但会建议使用外部脚本来链接/触发你的A / B / C构建步骤。