目录

1.简介

2.核心作用

3.常用命令介绍

3.1.文件操作命令

3.2.系统命令执行

3.3.校验与哈希

3.4.流程控制与等待

3.5.路径与文件处理

3.6.归档与压缩

3.7.网络与下载

3.8.实用工具

4.使用示例

5.与 shell 命令的对比

6.在 CMake 脚本中使用

7.总结

相关链接


1.简介

        在 CMake 中,cmake -E 是一个强大的命令行工具模式,用于执行各种文件操作、系统命令和实用功能。它提供了一组跨平台的命令,可替代传统的 shell 命令(如 cpmkdirrm 等),确保在不同操作系统(Windows、Linux、macOS)上行为一致。

        CMake命令行工具的形式主题如下:

cmake -E  <命令> [<命令行参数>...]

2.核心作用

1.跨平台文件操作

 执行文件复制、移动、删除等操作,无需担心不同系统的命令语法差异(如 Windows 的 copy vs Linux 的 cp)。

2.系统命令封装

提供安全执行外部程序、环境变量操作等功能,避免直接调用平台特定命令。

3.脚本辅助工具

在 CMake 脚本(如 CMakeLists.txt 或 .cmake 文件)中执行复杂操作,或作为独立命令行工具使用。

3.常用命令介绍

3.1.文件操作命令

命令作用示例
cmake -E copy复制文件或目录(递归)。cmake -E copy src.txt dest.txt
cmake -E copy_directory src/ dest/
cmake -E remove删除文件或目录(递归)。cmake -E remove file.txt
cmake -E remove_directory build/
cmake -E make_directory创建目录(递归创建父目录)。cmake -E make_directory build/subdir
cmake -E rename重命名或移动文件 / 目录。cmake -E rename old.txt new.txt

3.2.系统命令执行

安全设置和读取环境变量,避免直接操作 shell 环境。

命令作用示例
cmake -E env设置环境变量并执行命令(跨平台)。cmake -E env "PATH=/new/path:$PATH" command.exe
cmake -E execute_process执行外部程序并捕获输出。cmake -E execute_process --cmd=ls --args=-l # 执行 ls -l
cmake -E env --unset取消环境变量并执行命令。cmake -E env --unset=PATH program.exe # 清空 PATH 执行程序
cmake -E chdir切换目录并执行命令(避免硬编码 cd 命令)。cmake -E chdir build cmake .. # 在 build 目录执行 cmake

3.3.校验与哈希

用于文件完整性验证、依赖校验等场景。

命令作用示例
cmake -E md5sum计算文件的 MD5 哈希值。cmake -E md5sum file.txt > file.md5
cmake -E sha256sum计算文件的 SHA-256 哈希值(更安全)。cmake -E sha256sum download.zip
cmake -E compare_files比较两个文件内容是否相同(二进制比较)。`cmake -E compare_files a.txt b.txtecho "文件不同"`

3.4.流程控制与等待

在脚本中实现暂停、条件判断等逻辑。

命令作用示例
cmake -E sleep暂停执行指定时间(秒),用于等待资源或定时操作。cmake -E sleep 10 # 暂停 10 秒
cmake -E time测量命令执行时间(类似 shell 的 time 命令)。cmake -E time cmake --build . # 测量编译时间

3.5.路径与文件处理

处理路径规范化、文件类型转换等。

命令作用示例
cmake -E canonicalize_path将路径转换为规范形式(解析 ../、符号链接,添加斜杠等)。cmake -E canonicalize_path ../src # 输出绝对路径
cmake -E echo输出文本(支持颜色和格式化,替代 shell 的 echo)。cmake -E echo "配置完成!"
cmake -E echo_append输出文本但不换行(类似 echo -n)。cmake -E echo_append "正在下载..."
cmake -E touch创建空文件或更新文件时间戳(类似 shell 的 touch)。cmake -E touch output.log

3.6.归档与压缩

创建或解压常见格式的归档文件,替代 tarzip 等命令。

命令作用示例
cmake -E tar创建或解压归档文件(支持 tartar.gzzip 等格式)。cmake -E tar xvf package.zip # 解压
cmake -E tar cf archive.tar src/ # 创建

3.7.网络与下载

安全执行网络请求,替代 curl 或 wget(需系统支持)。

命令作用示例
cmake -E download下载文件(支持 HTTP/HTTPS,带进度显示)。cmake -E download https://example.com/file.zip ./file.zip
cmake -E make_directory递归创建目录(与文件操作命令重复,但常用于下载前准备目录)。cmake -E make_directory downloads && cd downloads

3.8.实用工具

其他杂项功能。

命令作用示例
cmake -E capabilities显示当前 CMake 支持的所有 -E 命令。cmake -E capabilities
cmake -E create_symlink创建符号链接(需系统支持,如 Windows 管理员权限或 Linux/macOS)。cmake -E create_symlink src/ link_to_src

4.使用示例

1.跨平台创建目录并复制文件

# 创建多级目录
cmake -E make_directory build/bin/data# 复制文件(Windows/Linux 通用)
cmake -E copy src/main.exe build/bin/
cmake -E copy_directory assets/ build/bin/data/

2.安全执行外部命令

# 在特定目录执行命令(避免硬编码 cd 命令)
cmake -E chdir build cmake --build . --config Release# 设置环境变量并执行(Windows/Linux 通用)
cmake -E env "CXX=g++" "CFLAGS=-O3" cmake ..

3.文件校验

# 下载文件并验证哈希
curl -O https://example.com/file.zip
cmake -E sha256sum file.zip | grep "expected_hash"

4.自动化构建流程

# 编译前清理并计时
cmake -E remove_directory build
cmake -E make_directory build
cmake -E time cmake -S . -B build
cmake -E time cmake --build build

5.环境隔离执行

# 在临时环境中执行命令(不影响当前环境)
cmake -E env "PATH=/custom/path:$PATH" "DEBUG=1" myapp.exe

5.与 shell 命令的对比

功能shell 命令(Linux/macOS)shell 命令(Windows)cmake -E 替代方案优势
创建目录mkdir -p buildmkdir buildcmake -E make_directory build递归创建,无需处理 -p 参数差异
复制文件cp src.txt dest.txtcopy src.txt dest.txtcmake -E copy src.txt dest.txt统一语法,自动处理路径分隔符差异
删除目录rm -rf buildrmdir /s /q buildcmake -E remove_directory build无需记忆 /s /q 等参数
执行命令cd build && makecd build && nmakecmake -E chdir build cmake --build .跨平台目录切换与命令执行

6.在 CMake 脚本中使用

在 CMakeLists.txt 或 .cmake 文件中,可通过 execute_process 调用 cmake -E 命令:

# 创建目录
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/data)# 复制文件
execute_process(COMMAND ${CMAKE_COMMAND} -E copy${CMAKE_SOURCE_DIR}/config.ini${CMAKE_BINARY_DIR}/config.ini
)# 计算哈希
execute_process(COMMAND ${CMAKE_COMMAND} -E md5sum ${CMAKE_SOURCE_DIR}/README.mdOUTPUT_VARIABLE readme_hash
)
message(STATUS "README.md 的 MD5: ${readme_hash}")

7.总结

cmake -E 提供了一套跨平台的命令行工具,用于替代传统 shell 命令,特别适合需要在不同操作系统上保持一致行为的场景。它在 CMake 脚本、自动化构建流程(如 CI/CD)中尤为有用,能显著简化跨平台文件操作和系统命令执行的复杂度。

相关链接

  • CMake 官网 CMake - Upgrade Your Software Build System
  • CMake 官方文档:CMake Tutorial — CMake 4.1.0-rc2 Documentation
  • CMake 源码:https://github.com/Kitware/CMake
  • CMake 源码:CMake · GitLab
  • 中文版基础介绍: CMake 入门实战 | HaHack
  • wiki: Home · Wiki · CMake / Community · GitLab
  • Modern CMake 简体中文版:  Introduction · Modern CMake

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/91737.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/91737.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/91737.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLO融合CAF-YOLO中的ACFM模块

YOLOv11v10v8使用教程&#xff1a; YOLOv11入门到入土使用教程 YOLOv11改进汇总贴&#xff1a;YOLOv11及自研模型更新汇总 《CAF-YOLO: A Robust Framework for Multi-Scale Lesion Detection in Biomedical Imagery》 一、 模块介绍 论文链接&#xff1a;https://arxiv.org…

Webpack 项目构建优化详解

1. 相关面试题 1.1. 做过哪些Webpack打包构建优化? 代码分割:使用 Webpack 的 SplitChunksPlugin 进行代码分割,将第三方库、公共代码与业务代码分离,提高缓存利用率和加载速度。 Tree Shaking:通过配置 mode: production 或使用 TerserPlugin,移除未引用的代码,减少…

【深度学习基础】张量与Tensor的区别?从标量到深度学习的多维世界

目录引言一、张量&#xff08;Tensor&#xff09;的定义与特性1. 数学中的张量2. 深度学习中的Tensor二、标量&#xff08;Scalar&#xff09;是什么&#xff1f;三、深度学习中的其他核心量1. 向量&#xff08;Vector&#xff09;2. 矩阵&#xff08;Matrix&#xff09;3. 高阶…

设计模式一: 模板方法模式 (Template Method Pattern)

模板方法模式是一种行为设计模式&#xff0c;它通过定义一个算法的骨架&#xff0c;而将一些步骤延迟到子类中实现。Template Method 使得子类可以不改变&#xff08;复用&#xff09;一个算法结构 即可重定义&#xff08;override 重写&#xff09;该算法的某些特定步骤。基本…

Linux驱动学习day24(UART子系统)

一、UART硬件理论1.1 作用及功能UART&#xff1a;通用异步收发传输器&#xff0c;简称串口。功能&#xff1a;移植u-boot、内核时&#xff0c;主要使用串口查看打印信息。外接各种模块&#xff0c;比如蓝牙GPS模块。使用UART的时候&#xff0c;要注意1. 波特率 2. 格式&#xf…

NFS共享服务器

目录 任务要求 思路总结 1.NFS共享服务 服务端 (ip 192.168.48.128) 客户端 (ip 192.168.48.130) 2.配置autofs自动挂载 任务要求 1.NFS服务器,可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中看来&#xff0c;那个远程主机的目…

FreeRTOS学习笔记之队列

小编正在学习嵌入式软件&#xff0c;目前建立了一个交流群&#xff0c;可以留下你的评论&#xff0c;我拉你进群一、简介队列是为了任务与任务、任务与中断之间的通信而准备的&#xff0c;可以在任务与任务、任务与中断之间消息传递&#xff0c;队列中可以存储有限的、大小固定…

垃圾收集器-ZGC

前言在Java开发中&#xff0c;垃圾收集器的选择对系统性能有着致命的影响。Java 8后&#xff0c;虽然G1 GC成为默认&#xff0c;但是它在延迟性控制上仍有限。ZGC作为最新一代高性能低延迟垃圾收集器&#xff0c;解决了CMS和G1在延迟、垃圾堆容量和吞吐量方面的重大突破。本文将…

计算机“十万个为什么”之跨域

计算机“十万个为什么”之跨域 本文是计算机“十万个为什么”系列的第五篇&#xff0c;主要是介绍跨域的相关知识。 作者&#xff1a;无限大 推荐阅读时间&#xff1a;10 分钟 一、引言&#xff1a;为什么会有跨域这个“拦路虎”&#xff1f; 想象你正在参观一座戒备森严的城堡…

C语言:20250719笔记

字符数组在C语言中&#xff0c;支持字符串常量&#xff0c;不支持字符串变量。如果想要实现类似的字符串变量&#xff0c;C语言提供了两种实现方式&#xff1a;字符数组&#xff1a;char name[] “哪吒”&#xff1b;字符指针&#xff1a;char *name "娜吒"&#x…

decltype是什么,什么作用?

基本概念decltype 是 C11 引入的关键字&#xff0c;用于推导表达式的类型&#xff0c;且会完整保留类型的细节&#xff08;包括 const、引用 &、指针 * 等&#xff09;。语法:decltype(表达式) 变量名核心特点1.推导依据是表达式本身&#xff0c;而非表达式的结果&#xff…

RPC 与 Feign 的区别笔记

一、基本概念 1.1 RPC&#xff08;Remote Procedure Call&#xff09; 定义&#xff1a;远程过程调用&#xff0c;允许像调用本地方法一样调用远程服务的方法。 本质&#xff1a;跨进程通信&#xff0c;隐藏了底层网络通信的复杂性。 常见实现&#xff1a; Java 原生 RMIDub…

高防IP能够防御CC攻击吗?它具备哪些显著优势?

摘要&#xff1a; 面对日益复杂的网络攻击&#xff0c;高防IP作为重要的安全工具&#xff0c;不仅能防御常见的DDoS攻击&#xff0c;还能有效应对CC攻击。本文将解析高防IP防御CC攻击的原理及其核心优势&#xff0c;帮助读者了解其在网络安全中的关键作用。一、高防IP能否防御C…

TypeScript 类型注解(一)

一、TypeScript 类型注解1、什么是TpyeScript类型注解- 是否还记得TypeScript的两个重要特性&#xff1f;- 类型系统、适用于任何规模- 可以说&#xff0c;TS的类型系统是TS最重要的功能&#xff1b;那么什么是类型注解呢&#xff1f;其实就是在声明变量时&#xff0c;将变量的…

弗兰肯斯坦式的人工智能与GTM策略的崩溃

2025 年上半年已经明确了一件事&#xff1a;B2B 市场营销团队被工具淹没&#xff0c;但缺乏策略。人工智能无处不在。收入领导者在进行无休止的试点。营销团队拼凑各种点解决方案&#xff0c;希望能实现规模扩张。然而&#xff0c;销售线索的增长停滞不前。信誉正在受损。曾经承…

NAND闪存(NAND Flash)是什么?

NAND闪存(NAND Flash)是什么? NAND闪存(NAND Flash)详解 NAND闪存是一种非易失性存储介质(断电不丢失数据),广泛应用于SSD、U盘、手机存储等设备中。NAND Flash 的全称是 “Negative-AND Flash”(与非型闪存),其名称源自其底层存储单元的电路结构——基于**“与非门…

Android性能优化之UI渲染优化

一、UI渲染核心瓶颈深度解析 1. 渲染管线关键阶段阶段CPU工作GPU工作潜在卡顿点Measure计算View尺寸-嵌套布局多次测量Layout计算View位置-频繁重排(Relayout)Draw构建DisplayList指令集-复杂自定义View.onDraw()Sync & Upload资源上传到GPU内存纹理上传大图/未压缩资源Ras…

基于Spring AI Alibaba的智能知识助手系统:从零到一的RAG实战开发

&#x1f4d6; 项目概述 在人工智能快速发展的今天&#xff0c;RAG&#xff08;Retrieval-Augmented Generation&#xff09;技术已成为构建智能问答系统的核心技术。本文将详细介绍一个基于Spring AI Alibaba DashScope深度集成的智能知识助手系统的完整开发过程&#xff0c;…

VirtualBox + CentOS:启用 DHCP 获取 IPv4 地址

标题&#xff1a; VirtualBox CentOS&#xff1a;启用 DHCP 获取 IPv4 地址 日期&#xff1a; 2025-07-18 一、问题现象 最小化安装的 CentOS 7 虚拟机里敲&#xff1a; ip addr输出只有 lo 的 127.0.0.1 以及 enp0s3 的 IPv6 链路本地地址&#xff0c;没有 IPv4&#xff0…

Git

Git简介Git 是一个分布式版本控制工具&#xff0c;通常用来对软件开发过程中的源代码文件进行管理。通过Git 仓库来存储和管理这些文件&#xff0c;Git 仓库分为两种:本地仓库:开发人员自己电脑上的 Git仓库。远程仓库:远程服务器上的 Git 仓库。commit: 提交, 将本地文件和版本…