web-dev-qa-db-ja.com

xcconfig変数に値を追加する方法は?

Xcodeおよび.xcconfigファイルを使用しています。プリプロセッサ定義にいくつかの値を追加しようとしていますが、それを機能させることができません。

私は次のことを試しました(これの多くのバリエーションと同様に)、しかし今のところ運がありません:

GCC_PREPROCESSOR_DEFINITIONS = '$(GCC_PREPROCESSOR_DEFINITIONS) NEW_VALUE'

NEW_VALUEシンボルがプリプロセッサ定義に追加されることはありません。

Xcconfigファイルの変数に新しい値を追加することに成功した人はいますか?

42
Martin Cote

この質問の他の回答で述べられている理由により、値を簡単に継承することはできません。

カスケードで設定を定義することをお勧めします。 APPがプロジェクトのプレフィックスであると仮定し、これをいくつかのCFLAGSのみを定義する単純なものにします。

platform.xcconfig:

_APP_PLATFORM_CFLAGS = -DMAS=1
_

project.xcconfig:

_#include "platform.xcconfig"
APP_PROJECT_CFLAGS = -DBETA=1
_

target-one.xcconfig:

_#include "project.xcconfig"
APP_TARGET_CFLAGS = -DSUPER_COOL=1
#include "merge.xcconfig"
_

target-two.xcconfig:

_#include "project.xcconfig"
APP_TARGET_CFLAGS = -DULTRA_COOL=1
#include "merge.xcconfig"
_

merge.xcconfig:

_OTHER_CFLAGS = $(inherited) $(APP_PLATFORM_CFLAGS) $(APP_PROJECT_CFLAGS) $(APP_TARGET_CFLAGS)
_

次に、各ターゲットビルド構成を_target-xxx.xcconfig_に基づいて作成します。実際のプロジェクトでは、プロジェクト用の構成ファイルとターゲット用の別の構成ファイルを使用して、より複雑なセットアップを使用しますが、アイデアはわかります。

また、$(inherited)は階層内のhigherレベルを指し、earlier。たとえば、プロジェクトレベルからターゲットレベルを継承します。これがXcode 4にも当てはまるかどうかはわかりません。

これは [〜#〜] gtm [〜#〜] の簡略化です。詳細については、ここを参照してください。

32
djromero

Xcodeビルドシステムガイドによると:

構成ユニットに特定のビルド設定の複数の定義が含まれている場合、Xcodeはユニット内の最後の定義を使用します。構成ファイルは、それらに含まれる構成ファイルで作成されたビルド設定定義にアクセスできないことに注意してください。つまり、含まれている構成ファイルで行われた定義を変更することはできません。交換のみ可能です。

したがって、これは、指定された変数に値を追加することができないことを意味すると思います。

10
Martin Cote

これは機能します:

xcodebuild GCC_PREPROCESSOR_DEFINITIONS='$(value) NEW_VALUE'
9
Laxman Battini

他の回答で述べたように、Xcode 10以前は、xcconfigファイルはお互いの値を単純に継承および拡張できませんでした。だが、

Xcode 10以降、xcconfigは期待どおりに機能するようになりました。$(inherited)は、以前に定義された変数の値に実際に展開されます。

.xcconfigファイルに同じビルド設定の複数の割り当てが含まれている場合、$(inherited)または$(<setting_name>)を使用した後の割り当ては、.xcconfigの以前の割り当てから継承されます。従来のビルドシステムでは、$(inherited)または$(<setting_name>)を使用するたびに、.xcconfig内で定義されている他の値がスキップされていました。 .xcconfigがこの改善の影響を受けるかどうかを検出するには、ターミナルでdefaults write com.Apple.dt.XCBuild EnableCompatibilityWarningsForXCBuildTransition -bool YESを実行すると、Xcodeがこの状況に関する警告を生成します。

(Xcode 10 beta 1リリースノート)

たとえば、2つの単純な.xcconfigファイルがあるとします。

// Generic.xcconfig
OTHER_Swift_FLAGS = $(inherited) -DMY_GENERIC_FLAG
// Debug.xcconfig
#include "Generic.xcconfig"
OTHER_Swift_FLAGS = $(inherited) -DMY_DEBUG_FLAG

プロジェクトのデバッグ構成にDebug.xcconfigを使用していると想定すると、-DMY_GENERIC_FLAG -DMY_DEBUG_FLAGの期待値OTHER_Swift_FLAGSが得られます。

(Xcode 9以前のリリースでは-DMY_DEBUG_FLAGだけではありません)


新しい動作は非常に簡単です。$(inherited)は、以前に定義された変数の値(ある場合)に置き換えられます。

したがって、前の例で#includeステートメントを展開すると、次のxcconfigファイルが取得されます。

// Merged xcconfig files after resolving #include
OTHER_Swift_FLAGS = -DMY_GENERIC_FLAG
OTHER_Swift_FLAGS = $(inherited) -DMY_DEBUG_FLAG
  • 最初の行のOTHER_Swift_FLAGSの値は-DMY_GENERIC_FLAGです($(inherited)は何にも展開されません。これは、発生するOTHER_Swift_FLAGSの最初の定義だからです。1)。
  • 2行目では、上書きされた場合はOTHER_Swift_FLAGSになり、その値は-DMY_GENERIC_FLAG -DMY_DEBUG_FLAGになります(以前の値+新しく追加されたフラグ)。

より複雑なxcconfig設定では、次のようになります。

// First.xcconfig
OTHER_Swift_FLAGS = $(inherited) -DMY_FIRST_FLAG
// Second.xcconfig
OTHER_Swift_FLAGS = $(inherited) -DMY_SECOND_FLAG
// Last.xcconfig
#include "Generic.xcconfig"
OTHER_Swift_FLAGS = $(inherited) -DMY_LAST_FLAG
// Merge.xcconfig
#include "First.xcconfig"
#include "Second.xcconfig"
OTHER_Swift_FLAGS = $(inherited) -DMY_INTERMEDIATE_FLAG
#include "Last.xcconfig"

今回は構成でMerge.xcconfigを使用していると想定します。

OTHER_Swift_FLAGSの解決された値は-DMY_FIRST_FLAG -DMY_SECOND_FLAG -DMY_INTERMEDIATE_FLAG -DMY_LAST_FLAGになります。

これは最初は驚くかもしれませんが、実際には意味があります。#includeが解決されると、次のxcconfigになります。

OTHER_Swift_FLAGS = $(inherited) -DMY_FIRST_FLAG
OTHER_Swift_FLAGS = $(inherited) -DMY_SECOND_FLAG
OTHER_Swift_FLAGS = $(inherited) -DMY_INTERMEDIATE_FLAG
OTHER_Swift_FLAGS = $(inherited) -DMY_LAST_FLAG

最終的に解決された値は、最後の行で定義された値、つまり-DMY_LAST_FLAGと前の行から継承した値-DMY_INTERMEDIATE_FLAGなどです。

当然のことながら、いずれかの定義で$(inherited)を忘れた場合は、継承チェーンを壊し、$(inherited)を含まない定義の上位の定義からのみ値を取得します。


1 xcconfigファイルがプロジェクトレベルで定義された以前の値を継承することを期待するかもしれませんが、そうではないようです


???? Xcode 10ベータ1以降、ビルド設定エディターGUIはxcconfigファイルで定義された変数の正しい値を適切に解決せず、古いXcode 10以前の動作で解決されたかのように値を表示します。これに関してrdar:// 40873121を提出しました( https://openradar.appspot.com/radar?id=4925869923500032 )。

7
Guillaume Algis

別の質問 があり、この特定の問題に役立つ可能性のある回答があります。それは、各層が定義のサブセットを構成し、それらをすべてリーフレベルのxcconfigでまとめる手法について説明しています。

4
fbrereto

Cocoapodsのxcconfigファイルを自分のファイルに統合しようとしているときに、少し良いアプローチに出くわしたと思います。私は自分のプロジェクトで以下を設定したい

GCC_PREPROCESSOR_DEFINITIONS = CONFIGURATION_$(CONFIGURATION)

残念ながら、これはPods.xcconfigに付属する定義と競合します。他の場所で述べたように、$(inherited)は期待どおりに機能しません。機能するのは次のとおりです

GCC_PREPROCESSOR_DEFINITIONS[config=*] = CONFIGURATION_$(CONFIGURATION) $(inherited)

更新:

特定の構成の設定を上書きする必要がある場合は、次のようなものを書きたくなります。

GCC_PREPROCESSOR_DEFINITIONS[config=*] = CONFIGURATION_$(CONFIGURATION) $(inherited)
GCC_PREPROCESSOR_DEFINITIONS[config=Debug] = DEBUG=1 CONFIGURATION_$(CONFIGURATION) $(inherited)

悲しいことにこれは機能しませんが、2番目の宣言をファイルに入れると、デバッグ構成によってのみロードされ、設定が適切にオーバーライドされます。

4
James Moore

これはXcode 2.4.1で私にとってはうまくいきます:

 GCC_PREPROCESSOR_DEFINITIONS = "$(GCC_PREPROCESSOR_DEFINITIONS)NEW_VALUE" 

設定ファイルを編集してからターゲットのビルド情報に変更が表示されるまでに数秒かかる場合があります。

1

プレースホルダー$(inherited)を使用して、下位レベルから継承された値を表します。

GCC_PREPROCESSOR_DEFINITIONS = "$(inherited) NEW_VALUE"
0
cdespinosa