CMake指令:常见内置命令行工具( CMake -E )
目录
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 命令(如 cp
、mkdir
、rm
等),确保在不同操作系统(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.txt | echo "文件不同"` |
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.归档与压缩
创建或解压常见格式的归档文件,替代 tar
、zip
等命令。
命令 | 作用 | 示例 |
---|---|---|
cmake -E tar | 创建或解压归档文件(支持 tar 、tar.gz 、zip 等格式)。 | 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 build | mkdir build | cmake -E make_directory build | 递归创建,无需处理 -p 参数差异 |
复制文件 | cp src.txt dest.txt | copy src.txt dest.txt | cmake -E copy src.txt dest.txt | 统一语法,自动处理路径分隔符差异 |
删除目录 | rm -rf build | rmdir /s /q build | cmake -E remove_directory build | 无需记忆 /s /q 等参数 |
执行命令 | cd build && make | cd build && nmake | cmake -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