CMAKE介绍
CMAKE 是一种跨平台的编译系统, 本文主要是简述cmake中一些常用的技巧, 将会以tips的形式来总结各个技术点.
参考文档:
https://cmake.org/cmake/help/v3.18/guide/tutorial/index.html // 官方英文文档
https://chenxiaowei.gitbook.io/cmake-cookbook/ // 中文文档
https://cgold.readthedocs.io/en/latest/overview/cmake-can.html // 带实例介绍的cmake英文技术文档
第一个cmake工程
https://github.com/musiclvme/ToolsPackages/tree/master/CMAKE/01.helloword
- CMakeLists.txt范例如下, 含义可以见每一行的注释说明.
- 编译
mkdir build; cd build; cmake ..; make
# cmake 最小版本要求
cmake_minimum_required (VERSION 3.6)
#指定project名字
project(Mydemo)
#打印log
message("This is a test demo")
#定义变量DEMO_SRC, 表示需要编译的源码文件
file(GLOB_RECURSE DEMO_SRC "${CMAKE_SOURCE_DIR}/src/*.c")
#根据前面定义的DEMO_SRC,生成可执行文件demo
add_executable(demo ${DEMO_SRC})
#target依赖的头文件目录定义
target_include_directories(demo PUBLIC ${CMAKE_SOURCE_DIR})
CMAKE TIPS
- cmake生成代码
使用configure_file命令, 会在顶级源码目录创建include目录,并生成config.h
#设置变量
set(ENABLE_INTERFACE ON)
# generate .h from config.h.in
configure_file (
"${PROJECT_SOURCE_DIR}/script/config.h.in"
"${PROJECT_SOURCE_DIR}/include/config.h"
)
config.h.in
#define ENABLE_INTERFACE @ENABLE_INTERFACE@
- cmake更改编译器
set(CMAKE_C_COMPILER ${compiler_dir}${CROSS_COMPILE}gcc)
set(CMAKE_AR "${compiler_dir}${CROSS_COMPILE}ar" CACHE FILEPATH "" FORCE)
set(CMAKE_AS "${compiler_dir}${CROSS_COMPILE}as")
set(CMAKE_LD "${compiler_dir}${CROSS_COMPILE}ld")
SET(CMAKE_STRIP "${compiler_dir}${CROSS_COMPILE}strip")
set(CMAKE_C_FLAGS "-g -O3 -Os -mcpu=cortex-m33 -mfpu=fpv5-sp-d16 -mfloat-abi=hard -mabi=aapcs -Wl,--gc-sections -ffunction-sections -mthumb -nostdlib")
需要注意的是更改编译器的设置需要放在 project(xxx)之前, 不然就会让编译器进入死循环!!
- cmake执行shell命令: execute_process
COMMAND 后面跟shell 命令
RESULT_VARIABLE 后面跟的变量保存执行的结果, 成功或是失败
OUTPUT_VARIABLE 后面定义的变量返回命令的结果
execute_process(COMMAND which gcc
RESULT_VARIABLE GCC_RESULT_STRING
OUTPUT_VARIABLE GCC_OUTPUT_STRING)
- cmake add_custom_command执行shell命令
set(ADD_HEADER_SRC "add.h")
set(ADD_HEADER_INC "add.h")
add_custom_command(OUTPUT ${ADD_HEADER_INC}
COMMAND echo "Generating addlibs header file..."
COMMAND ${CMAKE_COMMAND} -E copy ${ADD_LIB_DIR}/${ADD_HEADER_SRC} ${CMAKE_CURRENT_BINARY_DIR}/${ADD_HEADER_INC}
)
add_library(addlibs STATIC ${ADD_SRCS} ${ADD_HEADER_INC})
这个需要把add_custom_command输出和target关联,不然不会执行
- 待添加...
实例代码:
https://github.com/musiclvme/ToolsPackages/tree/master/CMAKE