GYP を使って Xcode プロジェクトを作ってみよう

今回は、ビルドツールの GYP (Generate Your Projects) を使って、Xcode プロジェクト (.xcodeproj) を作成する方法を紹介します。 GYP では Xcode Settings (xcode_settings) を使って Xcode に関するビルド設定を記述することができます。 そのほかにアプリケーションのバンドルに関する mac_bundlemac_bundle_resources といった設定も存在します。 これらの設定項目について、備忘録をかねてざっくり紹介していきます。

GYP の基本的な使い方については前回の記事 "ビルドオートメーションツールGYPを使おう" をご参照ください。


アプリケーションやリソースファイルのバンドルに関する設定
GYP を使った Xcode プロジェクトの作成について
Architecture - アーキテクチャの設定
Assets
Build Options
Code Signing
Deployment
Linking
Packaging
Search Paths
Versioning
Apple LLVM - Code Generation
Apple LLVM - Custom Compiler Flags
Apple LLVM - Language
Apple LLVM - Preprocessing
Apple LLVM - Warnings
Asset Catalog Compiler
User-Defined

アプリケーションまたはフレームワークをビルドする (mac_bundle)

リソースファイルやアセットなどのバンドルを必要とするアプリケーションやフレームワークをビルドする場合は GYP の mac_bundle を設定する必要があります。 .app 拡張子から始まるような OS X のアプリケーションやフレームワーク (.framework) を作成する場合は次のように 'mac_bundle': 1 を指定する必要があります。

{
  'targets': [
    {
      'target_name': 'MyApp',
      'product_name': 'MyApp',
      'type': 'executable',
      'mac_bundle': 1,
    },
  ],
}

静的ライブラリ (.a) やフレームワーク以外の動的ライブラリ (.dylib) をビルドする場合は指定する必要はありません。

アプリケーションにバンドルしたいリソースファイルを追加する (mac_bundle_resources)

アプリケーションやフレームワークと一緒にバンドルしたいリソースファイルをプロジェクトに追加する場合は、mac_bundle_resources を使います。 次の例では以下に示すリソースファイルをアプリケーションにバンドルするように指定しています。

  • Content ディレクトリ以下のリソースファイルすべて
  • Assets.xcassets/ ディレクトリ以下のリソースファイルすべて
  • Cocoa のストーリーボードファイル (Base.lproj/LaunchScreen.storyboard, Base.lproj/Main.storyboard)
{
  'targets': [
    {
      'target_name': 'MyApp',
      'product_name': 'MyApp',
      'type': 'executable',
      'mac_bundle': 1,
      'mac_bundle_resources': [
        'Content/',
        'Assets.xcassets/',
        'Base.lproj/LaunchScreen.storyboard',
        'Base.lproj/Main.storyboard',
      ],
    },
  ],
}

OS X アプリケーションだけでなく、iOS アプリケーションや watchOS アプリケーションについても同様に mac_bundle_resources でバンドルするリソースファイルを指定します。

依存するフレームワーク (.framework) をプロジェクトに追加する

Cocoa.frameworkUIKit.framework といったフレームワークまたは静的・動的ライブラリをリンクするときは、GYP の link_settings.libraries を利用します。 次の例では Cocoa アプリケーションで利用するいくつかのフレームワークを追加しています。

{
  'target_defaults': {
    'link_settings': {
      'libraries': [
        '$(SDKROOT)/System/Library/Frameworks/Cocoa.framework',
        '$(SDKROOT)/System/Library/Frameworks/AudioToolBox.framework',
        '$(SDKROOT)/System/Library/Frameworks/OpenAL.framework',
        '$(SDKROOT)/System/Library/Frameworks/OpenGL.framework',
        '$(SDKROOT)/System/Library/Frameworks/QuartzCore.framework',
      ],
    },
  }
}

CocoaTouch や iOS のフレームワークを追加する場合も同様です。 次の例では Metal アプリケーションを作るときに必要なフレームワークを追加しています。

{
  'target_defaults': {
    'link_settings': {
      'libraries': [
        '$(SDKROOT)/System/Library/Frameworks/Foundation.framework',
        '$(SDKROOT)/System/Library/Frameworks/UIKit.framework',
        '$(SDKROOT)/System/Library/Frameworks/Metal.framework',
        '$(SDKROOT)/System/Library/Frameworks/MetalKit.framework',
        '$(SDKROOT)/System/Library/Frameworks/ModelIO.framework',
      ],
    },
  }
}

gyp コマンドをどうやって手に入れる?

Superuser の権限がなくてインストールできない場合や、gyp コマンドのグローバルインストールに心理的抵抗がある方向けに、 GYP を手軽に使用する方法をここでは紹介します。 GYP のグローバルインストールについては 前回の記事(ビルドオートメーションツールGYPを使おう) をご参照ください。 また、お使いのマシンにすでに gyp コマンドがインストールされていれば、この項はスキップしていただいてかまいません。

まず、Git を使って gyp のソースコードを手に入れます。 リポジトリをすべて git clone するのは時間がかかるので、今回は shallow clone しています。

git clone --depth=1 https://chromium.googlesource.com/external/gyp.git gyp

GYP は Python 2 系で動作するので、Python のバージョンも確認しておいてください。

python --version

これでインストールせずに GYP が使えるようになります。 gyp コマンドの代わりに python gyp/gyp_main.py もしくは gyp/gyp で実行できます。 もちろん、Windows のコマンドプロンプト、MinGW、Ubuntu のコンソールについても同様に python gyp/gyp_main.py は有効です。

簡単な Cocoa アプリケーションのビルド設定例

実際にどんな GYP ファイルを書けばいいのかわからない方のために、簡単な Xcode プロジェクトを作成する GYP ファイルの例を紹介します。 最初に OS X や iOS などのプラットフォームや、ライブラリやフレームワーク、アプリケーションといった各ビルドターゲットに限らず、C++ や Objective-C を使う Xcode プロジェクトで共通する設定を以下に target_defaults として示します。

{
  'target_defaults': {
    'xcode_settings': {
      # Language
      'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0',
      'CLANG_CXX_LANGUAGE_STANDARD': 'c++14',
      'CLANG_CXX_LIBRARY': 'libc++',
      'CLANG_ENABLE_OBJC_ARC': 'YES',

      # Warnings
      'GCC_WARN_SHADOW': 'YES',
      'GCC_WARN_UNUSED_VARIABLE': 'YES',
      'GCC_TREAT_WARNINGS_AS_ERRORS': 'YES',
      'WARNING_CFLAGS': ['-Wall'],
    },
    'configurations': {
      'Debug': {
        'defines':['DEBUG=1'],
        'xcode_settings': {
          'GCC_OPTIMIZATION_LEVEL': '0',
        },
      },
      'Release': {
        'xcode_settings': {
          'GCC_OPTIMIZATION_LEVEL': '3',
        },
      },
    },
  },
}

この例では C++14, C, Objective-C または Objective-C++ のソースコードをコンパイルするための Xcode の設定をしています。ビルドコンフィグレーションとして Debug と Release を追加しています。 また、コンパイラの警告として GCC_WARN_SHADOWGCC_WARN_UNUSED_VARIABLE を追加しています。 警告内容はプロジェクトごとに適宜必要な項目を追加してください。 以降の例では、この target_defaults を記述した前提で話を進めていきます。

NOTE: 警告を無視すると後で大変なことになる
Xcode のプロジェクトに限らず、できるだけ多くのケースについてコンパイラの警告を出すようにしたり、警告レベルを高く設定したりすることをオススメします。 また警告は可能な限りエラー扱いにしておくことも合わせて推奨します。Xcode では GCC_TREAT_WARNINGS_AS_ERRORSYES に設定することでエラーとして扱えます。 もし Visual Studio でビルドするときは WarnAsError (/WX) オプションを、Make と Clang を使ってコンパイルするときは Treat Warnings as Errors (-Werror) オプションをつけます。 警告が出力されるということには必ず意味があります。 「コンパイラの警告を無視して後で痛い目をみた」という経験を誰しも一度や二度したことがあるのではないでしょうか。

次に、アプリケーションのビルドターゲット例を示します。 ソースコードやリソースファイルの位置については適宜読み替えてください。

{
  'targets': [
    {
      'target_name': 'MyApp',
      'product_name': 'MyApp',
      'type': 'executable',
      'mac_bundle': 1,
      'sources': [
        'AppDelegate.h',
        'AppDelegate.m',
        'main.m',
      ],
      'mac_bundle_resources': [
        'Assets.xcassets/',
        'Base.lproj/MainMenu.storyboard',
      ],
      'link_settings': {
        'libraries': [
          '$(SDKROOT)/System/Library/Frameworks/Cocoa.framework',
        ],
      },
      'xcode_settings': {
        'MACOSX_DEPLOYMENT_TARGET': '10.9',
        'ASSETCATALOG_COMPILER_APPICON_NAME': 'AppIcon',
        'INFOPLIST_FILE': 'Info.plist',
        'DYLIB_INSTALL_NAME_BASE': '@rpath',
      },
      'configurations': {
        'Debug': {
          'xcode_settings': {
            'ONLY_ACTIVE_ARCH': 'YES',
            'DEBUG_INFORMATION_FORMAT': 'dwarf',
          },
        },
      },
    },
  ],
}

上記の例では、"MyApp" というデスクトップアプリケーションをビルドする簡単な GYP の設定を示しています。 実際に、リソースファイルなどを用意して次のコマンドで OS X 10.9 以上をターゲットにした Cocoa アプリケーションの Xcode プロジェクトを作成することができます。1

gyp MyApp.gyp --depth=. -f xcode

例の中で出てきた xcode_settings の各項目についてはこれからざっくり紹介していきます。2

サポートするプラットフォームの設定 (Supported Platforms)

'xcode_settings': {
  'SUPPORTED_PLATFORMS': 'iphonesimulator iphoneos', # iOS
  #'SUPPORTED_PLATFORMS': 'macosx',                  # OS X
  #'SUPPORTED_PLATFORMS': 'watchsimulator watchos',  # watchOS
},

ベース SDK のバージョンを設定 (Base SDK)

'xcode_settings': {
  'SDKROOT': 'iphoneos', # Latest iOS
  #'SDKROOT': 'iphoneos9.0', # iOS 9.0

  #'SDKROOT': 'macosx', # Latest OS X
  #'SDKROOT': 'macosx10.11', # OS X 10.11

  #'SDKROOT': 'watchos', # Latest watchOS
  #'SDKROOT': 'watchos2.0', # watchOS 2.0
},

アーキテクチャの設定 (Architectures)

'xcode_settings': {
  'ARCHS': [
    # Standard architectures (armv7k)
    '$(ARCHS_STANDARD)',

    # Standard Architectures (including 64-bit)
    #'$(ARCHS_STANDARD_INCLUDING_64_BIT)',
  ],
},

ターゲットアーキテクチャの設定 (Valid Architectures)

'xcode_settings': {
  'VALID_ARCHS': [
    'arm64',
    'armv7',
    'armv7s',
    #'$(ARCHS_STANDARD)',
  ],
},

アクティブなアーキテクチャのみターゲットにしてビルドする (Build Active Architecture Only)

'xcode_settings': {
  'ONLY_ACTIVE_ARCH': 'YES',
},

デバッグビルド時のみ有効にする場合は次のようにします。

'configurations': {
  'Debug': {
    'xcode_settings': {
      'ONLY_ACTIVE_ARCH': 'YES',
    },
  },
},

Embed Asset Packs in Product Bundle

'xcode_settings': {
  'EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE': 'YES',
},

デバッグ情報のフォーマット (Debug Infomation Format)

'xcode_settings': {
  'DEBUG_INFORMATION_FORMAT': 'dwarf',            # DWARF
  #'DEBUG_INFORMATION_FORMAT': 'dwarf-with-dsym', # DWARF with dSYM File
},

各ビルドコンフィグレーション (Debug, Release) ごとにデバッグ情報のフォーマットを変更する場合は、次のようにします。

'configurations': {
  'Debug': {
    'xcode_settings': {
      'DEBUG_INFORMATION_FORMAT': 'dwarf',
    },
  },
  'Release': {
    'xcode_settings': {
      'DEBUG_INFORMATION_FORMAT': 'dwarf-with-dsym',
    },
  },
},

Validate Built Product

'xcode_settings': {
  'VALIDATE_PRODUCT': 'YES',
},

コード署名 ID の設定 (Code Signing identity)

'xcode_settings': {
  # Any iOS SDK: iOS Developer
  'CODE_SIGN_IDENTITY[sdk=iphoneos*]': 'iPhone Developer',

  # Any OS X SDK: Don't Code Sign
  'CODE_SIGN_IDENTITY[sdk=macosx*]': '',
},

Mac OS X のターゲットバージョンの設定 (OS X Deployment Target)

Mac で動くアプリケーションを開発する場合、動作対象にする OS X のバージョンを指定することができます。 MACOSX_DEPLOYMENT_TARGET に OS X バージョンを指定します。 次の例では、OS X 10.9 以降をアプリケーションの動作対象に指定しています。

'xcode_settings': {
  'MACOSX_DEPLOYMENT_TARGET': '10.9',
},

上記の設定例でビルドしたアプリケーションは、古い 10.8 (Mountain Lion) などでは実行できず、10.9 (Mavericks) 以降の Mac で動かすことができます。

NOTE
OpenGL 3.3 以降(または OpenGL 4)を使ったアプリケーションを開発する場合は、OS X 10.9 (Mavericks) 以降を動作対象として指定しておくといいでしょう。 OS X 10.8 (Mountain Lion) では OpenGL 3.2 までしか利用できませんが 10.9 以降では OpenGL 4.1 まで対応できます。 また Mavericks や Yosemite (OS X 10.10), El Capitan‎ (10.11) は無償でアップグレードできるため、アプリケーションの動作対象を最新の OS X に引き上げても差支えないでしょう。

iOS のターゲットバージョンの設定 (iOS Deployment Target)

次の例では iOS 9.0 以上をアプリケーションの動作対象となるターゲットに設定しています。

'xcode_settings': {
  'IPHONEOS_DEPLOYMENT_TARGET': '9.0',
},

watchOS のターゲットバージョンの設定 (watchOS Deployment Target)

'xcode_settings': {
  'WATCHOS_DEPLOYMENT_TARGET': '2.0',
},

Skip Install

'xcode_settings': {
  'SKIP_INSTALL': 'YES',
  #'SKIP_INSTALL': 'NO',
},

Strip debug Symbols During Copy

'xcode_settings': {
  #'COPY_PHASE_STRIP': 'YES',
  'COPY_PHASE_STRIP': 'NO',
},

Dynamic Library Install Name Base

'xcode_settings': {
  'DYLIB_INSTALL_NAME_BASE': '@rpath',
  #'DYLIB_INSTALL_NAME_BASE': '@executable_path/../../..',
},

Runpath Search Paths

'xcode_settings': {
  'LD_RUNPATH_SEARCH_PATHS': [
    '$(inherited)',
    '@executable_path/../Frameworks',
    '@loader_path/Frameworks',
  ],
},

Installation Directory

'xcode_settings': {
  'INSTALL_PATH': '$(LOCAL_LIBRARY_DIR)/Frameworks',
},

Compatibility Version

'xcode_settings': {
  'DYLIB_COMPATIBILITY_VERSION': '1',
},

Current Library Version

'xcode_settings': {
  'DYLIB_CURRENT_VERSION': '1',
},

Info.plist ファイルの指定 (Info.plist File)

GYP ファイルからの .plist ファイルへの相対パスを指定します。

'xcode_settings': {
  'INFOPLIST_FILE': 'MyApp/Info.plist',
},

Product Bundle Identifier

'xcode_settings': {
  'PRODUCT_BUNDLE_IDENTIFIER': 'com.example.MyApplication',
},

Product Name

'xcode_settings': {
  'PRODUCT_NAME': '$(TARGET_NAME)',
},

Defines Module

'xcode_settings': {
  'DEFINES_MODULE': 'YES',
},

Framework Version

'xcode_settings': {
  'FRAMEWORK_VERSION': 'A',
},

Always Search User Paths

'xcode_settings': {
  'ALWAYS_SEARCH_USER_PATHS': 'NO',
  #'ALWAYS_SEARCH_USER_PATHS': 'YES',
},

ライブラリのディレクトリパスを追加する (Library Search Paths)

LIBRARY_SEARCH_PATHS に追加します。

'xcode_settings': {
  'LIBRARY_SEARCH_PATHS': [
    '$(SDKROOT)/System/Library/Frameworks',
  ],
},

パスが1つの場合は、次のような記述でもかまいません。

'xcode_settings': {
  'LIBRARY_SEARCH_PATHS': '$(SDKROOT)/System/Library/Frameworks',
},

また LIBRARY_SEARCH_PATHS[sdk=macosx*] とすることでターゲットプラットフォームごとに設定をパスを指定することも可能です。 次の例では OS X 向けのビルドと、iOS 向けのビルドでライブラリパスを変更しています。

'xcode_settings': {
  'LIBRARY_SEARCH_PATHS[sdk=macosx*]': '~/MacOSX10.11.sdk/System/Library/Frameworks',
  'LIBRARY_SEARCH_PATHS[sdk=iphoneos*]': '$(SDKROOT)/System/Library/Frameworks',
},

Versioning System

'xcode_settings': {
  #'VERSIONING_SYSTEM': '',             # None
  'VERSIONING_SYSTEM': 'apple-generic', # Apple Generic
},

コンパイラの最適化レベル (Optimization Level)

'xcode_settings': {
  # None [-O0]
  #'GCC_OPTIMIZATION_LEVEL': '0',

  # Fast [-O, O1]
  #'GCC_OPTIMIZATION_LEVEL': '1',

  # Faster [-O2]
  #'GCC_OPTIMIZATION_LEVEL': '2',

  # Fastest [-O3]
  'GCC_OPTIMIZATION_LEVEL': '3',

  # Fastest, Smallest [-Os]
  #'GCC_OPTIMIZATION_LEVEL': 's',

  # Fastest, Aggressive Optimizations [-Ofast]
  #'GCC_OPTIMIZATION_LEVEL': 'fast',
},

各ビルドコンフィグレーション (Debug, Release) ごとに最適化レベルを変更する場合は、次のようにします。

'configurations': {
  'Debug': {
    'xcode_settings': {
      'GCC_OPTIMIZATION_LEVEL': '0',
    },
  },
  'Release': {
    'xcode_settings': {
      'GCC_OPTIMIZATION_LEVEL': 's',
    },
  },
},

シンボルのデフォルトの Visibility 属性を設定する (Symbols Hidden by Default)

GCC および Clang における -fvisibility=hidden オプションに対応するビルド設定は次のようになります。

'xcode_settings': {
  'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES', # '-fvisibility=hidden'
},

インライン関数の Visibility 属性を設定する (Inline Methods Hidden)

GCC および Clang における -fvisibility-inlines-hidden オプションに対応するビルド設定は次のようになります。

'xcode_settings': {
  'GCC_INLINES_ARE_PRIVATE_EXTERN': 'YES', # '-fvisibility-inlines-hidden'
},

C++ のコンパイラフラグを設定する (OTHER_CPLUSPLUSFLAGS)

'xcode_settings': {
  'OTHER_CPLUSPLUSFLAGS': [
    '-fno-exceptions',
    '-fno-rtti',
  ],
},

警告のレベルを指定する (Other Warning Flags)

'xcode_settings': {
  'WARNING_CFLAGS': [
    '-Wall',
  ],
},

コンパイラを LLVM Clang または GCC に切り替える (Compiler for C/C++/Objective-C)

Xcode ではコンパイラとして LLVM Clang と GCC を利用することができます。 コンパイラに Clang を使うには、GCC_VERSION を次のように指定します。

'xcode_settings': {
  'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0',
},

C コンパイラのバージョンを変更する (C Language Dialect)

'xcode_settings': {
  #'GCC_C_LANGUAGE_STANDARD': 'ansi',             # ANSI C [-ansi]
  #'GCC_C_LANGUAGE_STANDARD': 'c89',              # C89 [-std=c89]
  #'GCC_C_LANGUAGE_STANDARD': 'gnu89',            # GNU89 [-std=gnu89]
  #'GCC_C_LANGUAGE_STANDARD': 'c99',              # C99 [-std=c99]
  #'GCC_C_LANGUAGE_STANDARD': 'gnu99',            # GNU99 [-std=gnu99]
  'GCC_C_LANGUAGE_STANDARD': 'c11',              # C11
  #'GCC_C_LANGUAGE_STANDARD': 'gnu11',            # GNU11
  #'GCC_C_LANGUAGE_STANDARD': 'compiler-default', # Compiler Default
},

標準ライブラリとして libc++ または libstdc++ を使う

Xcode 7 からは CLANG_CXX_LIBRARY の項目がなくなったため特に指定する必要はありません。

'xcode_settings': {
  #'CLANG_CXX_LIBRARY': 'libstdc++',
  'CLANG_CXX_LIBRARY': 'libc++',
},

C++11 または C++14 でコンパイルする

Xcode で C++11 または C++14 を対象にする場合は、CLANG_CXX_LANGUAGE_STANDARD を指定します。

'xcode_settings': {
  #'CLANG_CXX_LANGUAGE_STANDARD': 'c++0x',
  #'CLANG_CXX_LANGUAGE_STANDARD': 'c++11',
  #'CLANG_CXX_LANGUAGE_STANDARD': 'c++1y',
  'CLANG_CXX_LANGUAGE_STANDARD': 'c++14',
},

C++11 以降を利用する場合は、コンパイラに LLVM Clang を、C++ の標準ライブラリに libc++ を指定する必要があります。 また libc++ を使うには OS X 10.7 以上を利用する必要があるので注意してください。

'xcode_settings': {
  'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0',
  'CLANG_CXX_LANGUAGE_STANDARD': 'c++14',
  'CLANG_CXX_LIBRARY': 'libc++',
},

Enable Modules (C and Objective-C)

'xcode_settings': {
  #'CLANG_ENABLE_MODULES': 'NO',
  'CLANG_ENABLE_MODULES': 'YES',
},

Objective-C の ARC を有効にする (Objective-C Automatic Reference Counting)

Objective-C の ARC (Automatic Reference Counting) を有効にするには次のように CLANG_ENABLE_OBJC_ARCYES に設定します。

'xcode_settings': {
  'CLANG_ENABLE_OBJC_ARC': 'YES',
},

Enable Foundation Assertions

'xcode_settings': {
  'ENABLE_NS_ASSERTIONS': 'NO',
  #'ENABLE_NS_ASSERTIONS': 'YES',
},

Release ビルド時のみアサーションを無効にする場合は、次のようにします。

'configurations': {
  'Release': {
    'xcode_settings': {
      'ENABLE_NS_ASSERTIONS': 'NO',
    },
  },
},

コンパイラの警告をエラーとして扱う (Warning Policies - Treat Warnings as Errors)

'xcode_settings': {
  'GCC_TREAT_WARNINGS_AS_ERRORS': 'YES',
},

そのほかコンパイラの警告に関する設定 (Warning Policies) には以下の項目があります。

'xcode_settings': {
  # Inhibit All Warnings
  'GCC_WARN_INHIBIT_ALL_WARNINGS': 'YES',

  # Pedantic Warnings
  'GCC_WARN_PEDANTIC': 'YES',
},

コンパイラの警告を有効または無効にする (Warnings)

Visual Studio ではコンパイラの警告レベルを指定することができましたが、Xcode では警告の内容ごとに細かく指定することができます。 GCC_ のプリフィクスを持つ設定については GCC だけでなくコンパイラの LLVM Clang についても有効です。

言語共通の警告 (Warnings - All languages)

'xcode_settings': {
  'CLANG_WARN_ASSIGN_ENUM': 'YES',
  'CLANG_WARN_BOOL_CONVERSION': 'YES',
  'CLANG_WARN_CONSTANT_CONVERSION': 'YES',
  'CLANG_WARN_DOCUMENTATION_COMMENTS': 'YES',
  'CLANG_WARN_EMPTY_BODY': 'YES',
  'CLANG_WARN_IMPLICIT_SIGN_CONVERSION': 'YES',
  'CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION': 'YES',
  'CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION': 'YES',
  'CLANG_WARN_UNREACHABLE_CODE': 'YES',

  'GCC_WARN_64_TO_32_BIT_CONVERSION': 'YES',
  'GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS': 'YES',
  'GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS': 'YES',
  'GCC_WARN_ABOUT_MISSING_NEWLINE': 'YES',
  'GCC_WARN_ABOUT_MISSING_PROTOTYPES': 'YES',  
  'GCC_WARN_CHECK_SWITCH_STATEMENTS': 'YES',
  'GCC_WARN_FOUR_CHARACTER_CONSTANTS': 'YES',
  'GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS': 'YES',
  'GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED': 'YES',
  'GCC_WARN_MISSING_PARENTHESES': 'YES',
  'GCC_WARN_NON_VIRTUAL_DESTRUCTOR': 'YES',
  'GCC_WARN_SHADOW': 'YES',
  'GCC_WARN_SIGN_COMPARE': 'YES',
  'GCC_WARN_TYPECHECK_CALLS_TO_PRINTF': 'YES',
  'GCC_WARN_UNKNOWN_PRAGMAS': 'YES',
  'GCC_WARN_UNUSED_FUNCTION': 'YES',
  'GCC_WARN_UNUSED_LABEL': 'YES',
  'GCC_WARN_UNUSED_PARAMETER': 'YES',
  'GCC_WARN_UNUSED_VALUE': 'YES',
  'GCC_WARN_UNUSED_VARIABLE': 'YES',

  #'GCC_WARN_ABOUT_RETURN_TYPE': 'NO',       # No
  #'GCC_WARN_ABOUT_RETURN_TYPE': 'YES',      # Yes
  'GCC_WARN_ABOUT_RETURN_TYPE': 'YES_ERROR', # Yes (treat as error)

  #'GCC_WARN_UNINITIALIZED_AUTOS': 'NO',            # No
  #'GCC_WARN_UNINITIALIZED_AUTOS': 'YES',           # Yes
  'GCC_WARN_UNINITIALIZED_AUTOS': 'YES_AGGRESSIVE', # Yes (Aggressive)

  # Treat Missing Function Ptorotypes as Errors
  'GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS': 'YES',

  # Treat Incompatible Pointer Type Warnings as Errors
  'GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS': 'YES',
},

C++ に関する警告の設定 (Warnings - C++)

'xcode_settings': {
  # Exit-Time C++ Destructors
  'CLANG_WARN__EXIT_TIME_DESTRUCTORS': 'YES',

  # Nonvirtual Destructor
  'GCC_WARN_NON_VIRTUAL_DESTRUCTOR': 'YES',

  # Overloaded Virtual Functions
  'GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS': 'YES',

  # Undefined use of offsetof Macro
  #'GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO': 'YES',

  # Using C++11 extensions in earlier versions of C++
  'CLANG_WARN_CXX0X_EXTENSIONS': 'YES',
},

Objective-C に関する警告の設定 (Warnings - Objective C)

'xcode_settings': {
  'CLANG_WARN__DUPLICATE_METHOD_MATCH': 'YES',
  'CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES': 'YES',
  'CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS': 'YES',
  #'GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL': 'YES',
  'CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS': 'YES',
  'GCC_WARN_STRICT_SELECTOR_MATCH': 'YES',
  'GCC_WARN_UNDECLARED_SELECTOR': 'YES',

  #'CLANG_WARN_DIRECT_OBJC_ISA_USAGE': 'NO',       # No
  #'CLANG_WARN_DIRECT_OBJC_ISA_USAGE': 'YES',      # Yes
  'CLANG_WARN_DIRECT_OBJC_ISA_USAGE': 'YES_ERROR', # Yes (treat as error)

  #'CLANG_WARN_OBJC_ROOT_CLASS': 'NO',       # No
  #'CLANG_WARN_OBJC_ROOT_CLASS': 'YES',      # Yes
  'CLANG_WARN_OBJC_ROOT_CLASS': 'YES_ERROR', # Yes (treat as error)
},

Objective-C と ARC に関する警告の設定 (Warnings - Objective C and ARC)

'xcode_settings': {
  'CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE': 'YES',
  'CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF': 'YES',
  'CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK': 'YES',
  #'CLANG_WARN__ARC_BRIDGE_CAST_NONARC': 'YES',
},

Asset Catalog App Icon Set Name

'xcode_settings': {
  'ASSETCATALOG_COMPILER_APPICON_NAME': 'AppIcon',
},

Metal のデバッグ情報を有効または無効にする (MTL_ENABLE_DEBUG_INFO)

Release デバッグ時のみ有効にする場合は、次のようにします。

'configurations': {
  'Debug': {
    'xcode_settings': {
      'MTL_ENABLE_DEBUG_INFO': 'YES',
    },
  },
  'Release': {
    'xcode_settings': {
      'MTL_ENABLE_DEBUG_INFO': 'NO',
    },
  },
},

最後に

一昨年の夏くらいでしょうか、Xcode や Cocoa のプロジェクトを GYP で作成する方法を簡単にまとめてみようと画策していたのですが、なかなか筆が進まず今日になってようやく公開することができました。

GYP を使わなくても、直接 Xcode のプロジェクトを管理したり、CocoaPods や CMake を使ったり、他にもいろいろなプロジェクトの進め方や管理方法があります。 Chromium プロジェクトについても GYP に代わるビルドツール GN に少しずつ置き換えられているようです。 とは言っても、JavaScript エンジンである V8 をはじめとして Node.js や Electron (Atom Shell) でまだまだ GYP が使われています。 また、今回は触れませんでしたが、最新の GYP では watchOS 向けのビルドターゲットもサポートしているようです。 この記事が、Mac のデスクトップアプリや Node.js モジュールを作成する際などにお役立ていただければ幸いです。

NOTE: GYP 以外のビルドツール・ライブラリマネージャーの選択肢
Xcode のプロジェクトファイルを作ったり、依存するライブラリを管理してくれるツールや方法はいくつかあります。 GYP, CMake, premake の他に Objective-C や Swift のプロジェクトに特化したライブラリマネージャー CocoaPods があります。 CocoaPods は、プロジェクトに必要なライブラリを簡単に追加することができ、依存するパッケージのアップデートに追従することができます。 また多くの Objective-C で書かれたライブラリ(例えば AFNetworking など)は、CocoaPods に対応しています。 CocoaPods はその性質上クロスプラットフォームではありませんが、Mac/iOS のみをターゲットにする場合は、今のところ最適な手段のように思えます。 Xcode プロジェクトに関しては他にも Carthage というライブラリマネージャーなどがあります。 GYP も含めて、各ビルドツール・ライブラリマネージャーについて広く選択肢を持っておくのは良さそうです。

参考文献


  1. ソースコードやリソースファイルについては Xcode > "Create a new Xcode project" > OS X > Cocoa Application から作成することができます。 

  2. Xcode 7 の ”Build Settings” の順に掲載しています。 

Leave a Reply