2009-11-09 15 views
5

Estoy intentando agregar una secuencia de comandos de Python para en mi proyecto para obtener los números de generación y comercialización directamente de Git.Xcode objetivo de secuencias de comandos de Python Fase

He creado una nueva fase de destino y que se ejecuta un script como se explica en:
http://yeahrightkeller.com/2008/10/19/xcode-run-script-build-phase-tip/

y he escrito un script en Python que analiza el programa usando Info.plist

from Foundation import NSMutableDictionary 

Sin embargo el script falla al compilarse e informa el siguiente error en los resultados de compilación:

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) 

Claramente, distutils ha hardcoded alguna manera que está compilado para la versión 10.6 (Snow Leopard, que es el que yo estoy usando), pero el proyecto tiene el objetivo de establecer MacOSX despliegue a 10,5.

si trato de establecer esta variable en el proyecto a 10,6, entonces me sale:

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

Cualquier ideas sobre cómo resolver este problema? Gracias por adelantado.

Respuesta

1

de Apple distribuye Python 2.5 y 2.6 con Snow Leopard (10.6) y ambos están construidos con un destino de despliegue de 10,6. Si realmente necesita apuntar a su aplicación para 10.5, no puede usar con seguridad las Pythons suministradas por Apple en 10.6 para implementar en 10.5.

La solución más sencilla puede ser la de descargar e instalar un Python 2.6 from python.org. Ese Python es el objetivo de 10.3+, por lo que funcionará tanto en 10.5 como en 10.6. Probablemente también deba asegurarse de que Python esté instalado en todas las máquinas donde se implementará su aplicación.

Otra opción podría ser crear una aplicación auxiliar independiente usando py2app con python.org 2.6 y desplegar eso junto con su aplicación principal. O crea toda tu aplicación en py2app. En cualquier caso, la aplicación contendría su propio intérprete y marco de python framework, independientemente de la versión del sistema.

EDIT: Basado en su comentario, no estoy seguro de entender su problema. Dado que se está ejecutando en 10.6, no está claro para mí (1) por qué tiene el objetivo de despliegue establecido en 10.5 y (2) si necesita tener el despliegue establecido en 10.5. Voy a adivinar que tenía un proyecto de Xcode existente que fue desarrollado en 10.5 y luego importado o actualizado de Xcode en 10.5 a Xcode en 10.6. Si ese es el caso, entonces creo que lo único que debería haberse hecho es cambiar Active SDK de 10.5 a 10.6 (en la vista general) en la parte superior de la ventana del proyecto. Hacer exactamente eso y forzar un Clean All Targets debería resolver el error crt library not found; si no, hay algo mal con las dependencias del proyecto.

Por otro lado, si realmente necesita desarrollar en 10.6 para 10.5, entonces parece que su gitversion.py introduce una dependencia inadvertida en python 2.6 (como puede verse por el traceback), que no es parte de 10.5. A menos que realmente necesite las características de Python 2.6, debería poder eliminar eso utilizando python 2.5 que Apple proporciona tanto en 10.5 como en 10.6. En ese caso, tal vez todo lo que necesita hacer es asegurarse de invocar python en el script de fase de compilación con /usr/bin/python2.5 en lugar de solo python.

+0

Gracias mucho por su respuesta Ned. Implementar para 10.5 es imprescindible dado el error que obtengo con 10.6. Pero 10.5 no funciona porque los distutils esperan 10.6 (como lo indica la variable de entorno). ¿Hay alguna forma de decirle a distutils que trabaje para 10.5 o que use la versión 10.5? El objetivo para mí es solo agregar un script de python como fase de destino porque leer y escribir el plist es más fácil, no implementar una aplicación de Python. –

+0

Ver comentarios adicionales arriba. ¡Espero que ayude! –

+0

Gracias otra vez Ned. Este no es un proyecto de MacOSX, sino uno de iPhone y parece requerir 10.5 como objetivo porque de lo contrario obtengo: ld: biblioteca no encontrada para -lcrt1.10.6.o incluso después de limpiar el objetivo. He decidido tomar el camino difícil y reemplazar el script de Python con un script de Perl que hace exactamente lo mismo. No obtengo el mismo error con Perl. Dios bendiga a Perl! Gracias TMTOWTDI! Todavía creo que hay un problema con python cuando se usa como script de un proyecto de iPhone, pero tengo una solución para ello. –

1

A los efectos de este script, sólo tiene que establecer temporalmente el valor de MACOSX_DEPLOYMENT_TARGET a 10.6.Por lo que su comando sería:

env MACOSX_DEPLOYMENT_TARGET=10.6 gitversion.py 
2

que tienen el mismo problema, y ​​quería mantener la versión de Python, porque el manejo de la vía plist NSMutableDictionary es mucho mejor que el uso de expresiones regulares en Info.plist.

Sobre la base de la respuesta de Maxence, la solución era quitar el código Python de la Guión Ejecutar fase de construcción en un archivo gitversion.py:

#!/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) 

luego vuelva a colocar el guión original de ejecución con un script de shell:

env MACOSX_DEPLOYMENT_TARGET=10.6 python gitversion.py 

Asegúrese de recordar cambiar la configuración Shell a /bin/sh.

+0

[PlistBuddy] (https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man8/PlistBuddy.8.html) se puede utilizar para leer/escribir Info.plist, fyi. – pkamb

Cuestiones relacionadas