cmake指令记录

cmake指令记录

PROJECT定义工程名称
PROJECT(projectname [CXX] [C] [JAVA])
改变量隐式定义了两个cmake变量:<projectname>_BINARY_DIR, <projectname>_SOURCE_DIR
cmake预定义的两个等价变量: PROJECT_BINARY_DIR, PROJECT_SOURCE_DIR

SET显示定义变量
SET(VAR [VALUE] [CACHE TYPE OF DOCSTRING [FORCE]])

MESSAGE用于向终端输出用户定义的信息
MESSAGE([SEND_ERROR | STATUS | FATAL ERROR] "message to display" ...)
SEND_ERROR,产生错误信息,生成过程被跳过
STATUS,输出前缀为-的信息
FATAL_ERROR,立即终止所有的cmake过程


ADD_EXECUTABLE用指定的源文件生成指定名称的可执行文件
ADD_EXECUTABLE(NAME [WIN32] [MAXOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1, source2, ..., sourceN)

ADD_LIBRARY用指定的源文件生成指定名称的库文件
ADD_LIBRARY(libname [SHARED | STATIC | MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
SET_TARGET_PROPERTIES用于设定目标文件的属性
SET_TARGET_PROPERTIES(target1 target2 ... PROPERTIES prop1 value1 prop2 value2 ..)
    prop有OUTPUT_NAME CLEAN_DIRECT_OUTPUT VERSION(动态库版本) SOVERSION(API版本)
GET_TARGET_PROPERTIES用于获得目标文件的属性
GET_TARGET_PROPERTIES(VAR target property)

ADD_SUBDIRECTORY用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置。
ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
EXCLUDE_FROM_ALL,用于将这个目录从编译过程中排除(如:工程的example)

变量EXECUTABLE_OUTPUT_PATH, LIBRARY_OUTPUT_PATH用于指定最终生成的二进制文件与库文件的位置

make install将生成的目的文件安装在/usr/bin目录下,可以通过CMAKE_INSTALL_PREFIX指定安装目录的前缀,如:
cmake -DCMAKE_INSTALL_PREFIX=/usr .

INSTALL命令用于定义安装规则,安装的内容可以包括二进制文件、静态库、动态库、文件、目录、脚本等

目标文件的安装
INSTALL(TARGETS targets... [EXPORT <export-name>] 
        [[ARCHIVE | LIBRARY | RUNTIME | FRAMEWORK | BUNDLE | PRIVATE_HEADER | PUBLIC_HEADER | RESOURCE]
        [DESTINATION <dir>]
        [INCLUDES_DESTINATION <dir> ...]
        [PERMISSIONS permissions...]
        [CONFIGURATIONS [Debug | Release | ...]]
        [COMPONENT <component>]
        [OPTIONAL] [NAMELINK_ONLY | NAMELINK_SKIP]
        ] [...])    
普通文件的安装
INSTALL(FILES file... DESTINATION <dir>
        [PERMISSIONS permissions...]
        [CONFIGURATIONS [Debug | Release | ...]]
        [COMPONENT <component>]
        [RENAME <name>] [OPTIONAL])
非目标文件的可执行程序安装(如脚本等)
INSTALL(PROGRAMS files... DESTINATION <dir>
        [PERMISSIONS permissions...]
        [CONFIGURATIONS [Debug | Release | ...]]
        [COMPONENT <component>]
        [RENAME <name>] [OPTIONAL])
目录的安装
INSTALL(DIRECTORY dirs... DESTINATION <dir>
        [FILE_PERMISSIONS permissions...]
        [DIRECTORY_PERMISSIONS permissions...]
        [USE_SOURCE_PERMISSIONS] [OPTIONAL]
        [CONFIGURATIONS [Debug | Release | ...]]
        [COMPONENT <component>] [FILES_MATCHING]
        [[PATTERN <pattern> | REGEX <regex>] [EXCLUDE] [PERMISSIONS permissions...]] [...])
注意:如果dirs不以/结尾,那么dirs这个目录安装到目标路径中;如果以/结尾,那么dirs中的内容安装到目标路径中
安装时CMAKE脚本的执行
INSTALL([SCRIPT <file>] [CODE <code>] [...])
SCRIPT参数用于在安装时调用cmake脚本文件(如:abc.cmake文件)
CODE参数用于执行CMAKE指令,必须以双引号括起来

INCLUDE_DIRECTORIES用于向工程添加多个特定的头文件搜索路径,路径之间用空格分割;如果路径包含了空格,可以使用双引号将它括起来。
默认的行为是追加到当前头文件搜索路径的后面,可以通过AFERTER和BEFORE控制,或SET(CMAKE_INCLUDE_DIRECTORIES_BEFORE ON)来设置
INCLUDE_DIRECTORIES([AFTER | BEFORE] [SYSTEM] dir1 dir2...)

LINK_DIRECTORIES添加非标准的共享库搜索路径
LINK_DIRECTORIES(dir1 dir2...)

TARGET_LINK_LIBRARIES为target添加需要链接的共享库
TARGET_LINK_LIBRARIES(target lib1 <debug|optimized> lib2...)

特殊的环境的环境变量CMAKE_INCLUDE_PATH CMAKE_LIBRARY_PATH用于指定头文件和库文件的路径

FIND_PATH用于在指定路径中搜索文件名
FIND_PATH(<VAR> name1 [path1 path2...])

- ${}:cmake变量的引用形式(取变量的值),但在IF语句中变量是直接引用变量名。
- 指令的一般形式:指令(参数1 参数2 ...) 参数使用括号括起,参数之间用空格或分号隔开。
- 指令不区分大小写,但变量与参数区分大小写。
- cmake自定义变量有两种形式:隐式定义和显示定义(SET)
- make clean 清理工程,对构建结果进行清理。
- 推荐使用外部构建(out-of-source build),而尽量少使用内部构建(in-source build)。
- 如果需要改变目标文件的存放路径,那么就在ADD_EXECUTABLE或ADD_LIBRARY的所在的那个CMakeLists.txt文件中,
加入SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)或SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
- CMAKE_BINARY_DIR PROJECT_BINARY_DIR <projectname>_BINARY_DIR:内部构建时,这些变量指的是工程顶层目录;外部构建时,指的是工程编译发生的目录。
- CMAKE_SOURCE_DIR PROJECT_SOURCE_DIR <projectname>_SOURCE_DIR:不论采用何种编译方式,都指的是工程顶层目录。
- CMAKE_CURRENT_SOURCE_DIR:指当前处理的CMakeLists.txt所在的路径。
- CMAKE_CURRENT_BINARY_DIR:指target编译目录
- CMAKE_CURRENT_LIST_FILE:输出调用这个变量的CMakeLists.txt的完整路径。
- CMAKE_CURRENT_LIST_LINE:输出这个变量所在的行。
- CMAKE_MODULE_PATH:用来定义自己的cmake模块所在的路径。
- EXECUTABLE_OUTPUT_PATH LIBRARY_OUTPUT_PATH:用来定义最终结果的存放路径
- PROJECT:用来定义项目的名称。
- cmake调用环境变量的方式:$ENV{NAME}
- CMAKE_INCLUDE_CURRENT_DIR:自动添加CMAKE_CURRENT_SOURCE_DIR和CMAKE_CURRENT_BINARY_DIR到当前处理的CMakeLists.txt文件中,等价于INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
- CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE:将工程提供的头文件目录始终至于系统头文件的前面。
- CMAKE_INCLUDE_PATH CMAKE_LIBRARY_PATH:环境变量,用于指定cmake的头文件和库文件目录。
- CMAKE_MAJOR_VERSION:cmake主版本号
- CMAKE_MINOR_VERSION:cmake次版本号
- CMAKE_PATCH_VERSION:cmake补丁升级号
- CMAKE_SYSTEM:系统名称,如Linux-3.16.0
- CMAKE_SYSTEM_NAME:系统名称,不包含版本号
- CMAKE_SYSTEM_VERSION:系统版本号
- CMAKE_SYSTEM_PROCESSOR:处理器名称
- UNIX:在所有的类UNIX平台为true
- WIN32:在所有的win32平台为true
- CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS:用来控制IF ELSE语句的书写方式
- BUILD_SHARED_LIBS:用来控制默认的库编译方式,不设置该变量,默认是静态的。
- CMAKE_BUILD_TYPE: 指定编译的版本(Release or Debug)
- CMAKE_C_FLAGS:设置C编译选项,也可使用ADD_DEFINITIONS()添加
- CMAKE_CXX_FLAGS:设置C++编译选项,也可使用ADD_DEFINITIONS()添加。
- CMAKE_C_COMPILER: 指定使用的C编译器
- CMAKE_CXX_COMPILER: 指定使用的C++编译器
- ADD_DEFINITIONS:向C/C++编译器添加-D定义,如ADD_DEFINITIONS(-DENABLE_DEBUG -DABC),如果代码中定义了#ifdef ENABLE_DEBUG ... #endif那么这段代码生效
- ADD_DEPENDENCIES:定义target依赖的其它target
ADD_DEPENDENCIES(target-name depend-target1 depend-target2)
- ENABLE_TESTING:用来控制Makefile是否构建test目标
- ADD_TEST:ADD_TEST(testname Exename arg1 arg2...)
- AUX_SOURCE_DIRECTORY:用于发现一个目录下的所有源文件,并将列表存储在一个变量中
AUX_SOURCE_DIRECTORY(dir VARIABLE)
- CMAKE_MINIMUM_REQUIRED:指定编译工程所需要的最小cmake版本号
CMAKE_MINIMUM_REQUIRED(VERSION number [FATAL_ERROR])
- EXEC_PROGRAM:用于在指定的目录运行某个程序,通过ARGS添加参数
EXEC_PROGRAM(Executable <directory in which to run> ARGS <arguments to executable> OUTPUT_VARIABLE <var> RETURN_VALUE <var>)
- FILE
FILE(WRITE filename "message to write"... )
FILE(APPEND filename "message to write"... )
FILE(READ filename variable)
FILE(GLOB variable [RELATIVE path] [globbing expressions]...)
FILE(GLOB_RECURSE variable [RELATIVE path][globbing expressions]...)
FILE(REMOVE [directory]...)
FILE(REMOVE_RECURSE [directory]...)
FILE(MAKE_DIRECTORY [directory]...)
FILE(RELATIVE_PATH variable directory file)
FILE(TO_CMAKE_PATH path result)
FILE(TO_NATIVE_PATH path result)
- INCLUDE用于载入CMakeLists.txt文件,也用于载入cmake模块
INCLUDE(<file | module> [OPTIONAL] [RESULT_VARIABLE <VAR>] [NO_POLICY_SCOPE])
- FIND_FILE(<VAR> name1 path1 path2...):VAR变量代表找到的文件全路径,包含文件名
- FIND_LIBRARY(<VAR> name1 path1 path2...):VAR代表找到的库全路经,包库文件名
- FIND_PATH(<VAR> name1 path1 path2...):VAR代表包含这个文件的路径
- FIND_PROGRAM(<VAR> name1 path1 path2...):VAR代表包含这个程序的全路经
- FIND_PACKAGE:用来调用预定义在CMAKE_MODULE_PATH下的Find<name>.cmake模块
FIND_PACKAGE(<name> [version] [EXACT] [QUIET] [MODULE] [REQUIRED] [[COMPONENTS] [components...]] 
        [OPTIONAL_COMPONETS components...] [NO_POLICY_SCOPE])
每一个模块都会定义以下几个变量:
    <name>_FOUND    <name>_INCLUDE_DIR or <name>_INCLUDES   <name>_LIBRARY or <name>_LIBRARIES
- IF(expression)
    COMMAND1(ARGS...)
    COMMAND2(ARGS...)
    ...
  ELSEIF(expression)
    COMMAND1(ARGS...)
    COMMAND2(ARGS...)
    ...
  ELSE(expression)
    COMMAND1(ARGS...)
    COMMAND2(ARGS...)
    ...
  ENDIF(expression)
IF(NOT var) IF(var1 AND var2) IF(var1 OR var2) IF(COMMAND cmd) IF(EXISTS file) IF(EXISTS dir) IF(IS_DIRECTORY dir)
IF(file1 IS_NEWER_THAN file2) IF(variable MATCHES regex) IF(string MATCHES regex)
IF(DEFINED variable)
# 数字比较
IF(variable LESS number)
IF(string LESS number)
IF(variable GREATER number)
IF(string GREATER number)
IF(variable EQUAL number)
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)
- WHILE(condition)
    COMMAND1(ARGS ...)
    COMMAND2(ARGS ...)
    ...
    ENDWHILE(condition)
- FOREACEH
# 列表
FOREACH(loop_var arg1 arg2 ...)
    COMMAND1(ARGS ...)
    COMMAND2(ARGS ...)
    ...
    ENDFOREACH(loop_var)
# 范围
FOREACH(loop_var arg1 arg2 ...)
    COMMAND1(ARGS ...)
    COMMAND2(ARGS ...)
    ...
    ENDFOREACH(loop_var)
# 范围和步进
FOREACH(loop_var RANGE start stop [step])
ENDFOREACH(loop_var)

- 自定义模块
mkdir build src cmake
vim cmake/FindHELLO.cmake
-----------
FIND_PATH(HELLO_INCLUDE_DIR hello.h /home/corfox/Test/cmake/backup/cmake/t3/lib)
FIND_LIBRARY(HELLO_LIBRARY hello /home/corfox/Test/cmake/backup/cmake/t3/build)
IF(HELLO_INCLUDE_DIR AND HELLO_LIBRARY)
    SET(HELLO_FOUND TRUE)
ENDIF(HELLO_INCLUDE_DIR AND HELLO_LIBRARY)
IF(HELLO_FOUND)
    IF(NOT HELLO_FIND_QUIETLY)
        MESSAGE(STATUS "Found Hello: ${HELLO_LIBRARY}")
    ENDIF(NOT HELLO_FIND_QUIETLY)
ELSE(HELLO_FOUND)
    IF(HELLO_FIND_REQUIRED)
        MESSAGE(FATAL_ERROR "Could not find hello library")
    ENDIF(HELLO_FIND_REQUIRED)
ENDIF(HELLO_FOUND)
---------------------
vim src/main.c
------------------------
#include "hello.h"

int main() {
    HelloFunc();
    return 0;
}
-------------------------
vim src/CMakeLists.txt
--------------------------
MESSAGE(STATUS "CMAKE_MODULE_PATH=" ${CMAKE_MODULE_PATH})
FIND_PACKAGE(HELLO)
IF(HELLO_FOUND)
    INCLUDE_DIRECTORIES(${HELLO_INCLUDE_DIR})
    #   LINK_DIRECTORIES(/home/corfox/Test/cmake/backup/cmake/t3/build)
    ADD_EXECUTABLE(hello main.c)
    TARGET_LINK_LIBRARIES(hello ${HELLO_LIBRARY})
    MESSAGE(STATUS "HELLO_INCLUDE_DIR=" ${HELLO_INCLUDE_DIR})
    MESSAGE(STATUS "HELLO_LIBRARY=" ${HELLO_LIBRARY})
ENDIF(HELLO_FOUND)
-------------------
vim CMakeLists.txt
-----------------------
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(MAIN)
MESSAGE(STATUS "PROJECT_SOURCE_DIR=" ${PROJECT_SOURCE_DIR})
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
MESSAGE(STATUS "CMAKE_MODULE_PATH=" ${CMAKE_MODULE_PATH})
ADD_SUBDIRECTORY(src)


OPTION(<VAR> "help string describing option" [ON | OFF]),定义cmake开关选项,ON打开,OFF关闭,如:
OPTION(TEST_DEBUG_SWITCH "Open test debug macro" OFF)
IF(TEST_DEBUG_SWITCH)
ADD_DEFINITIONS(-DTEST_DEBUG)
END(TEST_DEBUG_SWITCH)

- CMAKE_C_COMPILER: 指定使用的C编译器
- CMAKE_CXX_COMPILER: 指定使用的C++编译器
cmake -G <generator-name> 参数指定编译系统的生成器类型:
cmake -G "Visual Studio 12 2013": 指定生成VS2013的项目文件
cmake -G "MSYS Makefiles": 指定生成MSYS Makefile文件
cmake -G "MinGW Makefiles": 指定生成用于minw32-make的Makefile文件
cmake -G "Unix Makefiles": 指定生成标准的Unix Makefile文件

参考
1. cmake实践
2. cmake帮助文档

原文地址:https://www.cnblogs.com/corfox/p/5414982.html