I\'m using Xcode and .xcconfig files. I\'m trying to append some values in the preprocessor definitions, but I simply can\'t make it work.
I tried the following (as
As stated in other answers, prior to Xcode 10, xcconfig files could not simply inherit and extend each other's values. But,
$(inherited)
actually expand to the previously defined value of the variable.When an .xcconfig file contains multiple assignments of the same build setting, later assignments using
$(inherited)
or$(
will inherit from earlier assignments in the .xcconfig. The legacy build system caused every use of) $(inherited)
or$(
to skip any other values defined within the .xcconfig. To detect whether your .xcconfig is affected by this improvement, running) defaults write com.apple.dt.XCBuild EnableCompatibilityWarningsForXCBuildTransition -bool YES
in Terminal will cause Xcode to generate a warning about this situation.
(Xcode 10 beta 1 release notes)
So for example, given two simple .xcconfig files:
// Generic.xcconfig
OTHER_SWIFT_FLAGS = $(inherited) -DMY_GENERIC_FLAG
// Debug.xcconfig
#include "Generic.xcconfig"
OTHER_SWIFT_FLAGS = $(inherited) -DMY_DEBUG_FLAG
Assuming your project uses Debug.xcconfig for its Debug configuration, you'll get the expected value -DMY_GENERIC_FLAG -DMY_DEBUG_FLAG
for OTHER_SWIFT_FLAGS
.
(instead of just -DMY_DEBUG_FLAG
in Xcode 9 and earlier releases)
The new behavior is pretty straightforward: $(inherited)
is simply replaced by the previously defined value of the variable, if any.
So in the previous example, if we expand the #include
statement, we'll get the following xcconfig file:
// Merged xcconfig files after resolving #include
OTHER_SWIFT_FLAGS = -DMY_GENERIC_FLAG
OTHER_SWIFT_FLAGS = $(inherited) -DMY_DEBUG_FLAG
OTHER_SWIFT_FLAGS
value is -DMY_GENERIC_FLAG
( $(inherited)
expands to nothing, because this is the first definition of OTHER_SWIFT_FLAGS
we encounter1).OTHER_SWIFT_FLAGS
if overwritten, and its value is now -DMY_GENERIC_FLAG -DMY_DEBUG_FLAG
(its previous value + the newly added flag).On a more complex xcconfig setup, things could look like this:
// 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"
We'll assume this time we're using the Merge.xcconfig in our configuration.
The resolved value for OTHER_SWIFT_FLAGS
will then be -DMY_FIRST_FLAG -DMY_SECOND_FLAG -DMY_INTERMEDIATE_FLAG -DMY_LAST_FLAG
.
This might be surprising at first, but it actually makes sense: once the #include
are resolved, we end up with this 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
The final resolved value is then the one defined on the last line, which is -DMY_LAST_FLAG
plus the value it inherited from the previous line -DMY_INTERMEDIATE_FLAG
etc etc.
Note that naturally, if you forget $(inherited)
in one of the definitions, you'll break the inheritance chain and only get the values from the bottom definitions, up the definition without $(inherited)
.
1 One may expect the xcconfig file to inherit previous values defined at the Project level, but it doesn't seem to be the case