ビルドツール GYP で Visual Studio プロジェクトのあれこれを設定しよう

これまで趣味のビデオゲーム開発に、ビルドツールの 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)

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)

デバッグ情報を生成するには、GenerateDebugInformationtrue を設定します。 次の例では、デバッグビルド時のみデバッグ情報を生成するようにしています。

{
  '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)

パフォーマンスツールプロファイラで使用できる出力ファイルを作成する場合は Profiletrue を設定します。 これは /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)

警告をエラーとして扱う場合、WarnAsErrortrue に設定します。 次の例では警告レベルを /W4 とし、警告をエラーとして扱うように /WX を設定しています。

{
  'target_defaults': {
    'msvs_settings': {
      'VCCLCompilerTool': {
        'WarningLevel': '4', # /W4 (Level 4)
        'WarnAsError': 'true', # /WX
      },
    },
  },
}

特定のコンパイラの警告を無視する (/wd)

特定のコンパイラの警告を無視するには DisableSpecificWarnings を設定します。 これは VCCLCompilerTool.DisableSpecificWarnings プロパティに対応します。

次の例では、コンパイラの警告 C4700C4701 を無視しています。

{
  'target_defaults': {
    'msvs_settings': {
      'VCCLCompilerTool': {
        'DisableSpecificWarnings': ['4700', '4701'], # /wd"4700" /wd"4701"
      },
    },
  },
}

プリプロセッサ定義

WIN32_LEAN_AND_MEANNOMINMAX などのプリプロセッサの定義は 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-)

読み取り専用の文字列プールを有効にする場合は StringPoolingtrue に設定します。これは 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)

ネイティブコード分析を有効にするには EnablePREfasttrue に設定します。これは 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.libwinmm.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_settingsVCLibrarianTool.LinkTimeCodeGeneration または VCLinkerTool.LinkTimeCodeGeneration の項目を設定します。

ここで注意することがあります。 静的ライブラリ (static_library) をビルドする場合、ライブラリアンツール (VCLibrarianTool) の LinkTimeCodeGeneration を設定します。 動的ライブラリ (shared_library) または実行ファイル (executable) をビルドする場合は、 リンカツール (VCLinkerTool) の LinkTimeCodeGeneration を指定します。 また、VCLibrarianTool/LTCG を設定する場合は、LinkTimeCodeGenerationtrue にする必要がありますが、 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) の名前を変更します。ProgramDatabaseFileVCLinkerTool.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_toolsetv120 を設定します。

{
  '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_toolsetv140 を指定することで対応できます。

{
  '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_toolsetLLVM-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_settingsmsbuild_settings でほとんどそのまま置き換えることができます。 このことについて、"GYP における MSBuild Settings (msbuild_settings) の使い方" という記事を書きました。 ご参考になれば幸いです。

参考文献

Leave a Reply