build2 标准项目结构:从 Hello World 到可复用工程的升级之路
build2 标准项目结构从 Hello World 到可复用工程的升级之路【免费下载链接】build2build2 build system项目地址: https://gitcode.com/gh_mirrors/bu/build2build2 标准项目结构是每一位 C/C 开发者上手 build2 的第一道门槛。build2 是一款开源MIT 协议、跨平台的 C/C 构建工具链它将构建系统、包管理器bpkg与项目管理器bdep整合为一个整体。很多新手第一次接触 build2 时最头疼的往往不是语法而是文件到底该怎么摆。本文从零开始用一个 Hello World 项目带你跑通 build2 目录规范再一步步升级为可复用、可测试、可发布的正式工程。为什么 build2 需要标准项目结构build2 的日常操作由三个工具协作完成工具职责b构建驱动执行构建、测试、安装等操作bpkg包管理器负责包的获取与依赖解析bdep项目管理器负责创建、初始化、发布项目标准项目结构让三者共享同一套约定看到build/目录就知道去加载配置看到manifest就知道项目叫什么、版本是多少、依赖哪些包。这套约定正是工程可复用的基石。 认识 build2 项目的两个核心文件无论项目多小build/目录下都至少要有两个文件它们共同决定了项目如何被加载。build/bootstrap.build项目的身份证bootstrap.build声明项目最基本的身份信息。这是 build2 测试代码里最精简的写法见tests/common.testscriptproject test amalgamation subprojects project是项目名amalgamation与subprojects用于描述项目聚合关系单项目留空即可。build/root.build模块加载入口root.build负责加载所需模块一个 C 项目通常至少需要using cxx如果需要配置生成、版本管理、安装等能力就在这里追加using in、using version、using install等语句。这些模块的源码都位于libbuild2/目录下例如libbuild2/in/、libbuild2/version/、libbuild2/install/随构建系统一起分发。 Hello World 起步最小可用项目结构一个最小的可复用 hello 项目长这样hello/ ├── build/ │ ├── bootstrap.build │ └── root.build ├── hello/ │ ├── hello.cxx │ └── buildfile ├── buildfile └── manifest一个 hello 项目的最小文件清单每个子目录都有自己的buildfile声明这个目录要产出什么。hello/buildfile只需一行exe{hello}: {hxx cxx}{**}exe{}表示可执行文件{**}表示收集该目录下所有源文件。build2 仓库根目录的buildfile则是顶层汇总的范例用目标类型把文件分组得清清楚楚./: {*/ -build/ -config/ -old-tests/} \ doc{INSTALL NEWS README.md} legal{LICENSE AUTHORS} \ file{INSTALL.cli bootstrap* config.guess config.sub} \ manifest这里的doc{}、legal{}、file{}都是 build2 预定义的目标类型-build/ -config/则表示从通配中排除这些目录。manifest打包与依赖的元数据manifest是项目的名片build2 根目录的manifest就是一个标准范例: 1 name: build2 version: 0.19.0-a.0.z summary: build2 build system license: MIT description-file: README.md changes-file: NEWSname、version、summary、license是最基础的四要素加上depends字段即可声明对其它包的依赖这正是 bpkg 做依赖解析的依据。 从单目录到多目录buildfile 的模块化写法项目变大后单一 buildfile 会越来越臃肿此时需要把构建逻辑拆到各子目录让每个目录各管一摊。目标类型与通配符让 buildfile 更简洁build2 通过目标类型前缀表达意图exe{}可执行文件、lib{}库、doc{}文档、testscript测试脚本。配合{**}、{*.test...}等通配符可以用极少的代码覆盖大量文件。比如b/buildfile里构建b驱动程序的写法exe{b}: {hxx ixx txx cxx}{**} $libs一行就收集了全部头文件与源码还通过include ../libbuild2/挂上了核心库lib{build2}。子项目与 amalgamation大工程的组织方式当多个相关项目需要一起开发时可在bootstrap.build里声明project myapp amalgamation myapp subprojects lib1 lib2amalgamation表示本项目与其他项目聚合subprojects列出子项目。build2 源码本身就是极佳的范例libbuild2/是核心库与各模块b/、bx/是构建驱动tests/、old-tests/是测试它们通过根 buildfile 汇总成一个大工程。 可复用工程的三个进阶要素测试先行tests/ 目录与 testscript可复用工程必须有测试。build2 的约定是建tests/目录每个测试目录放一个testscript。例如tests/directive/assert.testscript中的一条测试$* assert true : true $* assert false 2EOE ! 0$*表示被测程序! 0断言退出码非零。公共逻辑可以抽到公共 testscript 里用.include引入避免重复参见tests/common.testscript。模板替换in 模块与 .in 文件in模块让你用$变量$占位符做文件模板替换典型场景是根据配置生成头文件。build2 自身的libbuild2/config/host-config.cxx.in就是模板构建时把$host_config$等占位符替换为实际配置值生成host-config.cxx见libbuild2/buildfile中的config/cxx{host-config}: config/in{host-config}。版本管理与安装version 与 install 模块version模块从 manifest 读取版本号提供$version.major、$version.project_id、$version.pre_release等变量用法见libbuild2/version/buildfile让版本信息在构建期即可用。install模块则控制安装行为用install false排除测试产物用install.root、install.lib等变量指定安装路径libbuild2/buildfile里就有大量现成写法。 参考 build2 自身源码最权威的结构范例理论说再多不如直接看官方实现。build2 仓库本身就是标准项目结构的活教材git clone https://gitcode.com/gh_mirrors/bu/build2clone 之后建议按这个顺序阅读根buildfile顶层目标汇总→libbuild2/buildfile核心库与模块组织→tests/测试目录规范→b/buildfile可执行程序构建。把每一层与本文的讲解对照着看你就能彻底吃透 build2 项目结构想深入语法细节还可查阅doc/目录下的doc/manual.cli与doc/testscript.cli。总结从最小 Hello World 到可复用工程build2 标准项目结构的核心只有三件事用build/目录承载配置、用manifest描述身份、用分层的buildfile组织构建逻辑。掌握这套结构之后再配合 testscript、in、version、install 等模块你就能像 build2 官方仓库一样构建出结构清晰、可测试、可发布的大型 C/C 工程。【免费下载链接】build2build2 build system项目地址: https://gitcode.com/gh_mirrors/bu/build2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考