Вложенные совокупные цели в XCode, кажется, не проходят настройки должным образом - PullRequest
2 голосов
/ 24 мая 2011

У меня есть проект с одним основным приложением Cocoa, кучей плагинов и парой вспомогательных приложений. У вспомогательных приложений есть свои собственные цели, и, поскольку я хочу, чтобы приложение могло быть построено без плагинов, у основного приложения есть своя собственная цель (назовите ее AppTarget), но я обычно строю все это в совокупной цели (назовите ее TargetA). У меня также есть еще одна Aggregate Target с TargetA, другой плагин и дополнительная фаза сборки файлов копирования (TargetB). Это все работает, как ожидалось. Я пытаюсь создать новую Aggregate Target, TargetC, которая содержит TargetA и в которой будет (но пока нет) фаза сборки сценария запуска оболочки.

Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь использовать GCC_PREPROCESSOR_DEFINITIONS, чтобы # определить символ TARGETC для условной компиляции (#ifdef TARGETC ... #endif), но он не включается в параметры сборки когда я смотрю в журнале сборки и поведение приложения совпадает с журналом сборки - GCC_PREPROCESSOR_DEFINITIONS не удалось (я пробовал и TARGETC, и TARGETC = 1. Я попытался добавить пользовательскую настройку OTHER_CFLAGS (установив ее в -DTARGETC = 1 ), но это тоже не сработало.

Документация гласит, что пользовательские настройки для совокупных целей сводятся к их подзадачам, но кажется, что это снижается только на один уровень - TargetA может получать его, но AppTarget точно не знает. Это ошибка, ожидаемое поведение или я что-то не так делаю?

1 Ответ

0 голосов
/ 28 мая 2011

Я нашел ответ: это ожидаемое поведение, и более того, совокупные цели вообще не передают свои пользовательские настройки подзадачам; либо документация неверна, либо я неправильно ее прочитал. Какой вид, кажется, побеждает цель иметь GCC_PREPROCESSOR_DEFINITIONS в качестве пользовательского параметра по умолчанию, доступного для совокупных целей, но c'est la vie.

Чтобы получить желаемое поведение, вместо этого я создаю отдельный плагин, который будет добавлен к новой цели агрегирования. Я использую синглтон для загрузки плагина, который будет содержать ссылку на основной класс в плагине (тип id <MyPluginProtocol>), который может быть возвращен любому, кто попросит. Если попытка загрузки не удалась (поскольку плагин не существует), он вернет ноль, поэтому if (nil != [[PluginLoader sharedLoader] plugin]) занимает место #ifdef TARGETC. Это означает, что я не могу сократить размер кода доставки, но, по крайней мере, он работает, и это не пустая трата времени, так как у меня есть другой код, который в любом случае будет добавлен в плагин (только для этой цели).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...