首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用cmake管理多个构建配置

如何使用cmake管理多个构建配置
EN

Stack Overflow用户
提问于 2019-08-20 03:17:27
回答 1查看 1.9K关注 0票数 0

我试图思考如何设计一个新的项目建设系统。

我想使用CMake为Windows和Linux编译。我想要发布版本和Debug构建,这是非常直接的。

问题是,在接下来的几年中,我将希望为多个硬件项目部署此软件。这意味着我将在我的C++程序中打开/关闭或改变功能的预处理定义。我还想链接配置特定的库。当前遗留项目使用具有定义列表的标头,然后链接所有可能的项目依赖项。

示例标题:

代码语言:javascript
运行
复制
// projects.h

//#define project1
//#define project2
#define project3

这意味着要更改硬件/项目配置,您必须编辑该文件,以确保选择了正确的硬件配置。

我想做的是为每个项目配置一个配置,这也可以配置为发行版或调试构建。

对于如何在CMake中更好地处理这个问题,有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-28 11:23:35

用于多个硬件项目

对我来说,它很快就变得凌乱不堪。

我的目标是:

  • 我不喜欢一个大的config.h文件。我不想重新编译100%的文件,因为我在一个中心config.h文件中添加了一个空格
  • 所有的板都公开了用户应用程序可以使用的API。木板不能混在一起。
  • 我可以很容易地添加新的板,并有一个板来测试应用程序。

我发现:

  • cmake用于为不同的配置配置项目。因此,cmake不存储配置,而是用于选择配置。
  • 因此,您需要“外部”位置来存储当前项目的配置。
  • 我有多个应用程序和多个板,选择的应用程序配置选项存储在一个makefile中。然后,此makefile配置cmake,后者反过来配置构建系统,然后可用于构建应用程序。是这样的,因为cmake支持每个工具链的一个配置。因此,对于具有不同编译器/编译器选项的体系结构,我必须重新运行cmake。

我基本上有这样一个目录结构:

代码语言:javascript
运行
复制
- app
  - CMakeLists.txt
  - main.c
  - lib.c
- boards               # this is actually git submodule shared between multiple projects
  - boardapi           # generic board api library
    - CMakeLists.txt
    - uart_api.h       # exposes an api to access uart
    - spi_api.h
    - timer_api.h
    - board_api.h
    - some_defines.h    # includes some_defines_impl.h
  - BOARD1
    - toolchain.cmake
    - CMakeLists.txt
    - implementation1.c
    - implementation2.c
    - some_defines_impl.h
  - BOARD2
    - toolchain.cmake
    - CMakeLists.txt
    - implementation1.c
    - implementation2.c
    - some_defines_impl.h
  - linux
    - ... as above ...
  - armv5te
    - ... as above ...
  - CMakeLists.txt
- CMakeLists.txt
- Makefile
  • 我有一个boards目录,每个板有多个文件夹。
  • 每个文件夹都有自己的toolchain.cmake文件和CMakeLists.txt文件
  • 在板文件夹中的每个CMakeLists.txt中,都会添加一个具有文件夹名称的库。
  • 我有一个makefile,它可以迭代我想要编译这个应用程序的所有板,并为每个板运行cmake + make。基本上是BOARDS=BOARD1 BOARD2然后是all: $(foreach board,$(BOARDS),cmake;make;)
  • 使用cmake -DCMAKE_TOOLCHAIN_FILE=board/$(BOARD)/toolchain.cmake -DBOARD=$(BOARD)配置cmake。
  • board/CMakeLists.txt文件全部做的是add_subdirectory(${BOARD})add_library(board INTERFACE ${BOARD})
  • CMakeLists.txt执行add_subdirectory(boards),在此之后执行link_libraries(boards)。它应该将所有图书馆与董事会库连接起来。
  • 每个board目录依次控制特定的板配置。
  • 如果您有多个项目配置,就像它们是正常的项目,而不关心董事会。示例:在app/CMakeLists.txt中迭代它们,如下所示:

代码语言:javascript
运行
复制
foreach(i IN LISTS project1 project2 project3) 
    add_executable(main+${i} main.c app.c)
    target_add_definitions(${i}) 
endforeach()

或者,如果是前任。有许多宏,您可以创建另一个结构projects/{project1,project2,project3}并重新创建与板相同的结构,但不需要toolchain.cmake文件。然后迭代foreach项目并执行target_link_libraries(main+${i} ${i}),这将有效地将所有宏定义带到主应用程序中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57689789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档