Макрос препроцессора DEBUG, не определенный для целей CocoaPods
У меня возникают проблемы с модулем DCIntrospect-ARC, который должен работать только в режиме DEBUG. Он проверяет, определен ли макрос DEBUG перед запуском. Тем не менее, он не определен в целевой программе CocoaPods, и хотя я запущен в режиме отладки в Xcode, он не запускается, потому что макрос DEBUG не определен.
Я могу определить макрос DEBUG в podspec, используя
s.xcconfig = { "GCC_PREPROCESSOR_DEFINITIONS" => '$(inherited) DEBUG=1' }
но это определило DEBUG для всех конфигураций сборки, а не только для конфигурации DEBUG.
- Является ли это проблемой CocoaPods? Не следует ли, чтобы макрос DEBUG был определен для Pods?
- Могу ли я обойти это в файле Podspec и объявить макрос DEBUG только в конфигурации сборки Debug?
Ответы
Ответ 1
вы можете использовать hook post_install в подпикселе.
Этот крючок позволяет вам вносить любые последние изменения в сгенерированный проект Xcode до его записи на диск или любые другие задачи, которые вы, возможно, захотите выполнить.
http://guides.cocoapods.org/syntax/podfile.html#post_install
post_install do |installer_representation|
installer_representation.pods_project.targets.each do |target|
target.build_configurations.each do |config|
if config.name != 'Release'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'DEBUG=1']
end
end
end
end
Ответ 2
Благодаря Джону я завершил свой собственный скрипт Podfile, который также изменяет уровень оптимизации на ноль и включает утверждения.
У меня есть несколько конфигураций отладки (для ACC и PROD), поэтому мне нужно было обновить несколько свойств для целей отладки.
post_install do |installer|
installer.pods_project.build_configurations.each do |config|
if config.name.include?("Debug")
# Set optimization level for project
config.build_settings['GCC_OPTIMIZATION_LEVEL'] = '0'
# Add DEBUG to custom configurations containing 'Debug'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)']
if !config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'].include? 'DEBUG=1'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] << 'DEBUG=1'
end
end
end
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
if config.name.include?("Debug")
# Set optimization level for target
config.build_settings['GCC_OPTIMIZATION_LEVEL'] = '0'
# Add DEBUG to custom configurations containing 'Debug'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)']
if !config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'].include? 'DEBUG=1'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] << 'DEBUG=1'
end
# Enable assertions for target
config.build_settings['ENABLE_NS_ASSERTIONS'] = 'YES'
config.build_settings['OTHER_CFLAGS'] ||= ['$(inherited)']
if config.build_settings['OTHER_CFLAGS'].include? '-DNS_BLOCK_ASSERTIONS=1'
config.build_settings['OTHER_CFLAGS'].delete('-DNS_BLOCK_ASSERTIONS=1')
end
end
end
end
end
Ответ 3
Принятый ответ на данный момент не работает для Swift Pods.
Ниже приведено однострочное изменение этого ответа, который работает для обоих.
post_install do |installer_representation|
installer_representation.pods_project.targets.each do |target|
target.build_configurations.each do |config|
if config.name != 'Release'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'DEBUG=1']
config.build_settings['OTHER_SWIFT_FLAGS'] = ['$(inherited)', '-DDEBUG']
end
end
end
end
Ответ 4
Я думаю, что принятый ответ мне не подходит. config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'DEBUG=1']
||=
используется для назначения пустой или нулевой переменной, но если config.build_settings['GCC_PREPROCESSOR_DEFINITIONS']
не пуст?
Массив не может быть изменен вообще. Для меня значение ["POD_CONFIGURATION_PRODUCTION=1", "$(inherited)"]
.
Итак, я дал полный андерсер.
post_install do |installer_representation|
installer_representation.pods_project.build_configurations.each do |config|
if config.name == 'Release' || config.name == 'Production' || config.name == 'Release-InHouse'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= []
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] |= ['$(inherited)', 'NDEBUG=1']
end
end
end
|| = [] убедитесь, что переменная является допустимым массивом. и arrayA |= arrayB
означает arrayA + arrayB и освобождает повторяющийся элемент, а затем возвращается к массиву.
Ответ 5
Еще проще: просто убедитесь, что у вас есть макрос DEBUG=1
для ваших GCC_PREPROCESSOR_DEFINITIONS в вашем проекте в xCode для режима отладки, но не для режима выпуска. Если вы добавите его на уровень проекта (не конкретные цели), он будет наследоваться всеми целями (отладочный тест, пользовательские цели и т.д.). Это устанавливается по умолчанию для новых проектов и, как ожидается, будет там. Если вам не хватает, это может иметь большое влияние.
Если он все еще не работает, убедитесь, что у вас также есть $(inherited)
во всех ваших целях для GCC_PREPROCESSOR_DEFINITIONS. CocoaPods и DEBUG рассчитывают на это.
![settings]()