これまで趣味のビデオゲーム開発に、ビルドツールの GYP (Generate Your Projects) を利用してきました。 Visual Studio と Xcode のプロジェクト生成に GYP を使用している中で、まとまった具体例やドキュメントが管見の及ぶ限りなかなか見当たりません。 そこで今回は備忘録もかねて、Visual Studio 向けの具体的な GYP の記述例について、一挙にドドーンとまるっとまるごと紹介していきます。
今回は最新(2014 年 10 月現在)の Visual Studio 14 CTP を利用します。また Visual Studio で Clang for Windows (LLVM Clang 3.5) を GYP とともに利用する方法についても紹介します。
一般的な設定
- GYP で Visual Studio のビルド設定を行う (msvs_settings)
- リリースビルドとデバッグビルドの設定をする (configurations)
- デバッグ情報を生成する (/DEBUG)
コンパイラツールの設定
- 警告レベルの設定 (/W0, /W1, /W2, /W3, /W4)
- プリプロセッサ定義
- ランタイムライブラリの指定 (/MT, /MTd, /MD, /MDd)
- コード最適化のオプションを指定する (/Od, /O1, /O2, /Ox)
- フレームポインタの省略を有効・無効にする (/Oy, /Oy-)
- 組み込み関数を使用する (/Oi)
- 関数レベルでリンクする (/Gy)
- インライン関数の展開 (/Ob1, /Ob2)
- コードの速度とサイズのどちらを優先するか選択 (/Ot, /Os)
- スタックバッファのセキュリティチェックを行う (/GS, /GS-)
- C++ の例外を有効にする (/EHsc, /EHa)
- wchar_t をビルトイン型として扱う (/Zc:wchar_t, /Zc:wchar_t-)
- コンパイル時に著作権情報をメッセージとして表示しない(/nologo)
- プログラム全体の最適化 (/GL)
- 読み取り専用の文字列プールを有効にする (/GF, /GF-)
- ファイバー保護の最適化 (/GT)
- 基本的なランタイムエラーチェックを有効にする (/RTCs, /RTCu, /RTC1)
- ネイティブコード分析を有効にする (/analyze)
- 変更されたソースコードとそれに影響するソースコードだけを再コンパイルする簡易リビルド (/Gm)
- 浮動小数点数の例外処理を有効にする (/fp:except)
- ファイルのコンパイル言語オプションを C または C++ に変更する (/TC, /TP)
リンカツール/ライブラリアンツールの設定
- 依存するライブラリを追加する (AdditionalDependencies)
- インクリメンタルを有効・無効にする (/INCREMENTAL)
- 参照されない関数とデータを削除する (/OPT:REF, /OPT:NOREF)
- リンカの追加オプションを指定する (AdditionalOptions)
- ターゲットマシンを指定する (/MACHINE)
- サブシステムを指定する (/SUBSYSTEM)
- side-by-side マニフェストを生成する (/MANIFEST)
- COMDAT の圧縮 (/OPT:NOICF, /OPT:ICF)
- リンク時のコード生成を指定する (/LTCG)
- プログラムデータベースファイル (PDB, .pdb) の名前を変更する
その他
- 文字セットを指定する (CharacterSet)
- 出力ディレクトリを指定する
- 中間ファイルの出力先(中間ディレクトリ)を指定する
- プロジェクト固有の GUID を指定する
- プラットフォームツールセットを指定する(任意のバージョンのコンパイラに設定する, msbuild_toolset)
- Visual Studio + Clang 3.5 でビルドする
GYP で Visual Studio のビルド設定を行う (msvs_settings)
GYP で Visual Studio 固有のビルド設定を行うには msvs_settings
を利用します。
msvs_settings
には VCCLCompilerTool
, VCLinkerTool
, そして VCLibrarianTool
などの項目があります。
これらの項目は Visual Studio における VCCLCompilerTool インターフェイス や VCLinkerTool インターフェイス および VCLibrarianTool インターフェイス を提供する
Microsoft.VisualStudio.VCProjectEngine 名前空間 にほとんど沿っています。
msvs_settings
の他に、GYP では任意のプラットフォームツールセットを指定する msbuild_toolset
が用意されています。
msbuild_toolset
については、このページの「プラットフォームツールセットを指定する(任意のバージョンのコンパイラに設定する, msbuild_toolset)」をご覧ください。
また、今回はお話しできませんが、Xcode についても msvs_settings
と同様に Xcode 固有のビルド設定を行う xcode_settings
が用意されています。
次の例は、Visual Studio と Xcode のビルド設定を含んだ GYP の設定例を示しています。
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
'WarningLevel': '4', # /W4 (Level 4)
'WarnAsError': 'true', # /WX
},
},
},
'targets': [
{
'target_name': 'MyApp',
'product_name': 'MyApp',
'type': 'executable',
'include_dirs': [
'../include',
],
'sources': [
'../src/main.cpp',
],
'msbuild_toolset': 'v120', # Visual Studio 2013 (v120)
'msvs_settings': {
'VCCLCompilerTool': {
'DebugInformationFormat': '3' # /Zi
},
'VCLinkerTool': {
'GenerateDebugInformation': 'true', # /DEBUG
'Profile': 'true', # /PROFILE
},
},
'xcode_settings': {
'GCC_INLINES_ARE_PRIVATE_EXTERN': 'YES', # '-fvisibility-inlines-hidden'
'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES', # '-fvisibility=hidden'
},
},
] # targets
}
リリースビルドとデバッグビルドの設定をする (configurations)
Visual Studio のプロジェクトファイルの多くは、デバッグビルドとリリースビルドの 2 つのコンフィグレーションを持っています。
GYP では configurations
を使って、これらのコンフィグレーションを設定することができます。
既定のコンフィグレーションは default_configuration
で指定できます。
次の例では、デバッグビルドとリリースビルドを configurations
に追加し、
それぞれに沿ったプリプロセッサを定義しています。
また、デフォルトのビルドがデバッグビルドとなるよう default_configuration
を設定しています。
{
'target_defaults': {
'configurations': {
'Debug': {
'defines': ['DEBUG=1'],
},
'Release': {
'defines': ['NDEBUG=1'],
},
},
'default_configuration': 'Debug',
#'default_configuration': 'Release',
}
}
この configurations
の設定は Visual Studio に限らず Xcode などの環境でも有効です。
デバッグ情報を生成する (/DEBUG)
デバッグ情報を生成するには、GenerateDebugInformation
に true
を設定します。
次の例では、デバッグビルド時のみデバッグ情報を生成するようにしています。
{
'target_defaults': {
'configurations': {
'Debug': {
'msvs_settings': {
'VCCLCompilerTool': {
'DebugInformationFormat': '3' # /Zi
},
'VCLinkerTool': {
'GenerateDebugInformation': 'true', # /DEBUG
},
},
},
'Release': {
},
},
'default_configuration': 'Release',
},
}
これから 'msvs_settings' の各項目について、具体的な例を挙げながら説明していきます。
デバッグ情報の形式 (/Z7, /Zi, /ZI)
デバッグ情報の形式については DebugInformationFormat
で指定できます。これは
VCCLCompilerTool.DebugInformationFormat プロパティに対応します。
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
#'DebugInformationFormat': '0', # None
#'DebugInformationFormat': '1', # /Z7 (C7 compatible)
#'DebugInformationFormat': '3', # /Zi (Program Database)
'DebugInformationFormat': '4', # /ZI (Program Database for Edit And Continue)
},
},
}
}
パフォーマンスツールプロファイラを利用する (/PROFILE)
パフォーマンスツールプロファイラで使用できる出力ファイルを作成する場合は Profile
に true
を設定します。
これは
/PROFILE (パフォーマンス ツール プロファイラー)
に値します。また /PROFILE
を使用するには /DEBUG
を指定する必要があります。
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
'DebugInformationFormat': '3' # /Zi
},
'VCLinkerTool': {
'GenerateDebugInformation': 'true', # /DEBUG
'Profile': 'true', # /PROFILE
},
},
},
}
警告レベルの設定 (/W0, /W1, /W2, /W3, /W4)
コンパイラの警告レベルを指定するには WarningLevel
を設定します。
0 から 4 までの値を指定することができ、それぞれ Visual C++ コンパイラの警告レベル
TurnOffAllWarnings (警告なし) と Level 1 から Level 4 に対応します。
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
#'WarningLevel': '0', # /W0 (TurnOffAllWarnings)
#'WarningLevel': '1', # /W1 (Level 1)
#'WarningLevel': '2', # /W2 (Level 2)
#'WarningLevel': '3', # /W3 (Level 3)
'WarningLevel': '4', # /W4 (Level 4)
},
},
},
}
警告をエラーとして扱う (/WX)
警告をエラーとして扱う場合、WarnAsError
を true
に設定します。
次の例では警告レベルを /W4
とし、警告をエラーとして扱うように /WX
を設定しています。
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
'WarningLevel': '4', # /W4 (Level 4)
'WarnAsError': 'true', # /WX
},
},
},
}
特定のコンパイラの警告を無視する (/wd)
特定のコンパイラの警告を無視するには DisableSpecificWarnings
を設定します。
これは
VCCLCompilerTool.DisableSpecificWarnings プロパティに対応します。
次の例では、コンパイラの警告 C4700 と C4701 を無視しています。
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
'DisableSpecificWarnings': ['4700', '4701'], # /wd"4700" /wd"4701"
},
},
},
}
プリプロセッサ定義
WIN32_LEAN_AND_MEAN
や NOMINMAX
などのプリプロセッサの定義は
PreprocessorDefinitions
に追加します。
VCCLCompilerTool.PreprocessorDefinitions プロパティ
に相当します。
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
'PreprocessorDefinitions': [
'_WIN32_WINNT=0x0601', # Windows 7 or later
'WIN32_LEAN_AND_MEAN',
'NOMINMAX',
],
},
},
},
}
これは次のように GYP の defines
に書き換えることも可能です。
{
'target_defaults': {
'defines': [
'_WIN32_WINNT=0x0601', # Windows 7 or later
'WIN32_LEAN_AND_MEAN',
'NOMINMAX',
],
},
}
defines
と使い分ける一つの指針として Visual Studio でのみ有効にしたいプリプロセッサについては、
PreprocessorDefinitions
に定義を追加していくと良いでしょう。
ランタイムライブラリの指定 (/MT, /MTd, /MD, /MDd)
"マルチスレッドデバッグ (/MTd)" や "マルチスレッド DLL (/MD)" といったランタイムライブラリは RuntimeLibrary
で設定できます。
VCCLCompilerTool::RuntimeLibrary プロパティ
に相当します。
次の例では "マルチスレッド (/MT)" をランタイムライブラリとしてリンクします。
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
'RuntimeLibrary': '0', # /MT
#'RuntimeLibrary': '1', # /MTd
#'RuntimeLibrary': '2', # /MD
#'RuntimeLibrary': '3', # /MDd
},
},
}
}
コード最適化のオプションを指定する (/Od, /O1, /O2, /Ox)
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
'Optimization': '0', # /Od
#'Optimization': '1', # /O1
#'Optimization': '2', # /O2
#'Optimization': '3', # /Ox
},
},
}
}
開発するアプリケーションによって異なりますが、筆者はリリースビルドの場合 /O2
, デバッグビルドの場合 /Od
, を指定することが多いです。
フレームポインタの省略を有効・無効にする (/Oy, /Oy-)
フレームポインタを省略する場合は /Oy
, 省略しない場合は /Oy-
を指定する必要があります。
/Oy
については、以下の MSDN のページをご覧ください。
/Oy (フレーム ポインターの省略)
次の例ではフレームポインタを省略しないよう設定しています。
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
#'OmitFramePointers': 'true', # /Oy
'OmitFramePointers': 'false', # /Oy-
},
},
}
}
組み込み関数を使用する (/Oi)
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
'EnableIntrinsicFunctions': 'true', # Yes (/Oi)
#'EnableIntrinsicFunctions': 'false', # No
},
},
}
}
/Oi
については、以下の MSDN のページをご覧ください。
/Oi (組み込み関数の生成)
関数レベルでリンクする (/Gy)
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
'EnableFunctionLevelLinking': 'true', # /Gy
#'EnableFunctionLevelLinking': 'false',
},
},
}
}
/Gy
については、以下の MSDN のページをご覧ください。
/Gy (関数レベルのリンクの有効化)
インライン関数の展開 (/Ob1, /Ob2)
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
#'InlineFunctionExpansion': '0', # Default
#'InlineFunctionExpansion': '1', # /Ob1
'InlineFunctionExpansion': '2', # /Ob2
},
},
}
}
コードの速度とサイズのどちらを優先するか選択 (/Ot, /Os)
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
#'FavorSizeOrSpeed': '0', # Neither
#'FavorSizeOrSpeed': '1', # /Ot
'FavorSizeOrSpeed': '2', # /Os
},
},
}
}
スタックバッファのセキュリティチェックを行う (/GS, /GS-)
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
#'BufferSecurityCheck': 'true', # /GS
'BufferSecurityCheck': 'false', # /GS-
'DebugInformationFormat': '3',
},
'VCLinkerTool': {
'GenerateDebugInformation': 'true',
},
},
}
}
C++ の例外を有効にする (/EHsc, /EHa)
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
#'ExceptionHandling': '0', # No
#'ExceptionHandling': '1', # /EHsc
'ExceptionHandling': '2', # /EHa
'WarnAsError': 'true',
'Optimization': '0',
},
},
}
}
wchar_t をビルトイン型として扱う (/Zc:wchar_t, /Zc:wchar_t-)
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
#'TreatWChar_tAsBuiltInType': 'false', # /Zc:wchar_t-
'TreatWChar_tAsBuiltInType': 'true', # /Zc:wchar_t
},
},
}
}
TreatWChar_tAsBuiltInType
または /Zc:wchar_t
については、以下の MSDN のページをご覧ください。
VCCLCompilerTool.TreatWChar_tAsBuiltInType プロパティ
コンパイル時に著作権情報をメッセージとして表示しない(/nologo)
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
#'SuppressStartupBanner': 'false', # No
'SuppressStartupBanner': 'true', # Yes (/nologo)
},
},
}
}
プログラム全体の最適化 (/GL)
特に指定しなければ false
となり、Visual Studio の既定値が指定されます。
VCCLCompilerTool::WholeProgramOptimization プロパティに対応します。
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
'WholeProgramOptimization': 'true', # /GL
},
},
}
}
読み取り専用の文字列プールを有効にする (/GF, /GF-)
読み取り専用の文字列プールを有効にする場合は StringPooling
を true
に設定します。これは
VCCLCompilerTool::StringPooling プロパティに対応します。
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
'StringPooling': 'true', # /GF
#'StringPooling': 'false', # /GF-
},
},
}
}
ファイバー保護の最適化 (/GT)
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
#'EnableFiberSafeOptimizations': 'false', # No
'EnableFiberSafeOptimizations': 'true', # /GT
},
},
}
}
基本的なランタイムエラーチェックを有効にする (/RTCs, /RTCu, /RTC1)
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
'Optimization': '0',
#'BasicRuntimeChecks': '0', # Default
#'BasicRuntimeChecks': '1', # /RTCs
#'BasicRuntimeChecks': '2', # /RTCu
'BasicRuntimeChecks': '3', # /RTC1
},
},
}
}
ネイティブコード分析を有効にする (/analyze)
ネイティブコード分析を有効にするには EnablePREfast
を true
に設定します。これは
VCCLCompilerTool::EnablePREfast プロパティに対応します。
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
'EnablePREfast': 'true', # /analyze
'WarnAsError': 'true', # /WX
},
},
},
}
変更されたソースコードとそれに影響するソースコードだけを再コンパイルする簡易リビルド (/Gm)
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
#'MinimalRebuild': 'false', # /Gm-
'MinimalRebuild': 'true', # /Gm
},
},
},
}
浮動小数点数の例外処理を有効にする (/fp:except)
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
#'FloatingPointExceptions': 'false', # /fp:except-
'FloatingPointExceptions': 'true', # /fp:except
},
},
},
}
ファイルのコンパイル言語オプションを C または C++ に変更する (/TC, /TP)
次の例では、ソースコードを C 言語としてコンパイルするように CompileAs
オプションを指定しています。
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
#'CompileAs': '0', # Default
'CompileAs': '1', # /TC (CompileAsC)
#'CompileAs': '2', # /TP (CompileAsCpp)
},
},
},
}
依存するライブラリを追加する (AdditionalDependencies)
kernel32.lib
や winmm.lib
といったライブラリファイルにプロジェクトが依存している場合、AdditionalDependencies
に追加の依存ファイルとして追加することができます。
これは VCLinkerTool::AdditionalDependencies プロパティに対応します。
次の例では、Win32 のライブラリを追加しています。適宜アプリケーションに必要なライブラリはコメントアウトを外してリンクするようにしてください。
{
'target_defaults': {
'msvs_settings': {
'VCLinkerTool': {
'AdditionalDependencies': [
'winmm.lib',
'ws2_32.lib',
'kernel32.lib',
#'user32.lib',
#'gdi32.lib',
#'winspool.lib',
#'comdlg32.lib',
#'advapi32.lib',
#'shell32.lib',
#'ole32.lib',
#'oleaut32.lib',
#'uuid.lib',
#'odbc32.lib',
#'odbccp32.lib',
],
},
},
}
}
これは次のように GYP の libraries
で置き換えることも可能です:
{
'target_defaults': {
'link_settings': {
'libraries': [
'-lwinmm.lib',
'-lws2_32.lib',
'-lkernel32.lib',
#'-luser32.lib',
#'-lgdi32.lib',
#'-lwinspool.lib',
#'-lcomdlg32.lib',
#'-ladvapi32.lib',
#'-lshell32.lib',
#'-lole32.lib',
#'-loleaut32.lib',
#'-luuid.lib',
#'-lodbc32.lib',
#'-lodbccp32.lib',
],
},
},
}
DirectX 11 を依存するライブラリとして追加する
次のようにして、AdditionalDependencies
として、 DXGI, Direct3D 11, Direct3D Compiler のライブラリを追加します。
{
'target_defaults': {
'msvs_settings': {
'VCLinkerTool': {
'AdditionalDependencies': [
'dxgi.lib',
'd3d11.lib',
'd3dcompiler.lib',
],
},
},
}
}
インクリメンタルを有効・無効にする (/INCREMENTAL)
インクリメンタルリンクを無効にする場合 (/INCREMENTAL:NO
) は '1' を、有効にする場合 (/INCREMENTAL:YES
) は '2' を LinkIncremental
に設定します。
{
'target_defaults': {
'msvs_settings': {
'VCLinkerTool': {
'LinkIncremental': '1', # /INCREMENTAL:NO
#'LinkIncremental': '2', # /INCREMENTAL:YES
},
},
}
}
開発するアプリケーションによって異なりますが、筆者の場合、リリースビルド時はインクリメンタルリンクを無効にし、デバッグビルド時は有効にすることが多いです。
参照されない関数とデータを削除する (/OPT:REF, /OPT:NOREF)
参照されない関数とデータを削除、または保持する場合は OptimizeReferences
を設定します。これは
VCLinkerTool.OptimizeReferences プロパティに対応します。
次の例では、参照されることのない関数を削除する最適化オプション /OPT:REF
を指定しています。
{
'target_defaults': {
'msvs_settings': {
'VCLinkerTool': {
#'OptimizeReferences': '1', # /OPT:NOREF
'OptimizeReferences': '2', # /OPT:REF
},
},
}
}
リンカの追加オプションを指定する (AdditionalOptions)
VCLinkerTool::AdditionalOptions プロパティに相当するリンカの追加オプション (AdditionalOptions
) を指定することができます。
次の例では /OPT:REF
オプションをリンカに追加しています。
{
'target_defaults': {
'msvs_settings': {
'VCLinkerTool': {
'AdditionalOptions': [
'/OPT:REF',
],
},
},
}
}
ターゲットマシンを指定する (/MACHINE)
{
'target_defaults': {
'msvs_settings': {
'VCLinkerTool': {
#'TargetMachine': '0', # Not Set
'TargetMachine': '1', # /MACHINE:X86
#'TargetMachine': '3', # /MACHINE:ARM
#'TargetMachine': '4', # /MACHINE:EBC
#'TargetMachine': '5', # /MACHINE:IA64
#'TargetMachine': '7', # /MACHINE:MIPS
#'TargetMachine': '8', # /MACHINE:MIPS16
#'TargetMachine': '9', # /MACHINE:MIPSFPU
#'TargetMachine': '10', # /MACHINE:MIPSFPU16
#'TargetMachine': '14', # /MACHINE:SH4
#'TargetMachine': '16', # /MACHINE:THUMB
#'TargetMachine': '17', # /MACHINE:X64
},
},
}
}
サブシステムを指定する (/SUBSYSTEM)
{
'target_defaults': {
'msvs_settings': {
'VCLinkerTool': {
#'SubSystem': '0', # Not Set
'SubSystem': '1', # /SUBSYSTEM:CONSOLE
#'SubSystem': '2', # /SUBSYSTEM:WINDOWS
#'SubSystem': '3', # /SUBSYSTEM:NATIVE
#'SubSystem': '4', # /SUBSYSTEM:EFI_APPLICATION
#'SubSystem': '5', # /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER
#'SubSystem': '6', # /SUBSYSTEM:EFI_ROM
#'SubSystem': '7', # /SUBSYSTEM:EFI_RUNTIME_DRIVER
#'SubSystem': '8', # WindowsCE
},
},
}
}
side-by-side マニフェストを生成する (/MANIFEST)
side-by-side アセンブリマニフェストを生成する場合は GenerateManifest
を 'true' に設定します。
マニフェストファイルについては以下の MSDN ページをご確認ください:
/MANIFEST (side-by-side アセンブリ マニフェストを作成する)
次の例ではマニフェストを生成しないように指定しています。
{
'target_defaults': {
'msvs_settings': {
'VCLinkerTool': {
#'GenerateManifest': 'true', # /MANIFEST
'GenerateManifest': 'false', # /MANIFEST:NO
},
},
}
}
COMDAT の圧縮 (/OPT:NOICF, /OPT:ICF)
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
'DebugInformationFormat': '3',
'EnableFunctionLevelLinking': 'true',
'Optimization': '0',
},
'VCLinkerTool': {
#'EnableCOMDATFolding': '1', # /OPT:NOICF
'EnableCOMDATFolding': '2', # /OPT:ICF
'GenerateDebugInformation': 'true',
'LinkIncremental': '1',
},
},
}
}
EnableCOMDATFolding
または /OPT:NOICF
, /OPT:ICF
オプションについては、以下の MSDN のページをご覧ください。
VCLinkerTool.EnableCOMDATFolding プロパティ
リンク時のコード生成を指定する (/LTCG)
Visual Studio の /LTCG
オプションを指定するには、msvs_settings
の
VCLibrarianTool.LinkTimeCodeGeneration
または VCLinkerTool.LinkTimeCodeGeneration
の項目を設定します。
ここで注意することがあります。
静的ライブラリ (static_library
) をビルドする場合、ライブラリアンツール (VCLibrarianTool
) の LinkTimeCodeGeneration
を設定します。
動的ライブラリ (shared_library
) または実行ファイル (executable
) をビルドする場合は、
リンカツール (VCLinkerTool
) の LinkTimeCodeGeneration
を指定します。
また、VCLibrarianTool
で /LTCG
を設定する場合は、LinkTimeCodeGeneration
を true
にする必要がありますが、
VCLinkerTool.LinkTimeCodeGeneration
には 1
から 4
整数値を指定する必要があります。
msvs_settings
の設定で特にはまりやすいところだと思われるので注意が必要です。
{
'targets': [
{
'target_name': 'gameengine',
'type': 'static_library',
'msvs_settings': {
'VCCLCompilerTool': {
'WholeProgramOptimization': 'true', # /GL
},
'VCLibrarianTool': {
'LinkTimeCodeGeneration': 'true', # /LTCG
},
},
},
{
'target_name': 'game-app',
'type': 'executable',
'msvs_settings': {
'VCLinkerTool': {
#'LinkTimeCodeGeneration': '0', # Default
'LinkTimeCodeGeneration': '1', # /LTCG
#'LinkTimeCodeGeneration': '2', # /LTCG:PGInstrument
#'LinkTimeCodeGeneration': '3', # /LTCG:PGOptimize
#'LinkTimeCodeGeneration': '4', # /LTCG:PGUpdate
},
},
},
],
}
LinkTimeCodeGeneration
または /LTCG
オプションについては、以下の MSDN のページをご覧ください。
VCLinkerTool::LinkTimeCodeGeneration プロパティ
プログラムデータベースファイル (PDB, .pdb) の名前を変更する
/DEBUG
オプションを指定すると生成されるプログラムデータベースファイル (PDB, 拡張子は .pdb
) の名前を変更します。ProgramDatabaseFile
はVCLinkerTool.ProgramDatabaseFile プロパティに相当します。
{
'target_defaults': {
'msvs_settings': {
'VCCLCompilerTool': {
'DebugInformationFormat': '3',
},
'VCLinkerTool': {
'ProgramDatabaseFile': '$(OutDir)$(TargetName).pdb',
'GenerateDebugInformation': 'true',
},
},
}
}
次の例のように、GYP の変数である <(PRODUCT_DIR)
を指定することも可能です。
'ProgramDatabaseFile': '<(PRODUCT_DIR)\\$(TargetName).pdb',
文字セットを指定する (CharacterSet)
次の例では、文字セットとして Unicode 文字セットを設定しています。
{
'target_defaults': {
'msvs_configuration_attributes': {
'CharacterSet': '1', # Use Unicode Character Set
#'CharacterSet': '2', # Use Multi-Byte Character Set
},
},
}
出力ディレクトリを指定する
実行ファイルやライブラリファイルなどの出力先を示す出力ディレクトリを指定するには IntermediateDirectory
にファイルパスを設定します。
{
'target_defaults': {
'msvs_configuration_attributes': {
'OutputDirectory': '$(SolutionDir)$(ConfigurationName)',
},
},
}
中間ファイルの出力先(中間ディレクトリ)を指定する
obj ファイルなどの中間ファイルの出力先を示す中間ディレクトリを指定するには IntermediateDirectory
にファイルパスを設定します。
{
'target_defaults': {
'msvs_configuration_attributes': {
'IntermediateDirectory': '$(SolutionDir)..\\out\\obj\\$(ConfigurationName)\\$(ProjectName)',
},
},
}
プロジェクト固有の GUID を指定する
Visual Studio のプロジェクトファイル (.vcxproj
) はそれぞれ GUID (ProjectGuid
) が割り振られています。
GYP では msvs_guid
を使って設定することが可能です。
以下の例では、 共有ライブラリをビルドターゲットにしているプロジェクトファイルに特定の GUID を指定しています。
{
'targets': [
{
'target_name': 'gameengine-static',
'product_name': 'gameengine',
'type': 'static_library',
},
{
'target_name': 'gameengine-shared',
'product_name': 'GameEngine',
'type': 'shared_library',
'msvs_guid': 'XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',
},
],
}
GUID の作成については以下の MSDN のページをご覧ください:
GUID の作成 (guidgen.exe)
プラットフォームツールセットを指定する(任意のバージョンのコンパイラに設定する, msbuild_toolset)
GYP で任意のバージョンのプラットフォームツールセットを指定するには、msbuild_toolset
を利用します。
例えば、プラットフォームツールセットとして Visual Studio 2013 (v120) を利用する場合は、
次のように msbuild_toolset
に v120
を設定します。
{
'target_defaults': {
#'msbuild_toolset': 'v110', # Visual Studio 2012 (v110)
'msbuild_toolset': 'v120', # Visual Studio 2013 (v120)
},
}
C++11, C++14 の機能を使うためには、Visual Studio 14 (CTP) に含まれるプラットフォームツールセットである Visual Studio 2014 (v140) を利用する必要があります。
次のように msbuild_toolset
に v140
を指定することで対応できます。
{
'target_defaults': {
'msbuild_toolset': 'v140', # Visual Studio 2014 (v140)
},
}
Visual Studio + Clang 3.5 でビルドする
LLVM Clang を利用して Visual Studio 上でビルドするには、Clang for Windows を事前にインストールしておく必要があります。
Visual Studio で利用可能な Clang for Windows は次のページからダウンロード可能です。
LLVM Download Page
また、最新の開発バージョン(スナップショットビルド)は以下のページからダウンロード可能です。
LLVM Snapshot Builds
ここでは、2014 年 10 月現在最新のバージョンである Clang 3.5 を例に GYP の設定例を紹介します。
Visual Studio で Clang を利用する場合、プラットフォームツールセットとして msbuild_toolset
に LLVM-vs2013
を指定する必要があります。
もし必要であれば、プリプロセッサの定義に _HAS_EXCEPTIONS=0
を追加後、ビルドしてください。
{
'target_defaults': {
'msbuild_toolset': 'LLVM-vs2013',
'msvs_settings': {
'VCCLCompilerTool': {
'PreprocessorDefinitions': [
#'_HAS_EXCEPTIONS=0',
],
},
},
},
}
最後に
少々長くなりました。開発のお役に立つことができれば幸いです。 次回は GYP における Xcode の設定について見ていきたいと思います。
追記 (Dec 11, 2014)
GYP には msvs_settings
の他に msbuild_settings
が用意されています。
最新の Visual Studio をターゲットにしている場合、msvs_settings
は msbuild_settings
でほとんどそのまま置き換えることができます。
このことについて、"GYP における MSBuild Settings (msbuild_settings) の使い方" という記事を書きました。
ご参考になれば幸いです。
Leave a Reply