Help us understand the problem. What is going on with this article?

common.gypi を作っておこう

More than 5 years have passed since last update.

なんか GYP 使ってる大きいプロジェクトは大体プロジェクト共通の設定を common.gypi ってファイル作って書いてるらしいよ。

ということで単純な common.gypi を作ってみたので紹介と、簡単な解説をします。

common.gypi
{
  ## Variables
  'variables' : {
    'target_arch%' : '<(target_arch)', #! String
    'vc_runtime%' : 'static', #! String [static, dynamic]
    'vc_subsystem%' : 'NotSet', #! String [NotSet, Console, Windows, Native, EFI Application, EfI Boot Service Driver, EFI ROM, EFI Runtime, WindowsCE, POSIX]
  },
  ## TargetDefaults
  'target_defaults' : {
    'default_configuration': 'Release',
    'conditions' : [
      ['target_arch=="x64"', {
        'msvs_configuration_platform' : 'x64',
      }],
    ],
    ## Configurations
    'configurations' : {
      ## Debug Configuration
      'Debug' : {
        'defines' : ['DEBUG', '_DEBUG'],
        'cflags' : ['-g', '-O0'],
        ## (Windows) MSBuild settings
        'msbuild_settings' : {
          ## [CL Task](http://msdn.microsoft.com/ja-jp/library/ee862477.aspx)
          'ClCompile' : {
            'Optimization' : 'Disabled',
            'WarningLevel' : 'Level3',
            'conditions' : [
              ['vc_runtime=="static"', { 'RuntimeLibrary' : 'MultiThreadedDebug', }],
              ['vc_runtime=="dynamic"', { 'RuntimeLibrary' : 'MultiThreadedDebugDLL', }],
            ],
          },
          ## [Link Task](http://msdn.microsoft.com/ja-jp/library/ee862471.aspx)
          'Link' : {
            'GenerateDebugInformation' : 'true',
            'SubSystem' : '<(vc_subsystem)',
          },
        },
        ## (Mac) XCode Settings
        'xcode_settings' : {
          'GCC_OPTIMIZATION_LEVEL' : '0',
        },
      },
      ## Release Configuration
      'Release' : {
        'cflags' : ['-O3', '-ffunction-sections', '-fdata-sections'],
        'msbuild_settings' : {
          'ClCompile' : {
            'WarningLevel' : 'Level3',
            'Optimization' : 'MaxSpeed',
            'FunctionLevelLinking' : 'true',
            'IntrinsicFunctions' : 'true',
            'conditions' : [
              ['vc_runtime=="static"', { 'RuntimeLibrary' : 'MultiThreaded', }],
              ['vc_runtime=="dynamic"', { 'RuntimeLibrary' : 'MultiThreadedDLL', }],
            ],
          },
          'Link' : {
            'GenerateDebugInformation' : 'true',
            'EnableCOMDATFolding' : 'true',
            'OptimizeReferences' : 'true',
            'SubSystem' : '<(vc_subsystem)',
          },
        },
      },
    },
    ## Debug and Release settings
    'conditions' : [
      ['target_arch=="ia32"', {
        'cflags' : ['-m32'],
        'ldflags' : ['-m32'],
      }],
      ['target_arch=="x64"', {
        'cflags' : ['-m64'],
        'ldflags' : ['-m64'],
      }],
    ],
  },
}
build.gyp
{
  'variables' : {
    'target_arch' : 'ia32',
  },
  'includes' : [
    'mycommon.gypi',
  ],
  'targets' : [
    {
      'target_name' : 'test',
      'type' : 'executable',
      'sources' : [
        'main.cc',
      ],
    }
  ]
}

common.gypi を作っておけば、プロジェクトのフォルダにコピーして各プロジェクトの *.gyp ファイルで includes セクションを使って読みこむだけで基本的な設定を簡単に取り込むことが出来ます。
共通の設定は common.gypi にまとめてあるので 上記 build.gyp は非常にシンプルで良いですね。

以下、解説

一般的にはデバッグ用とリリース用のビルド構成を用意すると思いますがデフォルトでは存在しないので Release と Debug の構成を追加しましょう。
基本的には target_defaults セクションに configurations' セクションを追加してReleaseDebugという辞書を用意してあげて各ターゲットの一般的な共通の設定を入れるだけです。
Release と Debug で共通の設定はそのまま
target_defaults` 直下に書いておきます。

variables セクションを使ったテクニックを簡単に説明します。
末尾が % の変数はデフォルト値の指定です。既に同名(末尾の % は変数名に含まれません)の変数がある場合その値が使われ、同名の変数が無ければこのデフォルト値が使われます。
gyp コマンドの実行時に -D オプションを使ったり、上記 build.gyp のようにインクルードする側で variables セクションを使って変数の値を変更出来ます。
各プロジェクトで簡単に変更出来るようにしたい設定値などに使用すると便利です。

この common.gypi では Visual Studio のランタイムライブラリ(マルチスレッドデバッグとかマルチスレッドDLLとかややこしいやつ)を簡単に変更出来るようにするための条件変数 vc_runtime と、
Visual Studio のサブシステム(初心者が Windows アプリケーションを作ろうとして「空のプロジェクト」で始めてよくハマってるやつ)を簡単に変更できるようにするための変数 vc_subsystem を用意しています。

vc_runtime 変数は通常の条件(conditions)セクションで条件変数として使用して、
vc_subsystem 変数は変数展開によって直接 msbuild_settings/ClCompile/Link/Subsystem に設定しています。

変数展開や条件セクションなどの文法についてはここでは説明しません。
以下の GYP プロジェクトの Wiki のページ

や、以下の日本語記事などを参照すると幸せになれます。

更に、よく使うライブラリがある場合、そのライブラリ用の libhoge_common.gypi のようなファイルを作っておけば、common.gypi と共に includes に追加するだけでライブラリを使ったプロジェクト用の基本的な設定が簡単に行えて便利です。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away