具有多个组件的基本项目设置

时间:2019-09-16 19:30:16

标签: cmake

设置具有多个独立组件的项目的最佳方法是什么?

我的项目没有顶级CMakeLists文件,它包含多个组件。其中一些可以独立构建,而另一些则依赖于其他组件。 例如,组件A和B可以自行构建和使用(并且可以由多个单独的目标组成),而组件C则需要A和B进行构建。

项目布局:

    ├───component_A
    │       CMakeLists.txt
    │       main.cpp
    │
    ├───component_B
    │       CMakeLists.txt
    │       main.cpp
    │
    └───component_C
             CMakeLists.txt
             main.cpp

我可以看到3种可能性,但似乎没有一种是有效或可行的:

  1. 使用add_subdirectory(component_A CMAKE_BINARY_DIR / componentA)。

  2. ExternalProject_Add()似乎太局限,无法处理大量组件

  3. 将每个组件作为一个软件包进行处理,并使用find_package 包括他们。配置,安装等如何工作 这种情况?

1 个答案:

答案 0 :(得分:0)

一个简单的解决方案是使用一些CMake options创建一个顶级CMake,以使您可以控制整个项目中的内容。这些选项将被填充,并且可以在CMake GUI中进行更改,但是如果从命令行运行cmake,也可以对其进行控制。这是适合您情况的简单顶级CMake文件,如下所示:

cmake_minimum_required(VERSION 3.11)

project(TopLevelProject)

# Define options to easily turn components ON or OFF.
option(ENABLE_COMPONENT_A "Option to include component A" ON)
option(ENABLE_COMPONENT_B "Option to include component B" OFF)
option(ENABLE_COMPONENT_C "Option to include component C" OFF)

# Determine which components are included and built by default in ALL_BUILD.
if(ENABLE_COMPONENT_C)
    # Need all three components in this case.
    add_subdirectory(component_A)
    add_subdirectory(component_B)
    add_subdirectory(component_C)
else()
    if(ENABLE_COMPONENT_A)
        add_subdirectory(component_A)
    endif()
    if(ENABLE_COMPONENT_B)
        add_subdirectory(component_B)
    endif()
endif()

在此示例中,仅选项A为ON,因此仅组件A将包含在生成的构建系统中。即使包括所有组件,您仍然可以选择在生成构建系统后分别构建哪些项目(或目标)。