搭建gn环境踩坑存档

流程

1. 项目根目录下新增.gclient和.gclient_entries

//.gclient
solutions = [{"name": "src","url": "","managed": False,"custom_deps": {},"custom_vars": {},},
]// .gclient_entries
entries = {'src': '',
}

gclient是一个多仓管理工具,可以把多个仓库的源码clone到本地的一个项目中,具体可以看2. chromium开发工具--gclient - Bigben - 博客园

2. 新建并进入src目录

3. 新建示例代码hello_world.cc

#include <iostream>
using namespace std;int main()
{cout<< "hello world" << endl;while(1) {} // 为了让窗口不要自动关闭,好看到输出结果return 0;
}

4 新建.gn,该文件指出了gn的配置文件路径,以及使用哪个python解释器。

buildconfig = "//build/config/BUILDCONFIG.gn"# The python interpreter to use by default. On Windows, this will look
# for python3.exe and python3.bat.
script_executable = "python3"

5. 新建BULD.gn,这个文件指出我们该如何形成可执行文件

executable("hello_world") {sources = ["hello-world.cc",]
}

6. 新建build/config/BUILDCONFIG.gn,把chromuim源码下对应文件粘过来,因为我只想研究一下核心流程,不考虑兼容性,所以我把default_compiler_configs及以后的代码全删了,不然要复制太多文件了。

7. 运行gn gen out/default,out/后文件名可以任意,但是out/这个前缀不能修改。

8. 报错gn.py: Could not find checkout in any parent of the current path。原因是src目录下缺少buildtools,把chromium/src/buildtools复制到<your project>/src/buildtools即可。

9. 接下来会报一堆缺少文件的错误,这些文件分别在src/build、src/build_overrides、src/buildtools、src/tools四个目录下,你可以试着把这几个文件夹一次性从chromium项目下拷贝过来,我当时只拷了build文件夹所以报错了,而且没报具体错误原因所以没法排查,最后是缺哪个文件拷哪个文件一点点拷完了,rust相关代码我不想复制了,所以引用到的地方我就全删了。

10. gn gen out/default后,运行

autoninja -C out/default

这时候会报错depot_tools/ninja.py: Could not find Ninja in the third_party of the current project, nor in your PATH,原因就是ninja.exe既不在当前项目下,也不在环境变量里。

解决方案:在src目录下新建third_party,把chromium项目中的third_party/ninja复制过去。

11. 再次运行autoninja -C out/default,报错The system cannot find the file specified.

把chromium项目third_party目录下llvm-build\Release+Asserts\bin\clang-cl.exe复制过来,再次运行命令就可以成功了。

12. 双击out/default/hello_world.exe,显示

证明构建成功了。

问题汇总

问题一:gn.py: Could not find checkout in any parent of the current path.

核心原因:缺少buildtools。

解决方案:把chromium/src/buildtools复制到<your project>/src/buildtools,进入src目录后执行命令

gn gen out/default

.gclient和.gclient_entries文件最好也加上,虽然gclient_paths.py脚本中做了兼容,如果命令行所在目录下存在buildtools,就返回当前目录作为入口,但这毕竟不是一种规范的做法。

问题二:could not execute interpreter

根目录下的.gn文件需要设置script_executable,否则gn会直接执行py文件,windows环境下会在环境变量path中寻找python.exe和python.bat,没找到就会报错。

# The python interpreter to use by default. On Windows, this will look
# for python3.exe and python3.bat.
script_executable = "python3"

具体逻辑看gn源码src\gn\setup.cc

大致就是先查当前目录下是否存在python3.exe,存在就返回绝对路径。

否则查找环境变量path下是否存在python3.exe,和python3.bat;如果存在python3.exe,返回对应绝对路径,存在python3.bat,就通过该文件找到对应的python3.exe,返回exe的绝对路径。

否则返回空路径。

// python_exe_name and python_bat_name can be empty but cannot be absolute
// paths. They should be "python.exe" or "", etc., and "python.bat" or "", etc.
base::FilePath FindWindowsPython(const base::FilePath& python_exe_name,const base::FilePath& python_bat_name) {char16_t current_directory[MAX_PATH];::GetCurrentDirectory(MAX_PATH, reinterpret_cast<LPWSTR>(current_directory));// First search for python.exe in the current directory.if (!python_exe_name.empty()) {CHECK(python_exe_name.FinalExtension() == u".exe");CHECK_EQ(python_exe_name.IsAbsolute(), false);base::FilePath cur_dir_candidate_exe =base::FilePath(current_directory).Append(python_exe_name);if (base::PathExists(cur_dir_candidate_exe))return cur_dir_candidate_exe;}// Get the path.const char16_t kPathEnvVarName[] = u"Path";DWORD path_length = ::GetEnvironmentVariable(reinterpret_cast<LPCWSTR>(kPathEnvVarName), nullptr, 0);if (path_length == 0)return base::FilePath();std::unique_ptr<char16_t[]> full_path(new char16_t[path_length]);DWORD actual_path_length = ::GetEnvironmentVariable(reinterpret_cast<LPCWSTR>(kPathEnvVarName),reinterpret_cast<LPWSTR>(full_path.get()), path_length);CHECK_EQ(path_length, actual_path_length + 1);// Search for python.exe in the path.for (const auto& component : base::SplitStringPiece(std::u16string_view(full_path.get(), path_length), u";",base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY)) {if (!python_exe_name.empty()) {base::FilePath candidate_exe =base::FilePath(component).Append(python_exe_name);if (base::PathExists(candidate_exe))return candidate_exe;}// Also allow python.bat, but convert into the .exe.if (!python_bat_name.empty()) {CHECK(python_bat_name.FinalExtension() == u".bat");CHECK_EQ(python_bat_name.IsAbsolute(), false);base::FilePath candidate_bat =base::FilePath(component).Append(python_bat_name);if (base::PathExists(candidate_bat)) {base::FilePath python_exe = PythonBatToExe(candidate_bat);if (!python_exe.empty())return python_exe;}}}return base::FilePath();
}

问题三:depot_tools/ninja.py: Could not find Ninja in the third_party of the current project, nor in your PATH

解决方案,要么添加指向ninja.exe的path,要么就在项目里添加third_party/ninja.exe

def main(args):# ...# Get gclient root + src.primary_solution_path = gclient_paths.GetPrimarySolutionPath()gclient_root_path = gclient_paths.FindGclientRoot(os.getcwd())gclient_src_root_path = Noneif gclient_root_path:gclient_src_root_path = os.path.join(gclient_root_path, "src")for base_path in set(# 这三个目录下只要有一个存在/third_party/ninja.exe就行[primary_solution_path, gclient_root_path, gclient_src_root_path]):if not base_path:continueninja_path = os.path.join(base_path,"third_party","ninja","ninja" + gclient_paths.GetExeSuffix(),)if os.path.isfile(ninja_path):check_out_dir(args[1:])return subprocess.call([ninja_path] + args[1:])return fallback(args[1:]) #这个函数会在环境变量中找ninja.exe,还没找到就会打印报错信息了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/25835.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CMU15445(2023fall) Project #3 - Query Execution(上)详细分析

晚日寒鸦一片愁 柳塘新绿却温柔 若教眼底无离恨 不信人间有白头 ——鹧鸪天 完整代码见&#xff1a; SnowLegend-star/CMU15445-2023fall: Having Conquered the Loftiest Peak, We Stand But a Step Away from Victory in This Stage. With unwavering determination, we pre…

【网络安全 | 漏洞挖掘】利用文件上传功能的 IDOR 和 XSS 劫持会话

未经许可,不得转载。 本文涉及漏洞均已修复。 文章目录 前言正文前言 想象这样一个场景:一个专门处理敏感文档的平台,如保险理赔或身份验证系统,却因一个设计疏漏而成为攻击者的“金矿”。在对某个保险门户的文件上传功能进行测试时,我意外发现了一个可导致大规模账户接管…

知识图谱-资源网

知识图谱-资源网 http://openkg.cn/datasets-type/https://www.ownthink.com/knowledge.html

【湖北省计算机信息系统集成协会主办,多高校支持 | ACM出版,EI检索,往届已见刊检索】第二届边缘计算与并行、分布式计算国际学术会议(ECPDC 2025)

第二届边缘计算与并行、分布式计算国际学术会议&#xff08;ECPDC 2025&#xff09;将于2025年4月11日至13日在中国武汉盛大召开。本次会议旨在为边缘计算、并行计算及分布式计算领域的研究人员、学者和行业专家提供一个高水平的学术交流平台。 随着物联网、云计算和大数据技术…

【Qt】MVC设计模式

目录 一、搭建MVC框架 二、创建数据库连接单例类SingleDB 三、数据库业务操作类model设计 四、control层&#xff0c;关于model管理类设计 五、view层即为窗口UI类 一、搭建MVC框架 里面的bin、lib、database文件夹以及sqlite3.h与工程后缀为.pro文件的配置与上次发的文章…

Grok3使用体验与模型版本对比分析

文章目录 Grok的功能DeepSearch思考功能绘画功能Grok 3的独特功能 Grok 3的版本和特点与其他AI模型的比较 最新新闻&#xff1a;Grok3被誉为“地球上最聪明的AI” 最近&#xff0c;xAI公司正式发布了Grok3&#xff0c;并宣称其在多项基准测试中展现了惊艳的表现。据官方消息&am…

Pytest测试用例执行跳过的3种方式

文章目录 1.前言2.使用 pytest.mark.skip 标记无条件跳过3.使用 pytest.mark.skipif 标记根据条件跳过4. 执行pytest.skip()方法跳过测试用例 1.前言 在实际场景中&#xff0c;我们可能某条测试用例没写完&#xff0c;代码执行时会报错&#xff0c;或者是在一些条件下不让某些…

DeepSeek开源周Day5: 3FS存储系统与AI数据处理新标杆

项目地址&#xff1a; GitHub - deepseek-ai/3FS: A high-performance distributed file system designed to address the challenges of AI training and inference workloads.GitHub - deepseek-ai/smallpond: A lightweight data processing framework built on DuckDB and…

什么是多线程?线程池?

文章目录 一、什么是多线程&#xff1f;二、多线程的实现方法1. 继承Thread类,重写run方法2. 实现Runnable接口&#xff0c;并创建Thread对象3. Callable和Future 三、线程的5种状态**New&#xff08;新创建&#xff09;****Runnalbe(可运行)****Running****Blocked(阻塞)****等…

MES生产制造执行管理系统(源码+配套文档)

在当今竞争激烈的制造业环境中&#xff0c;企业要想保持竞争优势&#xff0c;就必须不断提升生产效率、优化管理流程。MES&#xff08;制造执行系统&#xff09;作为连接上层计划管理与底层工业控制的桥梁&#xff0c;正逐渐成为众多制造企业转型升级的关键工具。一个功能全面的…

AI伦理挑战:如何确保技术发展符合道德规范?

引言 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;我们正迎来一个前所未有的数字化时代。AI的应用已经渗透到医疗、教育、金融、交通等众多领域&#xff0c;极大地推动了生产效率的提升&#xff0c;改善了人们的生活质量。从智能医疗诊断到自动驾驶汽车…

Qt 自带颜色属性

Qt 系统自带颜色如下&#xff1a; enum GlobalColor {color0,color1,black,white,darkGray,gray,lightGray,red,green,blue,cyan,magenta,yellow,darkRed,darkGreen,darkBlue,darkCyan,darkMagenta,darkYellow,transparent};对应颜色如下&#xff1a; color0: 这是自定义颜色…

MySQL慢查询分析与处理

什么是慢日志 慢日志是MySQL用来记录数据库中执行较慢的SQL语句的日志&#xff0c;当数据库遇到性能问题时&#xff0c;慢日志可以帮助我们分析数据库中执行较慢的SQL。 如何打开数据库慢日志功能 MySQL默认是关闭慢日志功能的&#xff0c;可以从数据库中或者从配置文件中进行…

深度学习基础--ResNet50V2网络的讲解,ResNet50V2的复现(pytorch)以及用复现的ResNet50做鸟类图像分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 如果说最经典的神经网络&#xff0c;ResNet肯定是一个&#xff0c;从ResNet发布后&#xff0c;作者又进行修改&#xff0c;命名为ResNe50v2&#xff0c…

TikTok隐私保护措施:确保用户安全

TikTok隐私保护措施&#xff1a;确保用户安全 在这个信息爆炸的时代&#xff0c;社交媒体平台的隐私保护问题日益成为公众关注的焦点。TikTok&#xff0c;作为全球领先的短视频平台&#xff0c;拥有庞大的用户群体&#xff0c;因此&#xff0c;其隐私保护措施显得尤为重要。本…

FFmpeg-chapter3-读取视频流(原理篇)

ffmpeg网站&#xff1a;About FFmpeg 1 库介绍 &#xff08;1&#xff09;libavutil是一个包含简化编程函数的库&#xff0c;包括随机数生成器、数据结构、数学例程、核心多媒体实用程序等等。 &#xff08;2&#xff09;libavcodec是一个包含音频/视频编解码器的解码器和编…

【Redis】Mac系统一键安装redis

要在 macOS 上一键安装 Redis&#xff0c;可以使用 Homebrew&#xff08;一个流行的包管理工具&#xff09;来简化安装过程。下面是可以执行的安装脚本&#xff1a; 安装脚本&#xff1a; #!/bin/bash# 检查 Homebrew 是否已安装&#xff0c;如果没有安装&#xff0c;则安装 …

P1149 [NOIP 2008 提高组] 火柴棒等式c/c++

P1149 [NOIP 2008 提高组] 火柴棒等式c/c 题目描述 给你 n 根火柴棍&#xff0c;你可以拼出多少个形如 ABC 的等式&#xff1f;等式中的 A、B、C 是用火柴棍拼出的整数&#xff08;若该数非零&#xff0c;则最高位不能是 0&#xff09;。用火柴棍拼数字 0∼9 的拼法如图所示&a…

七星棋牌 6 端 200 子游戏全开源修复版源码(乐豆 + 防沉迷 + 比赛场 + 控制)

七星棋牌源码 是一款运营级的棋牌产品&#xff0c;覆盖 湖南、湖北、山西、江苏、贵州 等 6 大省区&#xff0c;支持 安卓、iOS 双端&#xff0c;并且 全开源。这个版本是 修复优化后的二开版本&#xff0c;新增了 乐豆系统、比赛场模式、防沉迷机制、AI 智能控制 等功能&#…

安全模块设计:token服务、校验注解(开启token校验、开启签名校验、允许处理API日志)、获取当前用户信息的辅助类

文章目录 引言pom.xmlI 校验注解ApiValidationII token服务TokenService获取当前用户信息的辅助类III 域登录接口响应数据登陆用户信息引言 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/PO…