なんか GYP 使ってる大きいプロジェクトは大体プロジェクト共通の設定を 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'],
}],
],
},
}
{
'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' セクションを追加して
Releaseと
Debugという辞書を用意してあげて各ターゲットの一般的な共通の設定を入れるだけです。
target_defaults` 直下に書いておきます。
Release と Debug で共通の設定はそのまま
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
に追加するだけでライブラリを使ったプロジェクト用の基本的な設定が簡単に行えて便利です。