cmake指令记录

来源:互联网 发布:js日期格式化 format 编辑:程序博客网 时间:2024/05/18 10:30
PROJECT定义工程名称PROJECT(projectname [CXX] [C] [JAVA])改变量隐式定义了两个cmake变量:<projectname>_BINARY_DIR, <projectname>_SOURCE_DIRcmake预定义的两个等价变量: PROJECT_BINARY_DIR, PROJECT_SOURCE_DIRSET显示定义变量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依赖的其它targetADD_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>)- FILEFILE(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 cmakevim 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( “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文件
0 0
原创粉丝点击