他の回答で述べたように、Xcode 10 より前の xcconfig ファイルは、互いの値を単純に継承および拡張することはできませんでした。しかし、
Xcode 10 以降、xcconfig は期待どおりに機能するようになりました。$(inherited)
実際には、変数の以前に定義された値に展開されます。
.xcconfig ファイルに同じビルド設定の複数の割り当てが含まれている場合、後の割り当ては、.xcconfig の以前の割り当てを使用する$(inherited)
か$(<setting_name>)
継承します。レガシ ビルド システムでは、.xcconfig 内で定義された他の値が使用されるたびに、$(inherited)
またはスキップされていました。$(<setting_name>)
.xcconfig がこの改善の影響を受けるかどうかを検出するためdefaults write com.apple.dt.XCBuild EnableCompatibilityWarningsForXCBuildTransition -bool YES
に、ターミナルで実行すると、Xcode がこの状況に関する警告を生成します。
(Xcode 10 ベータ 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
。
( -DMY_DEBUG_FLAG
Xcode 9 以前のリリースではなく)
新しい動作は非常に簡単です:$(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
( 1に遭遇し $(inherited)
た最初の定義であるため、何も展開されません) です。OTHER_SWIFT_FLAGS
OTHER_SWIFT_FLAGS
上書きされた場合は 2 行目で、その値は現在-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_GENERIC_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_GENERIC_FLAG
OTHER_SWIFT_FLAGS = $(inherited) -DMY_LAST_FLAG
最終的に解決された値は、最後の行で定義された-DMY_LAST_FLAG
値に、前の行から継承した値-DDMY_GENERIC_FLAG
(Last.xcconfig に含まれる Generic.xcconfig から取得) などを加えたものになります。
当然のことながら、定義の 1 つを忘れる$(inherited)
と、継承チェーンが壊れて、下の定義から値のみを取得し、 のない定義まで取得することに注意してください$(inherited)
。
1 xcconfig ファイルがプロジェクト レベルで定義された以前の値を継承することを期待するかもしれませんが、そうではないようです。
Xcode 10 ベータ 1 の時点で、ビルド設定エディター GUI は xcconfig ファイルで定義された変数の正しい値を適切に解決せず、古い Xcode 10 より前の動作で解決されたかのように値を表示するようです。これに関して rdar://40873121 を提出しました ( https://openradar.appspot.com/radar?id=4925869923500032 )。