引言
在前面的文章中,我们介绍了 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使用的学习。