图形学【免费下载链接】skiaSkia is a complete 2D graphic library for drawing Text, Geometries, and Images. See documentation for contribution instructions.项目地址https://gitcode.com/gh_mirrors/ski/skia点击查看免费下载导读Skia 的 Bazel 构建系统为开发者预留了一个专属的个人配置区bazel/user/目录。你只需在该目录下创建名为buildrc的文本文件写入遵循.bazelrc规范的配置片段即可定义自己的构建配置custom builds、预设编译选项而无需触碰仓库根目录的公共配置。本文基于 bazel/user/README.md 展开结合仓库内 bazel/buildrc、.bazelrc 与 bazel/platform/BUILD.bazel 的真实实现帮助你掌握为什么 Skia 推荐使用bazel/user/buildrc而非$HOME/.bazelrc、如何编写可用的build:配置、以及如何组合出属于自己的构建矩阵。一、bazel/user/buildrc是什么bazel/user/目前只包含一个说明文件 bazel/user/README.md。它的核心指示只有一句话如果你希望定义自定义 Bazel 配置例如自定义构建请在本目录下创建一个名为buildrc的文本文件内容遵循 Bazel 官方的 .bazelrc conventions即.bazelrc的书写规范。需要特别说明的是该buildrc文件名是约定俗成的从仓库根目录的bazel/buildrc可以印证这种命名习惯——它是 Skia 团队用于 CI 测试的构建配置集合它不是Bazel 自动读取的标准文件名。使用方式取决于你如何让 Bazel 加载它通过命令行显式指定bazel --bazelrcbazel/user/buildrc build ...通过仓库根目录 .bazelrc 中的import指令加载当前根配置未默认 import 它这正是它作为用户私有区的原因或在你的 shell 别名 / 包装脚本中固定带上该参数。无论哪种方式文件内部书写的都是标准的.bazelrc语法因此你可以直接复用根目录 .bazelrc 和 bazel/buildrc 中的写法。二、为什么推荐bazel/user/buildrc而不是$HOME/.bazelrcREADME 明确给出两条并行的使用途径常规做法用户完全可以像使用其他 Bazel 项目一样把自定义构建写进$HOME/.bazelrc即全局用户级配置Skia 推荐做法如果用户希望避免与其他 Bazel 项目冲突bazel/user/buildrc是更安全的存放位置。两者的本质区别在于配置作用域$HOME/.bazelrc是全局配置会被本机所有Bazel 项目读取。Bazel 官方文档在描述配置加载顺序时明确指出系统级/etc/bazel.bazelrc、用户级$HOME/.bazelrc配置会先于项目级workspace/.bazelrc配置被读取全局配置中的build:选项会对每个项目生效。这意味着在一个项目里调试好的--configxxx定义可能在另一个项目里引发意外的构建行为例如误注册了不存在的--config值、污染 flag alias 等。bazel/user/buildrc位于仓库工作区内作用域只覆盖当前 Skia 检出目录天然隔离。你在 Skia 中实验的各种build:配置、--platforms覆盖、--cc_output_directory_tag定制都不会泄漏到其他 Bazel 工程中。从仓库结构看user 这个目录名也暗示了它的定位与根目录面向全员的 .bazelrc、面向 CI 的 bazel/buildrc 形成三个层级——项目默认配置 / CI 构建配置 / 个人开发配置。个人配置放在bazel/user/buildrc即使被 git 追踪也不会干扰其他人的构建且便于跟随仓库一起版本化保存你的实验记录。三、.bazelrc规范与build:配置语法速成编写bazel/user/buildrc前需要理解.bazelrc最核心的语法命名配置named config这也是 README 引用的.bazelrc conventions中最重要的部分。3.1 命名配置的定义与启用在.bazelrc或buildrc文件中使用如下前缀定义配置build:配置名 --flag1value1 --flag2value2build:前缀表示该配置对bazel build命令生效后接配置名如my_debug再后接一条或多条 Bazel 命令行 flag启用方式为bazel build //target --config配置名同一配置名可以出现多次定义多个定义会合并累加。这一点在 bazel/buildrc 的注释中有明确说明multiple definitions of a config are allowed - in this event, they are added together非常适合把为什么需要某个 flag写成独立注释块见下文 GL 配置的DISPLAY示例配置内部可以通过--config其它配置名引用其他配置实现配置组合。3.2 来自仓库的配置范例.bazelrc 的第 4 行展示了全局默认行为与命名配置的配合build --incompatible_enable_cc_toolchain_resolution而 bazel/buildrc 展示了命名配置的完整写法例如面向 Linux x64 的构建目标build:for_linux_x64_debug --platforms//bazel/platform:linux_x64_hermetic \ --compilation_modedbg \ --cc_output_directory_taglinux_x64_debug这个片段同时用到了三个高频 flagFlag作用示例取值--platforms指定目标平台Skia 用自定义平台绑定 hermetic 工具链//bazel/platform:linux_x64_hermetic--compilation_mode编译模式dbg调试、opt优化、fastbuild默认--cc_output_directory_tag给 C 输出目录加独立标签避免不同配置间互相覆盖增量缓存linux_x64_debug关于--cc_output_directory_tagbazel/buildrc 头部注释给出了一个非常实用的底层原理Bazel 默认的 unique target BuildConfiguration 已经会考虑编译模式与目标平台例如默认输出目录形如k8-fastbuild-ST-6a54c1377847但通过//bazel/common_config_settings打开或关闭的 Skia 特性 flag 不会影响输出目录。输出目录用于存放.o目标文件和依赖文件如 clang 的--write-dependencies产物如果这些文件被不必要地覆盖在不同配置间切换构建时会拖慢增量编译。因此为每种配置设置唯一的--cc_output_directory_tag是 Skia 保持多配置切换效率的关键技巧——这个经验同样适用于你的bazel/user/buildrc。3.3 配置组合与别名bazel/buildrc 还示范了两种组织手法组合配置——通过--config引用已有配置build:for_linux_x64_debug_with_rbe --configfor_linux_x64_debug --configlinux_rbe build:for_linux_x64 --configfor_linux_x64_fastbuild别名配置——用更口语化的名字指代已有配置build:for_mac_m1 --configfor_mac_arm64 build:for_mac_intel --configfor_mac_x64 build:cpu --configcpu_only build:gl --configgl_ganesh build:vk --configvulkan_ganesh这些写法可以直接复刻到bazel/user/buildrc例如先定义基础平台配置再派生出多个业务配置。四、围绕 Skia 平台的配置要点4.1 平台与 hermetic 工具链Skia 的 Bazel 配置高度依赖 bazel/platform/BUILD.bazel 中定义的自定义平台例如linux_x64_hermetic、mac_arm64_hermetic、windows_x64_hermetic、android_arm32/arm64与ios。这些平台通过constraint_value(name use_hermetic_toolchain)关联 Skia 自带的 hermetic 工具链constraint_setting(name skia_hermetic_toolchain) constraint_value( name use_hermetic_toolchain, constraint_setting :skia_hermetic_toolchain, visibility [//visibility:public], )bazel/buildrc 中的注释解释了其原理在目标平台中加入自定义constraint_setting/constraint_valueskia_hermetic_toolchainuse_hermetic_toolchain而 hermetic 工具链的target_compatible_with中带有同样的约束于是 Bazel 会解析到 Skia 的 hermetic 工具链而非本机默认工具链。配合根目录 .bazelrc 中的--extra_toolchains//toolchain:clang_linux_x64_toolchain等注册项实现跨平台一致的编译环境。这意味着在你的bazel/user/buildrc中定义目标平台时应优先引用这些既有平台标签而不是自己从头拼platforms//os:...# 用户自定义在 Skia 现有平台基础上调整编译模式 build:my_linux_dbg --configfor_linux_x64_debug4.2 多行定义与注释的实践价值bazel/buildrc 中 GL 后端的配置是最佳示范——同一配置出现两次第二次只为补充一个必要环境变量并附上原因注释build:gl_ganesh --enable_gpu_test_utils --gpu_backendgl_ganesh \ --cc_output_directory_taggl_ganesh # 在 Unix 上测试 Ganesh GL 后端时需要设置该环境变量 # 否则会报 Failed to open X display. 而无法创建 GL 上下文进行测试。 build:gl_ganesh --action_envDISPLAY:1这种配置 原因注释的组织方式被 README 引用的规范所鼓励也值得沿用到你的个人配置中把为什么要这样设置写进注释让配置可维护、可复用。五、实战在bazel/user/buildrc中编写你的第一个自定义配置综合以上内容一个最小可用的bazel/user/buildrc可以这样组织# 用户自定义配置示例遵循 .bazelrc 命名配置规范 # 用法bazel build //:skia --configmy_profile --bazelrcbazel/user/buildrc # 基础复用仓库内已定义好的 CI 配置 build:my_profile --configfor_linux_x64_fastbuild # 附加打开 GPU 测试工具并选择 Ganesh GL 后端 build:my_profile --enable_gpu_test_utils --gpu_backendgl_ganesh \ --cc_output_directory_tagmy_gl_profile # 附加单独补充 headless 环境下需要的 DISPLAY 变量 build:my_profile --action_envDISPLAY:1要点回顾配置名任取--config指定多次定义同名配置会自动合并优先复用 bazel/buildrc 中的既有配置与 bazel/platform/BUILD.bazel 的平台标签减少重复为每种配置设置唯一的--cc_output_directory_tag保护增量编译缓存需要与远程构建RBE互换使用时可参考根目录 .bazelrc 第 20-23 行的注释Linux 用户可在bazel/user/buildrc中取消注释加入--host_platform//bazel/platform:linux_x64_hermetic实现本地操作与远程操作之间的可互换性若要启用远程构建可仿照 bazel/buildrc 组合--configlinux_rbe --remote_download_minimal。六、小结bazel/user/buildrc是 Skia 为开发者预留的项目内、个人级Bazel 配置入口与全局$HOME/.bazelrc、项目根 .bazelrc项目默认、bazel/buildrcCI 矩阵各司其职。在你需要做自定义构建、实验新的编译选项组合、或者希望让本地构建行为与 CI 对齐时优先把配置写进bazel/user/buildrc——既安全隔离又能获得 Skia 既有平台、工具链与配置组合的完整支持。写作时遵循.bazelrc的build:命名配置规范、善用配置组合与--cc_output_directory_tag即可高效搭建出属于你自己的 Skia 构建矩阵。赞分享图形学【免费下载链接】skiaSkia is a complete 2D graphic library for drawing Text, Geometries, and Images. See documentation for contribution instructions.项目地址https://gitcode.com/gh_mirrors/ski/skia点击查看免费下载相关推荐Pyrefly bazel-check 命令实战指南在 Bazel 构建系统中集成类型检查Pyrefly bazel check 命令实战指南在 Bazel 构建系统中集成类型检查 本篇技术指南围绕 Pyrefly 提供的 bazel check开发工具静态分析IDE代码质量Nanopb Bazel 构建集成指南在 Flipper Zero 固件仓库中使用 cc_nanopb_proto_libraryNanopb Bazel 构建集成指南在 Flipper Zero 固件仓库中使用 cc_nanopb_proto_library 本篇技术指南以 nanop嵌入式物联网固件硬件开发渗透测试告别依赖混乱Bazel多仓库协同构建实战指南告别依赖混乱Bazel多仓库协同构建实战指南 大型项目开发中多团队协作时常常面临Git仓库分散、依赖管理复杂、构建效率低下等问题。Bazel作为一款高性能构构建工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
