chromium代码是通过GYP构建的,这是一个跨平台的构建系统,针对不同的操作系统,生成不同的编译工程文件。一个.gyp文件的目的是生成makefile、或者.sln工程文件。

一个典型的.gyp文件的框架是:

  {'variables': {...},'includes': ['../build/common.gypi',],'target_defaults': {...},'targets': [{'target_name': 'target_1',...},{'target_name': 'target_2',...},],'conditions': [['OS=="linux"', {'targets': [{'target_name': 'linux_target_3',...},],}],['OS=="win"', {'targets': [{'target_name': 'windows_target_4',...},],}, { # OS != "win"'targets': [{'target_name': 'non_windows_target_5',...},}],],}

整个文件最高一级结构就是一个Python的字典,包含variables、includes、target_defaults、targets、conditions。它们的作用分别如下:

variables:通过Python字典形式定义变量,可以被其他部分使用。

includes:其他文件定义的模块,包含在本文件中。

target_defaults:定义的全局设置,可以被其他targets使用。

targets:定义的目标,通过表的形式给出,每个target由字典形式给出各个关键字的描述:如目标文档的类型、依赖关系等等。

conditions:通过设置的条件改变之前定义的变量、目标的内容。

举一个例子:

有三个C++的代码文件内容分别是:

//hello_world.cc
#include <stdio.h>
#include "my_class.h"
#define X 2
int main(int argc, char** argv)
{int i = X;printf("define X: i = %d\n", i);printf("hello, world\n");Myclass my_class(100);my_class.Fun1();
}

此文件依赖头文件my_class.h和对应的类实现。

/*************************************************************************> File Name: my_class.h> Author: jxhe************************************************************************/class Myclass
{public:Myclass(int value): value_(value){}void Fun1();private:int value_;};

上面是my_class.h文件的内容,它在当前目录下的include子目录中。

/*************************************************************************> File Name: my_class.cc> Author: jxhe************************************************************************/
#include "my_class.h"
#include <stdio.h>
void Myclass::Fun1()
{printf("the value is %d\n", value_);
}

是my_class.cc文件内容。

通过gyp系统构建项目的编译工程。

{'targets':[{'target_name': 'foo','type'       : 'executable','sources'    :  ['hello_world.cc','my_class.cc',],'include_dirs':['include',]},],
}

上面的代码保存为foo.gyp文件。

当执行gyp --depth=. foo.gyp 时,将会生成Makefile。然后调用make命令将编译文件,生成foo和一些my_class.o、foo.o目标文件。

当编译一个典型库文件时,gyp文件的组织如下:

<span style="font-size:14px;"> {'targets': [{'target_name': 'foo','type': '<(library)'        'dependencies': ['xyzzy','../bar/bar.gyp:bar',],'defines': ['DEFINE_FOO','DEFINE_A_VALUE=value',],'include_dirs': ['..',],'direct_dependent_settings': {'defines': ['DEFINE_FOO','DEFINE_ADDITIONAL',],'linkflags': [],},'export_dependent_settings': ['../bar/bar.gyp:bar',],'sources': ['file1.cc','file2.cc',],'conditions': [['OS=="linux"', {'defines': ['LINUX_DEFINE',],'include_dirs': ['include/linux',],}],['OS=="win"', {'defines': ['WINDOWS_SPECIFIC_DEFINE',],}, { # OS != "win",'defines': ['NON_WINDOWS_DEFINE',],}],]},],}</span>

这个gyp文件定义了库文件,名字是foo,也就是会生成foo.o(静态库)或者foo.so(动态链接库),具体类型由变量<(libraty)决定,此变量是在调用gyp时指定。

dependencies:表明这个库依赖的其他库,也即foo必须在这些依赖库之后编译。

direct_dependent_settings:这里面定义的设置会被应用到依赖这个库的那个目标中,也即某target的dependencies里包含这个foo,那么这些设置就会应用到那个target。

export_dependent_settings:包含target,就会引入这些target的设置定义,到当前目标中。上例表明,在设置foo目标时,如果某target依赖foo,那么必须同时设置bar目标中direct_depentdent_settings的内容。这样就形成了目标设置的传递关系。

GYP(Generate Your Project)介绍相关推荐

  1. [Asp.Net Core轻量级Aop解决方案]AspectCore Project 介绍

    AspectCore Project 介绍 什么是AspectCore Project ? AspectCore Project 是适用于Asp.Net Core 平台的轻量级 Aop(Aspect- ...

  2. 【项目管理工具】—— Microsoft Office Project 介绍

    目录 目录 甘特图 任务分配状况 工作组规划器 资源工作表 报告 总结 Project是由微软开发的项目管理软件.设计的目的在于协助项目经理发展计划,为任务分配资源.跟踪计划.管理预算和分析工作量. ...

  3. Dynamic Web Project介绍及创建

    Dynamic Web Project即动态网页项目 Dynamic Web Project建立的工程包括动态内容如:(servlets.JSP files.filters 和 ssoicated m ...

  4. 项目管理工具 Open Project 介绍

    1.商务智能 系统地储存和管理商业数据,并通过各种模块展现统计分析报表 2.知识管理 整合管理多方商业信息,实现知识信息的快速实时共享 3.财务管理 实时统计项目盈亏状况,通过数据库调用方便快捷的生成 ...

  5. gn编译webrtc介绍

    说明:由于需要通过gn编译webrtc源代码和自研代码的添加,在此介绍gn命令和格式. 概述:我们通过gclient实现webrtc源码的下载,下载完成后使用gn命令进行编译,此时生成对应平台的文件( ...

  6. gyp linux,使用gyp

    GYP(Generate You Project),生成IDE项目的工具,使用Python脚本写成,配置文件为JSON格式. 使用gyp需要两个环境,python和gyp.gyp可以直接在这里下载 g ...

  7. gyp linux,gyp编译工具

    最近用到了 node-gyp 这个工具, 是node 社区对 google gyp 编译工具的一个封装, 使用 node-gyp 工具可以用C++为node 项目编写 addon. 了解了一下 goo ...

  8. ABPHelper.CLI及其依赖项简单介绍

    图片gif无法查看,请查看原文至博客园查看详情. 目录 目录 ABPHelper.CLI Scriban 通过Microsoft.Extensions.FileProviders.Embedded获取 ...

  9. Chisel 教程翻译 之 第一章:概述介绍《Digital Design with Chisel》

    1 Introduction 1 入门 This book is an introduction to digital system design using a modern hardware co ...

最新文章

  1. Linux入门第五集!MySQL8在Linux上的安装!MySQL的Linux资源分享!
  2. 使用Tensoflow实现梯度下降算法的一次线性拟合
  3. 什么时间回复客户邮件最有效?
  4. android 自定义键盘字体大小,android.inputmethodservice.KeyboardView 自定义键盘 字体大小设置...
  5. 1到10用递归c语言,为什么这个递归能输出1到10
  6. 从线上慢sql看explain关键字
  7. Spark 独立部署模式
  8. oracle vm发现无效设置_Oracle数据库编译失效对象相关命令总结大全,值得收藏
  9. 【TOJ1132】Square Root,二次同余方程
  10. 微课|中学生可以这样学Python(例7.2):三维向量类
  11. 专科python应届生工资多少-应届生学Python年薪30万,秘诀是什么?
  12. 贪心字典序最小问题poj3617
  13. 3种常用的Redis缓存读写策略
  14. java sql 搜索拼音
  15. 为游戏多开做准备,降低游戏的CPU
  16. matlab 无刷电机,无刷直流电机的matlab仿真
  17. 健身管理系统【管理员添加,删除,个人信息,项目】
  18. 点对点语音通信(转)
  19. oracle 生成随机姓名_Oracle生成随机日期时间
  20. window 开启 Telnet 客户端

热门文章

  1. 刚毕业的大学生适合进外包公司吗?
  2. Linux使用shell命令显示系统时间,Linux操作系统的Shell命令:日期格式
  3. 360°全景视频图制作
  4. 踏莎行·术 - NIO系列5:事件模型
  5. 刷脸支付技术引领产业链加速冲刺正在上演
  6. python判断语句入门教程_10_判断(if)语句_Python教程_600集Python从入门到精通教程(懂中文就能学会)...
  7. 李连杰大哥给我回信啦!2011年元旦
  8. android根据文件类型调用手机系统软件打开文件
  9. Photoshop给人物添加闪电效果
  10. linux操作系统定制的目的是,Linux操作系统在定制PMP DM320的应用解析