Подтвердить что ты не робот

Макрос препроцессора 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?
4b9b3361

Ответ 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