使用多个CMakeLists.txt构建CMake项目

时间:2018-12-11 14:29:44

标签: c cmake

我正在使用一些外部stm32-cmake生成可以正常运行的项目,但是现在我尝试使用多个CMakeLists.txt文件创建自己的CMake项目。我不知道如何使用CMake设计项目,以便我的根用户可以看到所有子CMake文件并执行命令。我知道这可能是重复的问题,但我仍然不知道如何执行此操作。我尝试在目录中找到一些包含多cmakes文件的cmake示例,以便我可以指导自己进行此构建,但是我发现教程还更改了源项目文件,以便编译器可以找到诸如--include \*.py这样的头文件,我不想更改它。

我在设计带有子目录的CMake项目时遇到问题。我的项目目录现在拥有以下组织:

#include root/sub-dir/header.h

在我的根目录CMakeLists.txt中,我有 ADD_EXECUTABLE()来生成最终的.elf文件。但这取决于其他子目录中的许多源文件,我在 add_subdirectory()中包括“ sub” CMakeLists.txt。我在CMake书中读到,那个大项目应该在子目录中还有其他CMakeLists.txt。

.
├── CMakeLists.txt
├── cmake
│   ├── toolchain.cmake
│   └── linker_script.cmake
├── Drivers
│   ├── CMSIS
│   │   ├── CMakeLists.txt
│   │   ├── Include
│   │   │   ├── arm_common_tables.h
│   │   │   ├── arm_const_structs.h
│   │   │   ├── arm_math.h
│   │   │   ├── core_cm4.h
│   │   └── STM32F4xx
│   │       ├── CMakeLists.txt
│   │       ├── Include
│   │       │   ├── stm32f407xx.h
│   │       │   ├── stm32f4xx.h
│   │       │   └── system_stm32f4xx.h
│   │       └── Source
│   │           └── Templates
│   │               ├── gcc
│   │               │   └── startup_stm32f407xx.s
│   │               └── system_stm32f4xx.c
│   └── HAL
│       ├── CMakeLists.txt
│       ├── Inc
│       │   ├── stm32f4xx_hal_adc.h
│       │   ├── stm32f4xx_hal_gpio.h
│       │   ├── stm32f4xx_hal.h
│       └── Src
│           ├── stm32f4xx_hal_adc.c
│           ├── stm32f4xx_hal.c
│           ├── stm32f4xx_hal_gpio.c
├── Inc
│   ├── flatbuffers_common_builder.h
│   ├── flatbuffers_common_reader.h
│   ├── main.h
│   ├── schema_meter_builder.h
│   ├── schema_meter_reader.h
│   ├── schema_meter_verifier.h
│   ├── stm32f4xx_hal_conf.h
│   └── stm32f4xx_it.h
├── lib
│   ├── libflatcc.a 
│   ├── libflatccrt.a 
└── Src
    ├── builder.c
    ├── main.c
    ├── stm32f4xx_hal_msp.c
    ├── stm32f4xx_it.c
    └── system_stm32f4xx.c

我只希望我的子目录(如Driver / CMSIS CMakeLists.txt)仅包含所有(* .h)文件,以便我的根CMakeLists.txt可以看到它并链接到/ STM32F4xx中的另一个子目录。

#root
SET(CMAKE_TOOLCHAIN_FILE ${CMAKE_SOURCE_DIR}/cmake/toolchain.cmake)
SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)

PROJECT(stm32f4discovery)

CMAKE_MINIMUM_REQUIRED(VERSION 3.4)
ENABLE_LANGUAGE(ASM)

add_subdirectory(Drivers/HAL)
add_subdirectory(Drivers/CMSIS)

INCLUDE_DIRECTORIES(
    Inc
)

SET(PROJECT_SOURCES
    Src/main.c
    Src/stm32f4xx_hal_msp.c
    Src/stm32f4xx_it.c
    Src/builder.c
    Inc/main.h
    Inc/stm32f4xx_hal_conf.h
)

ADD_EXECUTABLE(${CMAKE_PROJECT_NAME}.elf ${PROJECT_SOURCES} ${CMSIS_SOURCES} ${STM32HAL_SOURCES})

target_link_libraries(${CMAKE_PROJECT_NAME}.elf c rdimon m gcc)
target_link_libraries(${CMAKE_PROJECT_NAME}.elf asd)
target_link_libraries(${CMAKE_PROJECT_NAME}.elf asdf)

在我的/ STM32F4xx CMakeLists.txt中,我尝试使用 add_library(),以便可以通过根CMakeLists.txt“查看”我的文件,但是它不起作用。现在看起来像那样。

#CMSIS
include_directories(Include) 
add_subdirectory(STM32F4xx)

但是包含这样的源文件显然是错误的。

1 个答案:

答案 0 :(得分:0)

我在this answer上的多CMakeLists.txt结构体系结构的CMake上发现了相同的问题。