ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

build2 名称模式与通配符:构建文件编写效率翻倍的 7 个技巧

build2 名称模式与通配符:构建文件编写效率翻倍的 7 个技巧 build2 名称模式与通配符构建文件编写效率翻倍的 7 个技巧【免费下载链接】build2build2 build system项目地址: https://gitcode.com/gh_mirrors/bu/build2如果你正在使用 build2 构建系统或者刚刚接触它的构建文件buildfile那么「名称模式与通配符」是你最值得花十分钟掌握的特性。在 build2 中通配符模式wildcard name pattern可以自动收集源文件、按规则排除目标让你不再手动维护一长串文件清单——新增、删除、重命名源文件时构建文件几乎不需要改动。本文用 7 个实用技巧带你从零掌握 build2 名称模式让构建文件编写效率翻倍。1. 基础通配符* 与 ? 自动收集源文件build2 的名称模式支持三种基础通配符与 shell 的用法非常相似通配符含义示例*匹配任意数量字符含零个*.cxx匹配所有 C 源文件?匹配任意单个字符fo?.cxx匹配 foo.cxx、fox.cxx[...]匹配括号表达式中的单个字符[ab].cxx匹配 a.cxx、b.cxx最常用的场景是依赖声明。与其逐个列出文件不如直接写exe{hello}: cxx{hello} hxx{utility} cxx{utility}等价于一行通配符exe{hello}: {hxx cxx}{*}系统会自动为每个目标类型补上默认扩展名如.cxx、.hxx然后搜索匹配的文件。今后新增源文件时构建文件一行都不用改这正是 build2 通配符最直观的效率提升。2. 递归通配符 ** 与 ***一键扫平子目录项目变大后源码往往按功能拆分到多个子目录。此时使用递归通配符**可以一次匹配所有子目录中的文件exe{hello}: {hxx cxx}{**}这一行会递归收集整个项目树下的全部头文件和源文件。如果你还希望匹配当前目录本身可以使用***——它比**多匹配了起始目录。 小知识**在递归时默认跳过包含.buildignore文件的目录相当于给某些子目录贴上了「不参与模式匹配」的标签。这个设计在源码实现中也有明确注释见 libbuild2/filesystem.hxx。3. 包含与排除 和 - 精准过滤文件光有收集还不够你常常需要「排除」某些文件。build2 允许模式后面跟一串以包含或-排除开头的附加模式按顺序应用到已有结果上exe{hello}: cxx{f* -foo} # 匹配 f*但排除 foo exe{hello}: cxx{f* bar} # 匹配 f*并确保 bar 在内 exe{hello}: cxx{f* -fo?} # 排除 foo 和 fox exe{hello}: cxx{f* b* -foo -bar} # 综合运用最常见的实战场景是「自动生成的代码」。假设你的options.cxx/options.hxx由工具自动生成它们可能存在于源码目录或构建目录中直接使用模式可能造成重复正确的写法是先从模式中排除再显式引入exe{hello}: {hxx cxx}{* -options} {hxx cxx}{options}如果排除项很多还可以用分组写法甚至把列表放进变量exc foo.cxx bar.cxx exe{hello}: cxx{{f* b*} -{$exc}} file{$exc}4. 目录模式用 */ 快速圈定子项目当模式以目录分隔符结尾时它只匹配目录。./: */是 build2 中最经典的目录模式表示「当前目录下的所有直接子目录」./: */ # 所有直接子目录 ./: dir{* -build} # 排除 build 目录注意目录模式下所有包含/排除模式也必须是目录以/结尾否则会报「文件与目录类型不一致」的错误。这一点在官方手册的 Name Patterns 章节有完整说明见 doc/manual.cli。5. 目标类型/模式特定变量按模式定制规则通配符不仅用于依赖声明还能与变量赋值结合实现「针对某类目标生效的配置」。例如为 cxx 目标统一指定扩展名cxx{*}: extension cxx hxx{*}: extension hxx这行声明只对名称匹配*模式的cxx{}目标生效。你甚至可以写得更精确比如cxx{test-*}: install false让所有以test-开头的源文件参与编译但不参与安装。⚠️ 注意区分在目标名称依赖声明里cxx{*}会执行通配符匹配但在「目标类型/模式特定变量」赋值里*被视为模式而非文件搜索两者语义不同别搞混了。6. 引号与转义把通配符当普通字符用有时候你并不想触发模式匹配而是希望字面使用*。build2 提供了两个手段用引号抑制匹配pat foo*bar # 字面值 foo*bar不匹配任何文件 ./: cxx{foo*bar} # 字面目标名特殊字符转义在部分上下文中[、?有特殊含义——比如[在值开头会被当作属性列表的开始?在 eval 上下文中是三元运算符的一部分。此时需要转义x \[1-9]-foo.txt # 值开头的 [ 需要转义 y (foo.\?xx) # eval 上下文中的 ? 需要转义还有一个实用细节如果想把模式放进变量再使用必须用显式的前缀才能触发匹配pat f* exe{hello}: cxx{$pat} # 模式匹配 exe{hello}: cxx{$pat} # 字面 f*不匹配7. 用 path.match() 在条件分支里玩转通配符最后介绍一个高级技巧path.match()函数。它用 shell 风格通配符匹配路径非常适合配合switch语句做跨平台的条件分支switch $cxx.target.class: path.match, \ $cxx.target.system: path.match, \ $cxx.id: path.match { case windows, *, clang info msvcrt }*在这里充当「匹配任意」的角色配合default分支可以写出非常优雅的多平台逻辑。这一函数在 libbuild2/functions-path.cxx 中实现相关测试覆盖在 tests/name/pattern.testscript 里。结语把通配符用起来让构建文件「自动生长」最后总结一下这 7 个 build2 名称模式技巧的适用场景小项目单目录 →{hxx cxx}{*}足够多目录项目 →**/***递归收集混合自动生成代码 →/-精准排除多子项目聚合 →*/目录模式统一扩展名/安装策略 → 目标类型/模式特定变量需要字面*→ 引号与转义跨平台条件 →path.match()switch。build2 官方手册的「Name Patterns」章节doc/manual.cli是完整的语法参考源码实现与测试用例也值得翻看。掌握这些技巧后你的 buildfile 会变得更短、更清晰而且「随项目自动生长」——这正是现代构建系统应该有的体验。现在就去试试吧【免费下载链接】build2build2 build system项目地址: https://gitcode.com/gh_mirrors/bu/build2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表