48

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

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

GCC_PREPROCESSOR_DEFINITIONS = '$(GCC_PREPROCESSOR_DEFINITIONS) NEW_VALUE'

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

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

4

8 に答える 8

36

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

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

platform.xcconfig:

APP_PLATFORM_CFLAGS = -DMAS=1

project.xcconfig:

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

ターゲット-one.xcconfig:

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

ターゲット-two.xcconfig:

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

マージ.xcconfig:

OTHER_CFLAGS = $(inherited) $(APP_PLATFORM_CFLAGS) $(APP_PROJECT_CFLAGS) $(APP_TARGET_CFLAGS)

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

また、は以前の ではなく、階層の上位$(inherited)レベルを指すことに注意してください。たとえば、プロジェクト レベルからターゲット レベルで継承します。これが Xcode 4 にも当てはまるかどうかはわかりません。

これはGTMを簡略化したものです。詳細については、GTM を参照してください。

于 2011-03-13T12:39:25.877 に答える
19

他の回答で述べたように、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_FLAGXcode 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 )。

于 2018-06-06T23:34:35.227 に答える
10

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

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

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

于 2009-09-09T19:44:00.470 に答える
9

これは機能します:

xcodebuild GCC_PREPROCESSOR_DEFINITIONS='$(value) NEW_VALUE'
于 2012-09-27T16:30:53.283 に答える
4

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 番目の宣言を配置すると、設定が適切に上書きされます。

于 2014-08-14T22:13:02.483 に答える
4

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

于 2010-01-15T19:37:05.900 に答える
1

これは、Xcode 2.4.1 で機能します。

GCC_PREPROCESSOR_DEFINITIONS = "$(GCC_PREPROCESSOR_DEFINITIONS) NEW_VALUE"

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

于 2009-09-09T10:11:56.140 に答える
0

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

GCC_PREPROCESSOR_DEFINITIONS = "$(inherited) NEW_VALUE"
于 2010-01-15T21:51:40.643 に答える