专栏首页程序员互动联盟【专业技术】谷歌浏览器是如何编译出来的?

【专业技术】谷歌浏览器是如何编译出来的?

当我们编译chromium时,执行glient背后发生了什么?google为chromium的编译究竟做了哪些事情,我们通常并不需要亲自改这些编译规则,古人尚且知其然知其所以然,我们理应弄清楚发生在她背后的原理。下篇这篇小文,揭开一些发生在glient背后的蹊跷,让我们走进glient的世界。

gclient最后会执行hooks里的动作,而在chromium的代码配置文件中设置的hooks是运行src/build/gyp_chromium文件。下面分析这个文件的作用以及运行过程。

定义两个路径分别是script_dir和chromium_src,这里分别是脚本所在的路径和它的父目录。然后定义两个函数apply_gyp_environment和additional_include_files。

在程序运行开始就检查是否设置了环境变量SKIP_CHROMIUM_GYP_ENV,如果没有则调用函数apply_gyp_environment尝试读取chromium.gyp_env。

def apply_gyp_environment(file_path=None):

"""

Reads in a *.gyp_env file and applies the valid keys to os.environ.

"""

if not file_path or not os.path.exists(file_path):

return

file_contents = open(file_path).read()

try:

file_data = eval(file_contents, {'__builtins__': None}, None)

except SyntaxError, e:

e.filename = os.path.abspath(file_path)

raise

supported_vars = ( 'CHROMIUM_GYP_FILE',

'CHROMIUM_GYP_SYNTAX_CHECK',

'GYP_DEFINES',

'GYP_GENERATOR_FLAGS',

'GYP_GENERATOR_OUTPUT', )

for var in supported_vars:

val = file_data.get(var)

if val:

if var in os.environ:

print 'INFO: Environment value for "%s" overrides value in %s.' % (

var, os.path.abspath(file_path)

)

else:

os.environ[var] = val

读取file_path的内容,赋值给file_data。eval函数求值file_data字符串的值,其结果file_data是dict。读取其中的内容,与环境定义的变量supported_vars比较,如果环境中存在的变量则保持不变,否则加入到环境。

如果没有指定gyp文件,则添加all.gyp路径到args中,args.append(os.path.join(script_dir, 'all.gyp')),并且args.extend(['-I' + i for i in additional_include_files(args)])把参数中以-I指定的路径加入到args中,在本例中args开始为空。

########## gyp_chromium ##############

def additional_include_files(args=[]):

"""

Returns a list of additional (.gypi) files to include, without

duplicating ones that are already specified on the command line.

"""

# Determine the include files specified on the command line.

# This doesn't cover all the different option formats you can use,

# but it's mainly intended to avoid duplicating flags on the automatic

# makefile regeneration which only uses this format.

specified_includes = set()

for arg in args:

if arg.startswith('-I') and len(arg) > 2:

specified_includes.add(os.path.realpath(arg[2:]))

result = []

def AddInclude(path):

if os.path.realpath(path) not in specified_includes:

result.append(path)

# Always include common.gypi & features_override.gypi

AddInclude(os.path.join(script_dir, 'common.gypi'))

AddInclude(os.path.join(script_dir, 'features_override.gypi'))

# Optionally add supplemental .gypi files if present.

supplements = glob.glob(os.path.join(chrome_src, '*', 'supplement.gypi'))

for supplement in supplements:

AddInclude(supplement)

return result

additional_include_files函数的作用是除了命令行指定的路径外,包含chrome_src目录下的所有supplement.gypi文件以及script_dir下的common.gypi和features_override.gypi。还有all.gyp文件的路径组成了args。最后调用sys.exit(gyp.main(args))。

转自:http://blog.csdn.net/hjx5200/article/details/42744125

本文分享自微信公众号 - 程序员互动联盟(coder_online)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-01-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 互联网行业流行一句话叫“不要重复造轮子”,那么核心技术的轮子要不要重新造呢?

    从事软件开发多年,倒是经常轮子两个字打交道,经常也会教育刚入行的程序员不要尝试着开始就造轮子,先把轮子怎么使用的套路搞明白,后边基本功上来了随便怎么造都是可以的...

    程序员互动联盟
  • 【专业技术】C语言里面丰富多彩的浮点运算

    编者按:浮点运算,说起来简单,实现起来可不是那么容易的事情,我们认为很简单的运算,计算机特别是嵌入式处理器实现起来,也不是那么容易。嵌入式处理器,用的最多的当属...

    程序员互动联盟
  • 为什么苹果华为腾讯,都要把数据中心建在贵州,有什么好处?

    现在很多国内互联网企业都对在贵州建立自己的数据中心十分的感兴趣,就连苹果这样的世界名企都选择在贵州建立数据中心,可见贵州一定有吸引这些企业的独到之处,毕竟从地理...

    程序员互动联盟
  • 数据结构——动手实战双向链表

    在之前介绍SkipList的文章当中,有一些同学反馈说由于对链表缺少认知以及了解,所以直接啃算法有些过于困难。加上之前的文章当中介绍过了栈,所以这次继续线性表这...

    TechFlow-承志
  • malloc函数分配内存失败的常见原因

    malloc()函数分配内存失败的常见原因: 1. 内存不足。 2. 在前面的程序中出现了内存的越界访问,导致malloc()分配函数所涉及的一些信息被...

    用户1215536
  • Leetcode No.23 合并K个升序链表

    输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3,4,4,5,6] 解释:链表数组如下: [ 1->4-...

    week
  • 相对于百度问答和知乎,悟空问答有什么不同?

    人类天生就有好奇心,所以经常会有人提问。最早是百度推出了问答产品,主要用来方便网友提出问题,以及有经验的人回答问题。一经推出,就得到了网友的喜爱,在PC互联网的...

    光荣与梦想1987
  • php+ftp

    $ftp_server = “122.207.221.101”;//主机ip或者域名 $conn_id = ftp_connect($ftp_server) o...

    苦咖啡
  • TypeScript 实战算法系列(三):实现链表与变相链表

    链表作为一种数据结构,它存放着有序元素的集合。元素与元素之间通过指针连接,因此在链表中添加或删除元素只需要修改指针的指向即可,执行速度相比数组有得到显著的提升。...

    一只图雀
  • 获取注解信息

    何白白

扫码关注云+社区

领取腾讯云代金券