cmkr源码通配符(Glob)完整教程用**.cpp模式免逐个列文件构建整个项目【免费下载链接】cmkrModern build system based on CMake and TOML.项目地址: https://gitcode.com/gh_mirrors/cm/cmkrcmkr 是一款基于 CMake 和 TOML 的现代构建系统本教程带你掌握cmkr 通配符(Glob)功能只需在cmake.toml里写一个**.cpp模式cmkr 就会自动扫描并收集全部源文件无需逐个列出文件即可构建整个项目。为什么需要通配符告别逐个列源文件 传统 CMake 项目中每新增一个源文件都要手动去CMakeLists.txt的文件列表里补一行。文件多、目录层级深时这项工作既繁琐又容易漏。cmkr 把项目配置全部放进一个cmake.toml文件每个 target 的sources字段都支持通配符。cmkr 自己的项目就是这么做的——根目录的cmake.toml中可执行目标只写了两行就覆盖了全部源码[target.cmkr] type executable sources [ src/*.cpp, include/*.hpp, ]两种通配符模式* 与 ** 的正确写法 单层匹配*.ext只匹配指定目录下直接存放的、具有指定扩展名的文件不会进入子目录sources [src/*.cpp]递归匹配**.ext递归匹配指定目录及其所有子目录中的文件也就是标题中说的 “.cpp模式”sources [mylib/**.hpp, mylib/**.cpp]模式匹配范围src/*.cpp仅src/目录下的 .cpp 文件src/**.cppsrc/及所有子目录下的 .cpp 文件 注意cmkr 的递归语法是**.ext双星号直接跟扩展名不是常见的**/*.ext写法。完整实战示例双目标项目一步构建 cmkr 仓库内置了一个官方示例位于tests/globbing/目录包含一个静态库和一个可执行文件[project] name globbing description Globbing sources # 递归收集 mylib/ 下的所有头文件与源码 [target.mylib] type static alias mylib::mylib sources [mylib/**.hpp, mylib/**.cpp] include-directories [mylib/include] # 只收集 example/src/ 单层目录 [target.example] type executable sources [example/src/*.cpp] link-libraries [mylib::mylib]其目录结构大致为mylib/include/mylib/mylib.hpp—— 头文件mylib/src/mylib/mylib.cpp—— 库源码example/src/main.cpp—— 程序入口配置好后执行标准命令即可完成构建cmake -B build cmake --build build快速上手2 分钟把通配符引入你的项目 获取 cmkr 引导脚本从cmake/cmkr.cmake复制或克隆仓库git clone https://gitcode.com/gh_mirrors/cm/cmkr后取该文件在项目根目录执行cmake -P cmkr.cmake完成自举在cmake.toml的sources中写入*.ext或**.ext模式运行cmake -B build cmake --build build完成。之后只需修改cmake.toml重新构建时 cmkr 会自动重新生成CMakeLists.txt无需任何额外步骤。底层原理与 CMake file(GLOB) 的关键区别 这是 cmkr 通配符最值得称道的设计生成时展开而非构建时cmkr 在生成CMakeLists.txt的那一刻就完成通配符扫描把具体、完整的文件列表直接写死进去并不会生成 CMake 的file(GLOB ...)命令——因此天然规避了 “CMake 不自动感知新增文件” 的经典坑结果确定性收集到的文件会先排序再写入Windows、macOS、Linux 上生成的CMakeLists.txt顺序完全一致安全限制路径不能越出cmake.toml所在目录防止误扫。核心实现在src/cmake_generator.cpp的expand_cmake_path函数中感兴趣可以阅读源码。常见踩坑清单 ⚠️写成**/*.cpp不是合法的 cmkr 语法。文件名部分只允许*或**写成**/*.cpp会被当作字面文件名直接报错省略扩展名通配符依赖 “*/** 扩展名” 的结构src/**不会展开在项目根目录做递归通配cmkr 明确禁止顶层**.cpp提示 Recursive globbing not allowed in project root这是为了防止把 build 目录一并扫进来请始终指定子目录如src/**.cpp新增文件后没参与编译新增文件后需要让 cmkr 重新生成一次直接重新执行 cmake 配置/构建即可cmkr 会自动检测cmake.toml相关变化并重新生成。总结与延伸阅读 掌握*.ext与**.ext两种模式你就能用一行配置替代成百上千行的文件列表让构建脚本保持干净、省心。更多资料项目内相对路径官方 Glob 示例配置tests/globbing/cmake.toml官方 Glob 示例文档docs/examples/globbing.md通配符展开实现源码src/cmake_generator.cppcmake.toml全部选项参考docs/cmake-toml.md【免费下载链接】cmkrModern build system based on CMake and TOML.项目地址: https://gitcode.com/gh_mirrors/cm/cmkr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考