Xcode中的嵌套聚合目标似乎没有正确传递设置

时间:2011-05-24 05:01:16

标签: xcode preprocessor nested targets

我有一个项目,包含一个主要的Cocoa应用程序,一堆插件和几个帮助应用程序。帮助应用程序有自己的目标,因为我希望应用程序可以在没有插件的情况下构建,主应用程序有自己的目标(称为AppTarget),但我通常在聚合目标(称为TargetA)中构建它。我还有另一个带有TargetA的聚合目标,另一个插件和一个额外的复制文件构建阶段(TargetB)。这一切都按预期工作。我正在尝试创建一个包含TargetA的新聚合目标TargetC,它将具有(但尚未)运行Shell脚本构建阶段。

我遇到的问题是我正在尝试使用GCC_PREPROCESSOR_DEFINITIONS #define一个符号TARGETC进行条件编译(#ifdef TARGETC ... #endif),但它没有包含在构建参数中当我查看构建日志,并且应用程序的行为与构建日志匹配时 - GCC_PREPROCESSOR_DEFINITIONS失败(我尝试了TARGETC和TARGETC = 1.我尝试添加OTHER_CFLAGS用户定义的设置(将其设置为-DTARGETC = 1) ),但这也不起作用。

文档说聚合目标上的用户定义设置会逐渐下降到他们的子目标,但似乎这只会降低一个级别 - TargetA可能会得到它,但AppTarget肯定不会。这是一个错误,预期的行为,还是我做错了什么?

1 个答案:

答案 0 :(得分:0)

我找到了答案:这是预期的行为,而且,聚合目标根本不会将用户设置传递给子目标;要么文档错了,要么我误读了。哪种方式似乎打败了将GCC_PREPROCESSOR_DEFINITIONS作为可用于聚合目标的默认用户设置的目的,但是c'est la vie。

为了获得我想要的行为,我正在构建一个单独的插件,该插件将添加到新的聚合目标中。我正在使用单例来加载插件,该插件将保存对插件中的主要类的引用(键入为id <MyPluginProtocol>),可以将其返回给任何要求的人。如果加载尝试失败(因为插件不存在),它将返回nil,因此if (nil != [[PluginLoader sharedLoader] plugin])取代#ifdef TARGETC。这意味着我不会减少运输代码的大小,但至少它是有效的,并且它不是浪费,因为我还有其他代码将进入插件(仅适用于此目标)。