CMake常用语法
指定 cmake 最小版本
cmake_minimum_required(VERSION 3.4.1)
预定义变量
PROJECT_SOURCE_DIR # 工程的根目录
PROJECT_BINARY_DIR # 运行 cmake 命令的目录,通常是 ${PROJECT_SOURCE_DIR}/build
PROJECT_NAME # 返回通过 project 命令定义的项目名称
CMAKE_CURRENT_SOURCE_DIR # 当前处理的 CMakeLists.txt 所在的路径
CMAKE_CURRENT_BINARY_DIR # target 编译目录
CMAKE_CURRENT_LIST_DIR # CMakeLists.txt 的完整路径
CMAKE_CURRENT_LIST_LINE # 当前所在的行
CMAKE_MODULE_PATH # 定义自己的 cmake 模块所在的路径,SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然后可以用INCLUDE命令来调用自己的模块
EXECUTABLE_OUTPUT_PATH # 重新定义目标二进制可执行文件的存放位置
LIBRARY_OUTPUT_PATH # 重新定义目标链接库文件的存放位置
CMAKE_SOURCE_DIR # 工程目录
CMAKE_BINARY_DIR # 一般是build目录
环境变量
$ENV{Name}
set(ENV{Name} value) # 这里没有“$”符号
设置项目名称
project(demo)
同时会引入两个变量 demo_BINARY_DIR / PROJECT_BINARY_DIR, PROJECT_SOURCE_DIR/demo_SOURCE_DIR
设置 include 目录
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
设置 lib 目录
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/libs)
编译库, 可执行程序
add_executable(demo demo.cpp) # 生成可执行文件
add_library(common STATIC util.cpp) # 生成静态库
add_library(common SHARED util.cpp) # 生成动态库或共享库
链接库
target_link_libraries(demo
${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.a
boost_system.a
boost_thread
pthread)
Copy 文件
FILE(COPY ${CMAKE_CURRENT_SOURCE_DIR}/data DESTINATION ${CMAKE_BINARY_DIR})
设置 bin, lib 生成目录
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR})
set 追加变量
set(SRC_LIST main.cpp)
set(SRC_LIST ${SRC_LIST} test.cpp)
add_executable(demo ${SRC_LIST})
List 追加删除变量
set(SRC_LIST main.cpp)
list(APPEND SRC_LIST test.cpp)
list(REMOVE_ITEM SRC_LIST main.cpp)
add_executable(demo ${SRC_LIST})
搜索文件
aux_source_directory(. SRC_LIST)
aux_source_directory(protocol SRC_PROTOCOL_LIST)
add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})
# 或者
file(GLOB SRC_LIST "*.cpp" "protocol/*.cpp")
add_library(demo ${SRC_LIST})
# 或者
file(GLOB SRC_LIST "*.cpp")
file(GLOB SRC_PROTOCOL_LIST "protocol/*.cpp")
add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})
# 或者
file(GLOB_RECURSE SRC_LIST "*.cpp") #递归搜索
FILE(GLOB SRC_PROTOCOL RELATIVE "protocol" "*.cpp") # 相对protocol目录下搜索
add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})
打印信息
message(${PROJECT_SOURCE_DIR})
message("build with debug mode")
message(WARNING "this is warnning message")
message(FATAL_ERROR "this build has many error") # FATAL_ERROR 会导致编译失败
包含其他 cmake 文件
include(./common.cmake) # 指定包含文件的全路径
include(def) # 在搜索路径中搜索def.cmake文件
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) # 设置include的搜索路径
逻辑判断比较
if (expression) # expression 不为空(0,N,NO,OFF,FALSE,NOTFOUND)时为真
if (not exp) # 与上面相反
if (var1 AND var2)
if (var1 OR var2)
if (COMMAND cmd) # 如果 cmd 确实是命令并可调用为真
if (EXISTS dir) if (EXISTS file) # 如果目录或文件存在为真
if (file1 IS_NEWER_THAN file2) # 当 file1 比 file2 新,或 file1/file2 中有一个不存在时为真,文件名需使用全路径
if (IS_DIRECTORY dir) # 当 dir 是目录时为真
if (DEFINED var) # 如果变量被定义为真
if (var MATCHES regex) # 给定的变量或者字符串能够匹配正则表达式 regex 时为真,此处 var 可以用 var 名,也可以用 ${var}
if (string MATCHES regex)
数字比较
if (variable LESS number) # LESS 小于
if (string LESS number)
if (variable GREATER number) # GREATER 大于
if (string GREATER number)
if (variable EQUAL number) # EQUAL 等于
if (string EQUAL number)
字母顺序比较
if (variable STRLESS string)
if (string STRLESS string)
if (variable STRGREATER string)
if (string STRGREATER string)
if (variable STREQUAL string)
if (string STREQUAL string)
循环
foreach(i RANGE 1 9 2)
message(${i})
endforeach(i)