cmake-grammar
总结CMakeLists.txt中的语法。
demo
1 | cmake_minimum_required(VERSION 3.9) |
语法解析:
cmake命令可以分为脚本命令与项目命令。
脚本命令包括一些命令流控制(if、else、elseif、endif、break、continue...)、循环(while、endwhile、foreach、endforeach...)、设置(set、set_property、set_directory_properties...)、cmake相关(cmake_language、cmake_minimum_required...)、查找(find_file、find_library、find_package、find_path、find_program...)等等。
项目命令是涉及编译链接的命令。包括头文件目录、编译选项、编译生成目标文件、链接等。
指定cmake最小版本
cmake_minimum_required(VERSION 3.9)
project
:定义项目名称project(<PROJECT-NAME> [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]] ...)
- 还可以设置版本VERSION 、项目描述 DESCRIPTION 、编程语言 LANGUAGES 等。
set
:设置变量,包括normal、cache和environment。set(<variable> <value>... [PARENT_SCOPE])
OPTION
:Provide an option that the user can optionally select.Provides an option for the user to select as ON or OFF. If no initialis provided, OFF is used. option(<variable> "<help_text>" [value])
string(TOUPPER <string> <output_variable>)
:转换成大写configure_file
:Copy a file to another location and modify its contents.configure_file(<input> <output>...)
inlcude_directories
:向编译工程引入头文件目录。include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
add_subdirectory
:Add a subdirectory to the build.add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
target_link_libraries
:当链接目标文件时指定相关的库或者flag。target_link_libraries(<target> ... <item>... ...)
add_library
: 使用指定的源文件添加或生成一个库文件,生成静态或者动态共享库。add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] [source1] [source2 ...])
add_executable
:使用指定的源文件来生成可执行文件add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] [source1] [source2 ...])
target_include_directories
:为目标文件编译指定头文件目录,目标文件必须是通过add_executable()
和add_library()
创建的。target_include_directories(<target> [SYSTEM] [BEFORE] <INTERFACE|PUBLIC|PRIVATE> [items1...]
file(GLOB ...)
: 按指定格式搜索文件并将搜索结果存入变量中<variable>
。file(GLOB <variable> [LIST_DIRECTORIES true|false] [RELATIVE <path>] [CONFIGURE_DEPENDS] [<globbing-expressions>...])
install
:在项目安装时候指定规则.TARGETS
,安装的目的地LIBRARY
指定库被当作libraryDESTINATION
安装目录
FILES
指定了安装file的规则。用于头文件的安装
set_target_properties
:指定properties指示如何编译set_target_properties(target1 target2 ... PROPERTIES prop1 value1 prop2 value2 ...)
- targets的properties见https://cmake.org/cmake/help/latest/manual/cmake-properties.7.html#target-properties
- shared library必须指定 VERSION
和 SOVERSION
VERSION
:指定build versionSOVERSION
:指定API version
- shared library必须指定 VERSION
和 SOVERSION
find_package
:Finds and loads settings from an external project.-
CMAKE_BUILD_TYPE
: 指定项目的编译类型,Debug,Release等。PROJECT_BINARY_DIR
:运行cmake命令的目录,通常为${PROJECT_SOURCE_DIR}/build
。PROJECT_SOURCE_DIR
:当前工程的根目录,project()
命令所在的目录。CMAKE_CURRENT_BINARY_DIR
:target 编译目录。CMAKE_CURRENT_SOURCE_DIR
:当前处理的源文件所在目录。
参考资料
系统学习CMake资料:
- CMake Practice
- learning
cmake
- Introduction to CMake by Example
其他具体的参考资料:
每个subdirectory下面都有CMakeLists.txt。