• Cmake常用命令(一)


    概要

    Cmake就是一门脚本语言,用于生成Makefile.

    exec_program

    在 CMakeList.txt 文件中运行一条shell命令

    示例

    exec_program("export LD_LIBRARY_PATH=../../third-64/protobuf/lib/ && ../../third-64/protobuf/bin/protoc --cpp_out=./c/ *.proto" ${DIR})

    表示在${DIR}目录里运行字符串里的命令

    cmake_minimum_required

    该命令指明了对cmake的最低()版本的要求,...为低版本和高版本之间的连接符号

    示例

    cmake_minimum_required (VERSION 3.12.2...3.10.2)

    project

    语法

    project(<PROJECT-NAME> [<language-name>...])

    project命令用于指定cmake工程的名称,实际上,它还可以指定cmake工程的版本号(VERSION关键字)、简短的描述(DESCRIPTION关键字)、主页URL(HOMEPAGE_URL关键字)和编译工程使用的语言(LANGUAGES关键字)。

    这个命令的有个附加功能,就是给默认变量进行赋值。如:

    ·  PROJECT_NAME:将当前工程的名称赋值给PROJECT_NAME,对于本例子,就是${PROJECT_NAME}=mytest。

    ·  PROJECT_SOURCE_DIR:当前工程的源码路径。

    ·  <PROJECT-NAME>_SOURCE_DIR:指定工程的源码路径,这个变量和PROJECT_SOURCE_DIR的区别就是,<PROJECT-NAME>_SOURCE_DIR跟具体的工程名字关联起来,若<PROJECT-NAME>就是当前工程,则该变量和PROJECT_SOURCE_DIR相等。

    ·  PROJECT_BINARY_DIR:当前工程的二进制路径。

    ·  <PROJECT-NAME>_BINARY_DIR:指定工程的二进制路径,这个变量和PROJECT_BINARY_DIR的区别就是,<PROJECT-NAME>_BINARY_DIR跟具体的工程名字关联起来,若<PROJECT-NAME>就是当前工程,则该变量和PROJECT_BINARY_DIR相等。

    ·  CMAKE_PROJECT_NAME:顶层工程的名称。例如当前调用的CMakeLists.txt位于顶层目录(可以理解为使用cmake命令首次调用的那个CMakeLists.txt),那么工程名还会赋值给CMAKE_PROJECT_NAME。


    set

    可以对三类变量进行赋值,分别是一般变量,缓存变量和环境变量

    一般变量(Set Normal Variable)

    语法

    set(<variable> <value>... [PARENT_SCOPE])
    1. variable:只能有一个
    2. value:可以有0个,1个或多个,当value值为空时,方法同unset,用于取消设置的值
    3. PARENT_SCOPE(父作用域):作用域,传递给上层函数或者上层CMakeList.txt。不带这个参数,作用域在函数中,或本CMakeList.txt中。

    缓存变量(Set Cache Entry)

    语法

    set(<variable> <value>... CACHE <type> <docstring> [FORCE])

    和命令行中使用 -D的形式保持一致

    它是跨作用域的

    如果之前设置过,则不会覆盖之前的值,除非使用FORCE

    环境变量

    语法

    set(ENV{<variable>} [<value>])

    1)该命令设置的环境变量只在当前的cmake进程生效,既不会影响调用者的环境变量,也不会影响系统环境变量。(与schell环境独立)
    2)如果<value>值为空或者ENV{<variable>}后没有参数,则该命令会清除掉当前环境变量的值。
    3)<value>后的参数会被忽略。

    Option

    通常用法,CMake中的option用于控制编译流程,相当于C语言中的宏条件编译。与add_definitions配合使用。

    语法

    option(<variable> "<help_text>" [value])
    • variable:定义选项名称
    • help_text:说明选项的含义
    • value:定义选项默认状态,一般是OFF或者ON除去ON之外,其他所有值都为认为是OFF

    使用场景 : 编译脚本传递参数 -> CMake脚本接收option -> 源代码宏

    Message

    make 中的 message 命令就像是 C 语言中的 printf 函数,该命令可以将变量的值显示到终端。

    语法

    message([<mode>] "message text" ...)

    mode 的值包括 FATAL_ERRORWARNINGAUTHOR_WARNINGSTATUSVERBOSE等。我主要使用其中的 2 ——FATAL_ERRORSTATUS

    FATAL_ERROR:产生 CMake Error,会停止编译系统的构建过程;

    STATUS:最常用的命令,常用于查看变量值,类似于编程语言中的 DEBUG 级别信息。

    "message text"为显示在终端的内容。可以将变量(缓存变量、环境变量)值打印出来,注意需要在双引号内部。

    List

    语法

    list (subcommand <list> [args...])

    subcommand为具体的列表操作子命令,例如读取、查找、修改、排序这四大类。<list>为待操作的列表变量,[args...]为对列表变量操作需要使用的参数表,不同的子命令对应的参数也不一致。

    list命令即对列表的一系列操作,cmake中的列表变量是用分号;分隔的一组字符串,创建列表可以使用set命令,例如:set (var a b c d)创建了一个列表 "a;b;c;d"

    列表的读取

    命令

    格式

    解释

    示例

    LENGTH

    list (LENGTH <list> <output variable>)

    读取列表长度

    <output variable>为新创建的变量,用于存储列表的长度

    set (list_test a b c d) # 创建列表变量"a;b;c;d"
    list (LENGTH list_test length)

    GET

    list (GET <list> <element index> [<element index> ...] <output variable>)

    读取列表中指定索引的的元素,可以指定多个索引

    0开始编号,索引0的元素为列表中的第一个元素;索引也可以是负数,-1表示列表的最后一个元素

    set (list_test a b c d) # 创建列表变量"a;b;c;d"
    list (GET list_test 0 1 -1 -2 list_new)

    JOIN

    list (JOIN <list> <glue> <output variable>)

    将列表中的元素用连接字符串连接起来组成一个字符串

    set (list_test a b c d) # 创建列表变量"a;b;c;d"
    list (JOIN list_test -G- list_new)

    SUBLIST

    list (SUBLIST <list> <begin> <length> <output variable>)

    用于获取列表中的一部分(子列表)

    set (list_test a b c d) # 创建列表变量"a;b;c;d"
    list (SUBLIST list_test 1 2 list_new)


    列表的查找

    命令

    格式

    解释

    示例

    FIND

    list (FIND <list> <value> <output variable>)

    查找列表是否存在指定的元素

    set (list_test a b c d) # 创建列表变量"a;b;c;d"
    list (FIND list_test d list_index)

    列表的修改

    命令

    格式

    解释

    示例

    APPEND

    list (APPEND <list> [<element> ...])

    用于将元素追加到列表

    set (list_test a b c d) # 创建列表变量"a;b;c;d"
    list (APPEND list_test 1 2 3 4)

    FILTER

    list (FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>)

    根据正则表达式包含或排除列表中的元素

    list (FILTER list_test INCLUDE REGEX [a-z])

    INSERT

    list (INSERT <list> <element_index> <element> [<element> ...])

    在指定位置将元素(一个或多个)插入到列表中

    list (INSERT list_test 0 8 8 8 8)

    POP_BACK

    list (POP_BACK <list> [<out-var>...])

    将列表中最后元素移除

    <out-var>如果未指定输出变量,则仅仅是将原列表的最后一个元素移除。如果指定了输出变量,则会将最后一个元素移入到该变量,并将元素从原列表中移除。如果指定了多个输出变量,则依次将原列的最后一个元素移入到输出变量中,如果输出变量个数大于列表的长度,那么超出部分的输出变量未定义。

    list (POP_BACK list_test)

    POP_FRONT

    list (POP_FRONT <list> [<out-var>...])

    将列表中第一个元素移除

    list (POP_FRONT list_test)

    PREPEND

    list (PREPEND <list> [<element> ...])

    将元素插入到列表的0索引位置

    list (PREPEND list_test p q r s t)

    REMOVE_ITEM

    list (REMOVE_ITEM <list> <value> [<value> ...])

    将指定的元素从列表中移除

    list (REMOVE_ITEM list_test a)

    当指定的值在列表中存在重复的时候,会删除所有重复的值

     

    列表的排序

    命令

    格式

    解释

    示例

    REVERSE

    list (REVERSE <list>)

    用于将整个列表反转

    list (REVERSE list_test)

    SORT

    list (SORT <list> [COMPARE <compare>] [CASE <case>] [ORDER <order>])

    对列表进行排序

    list (SORT list_test) # 以字母顺序,按照大小写敏感方式,升序排列
    list (SORT list_test COMPARE NATURAL ORDER DESCENDING) # 以自然顺序,降序排列

  • 相关阅读:
    (2023 最新版)IntelliJ IDEA 下载安装及配置教程
    Java笔记:Java虚拟机的指令
    RORγ 反向激动剂-XY101 小分子化合物
    设计模式之策略模式
    如何在电脑和 SD 卡上恢复已删除 MOV等视频文件
    python接口自动化测试之接口数据依赖
    为什么Android 开发都在意Framework 底层知识?
    【图像增强】基于萤火虫算法实现图像对比度增强附matlab代码
    Django——模板应用
    爱普生L3153打印机如何清洗喷头
  • 原文地址:https://blog.csdn.net/zhanglehes/article/details/125613227