Chromium GN目标指南 - 查看GN目标(三)

引言

在前面的文章中,我们介绍了 Chromium 构建系统中的 GN 的基本概念、目录结构和常用工具,并通过构建一个简单的 Demo 学习了如何编写和使用 executable 目标。在本篇文章中,我们将学习如何查看和挑选合适的 GN 目标,以便于我们进行各种测试、分析和调试工作。

查看GN目标

在 Chromium 的构建过程中,会生成大量的 GN 目标,这些目标代表了不同的构建产物,例如可执行文件、静态库、动态库、测试程序等。了解如何查看这些目标对于我们理解构建过程和进行特定目标的构建至关重要。

我们可以使用 gn ls 命令来列出指定目录下的所有 GN 目标。例如,要查看 out/Default 目录下的所有目标,可以在 Chromium 源码的 src 目录下执行以下命令:

复制代码
gn ls .\out\Default\ 

这条命令会列出 out/Default 目录下所有可被构建的 GN 目标。

然而,由于 Chromium 项目庞大,gn ls 命令的输出结果可能非常多,直接查看并不方便。我们可以结合一些其他的命令行工具来过滤和查找特定的目标。

例如,我们可以使用 PowerShell 中的 Select-String 命令 (类似于 Linux 中的 grep) 来筛选包含特定关键词的目标。假设我们想要查找所有包含 "unittest" 的目标,并将结果保存到 uni.txt 文件中,可以使用以下命令:

复制代码
gn ls .\out\Default\ | Select-String "unittest" > uni.txt

这条命令会将 gn ls out/Default 的输出结果通过管道传递给 Select-String 命令,Select-String 命令会筛选出包含 "unittest" 的行,并将结果重定向到 uni.txt 文件中。

执行完上述命令后,uni.txt 文件中将包含 out/Default 目录下所有名称中包含 "unittest" 的目标。

挑选合适的GN目标

上面命令的输出为:

复制代码
//:chrome_official_builder_no_unittests
//base:base_unittests
//base:base_unittests__runner
//base:path_service_unittest
//base/allocator/partition_allocator/src/partition_alloc:unittests
//base/numerics:unittests
//base/test:run_all_unittests
//build/rust/tests/bindgen_static_fns_test:bindgen_static_fns_test_lib_unittests
//build/rust/tests/bindgen_static_fns_test:bindgen_static_fns_test_lib_unittests_exe
//build/rust/tests/bindgen_static_fns_test:bindgen_static_fns_test_lib_unittests_metadata
//build/rust/tests/bindgen_test:bindgen_test_lib_unittests
//build/rust/tests/bindgen_test:bindgen_test_lib_unittests_exe
//build/rust/tests/bindgen_test:bindgen_test_lib_unittests_metadata
//build/rust/tests/test_aliased_deps:test_aliased_deps_unittests
//build/rust/tests/test_aliased_deps:test_aliased_deps_unittests_exe
//build/rust/tests/test_aliased_deps:test_aliased_deps_unittests_metadata
//build/rust/tests/test_bin_crate:test_bin_crate_unittests
//build/rust/tests/test_bin_crate:test_bin_crate_unittests_exe
//build/rust/tests/test_bin_crate:test_bin_crate_unittests_metadata
//build/rust/tests/test_cpp_including_rust:test_cpp_including_rust_dylib_unittests
//build/rust/tests/test_cpp_including_rust:test_cpp_including_rust_dylib_unittests__runner
//build/rust/tests/test_cpp_including_rust:test_cpp_including_rust_unittests
//build/rust/tests/test_cpp_including_rust:test_cpp_including_rust_unittests__runner
//build/rust/tests/test_rlib_crate:target1_test_rlib_crate_v0_2_unittests
//build/rust/tests/test_rlib_crate:target1_test_rlib_crate_v0_2_unittests_exe
//build/rust/tests/test_rlib_crate:target1_test_rlib_crate_v0_2_unittests_metadata
//build/rust/tests/test_rlib_crate:target2_test_rlib_crate_v0_2_unittests
.............

通过上述方法,我们可以快速定位到感兴趣的目标。在众多的目标中,我们需要根据自己的需求挑选合适的 GN 目标进行构建和测试。

例如,在上面的列表中,//base:base_unittests 是一个非常常用的目标,它代表了 Chromium 的 Base 库的单元测试。Base 库是 Chromium 的基础库,提供了许多核心功能,例如字符串处理、容器、算法等。

通常,GN 目标的命名遵循一定的规范,可以帮助我们理解目标的作用:

  • // 开头的目标表示根目录下的目标。
  • : 后面的部分表示目标的名称。
  • _unittests 后缀通常表示该目标是一个单元测试目标。
  • __runner后缀的目标通常表示测试框架或者用于控制测试执行的脚本
  • _exe 后缀通常表示该目标用于生成可执行文件
  • _metadata后缀的目标通常表示该目标包含元数据信息

根据这些命名规范,我们可以大致判断目标的作用,并选择我们需要的目标。

Base库

在 Chromium 的开发过程中,Base 库的单元测试是一个非常重要的环节。通过运行 //base:base_unittests,我们可以确保 Base 库的功能正确性,并及时发现潜在的问题。

因此,在进行 Chromium 的开发或者调试时,我们经常需要构建和运行 //base:base_unittests 目标。

结语

在本篇文章中,我们学习了如何使用 gn ls 命令查看 GN 目标,并结合 PowerShell 的 Select-String 命令来过滤和查找特定的目标。我们还介绍了如何根据 GN 目标的命名规范来理解目标的作用,并以 Base 库的单元测试为例,说明了如何挑选合适的 GN 目标进行构建和测试。

在本系列后续的文章中,我们将介绍更多关于 GN 的高级用法和技巧,例如如何进行测试、如何进行代码覆盖率分析等,帮助你更加深入地理解和掌握 Chromium 的构建系统。最后,根据我们的学习计划挑选出的 GN 目标为 base:base_unittests,在接下来的文章中我们将继续围绕它展开GN使用的学习。

相关推荐
Frag0ut12 小时前
Chrome PWA离线落地实战指南:2026 网页应用原生级体验全栈开发攻略
chrome·pwa·service worker·离线浏览·web应用开发·网页原生体验·前端离线缓存
MyBili1 天前
Chrome隐私安全配置:完整防护指南
大数据·chrome·谷歌浏览器·隐私安全·浏览器防护·cookie管理·上网痕迹清理
MyBili2 天前
Chrome扩展开发入门:从零打造实用浏览器插件
前端·chrome·谷歌浏览器·效率工具·浏览器插件·前端入门·扩展开发
用户2265414712952 天前
浏览器扩展 + CDP 调试实践:多平台文章同步的五个坑
chrome
子兮曰3 天前
Chrome 权限元素实战:144 与 151 的渐进增强写法
前端·javascript·chrome
Frag0ut3 天前
Chrome 156 新特性完整指南:2026 最新功能与开发实践
chrome·谷歌浏览器·浏览器开发·chrome 156·webgpu\·css random·indexdb
afumu5 天前
把五个网页版 AI 拉进同一个群聊:不用 API key 的多 Agent 编排
人工智能·chrome·typescript
其实防守也摸鱼7 天前
个人学习 Pwn 思路:从基础到漏洞利用的进阶路径
大数据·前端·人工智能·chrome·算法·安全·网络安全
李长渊哦8 天前
Qoder 自定义子智能体(Subagent)学习笔记
chrome·笔记·学习
Frag0ut9 天前
Chrome DevTools深度调试:2026年复杂Web应用性能诊断实战
memory·chrome devtools·performance·渲染管线·snapshot·source map·insights