首页 > chromium研究 > 理解chromium构建系统

理解chromium构建系统

2011年10月19日 发表评论 阅读评论

转载时请注明出处和作者联系方式: http://mogoweb.net mogoweb@gmail.com

chromium采用了GYP(Generate Your Projects)构建系统。关于GYP的资料不多,google code上有该开源项目。GYP是google为chromium的构建而开发的一套构建系统,设计的初衷是用来产生原生的IDE工程文件(Visual Studio, Xcode)来编译chromium。

典型的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',
            .
            .
            .
        },
    }],
  ],
}

其中:

‘variables’: 变量定义,可用于文件的其它部分

‘includes’: 包含其它文件的清单,被包含的文件后缀通常为.gypi

‘target_defaults’: 可应用于所有目标的设置

‘targets’: 目标清单,每个目标是一个字典(dictionary),包含构建该目标所需的一些信息

‘conditions’: 条件说明,可以针对平台或者变量定义设置

一个典型的可执行构建目标(executable target)的gyp文件

{
  ‘targets’: [
    {
      'target_name': 'foo',
      'type': 'executable'
      'msvs_guid': '5ECEC9E5-8F23-47B6-93E0-C3B328B3BE65',
      'dependencies': [
        'xyzzy',
        '../bar/bar.gyp:bar',
      ],
      ‘defines’: [
        'DEFINE_FOO',
        'DEFINE_A_VALUE=value',
      ],
      ‘include_dirs’: [
        '..',
      ],
      ‘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',
          ],
        }]
      ],
  ],
}

其中:

‘target_name’: 目标的名称,在所有.gyp文件中应该唯一。该名称将作为所产生的Visual Studio solution的名称。

‘type’: 设置为executable

‘msvs_guid’: 硬编码的GUID值,用在产生的Visual Studio solution文件上。

‘dependencies’: 本目标的依赖目标清单。gyp将保证所依赖的目标在本目标之前生成,还将链接dependencies清单中的库目标。

‘defines’: C预处理定义,等价于-D或者/D

‘include_dirs’: 头文件包含路径,等价于-I或/I

‘sources’: 本目标所包含的源文件

‘conditions’: 条件定义,可根据条件修改设置

一个典型的库目标(library target)的gyp文件

{
  ‘targets’: [
    {
      'target_name': 'foo',
      'type': '<(library)'
      'msvs_guid': '5ECEC9E5-8F23-47B6-93E0-C3B328B3BE65',
      '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',
          ],
        }]
      ],
  ],
}

库目标的gyp文件大体上和可执行目标的gyp文件相同,除了以下几处不同:

‘type’: 通常设为’<(library)’,允许执行gyp时指定库是编译成静态库还是动态库。也可以直接给static_library或shared_library值直接指定库类型

‘direct_dependent_settings’: 定义设置,将应用到直接依赖该目标的其它目标上,也就是将本目标列在’dependencies’的那些目标上。

‘export_dependent_settings’: 定义设置,除了应用于直接依赖目标外,还可以应用在间接依赖目标上。

内置变量

gyp中变量是以<(variable_name)的形式使用的,除了可以自定变量外,gyp中还定义有一些系统变量。

变量名

变量值

DEPTH chromium顶层src目录的路径
PRODUCT_DIR 如果build release版本,值为<(DEPTH)/out/Release
如果build debug版本,值为<(DEPTH)/out/Debug
SHARED_INTERMEDIATE_DIR 动态库中间路径,值为<(PRODUCT_DIR)/obj/gen
   

转载时请注明出处和作者联系方式: 理解chromium构建系统 mogoweb@gmail.com

分类: chromium研究 标签:
  1. 2012年3月22日18:53 | #1

    关于页面是 404 哦~

  1. 本文目前尚无任何 trackbacks 和 pingbacks.