下载完chromium代码后开始编译,这就引出了chromium 的gyp 构建过程,即由gyp文件生成Makefile文件。gyp构建系统没有采用递归make。
两步完成构建过程,在src目录下
src$ . build/android/envsetup.sh // 环境设置
src$ android_gyp // 生成工程文件,进而可以生成Makefile文件
开始的gyp文件是build/all_android.gyp,它包含了最顶层的目标,并包含其他gpy文件。默认目标是ALL。
当然也可以只编译某一个目标,例如content_shell_apk就是其中一个目标,在content/content_shell.gypi中,这样就只编译content_shel及其依赖模块。
可以分析一下build/android/envsetup.sh脚本文件
该文件最后声明了一个函数就是android_gyp(该函数是build/gyp_chromiumd得封装), 所以也在最后直接调用该函数,这样就不在运行android_gyp了。
了解了all_android.gyp就可以进行必要的裁剪了,而不是所有的模块都编译,例如去掉test模块的编译。
gyp构建系统参考:http://blog.csdn.net/qq295445028/article/details/7859103
简单列一下gyp/gypi文件格式
gyp文件就是一个JSON格式的文件,一般包含如下字段:(参考build/all.gyp文件)
conditions(条件判断),includes(包含的构建文件),target_defaults(构建目标默认属性),targets(构建目标列表),variables(构建文件使用的变量)
1. conditions
分为普通的conditions(在load构建文件之后立即计算)和target_conditions(在计算完成依赖之后然后来进行计算),两个过程分别就是early and late phases阶段。对于conditions写法非常简单:
'conditions':[
['OS==Linux',{'sources':['linux_interface.cc']}], // 系统环境变量的判断 linux平台下,变量sources加入linux_interface.cc文件
['notifications==0', {'sources!': [ // 用户自定义变量的判断
'renderer/notification_provider.cc',
'renderer/active_notification_tracker.cc',
],
]
2. target
3. includes
4. actions
5. variables
以content shell为例,如何编译cc/cpp文件时加入某个宏(以ENABLE_PLUGINS为例)呢?相当于全局宏
首先要找对gyp文件,先找到target 为so的地方,很容易在content_shell.gypi中找到下面的target_name
'target_name': 'libcontent_shell_content_view', 它又依赖与“content_shell_lib”
而content_shell_lib依赖于chromium各目录下gyp文件的某一个target(这些target最终生成.a文件)。所以
搜索ENABLE_PLUGINS后,发现都在content目录下使用,所以可以找到content.gyp文件,加入宏即可
部分代码如下(还需要加入用户自定义变量enable_plugins,这样plugin相关代码才会编译)
'variables': {
'chromium_code': 1, # Use higher warning level.
'enable_plugins': 1,
'chromium_enable_vtune_jit_for_v8%': 0, # enable the vtune support for V8 engine.
'directxsdk_exists': '<!pymod_do_main(dir_exists ../third_party/directxsdk)',
},
'target_defaults': {
'defines': ['CONTENT_IMPLEMENTATION', 'ENABLE_PLUGINS=1'],
...
参考:
GYP相关文档: https://code.google.com/p/gyp/w/list
build system: http://www.wy182000.com/2011/09/01/buildsystem/