La macro del preprocesador DEBUG no está definida para los objectives CocoaPods.

Tengo problemas con un pod llamado DCIntrospect-ARC que solo debería funcionar en modo DEBUG. Comtesting si la macro DEBUG se define antes de ejecutarse. Sin embargo, no está definido en el objective de CocoaPods y, aunque estoy ejecutando el modo de debugging en Xcode, no se puede ejecutar porque la macro DEBUG no está definida.

Puedo definir la macro DEBUG en el podspec utilizando

s.xcconfig = { "GCC_PREPROCESSOR_DEFINITIONS" => '$(inherited) DEBUG=1' } 

pero esto definió DEBUG para todas las configuraciones de compilation y no solo la configuration DEBUG.

  1. ¿Es esto un problema de CocoaPods? ¿No debería definirse generalmente la macro DEBUG para Pods?
  2. ¿Puedo solucionar esto en el file Podspec y declarar la macro DEBUG solo en la configuration de compilation de Debug?

puede usar el enlace post_install en Podfile.

Este gancho le permite realizar los últimos cambios en el proyecto Xcode generado antes de que se escriba en el disco, o en cualquier otra tarea que desee realizar. 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 

Gracias a John, completé mi script de podfile personalizado, que también cambia el nivel de optimization a cero y habilita aserciones.

Tengo varias configuraciones de debugging (para ACC y PROD), por lo que necesitaba actualizar varias properties para fines de debugging.

Compartir es cariñoso, esperando que alguien lo encuentre útil.

 post_install do |installer| installer.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.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 

La respuesta aceptada a partir de ahora no funciona para Swift Pods. Aquí hay un cambio de una línea a esa respuesta que parece funcionar para ambos.

  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 

Creo que la respuesta aceptada no es tan adecuada para mí. config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'DEBUG=1']

||= se utiliza para asignar una variable vacía o nula, pero si config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] no está vacío?

La matriz no se puede modificar en absoluto. El valor es ["POD_CONFIGURATION_PRODUCTION=1", "$(inherited)"] para mí.

Entonces le di la respuesta completa.

 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 

|| = [] asegúrese de que la variable sea una matriz válida. y arrayA |= arrayB significa arrayA + arrayB y elimina el elemento repetido, y luego regresa a arrayA.

Aún más fácil: solo asegúrese de tener la macro DEBUG=1 en su GCC_PREPROCESSOR_DEFINITIONS en su proyecto en xCode para el modo de debugging, pero no en el modo de liberación. Si lo agrega el nivel del proyecto (no objectives específicos) será henetworkingado por todos los objectives (debugging-testing, objectives personalizados, etc.). Esto se establece de manera pnetworkingeterminada en nuevos proyectos, y generalmente se espera que esté allí. Si te lo estás perdiendo, eso podría tener un gran impacto.

Si aún no funciona, asegúrese de tener $(inherited) en todos sus objectives para GCC_PREPROCESSOR_DEFINITIONS. CocoaPods y DEBUG ambos countn con eso.

ajustes