我试图思考如何设计一个新的项目建设系统。
我想使用CMake为Windows和Linux编译。我想要发布版本和Debug构建,这是非常直接的。
问题是,在接下来的几年中,我将希望为多个硬件项目部署此软件。这意味着我将在我的C++程序中打开/关闭或改变功能的预处理定义。我还想链接配置特定的库。当前遗留项目使用具有定义列表的标头,然后链接所有可能的项目依赖项。
示例标题:
// projects.h
//#define project1
//#define project2
#define project3
这意味着要更改硬件/项目配置,您必须编辑该文件,以确保选择了正确的硬件配置。
我想做的是为每个项目配置一个配置,这也可以配置为发行版或调试构建。
对于如何在CMake中更好地处理这个问题,有什么建议吗?
发布于 2019-08-28 11:23:35
用于多个硬件项目
对我来说,它很快就变得凌乱不堪。
我的目标是:
我发现:
makefile
中。然后,此makefile
配置cmake
,后者反过来配置构建系统,然后可用于构建应用程序。是这样的,因为cmake支持每个工具链的一个配置。因此,对于具有不同编译器/编译器选项的体系结构,我必须重新运行cmake。我基本上有这样一个目录结构:
- 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
中,都会添加一个具有文件夹名称的库。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
中迭代它们,如下所示:
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})
,这将有效地将所有宏定义带到主应用程序中。
https://stackoverflow.com/questions/57689789
复制相似问题