XcodeGenでBuild ConfigurationとSchemeの設定をする

XcodeGenでBuild ConfigurationとSchemeの設定をする

Table of Contents

XcodeGenでDebugやReleaseなどBuild Configuration自体を追加したり、Build Configuration毎にビルドパラメータを変えたりする方法について説明します。

新しいBuild Configurationの登録

デフォルトはDebugとReleaseですが、新しく追加する場合はconfigsプロパティで追加します。

configs:
  Debug: debug
  Beta: release
  AppStore: release
  CI: debug

例えば Beta: releaseとは、Build Configuration名をBetaと名付け、ベースをReleaseにしてあります。
値の部分がdebugまたはrelease以外だとデフォルト値が適用されなくなります。

Build Configuration毎にビルドパラメータを変更

デフォルトのDebugとReleaseとは違いをつけたいから新しくBuild Configurationを追加したのに
そのままでは意味がありません。Build Configuration毎にビルドパラメータを変更します。

CIではAssertionを無効にしてみる

例えばCI時のみ動かないassertを作ろうと思います。 assert(_:)メソッド自体は適当です。何でもいいので説明省きます。

#if DISABLE_ASSERTION
func assert(_ string: String) {}
#else
func assert(_ string: String) {
    Swift.assertionFailure(string)
}
#endif

コード側で重要なのはプリプロセッサの条件式に入ってるDISABLE_ASSERTIONです。
これをXcodeGenで定義するには、settings.configs.CI.SWIFT_ACTIVE_COMPILATION_CONDITIONSに値を追加します。

targets:
  CustomBuildConfig: # ← ターゲット名
    # 〜 略 〜
    settings:
      configs:
        CI:
          SWIFT_ACTIVE_COMPILATION_CONDITIONS: [DEBUG, DISABLE_ASSERTION]

これを実行するとXcodeに反映されます。

XcodeBuildConfiguration

settingsはプロジェクト仕様のルートに置くことでターゲット毎でなく全体適用させることもできます。

プロパティ名の見つけ方

例えばXcodeのBuild Settings > Development Teamを用意する場合はDEVELOPMENT_TEAMプロパティをセットします。

XcodeBuildSettingsDevelopmentTeam

settings:
  DEVELOPMENT_TEAM: hogehoge    

ではどうやってXcodeのBuild Settingsとプロジェクト仕様のプロパティを一致させてるのか?
それはxcconfigと同じ値を使っています。

詳しくは「xcconfigで使うパラメータ名の見つけ方 」にまとめてあります。

XcodeGenでテスト時のBuild ConfigurationをCIにする

前述した方法を実施することでCI用のBuild Configurationとビルドパラメータを定義することができます。
しかし生成したXcodeではBuild ConfigurationがDebugのままです。
これだとCIでXcode生成して実行する場合では意図したBuild Configurationになりません。
デフォルトをDebugではなくCIにする必要があります。

デフォルトにするにはSchemeを使うことで定義できます。

schemes:
  CustomBuildConfig: # ← スキーム名
    build:
      targets:
        CustomBuildConfig: all # ← ビルド対象ターゲットと対応Actionの設定
        CustomBuildConfigTests: [test]
    test:
      config: CI

こうすることで下図のようになります。

XcodeSchemes

これを追加することで生成されたXcodeプロジェクトを開くと初めからTestのBuild ConfigurationはCIになります。

テストターゲットやカバレッジ指定をする

前述した設定でTest時のデフォルトBuild ConfigurationをCIにすることができました。
しかし、いざテストを実行しても動きません。
それはテストターゲットが設定されていないためです。

schemes:
  CustomBuildConfig:
    build:
      targets:
        CustomBuildConfig: all
        CustomBuildConfigTests: [test]
    test:
      targets:
        - CustomBuildConfigTests # ← テストターゲット名
      config: CI
      gatherCoverageData: true

先程のymlのtestプロパティを変更しました。こうすることでテストターゲットが選ばれた状態でXcodeプロジェクトが作成されます。

XcodeSchemes

今回の使ったコードはGitHubにアップしてありますので、全体像を掴みたい場合はご確認ください。

XcodeGenでEmbedded frameworkを登録する

XcodeGenでBuild Configuration別のビルドチューニングについて説明しました。
もしまだSettings周りで不明点がある場合は、「XcodeGenのSettings周りを整理する 」をおすすめします。

次はEmbedded frameworkを「Embedded frameworkの理解と作成方法 」で説明します。

このエントリーをはてなブックマークに追加