cmake 使用教程
一、demo
代码树
├── HARDWARE
│ ├── EXTI
│ │ └── exti.c
│ ├── INC
│ │ ├── exti.h
│ │ ├── key.h
│ │ └── led.h
│ ├── KEY
│ │ └── key.c
│ └── LED
│ └── led.c
├── Makefile
├── STM32F103RCTx_FLASH.ld
├── SYSTEM
│ ├── delay
│ │ ├── delay.c
│ │ └── delay.h
│ ├── readme.txt
│ ├── rtt
│ │ ├── SEGGER_RTT.c
│ │ ├── SEGGER_RTT.h
│ │ ├── SEGGER_RTT_ASM_ARMv7M.S
│ │ ├── SEGGER_RTT_Conf.h
│ │ └── SEGGER_RTT_printf.c
│ ├── sys
│ │ ├── core_cm3.h
│ │ ├── core_cmFunc.h
│ │ ├── core_cmInstr.h
│ │ ├── stm32f10x.h
│ │ ├── sys.c
│ │ ├── sys.h
│ │ └── system_stm32f10x.h
│ └── usart
│ ├── usart.c
│ └── usart.h
├── USER
│ ├── main.c
│ └── startup_stm32f10x_hd.s
├── build
CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 3.0)
PROJECT(STM32_REG_TEST1)
SET(TOOLCHAIN_PREFIX arm-none-eabi-)
SET(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc)
SET(CMAKE_BUILD_TYPE Debug)
SET(CMAKE_C_FLAGS_DEBUG "-g -gdwarf-2")
ADD_DEFINITIONS(-DSTM32F10X_HD)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mcpu=cortex-m3 -mthumb -specs=nano.specs -Wall -ffunction-sections -fdata-sections")
LINK_LIBRARIES(c m nosys)
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections -T${CMAKE_CURRENT_SOURCE_DIR}/STM32F103RCTx_FLASH.ld")
INCLUDE_DIRECTORIES(
${CMAKE_CURRENT_SOURCE_DIR}/SYSTEM/delay
${CMAKE_CURRENT_SOURCE_DIR}/SYSTEM/sys
${CMAKE_CURRENT_SOURCE_DIR}/SYSTEM/usart
${CMAKE_CURRENT_SOURCE_DIR}/SYSTEM/rtt
${CMAKE_CURRENT_SOURCE_DIR}/HARDWARE/INC
)
SET(SRC_LIST USER/main.c)
LIST(APPEND SRC_LIST USER/startup_stm32f10x_hd.s)
LIST(APPEND SRC_LIST SYSTEM/delay/delay.c)
LIST(APPEND SRC_LIST SYSTEM/sys/sys.c)
LIST(APPEND SRC_LIST SYSTEM/usart/usart.c)
LIST(APPEND SRC_LIST SYSTEM/rtt/SEGGER_RTT.c)
LIST(APPEND SRC_LIST SYSTEM/rtt/SEGGER_RTT_printf.c)
LIST(APPEND SRC_LIST HARDWARE/LED/led.c)
LIST(APPEND SRC_LIST HARDWARE/KEY/key.c)
LIST(APPEND SRC_LIST HARDWARE/EXTI/exti.c)
ADD_EXECUTABLE(main ${SRC_LIST})
二、基本语法
1. 变量
SET(TOOLCHAIN_PREFIX arm-none-eabi-)
=>设置一个变量TOOLCHAIN_PREFIX,值为arm-none-eabi-
SET(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc)
=>引用变量用 ${name}
2. 常用变量
CMAKE_C_COMPILER 指定C编译器
CMAKE_CXX_COMPILER 指定C++编译器
CMAKE_C_FLAGS 指定C编译选项
CMAKE_CXX_FLAGS 指定C++编译选项
CMAKE_EXE_LINKER_FLAGS 指定链接选项
CMAKE_SOURCE_DIR 工程目录顶层
CMAKE_CURRENT_SOURCE_DIR 当前CMakeLists.txt 所在的路径
CMAKE_CURRENT_LIST_FILE 当前CMakeLists.txt 的完整路径
CMAKE_CURRRENT_BINARY_DIR 当前make编译的目
EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH 生成target或库所在目录
PROJECT_NAME 项目名称
CMAKE_BUILD_TYPE Debug和Release两个选项
3. 常用命令
CMAKE_MINIMUM_REQUIRED(VERSION 3.0) cmake最低版本3.0
ADD_DEFINITIONS(-DSTM32F10X_HD) 添加宏定义
ADD_DEPENDENCIES(target-name depend-target1 depend-target2 ...) 定义target依赖其他target
ADD_EXECUTABLE(target ${SRC_LIST}) 说明源文件编译生成target
ADD_LIBRARY(test SHARED|STATIC|MODULE] ${LIBHELLO_SRC}) 生成库文件
ADD_SUBDIRECTORY(src_dir [binary_dir]) 向当前工程添加存放源文件的子目录
INCLUDE_DIRECTORIES(dir1 dir2 ...) 指定头文件的搜索路径, GCC -I
LINK_DIRECTORIES(dir1 dir2 ...) 动态链接库或静态链接库的搜索路径,GCC -L
TARGET_LINK_LIBRARIES(target ${test_library}) 添加链接库,GCC -l
LINK_LIBRARIES(c m nosys) 添加链接库,不指定target
三、编译
mkdir build && cd build
cmake ../
make clean && make