本文给出了 cmake 中的 一些常用的 指令,可以快速了解,为后面的内容深入 打点基础。

本专栏的详细实践代码全部放在 github 上,欢迎 star !!!

如有问题,欢迎留言、或加群【392784757】交流

注释

# 行注释

#[[
多行注释
]] message(" " #[[这里也可以注释]] "")

message

在学习时 可以多用message() 来输出 想要查看的变量

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

一般使用

message("msg1" "msg2" "msg3")

进阶使用-指定日志级别

message([] "message ... ")

--log-level

标准输出 stdout

错误输出 stderr

日志级别

  1. FATAL_ERROR 停止cmake运行和生成 printed to stderr
  2. SEND_ERROR cmake继续运行,生成跳过 printed to stderr
  3. WARNING printed to stderr
  4. none printed to stderr
  5. STATUS 项目用户可能感兴趣的信息 stdout
  6. VERBOSE 针对项目用户的详细信息 stdout
  7. DEBUG 项目本身的开发人员使用的信息
  8. TRACE 非常低级实现细节的细粒度消息

set

set 主要是涉及变量的创建、和修改

cmake 变量,包括两个部分,内置变量、自定义变量

内置变量 可进一步细分

  • 信息变量 project_name
  • 行为变量 BUILD_SHARED_LIBS
  • 描述系统的变量 MSVC、WIN32、CMAKE_SYSTEM_NAME
  • 控制构建的变量
  • ...

自定义变量,常为了更好控制 CMakeLists.txt 结构 ,逻辑流程,来定义一些变量,更好地辅助我们编写

如,

set(package_dir "") # 安装后的位置

set(package_root "") # 源码的位置

unset() 取消定义的变量

file

cmake fille 命令页面 :https://cmake.org/cmake/help/latest/command/file.html#file



常用的file 可分为是三个方面【其他的还有 Locking、 Path Conversion、Transfer、 archiving】

  • reading
  • writing
  • filesystem

下面给出了一些常用的 file 指令

  1. 创建与删除 文件/文件夹
file(MAKE_DIRECTORY files)
file(TOUCH files/4.txt)
file(TOUCH files/5.txt) file(REMOVE 1.txt)
file(REMOVE_RECURSE files/4.txt)
  1. 创建写入\追加 文件
file(WRITE main.cpp [=[

#include<iostream>
using namespace std;
int main()
{
cout<<"hello file create"<<endl;
return 0;
} ]=]) file(WRITE output.txt "hello cmake,1,你好 cmake\n")
file(APPEND output.txt "this is additional content.")
  1. file 检索文件保存到 list ,然后进行遍历
file(GLOB_RECURSE all_files *.txt)

math(EXPR cnt "0")
foreach(file ${all_files})
message("file_${cnt}: ${file}")
math(EXPR cnt "${cnt}+1")
endforeach(file ${all_files})
  1. file 拷贝文件、安装文件等
file(COPY_FILE 2.txt 2_copy.txt)
file(COPY 2.txt DESTINATION files/2.txt) file(INSTALL 2.txt DESTINATION ${CMAKE_PREFIX_PATH}/)

github上给出了更多详细的实践教程

foreach

cmake 中的 for 循环,相关指令签名如下

foreach(<loop_var> <items>)
<commands>
endforeach()
#
foreach(<loop_var> RANGE <stop>) foreach(<loop_var> RANGE <start> <stop> [<step>]) foreach(<loop_var> IN [LISTS [<lists>]] [ITEMS [<items>]])

主要是用来遍历 list ,

下面的CMakeLists.txt 给出了相关例子

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)

project(foreach_argument LANGUAGES CXX)

list(APPEND files a.cpp b.cpp)

math(EXPR cnt "0")
foreach(file ${files})
# message(STATUS "file_${cnt} ${file}")
math(EXPR cnt "${cnt}+1")
endforeach() foreach(i RANGE 10)
# message(STATUS "${i}")
endforeach(i RANGE 10) foreach(i RANGE 0 10 2)
message(STATUS "${i}")
endforeach(i RANGE 10)

if

if()

elseif()

else()

endif()

【CMake系列】03-cmake 注释、常用指令 message、set、file、for_each、流程控制if的更多相关文章

  1. CMake学习笔记三:cmake 常用指令

    1 基本指令 1,ADD_DEFINITIONS 向 C/C++编译器添加-D 定义,比如: DD_DEFINITIONS(-DENABLE_DEBUG -DABC),参数之间用空格分割. 如果你的代 ...

  2. 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  3. 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE【转】

    本文转载自:http://www.cnblogs.com/52php/p/5681745.html 前言: 开发了5,6年的时间,如果没有KDE4,也许不会有人或者Linux发行版本重视cmake,因 ...

  4. mysqlQL 5.7 安装报错CMake Error at cmake/boost.cmake:81 (MESSAGE)

    CMake Error at cmake/boost.cmake:81 (MESSAGE): You can download it with -DDOWNLOAD_BOOST=1 -DWITH_BO ...

  5. CMake Error at cmake/boost.cmake:76 (MESSAGE):

    编译mysql5.7.9的时候报错 CMake Error at cmake/boost.cmake:76 (MESSAGE): You can download it with -DDOWNLOAD ...

  6. Vue系列(一):简介、起步、常用指令、事件和属性、模板、过滤器

    一. Vue.js简介 1. Vue.js是什么 Vue.js也称为Vue,读音/vju:/,类似view,错误读音v-u-e 是一个轻量级MVVM(Model-View-ViewModel)框架,和 ...

  7. 编译mysql时CMake Error at cmake/readline.cmake:85 (MESSAGE)

    CMake Error at cmake/readline.cmake:85 (MESSAGE):  Curses library not found.  Please install appropr ...

  8. JVM系列【5】JVM常用指令

    JVM系列笔记目录 虚拟机的基础概念 class文件结构 class文件加载过程 jvm内存模型 JVM常用指令 GC与调优 指令集分类 基于寄存器的指令集 基于栈的指令集 Hotspot中的Loca ...

  9. Nginx学习系列四默认负载均衡轮询及Ip_hash等常用指令介绍

    一.简介 Upstream模块是Nginx中一个核心模块,当客户端访问Nginx服务器的时候,Nginx会从服务器列表中选取压力小的服务器,然后分配给客户端进行访问.这个过程,Nginx通过轮询算法轮 ...

  10. ROS零门槛学渣教程系列(二)——Linux常用指令:mkdir、tar、 unzip、cp、scp、mv、rm、find、apt、ssh

    Linux常用指令通过上一教程,我们获得了ubuntu系统.Linux是一个很大的领域.但不要紧张,我们一步步来就是了,跟着教程,需要能用到新知识,会提前介绍给大家.下面学习几个常用的Linux指令. ...

随机推荐

  1. FFmpeg开发笔记(三十二)利用RTMP协议构建电脑与手机的直播Demo

    不管是传统互联网还是移动互联网,实时数据传输都是刚需,比如以QQ.微信为代表的即时通信工具,能够实时传输文本和图片.其中一对一的图文通信叫做私聊,多对多的图文通信叫做群聊. 除了常见的图文即时通信,还 ...

  2. mysql在把子查询结果作为删除表中数据的条件,mysql不允许在子查询的同时删除原表数据

    在上一文中发布了多表删除指定记录,发现达不到我想要的效果,找了很多资料,发现以下方法. 数据库不能边查询边删除, 尝试以下操作 delete from push_msg_overview where ...

  3. DotNetGuide专栏C#/.NET/.NET Core充电站(让你学习不迷路)

    DotNetGuide简介 记录.收集和总结C#/.NET/.NET Core基础知识.学习路线.开发实战.编程技巧练习.学习视频.文章.书籍.项目框架.社区组织.开发必备工具.常见面试题.面试须知. ...

  4. java --面试题大全

            J2EE面试题   文档版本号:V2.0                   2016年11月 目 录 1. Java基础部分 8 1.1. 一个".java"源文 ...

  5. java中的基准测试框架JMH

    JHM是openJDK开发的一个benchmark框架.它是一个Maven依赖,所以创建一个Maven项目,引入下面两个依赖: <dependency> <groupId>or ...

  6. python3 pip3 安装 xmlrpc 失败

    python2 使用的是xmlrpclib库,到了 python3, 就直接使用 xmlrpc.client 和 xmlrpc.server了. 接下来,我使用 pip3 install xmlrpc ...

  7. OpenWrt中的LuCi和Lua一些总结

    Lua.LuCi Lua是一种小巧的脚本语言,和Python一样,Lua脚本的运行需要Lua解释器: UCI(Unified Configuration Interface)是OpenWrt实现所有系 ...

  8. Web 安全:OWASP TOP10 漏洞介绍

    OWASP TOP 10漏洞是指由Open Web Application Security Project(OWASP)发布的十大最严重. 最普遍的Web应用程序安全漏洞.这些漏洞在当今的Web应用 ...

  9. 敏捷开发(Scrum)

    ​ 一.敏捷的背景与动机 1.1 软件危机及软件工程的出现 速度是企业竞争致胜的关键因素,软件项目的最大挑战在于,一方面要应付变动中的需求,一方面要在紧缩的时程内完成项目,传统的软件工程难以满足这些要 ...

  10. 从基础到高级应用,详解用Python实现容器化和微服务架构

    本文分享自华为云社区<Python微服务与容器化实践详解[从基础到高级应用]>,作者: 柠檬味拥抱. Python中的容器化和微服务架构实践 在现代软件开发中,容器化和微服务架构已经成为主 ...