2009-11-09 5 views
5

Ich versuche, ein Python-Skript zu meinem Projekt hinzufügen, um die Build-und Marketing-Nummern direkt von Git zu erhalten.Xcode Target Phase Python Skript

Ich habe eine neue Zielphase erstellt und führt ein Skript wie erläutert in:
http://yeahrightkeller.com/2008/10/19/xcode-run-script-build-phase-tip/

Und ich habe ein Python-Skript geschrieben, das das Programm Info.plist mit

from Foundation import NSMutableDictionary 

jedoch parst das Skript fehlschlägt, während kompiliert wird und meldet den folgenden Fehler auf die Build-Ergebnisse:

Running a custom build phase script: gitversion.py 
Traceback (most recent call last): 
File "/Users/jorge/Documents/Programming iPod/Pruebas/RowOrder/Scripts/gitversion.py", line 9, in <module> 
from Foundation import NSMutableDictionary 
File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/Foundation/__init__.py", line 8, in <module> 
File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC/objc/__init__.py", line 26, in <module> 
from _bridgesupport import * 
File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC/objc/_bridgesupport.py", line 9, in <module> 
import pkg_resources 
File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py", line 651, in <module> 
class Environment(object): 
File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py", line 654, in Environment 
def __init__(self, search_path=None, platform=get_supported_platform(), python=PY_MAJOR): 
File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py", line 55, in get_supported_platform 
plat = get_build_platform(); m = macosVersionString.match(plat) 
File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py", line 181, in get_build_platform 
plat = get_platform() 
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/util.py", line 97, in get_platform 
cfgvars = get_config_vars() 
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/sysconfig.py", line 525, in get_config_vars 
func() 
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/sysconfig.py", line 408, in _init_posix 
raise DistutilsPlatformError(my_msg) 
distutils.errors.DistutilsPlatformError: $MACOSX_DEPLOYMENT_TARGET mismatch: now "10.5" but "10.6" during configure 
Finished running custom build phase script: gitversion.py (exit status = 1) 

Deutlich, distutils hat irgendwie fest programmiert, dass es für Version 10.6 kompiliert ist (Snow Leopard, das ist die, die ich benutze), aber das Projekt hat das MacOSX Deployment-Ziel auf 10.5 gesetzt.

Wenn ich versuche, diese Variable zu setzen in dem Projekt auf 10,6 ich dann bekommen:

ld: library not found for -lcrt1.10.6.o 

Alle Ideen, wie dieses Problem zu lösen? Danke im Voraus.

Antwort

1

Apple verteilt Python 2.5 und 2.6 mit Snow Leopard (10.6) und beide werden mit einem Bereitstellungsziel von 10.6 erstellt. Wenn Sie Ihre Anwendung wirklich auf 10.5 ausrichten müssen, können Sie die von Apple bereitgestellten Pythons unter 10.6 nicht verwenden, um sie auf 10.5 zu implementieren.

Die einfachste Lösung kann sein, eine Python 2.6 from python.org herunterzuladen und zu installieren. Das Python ist auf 10.3+ ausgerichtet, also wird es sowohl auf 10.5 als auch auf 10.6 funktionieren. Sie müssen wahrscheinlich auch sicherstellen, dass Python auf allen Computern installiert ist, auf denen Ihre App bereitgestellt wird.

Eine andere Möglichkeit besteht darin, eine separate Standalone-Helper-App mit py2app mit python.org 2.6 zu erstellen und diese zusammen mit Ihrer Hauptanwendung bereitzustellen. Oder erstellen Sie Ihre gesamte App unter py2app. In beiden Fällen würde die App unabhängig von der Systemversion einen eigenen Python-Framework-Interpreter und ein Framework enthalten.

EDIT: Basierend auf Ihrem Kommentar, ich bin mir nicht sicher, ob ich Ihr Problem verstehe. Da Sie auf 10.6 ausgeführt werden, ist es für mich nicht klar (1), warum Sie das Implementierungsziel auf 10.5 und (2) festgelegt haben, wenn die Implementierung auf 10.5 festgelegt werden muss. Ich vermute, dass Sie ein Xcode-Projekt hatten, das auf 10.5 entwickelt und dann von Xcode auf 10.5 nach Xcode auf 10.6 importiert oder aktualisiert wurde. Wenn das der Fall ist, dann denke ich, dass das einzige, was getan werden sollte, ist, das Active SDK von 10.5 auf 10.6 (in der Übersicht) oben im Projektfenster zu ändern. Genau das zu tun und einen Clean All Targets zu erzwingen, sollte den crt library not found Fehler lösen; Wenn nicht, stimmt etwas nicht mit den Projektabhängigkeiten.

Auf der anderen Seite, wenn Sie wirklich auf 10.6 für 10.5 entwickeln müssen, dann scheint es, dass Ihre gitversion.py führt eine unbeabsichtigte Abhängigkeit von Python 2.6 (wie aus dem Traceback ersichtlich), was nicht ist Teil von 10.5. Sofern Sie nicht wirklich Python 2.6-Funktionen benötigen, sollten Sie in der Lage sein, dies zu beseitigen, indem Sie Python 2.5 verwenden, das Apple sowohl auf 10.5 als auch auf 10.6 zur Verfügung stellt. In diesem Fall müssen Sie möglicherweise nur sicherstellen, dass Sie python im Buildphasen-Skript mit /usr/bin/python2.5 aufrufen und nicht nur mit python.

+0

Vielen Dank für Ihre Antwort Ned. Deployment für 10.5 ist ein Muss bei dem Fehler, den ich mit 10.6 bekomme. Aber 10.5 funktioniert nicht, da die Distutils 10.6 erwarten (wie durch die Umgebungsvariable angezeigt wird). Gibt es eine Möglichkeit, distutils zu sagen, dass es für 10.5 oder die Version 10.5 funktionieren soll? Das Ziel für mich ist nur ein Python-Skript als Zielphase hinzufügen, weil das Lesen und Schreiben der PLIST einfacher ist, keine Python-App bereitzustellen. –

+0

Siehe zusätzliche Kommentare oben. Ich hoffe, das hilft! –

+0

Danke nochmal Ned. Dies ist kein MacOSX-Projekt, sondern ein iPhone und es scheint 10,5 als Ziel zu benötigen, sonst bekomme ich: ld: library nicht gefunden für -lcrt1.10.6.o auch nach dem Reinigen des Ziels. Ich habe beschlossen, auf die harte Tour zu gehen und das Python-Skript durch ein Perl-Skript zu ersetzen, das genau das gleiche tut. Ich bekomme nicht den gleichen Fehler mit Perl. Gott segne Perl! Danke TMTOWTDI! Ich glaube immer noch, dass es ein Problem mit Python gibt, wenn es als Skript eines iPhone-Projekts verwendet wird, aber ich habe eine Abhilfe dafür. –

1

Für die Zwecke dieses Skripts können Sie einfach den Wert von MACOSX_DEPLOYMENT_TARGET auf 10.6 festlegen.Also Ihr Befehl wäre:

env MACOSX_DEPLOYMENT_TARGET=10.6 gitversion.py 
2

ich das gleiche Problem habe, und ich wollte die Python-Version halten, weil der plist über NSMutableDictionary Handhabung ist viel schöner als regex auf Info.plist.

Aufbauend auf Maxence Antwort, die Lösung der Python-Code aus dem Run Script bauen Phase in eine gitversion.py Datei abzustreifen war:

#!/usr/bin/env python 
import os 
from Foundation import NSMutableDictionary 
from subprocess import Popen, PIPE 

p = Popen(
     "/sw/bin/git rev-parse --short HEAD", 
     stdout=PIPE, 
     close_fds=True, 
     shell=True) 

version = p.stdout.read() 
print version 
info = os.environ['INFOPLIST_FILE'] 
print info 
plist = NSMutableDictionary.dictionaryWithContentsOfFile_(info) 
print plist 
plist['revision'] = version[:-1] 
plist.writeToFile_atomically_(info, 1) 

Dann ersetzen Sie die Original-Skript ausführen mit einem Shell-Skript:

env MACOSX_DEPLOYMENT_TARGET=10.6 python gitversion.py 

Denken Sie daran, die Einstellung Shell in /bin/sh zu ändern.

+0

[PlistBuddy] (https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man8/PlistBuddy.8.html) kann verwendet werden, um Info.plist, fyi zu lesen/schreiben. – pkamb

Verwandte Themen