2009-11-09 2 views
5

Я пытаюсь добавить скрипт Python в свой проект, чтобы получить номера сборки и маркетинга непосредственно из Git.Xcode Target Phase Python Script

Я создал новую целевую фазу и запускает скрипт, как описан в:
http://yeahrightkeller.com/2008/10/19/xcode-run-script-build-phase-tip/

И я написал скрипт на Python, который анализирует info.plist программы с помощью

from Foundation import NSMutableDictionary 

Однако скрипт терпит неудачу при компиляции и сообщает об ошибках в результатах построения:

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) 

Очевидно, distutils каким-то образом жестко запрограммировал, что он скомпилирован для версии 10.6 (Snow Leopard, это тот, который я использую), но у проекта установлен целевой уровень развертывания MacOSX 10.5.

Если я пытаюсь установить эту переменную в проекте до 10,6, я тогда получаю:

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

Любые идеи о том, как решить эту проблему? Заранее спасибо.

ответ

1

Apple распространяет Python 2.5 и 2.6 со Snow Leopard (10.6), и оба они построены с целью развертывания 10.6. Если вам действительно нужно настроить таргетинг на приложение на 10,5, вы не можете безопасно использовать поставляемые Apple Python 10.6 для развертывания на 10.5.

Самым простым решением может быть загрузка и установка Python 2.6 from python.org. Этот Python предназначен для 10.3+, поэтому он будет работать как на 10.5, так и на 10.6. Вероятно, вам также необходимо убедиться, что этот Python установлен на всех компьютерах, где будет развернуто ваше приложение.

Другим вариантом может быть создание отдельного автономного вспомогательного приложения с использованием py2app с python.org 2.6 и развертывание его вместе с основным приложением. Или создайте все приложение под py2app. В любом случае приложение будет содержать собственный интерпретатор фреймворка и структуру фреймворка, независимо от версии системы.

EDIT: Основываясь на вашем комментарии, я не уверен, что понимаю вашу проблему. Поскольку вы работаете на 10.6, мне не ясно (1), почему у вас установлен целевой показатель развертывания 10.5 и (2), если вам необходимо установить развертывание на 10.5. Я собираюсь предположить, что у вас был существующий проект Xcode, который был разработан на 10,5, а затем импортирован или обновлен с Xcode с 10.5 до Xcode на 10.6. Если это так, то я думаю, что единственное, что нужно было сделать, это изменить Active SDK с 10,5 до 10,6 (в обзоре) в верхней части окна проекта. Выполнение этого и принудительное удаление всех целевых объектов должно решить ошибку crt library not found; если нет, что-то не так с зависимостями проекта.

С другой стороны, если вам действительно нужно разработать 10.6 для 10.5, то кажется, что ваш gitversion.py вводит непреднамеренную зависимость от python 2.6 (как видно из traceback), что не является часть 10.5. Если вам действительно не нужны функции python 2.6, вы должны устранить это, используя python 2.5, который Apple предоставляет на 10.5 и 10.6. В этом случае, возможно, все, что вам нужно сделать, это убедиться, что вы вызываете python в сценарии фазы сборки с /usr/bin/python2.5, а не только с python.

+0

Спасибо большое за ваш ответ Ned. Развертывание для 10.5 является обязательным с учетом ошибки, которую я получаю с 10.6. Но 10.5 не работает, потому что distutils ожидает 10.6 (как указано переменной окружения.) Есть ли способ сказать distutils работать на 10.5 или использовать версию 10.5? Цель для меня заключается только в том, чтобы добавить скрипт python в качестве целевой фазы, потому что чтение и запись plist проще, а не для развертывания приложения python. –

+0

См. Дополнительные комментарии выше. Надеюсь, это поможет! –

+0

Еще раз спасибо Нед. Это не проект MacOSX, а iPhone один, и он, кажется, требует 10.5 в качестве цели, потому что в противном случае я получаю: ld: библиотека не найдена для -lcrt1.10.6.o даже после очистки цели. Я решил пойти жестким путем и заменить скрипт python скриптом perl, который делает то же самое. Я не получаю такую ​​же ошибку с perl. Бог благословит Перла! Спасибо TMTOWTDI! Я по-прежнему считаю, что существует проблема с python при использовании в качестве сценария проекта iPhone, но у меня есть обходное решение для него. –

1

Для целей этого скрипта вы можете просто временно установить значение MACOSX_DEPLOYMENT_TARGET в 10.6.Так что ваша команда будет:

env MACOSX_DEPLOYMENT_TARGET=10.6 gitversion.py 
2

У меня такая же проблема, и я хотел бы сохранить версию питона, потому что обработка с помощью PLIST NSMutableDictionary намного лучше, чем с помощью регулярных выражений на Info.plist.

Опираясь на ответ Maxence, решение было раздеться код питона из Run Script построить фазу в 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) 

Затем замените оригинальный Run Script с помощью сценария оболочки:

env MACOSX_DEPLOYMENT_TARGET=10.6 python gitversion.py 

Обязательно не забудьте изменить настройку Shell на /bin/sh.

+0

[PlistBuddy] (https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man8/PlistBuddy.8.html) можно использовать для чтения/записи Info.plist, fyi. – pkamb