XcodeGenのSettings周りを整理する
Table of Contents
XcodeGenは便利ですが、プロジェクト仕様ファイル(project.yml)のSettingsに関して自分の中で不透明なので整理しました。
Settingsとは?
XcodeGenのプロジェクト仕様ファイル内で使えるビルド設定を定義するプロパティと総称。
settings
はプロジェクトとターゲットの2箇所で使える- ビルド設定の値の解決はレベル順となっている
- Build Configuration(DebugやReleaseなど)別でビルドパラメータを設定できる
- Build Configurationにも適用される
base
プロパティがある settingGroups
でビルド設定を共通化できる- Xcode同様に自動で適用されるプリセットビルド設定がある
- ビルド設定群を別ファイル(xcconfig)として抜き出せる
ビルド設定はプロジェクトとターゲットで出来る
例えば次のプロジェクト仕様はプロジェクトとMyAppターゲットそれぞれでビルド設定をセットしています。
settings:
SWIFT_ACTIVE_COMPILATION_CONDITIONS: [project_value]
targets:
MyApp:
settings:
SWIFT_ACTIVE_COMPILATION_CONDITIONS: [target_value]
ビルド設定の値の解決方法
ビルド設定の値はレベル順に見ていってる。
- Target
- Target xcconfig file
- Project
- Project xcconfig file
- SDK defaults
Targetの設定が一番強く、下に行くほど範囲は広いが上書きされる。
検証するために次のプロジェクト仕様で確認する。
name: Settings
options:
bundleIdPrefix: com.mothule
settings:
SWIFT_ACTIVE_COMPILATION_CONDITIONS: [DEBUG, project_value]
targets:
Settings:
type: application
platform: iOS
sources: Settings
settings:
SWIFT_ACTIVE_COMPILATION_CONDITIONS: [DEBUG, target_value]
これを実際にXcodeで確認するとこうなる。
想定通り、Settings
ターゲットでは値はtarget_value
で解決されてる。
この挙動に関しては理解は容易と言える。
Build Configuration別でビルドパラメータを設定できる
DebugやReleaseなどBuild Configuration別でビルド設定を変えることができます。
例えば下記はDebug時はDEBUG
が定義され、Release時はRELEASE
が定義されます。
targets:
MyApp:
settings:
configs:
Debug:
SWIFT_ACTIVE_COMPILATION_CONDITIONS: [DEBUG]
Release:
SWIFT_ACTIVE_COMPILATION_CONDITIONS: [RELEASE]
Build Configurationにも適用されるbase
プロパティがある
Build Configurationに依存せず設定したビルドパラメータを入れたい場合は、base
を使います。
configs:
Debug: debug
CI: debug
Release: release
settings:
base:
DEVELOPMENT_TEAM: HogeHoge
configs:
Debug:
SWIFT_ACTIVE_COMPILATION_CONDITIONS: [DEBUG]
CI:
SWIFT_ACTIVE_COMPILATION_CONDITIONS: [DEBUG, CI]
Release:
SWIFT_ACTIVE_COMPILATION_CONDITIONS: [RELEASE]
この場合はどのBuild ConfigurationであってもDEVELOPMENT_TEAM
はHogeHoge
となります。
settingGroups
でビルド設定を共通化できる
例えばターゲットが5個あって、そのうち3つには同じビルド設定群がある場合、settingGroups
を使うことで設定箇所を1箇所にまとめることができます。
下記はsettingGroups
を使わなかったケースです。
targets:
App1:
settings:
DEVELOPMENT_TEAM: HogeHoge
App2:
settings:
DEVELOPMENT_TEAM: HogeHoge
App3:
settings:
DEVELOPMENT_TEAM: HogeHoge
DebugApp:
settings:
DEBUG_MODE: YES
StgApp:
settings:
DEBUG_MODE: NO
これだと1箇所ずつ更新する必要があり、更新し忘れなどが発生します。
下記のようにsettingGroups
を使うことで情報を1箇所に集約することができます。
settingGroups:
app: # ← 任意のグループ名
settings:
DEVELOPMENT_TEAM: HogeHoge
target:
App1:
settings:
groups: [app]
App2:
settings:
groups: [app]
App3:
settings:
groups: [app]
DebugApp:
settings:
DEBUG_MODE: YES
StgApp:
settings:
DEBUG_MODE: NO
Xcode同様に自動で適用されるプリセットビルド設定がある
Xcodeがプロジェクトやターゲット追加時に自動で設定が設定されるのと同様に、XcodeGenにもプロジェクトとターゲットにデフォルト設定を設定する。
プロジェクトにはDebugとReleaseの設定が、ターゲットにはプラットフォームとプロダクトタイプに応じた設定が適用される。
これらのプリセットを変更・無効するにはoptions.settingPresets
プロパティを使います。
デフォルトではall
となっておりプロジェクトとターゲット両方に対して適用されています。
もしターゲットだけ、プロジェクトだけとしたい場合は、options.settingPresets: project
やtargets
とすることで部分適用されます。
もし両方とも自動適用を無効にする場合はnone
になります。
ビルド設定群を別ファイル(xcconfig)として抜き出せる
ビルド設定のボリュームが大きくなると、プロジェクト仕様全体として見通しの悪いファイルとなってしまいます。
その場合はconfigFiles
を使ってxcconfig
ファイルをインポートしてビルド構成を別ファイルに抽出できます。
configFiles:
Debug: debug.xcconfig
Release: release.xcconfig
targets:
MyApp:
configFiles:
Debug: MyApp/debug.xcconfig
Release: MyApp/release.xcconfig
configFiles
でもプロジェクト単位とターゲット単位で設定できます。
xcconfig
について分からない方は「Xcodeのxcconfigの理解と使い方
」にまとめた記事をお読みください。
結論
この記事を書くにあたって、xcconfigの仕様を調べましたが、settings周りの仕様はxcconfigの仕様を把握すると理解が一気に深まりました。
xcconfigについては「Xcodeのxcconfigの理解と使い方
」にまとめてあります。