zoukankan      html  css  js  c++  java
  • 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帮助文档

  • 相关阅读:
    TCP/IP详解学习笔记(3)IP协议ARP协议和RARP协议
    TCP/IP详解学习笔记(2)-数据链路层
    TCP/IP详解学习笔记(1)-基本概念
    HTTP协议学习
    Windows下Git多账号配置,同一电脑多个ssh-key的管理
    Linux定时任务Crontab命令详解
    样式化复选框(Styling Checkbox)
    emmm 深入浅出教你看懂现代金融游戏
    今日工作收获(2018/2/27)
    html upload_file 对象(2018/02/26)工作收获
  • 原文地址:https://www.cnblogs.com/corfox/p/5414982.html
Copyright © 2011-2022 走看看