2014-01-10 14 views
18

Ich habe Probleme mit einem Pod namens DCIntrospect-ARC, der nur im DEBUG-Modus funktionieren sollte. Es prüft, ob das DEBUG-Makro vor dem Ausführen definiert ist. Es ist jedoch nicht im CocoaPods-Ziel definiert, und obwohl ich im Debug-Modus in Xcode ausgeführt werde, kann es nicht ausgeführt werden, da das DEBUG-Makro nicht definiert ist.DEBUG-Präprozessormakro nicht für CocoaPods-Ziele definiert

kann ich das DEBUG Makro in der podspec definieren

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

aber definiert DEBUG für alle bauen Konfigurationen verwenden und nicht nur die Debug-Konfiguration.

  1. Ist dies ein CocoaPods Problem? Sollte das DEBUG-Makro generell nicht für Pods definiert sein?
  2. Kann ich das in der Podspec-Datei umgehen und das DEBUG-Makro nur in der Debug-Build-Konfiguration deklarieren?

Antwort

19

Sie können den post_install Hook in Podfile verwenden.

Dieser Hook ermöglicht es Ihnen, letzte Änderungen am generierten Xcode-Projekt vorzunehmen, bevor es auf die Festplatte geschrieben wird, oder andere Aufgaben, die Sie ausführen möchten. 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 
+3

Verwendung von cocoapods Version 1.0.0.β.3 Ich muss installer_representation.pods_project anstatt installer_representation.project verwenden –

+0

Dies funktioniert nicht für Swift Pods. Ich fügte unten eine Antwort hinzu, die eine Zeile zu dieser Lösung hinzufügt, so dass es auch für Swift Pods funktioniert. – xaphod

11

Dank John ich meine benutzerdefinierte podfile Skript abgeschlossen, die auch die Optimierungsstufe auf Null ändert und ermöglicht Aussagen.

Ich habe mehrere Debug-Konfigurationen (für ACC und PROD), sooo ich musste mehrere Eigenschaften für Debugging-Zwecke aktualisieren.

Teilen ist fürsorglich, hoffen, dass jemand das nützlich findet.

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 
+0

Hi @Antoine 'Projekt' ist jetzt' pods_project' – amosel

-2

Noch einfacher: einfach sicherzustellen, dass Sie die DEBUG=1 Makro zu Ihrem GCC_PREPROCESSOR_DEFINITIONS in Ihrem Projekt in Xcode für Debug-Modus aber nicht Modus freigeben. Wenn Sie die Projektstufe hinzufügen (keine spezifischen Ziele), wird sie von allen Zielen übernommen (Debug-Test, benutzerdefinierte Ziele usw.). Dies ist standardmäßig bei neuen Projekten festgelegt und wird normalerweise erwartet. Wenn Sie es vermissen, könnte das weitreichende Auswirkungen haben. Wenn es immer noch nicht funktioniert, stellen Sie sicher, dass Sie auch $(inherited) in allen Ihren Zielen für GCC_PREPROCESSOR_DEFINITIONS haben. CocoaPods und DEBUG zählen darauf.

settings

+1

funktioniert nicht für Cocoapoden, das ist die Frage – xaphod

0

Die akzeptierte Antwort ab sofort funktioniert nicht für Swift Pods. Hier ist eine einzeilige Änderung dieser Antwort, die für beide zu funktionieren scheint.

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 
0

Ich denke, die akzeptierte Antwort ist nicht so richtig für mich. config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'DEBUG=1']

||= wird verwendet, um eine leere oder keine Variable zuzuweisen, aber wenn config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] nicht leer ist?

Das Array kann überhaupt nicht geändert werden. Der Wert ist ["POD_CONFIGURATION_PRODUCTION=1", "$(inherited)"] für mich.

Also gab ich die komplette Anwser.

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 

|| = [] Stellen Sie sicher, dass die Variable ein gültiges Array ist. und arrayA |= arrayB bedeutet ArrayA + ArrayB und löscht das wiederholte Element und kehrt dann zu ArrayA zurück.