首页 > 其他分享 >【CMake系列】03-cmake 注释、常用指令 message、set、file、for_each、流程控制if

【CMake系列】03-cmake 注释、常用指令 message、set、file、for_each、流程控制if

时间:2024-06-12 13:47:47浏览次数:9  
标签:files 03 set CMake foreach file cmake message txt

本文给出了 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()

标签:files,03,set,CMake,foreach,file,cmake,message,txt
From: https://www.cnblogs.com/caibucai/p/18243773

相关文章

  • 【CMake系列】01-CMake是什么
    在很多开源项目中,经常可以看到CMakeLists.txt这一文件,依靠它才能完成项目的配置运行过程。那它是什么?接下来,在这个专栏中,我们将系统学习CMake这一个重要工具。本专栏的实践代码全部放在github上,欢迎star!!!如有问题,欢迎留言、或加群【392784757】交流CMake是什么CMake......
  • 【CMake系列】11-CMake Pack
    cmakepack用于将我们的写好的项目打包,发送给使用方;打包后产生的内容有源代码包二进制包平台原生的二进制安装Debian->.debredhat->.rpmmacOS->.dmgwindows->NSIS本专栏的实践代码全部放在github上,欢迎star!!!如有问题,欢迎留言、......
  • 【CMake系列】10-cmake测试集成googletest与第三方库自动化构建
    cmake测试,使用ctest可能不能满足我们的需求,需要我们使用更为强大的第三方测试框架,如googletest,完成项目中的测试工作本篇文章将第三方测试框架googletest,引入,同时也可以作为关于第三方包自动化构建的很好示例,值得学习本专栏的实践代码全部放在github上,欢迎star!!!如......
  • 【CMake系列】10-cmake测试 ctest
    cmake作为一个强大的构建系统指导工具,同时也提供了测试功能,可用于项目的单元测试等,也可以与其他测试框架协作,如googletest,共同完成项目开发中的测试工作,本节我们就来学习如何借助cmake完成测试本专栏的实践代码全部放在github上,欢迎star!!!如有问题,欢迎留言、或加群【392......
  • 【CMake系列】09-cmake install 一般文件 文件夹 代码文件
    上一节,我们学习了项目构建后、目标的安装,本节学习的内容是对于一般文件,文件夹以及源代码的安装本节的文件依然使用file(WRITExxx.xx)来创建,不依赖额外的文件本专栏的实践代码全部放在github上,欢迎star!!!如有问题,欢迎留言、或加群【392784757】交流文件安装CMakeLi......
  • 03《android studio开发实战(第三版)》阅读笔记
    第四章:用户界面开发 本章介绍了Android中的常见布局管理器,如LinearLayout、RelativeLayout和ConstraintLayout,以及它们的使用场景和特点。 学习了各种用户界面元素,如TextView、EditText、Button等的使用方法,以及如何将它们组合在一起创建复杂的用户界面。理解了Android中的资源......
  • 前端菜鸡流水账日记 -- setTimeout定时器
    中午好哇,一上午的时间过的真快,这都快要吃午饭啦,突击询问有想好吃什么吗???当然,这不是重点,重点是我今天要说的这个定时器,以及和他搭配的取消定时器,话不多说,开始我们的新内容setTimeout都不陌生就是定时器,他可以这样用setTimeout(()=>{dealData.forEach(e=>{if(aw......
  • 系统FM802,FM803主控和利时
    系统FM802,FM803主控和利时接近开关通常有两种:埋入型和非埋入型。所谓埋入型就是指接近开关的感应头不检测其圆周方向的金属目标,系统FM802,FM803主控和利时即传感器感应头必须露出金属安装支架一段距离且圆周方向一定范围内不得有金属目标物以免引起错误判断。系统FM802,FM803......
  • FuTalk设计周刊-Vol.038
    ......
  • java面试题: HashMap、HashSet 和 HashTable 的区别
     HashMap常用方法 HashMap是一个基于哈希表的Map接口的实现。它允许使用null值和null键。 java复制//创建一个HashMapHashMap<KeyType,ValueType>map=newHashMap<>(); //添加元素map.put(key,value); //获取元素ValueTypevalue=map.get......