为具有单独上下文的多个项目创建一个构建目录

CMake one build directory for multiple projects with seperate context

我正在尝试在具有以下结构的一个构建目录中构建多个项目:

  |------ CMakeLists.txt (The main Cmake)
  |
  |------ ProjectAPP
  |          |----- .c/h files
  |          |----- sdh_config.h
  |          |----- CMakeList.txt
  |
  |------ ProjectDFU
  |          |----- .c/h files
  |          |----- sdh_config.h
  |          |----- CMakeList.txt
  | 
  |-------- SDK
  |          |---- SDK used by both projects

我们的想法是构建两个独立的项目,都构建在一个 SDK 之上。请注意,这两个项目都依赖于不同的 SDK 配置,由它们各自的 sdk_config.h.

完成

主要 CMakeList.txt 看起来像这样:

cmake_minimum_required(VERSION 3.22)

project(project)

add_dependency(ProjectAPP)
add_dependency(ProjectDFU)

add_custom_target(app DEPENDS ${exec_target_app} 
    ...
)

add_custom_target(dfu DEPENDS ${exec_target_dfu} 
    ...
)

add_custom_target(merge DEPENDS app dfu
    ...
)

基本上,我在同一个地方构建这两个项目的唯一用途是,我可以根据两个可执行文件获得目标,这样我就可以用它做一些事情。

我的问题:

基于 cmake 的 SDK 分散在数百个这样的小库中:

add_library(lib INTERFACE
    "file1.c"
    "file2.c"
)

这些库中的大部分将被两个项目使用,但具有不同的构建参数(参见 sdk_config.h)。

我现在所在的位置,出现以下错误:

add_library cannot create target "lib" because another target with the same name already exists. 
The existing target is an interface library created in source directory "ProjectAPP". 
See documentation for policy CMP0002 for more details.

我的问题:

在两个不同的构建上下文中隔离两个项目同时仍然能够在根级别对每个项目具有依赖性的最佳方法是什么?

提前感谢您的帮助。

回答我自己的问题,我不确定这是否是处理此问题的最佳方法,但 cmake ExternalProject 解决了我的问题。