Xcode目标阶段Python脚本
我正在尝试在我的项目中添加一个Python脚本,以便直接从Git获取构建和营销数字。
我创建了一个新的构建阶段,并按照以下链接中的说明运行了一个脚本:
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
有没有什么办法可以解决这个问题?提前谢谢!
4 个回答
为了这个脚本的需要,你可以暂时把 MACOSX_DEPLOYMENT_TARGET 的值设置为 10.6。所以你的命令应该是:
env MACOSX_DEPLOYMENT_TARGET=10.6 gitversion.py
苹果在它的Snow Leopard(10.6)系统中提供了Python 2.5和2.6这两个版本,这些版本都是为10.6系统准备的。如果你真的需要让你的应用程序在10.5系统上运行,那么在10.6上使用苹果提供的Python来部署到10.5上是有风险的。
最简单的解决办法是去python.org下载并安装Python 2.6。这个版本是为10.3及以上的系统设计的,所以它在10.5和10.6上都能正常工作。你可能还需要确保在所有要部署你应用的机器上都安装了这个Python。
另一个选择是使用py2app和python.org的2.6版本创建一个独立的辅助应用,并和你的主应用一起部署。或者你可以在py2app下创建整个应用。无论哪种方式,应用都会包含自己的Python解释器和框架,这样就不依赖于系统的版本了。
编辑:根据你的评论,我不太明白你的问题。因为你是在10.6上运行的,所以我不清楚(1)为什么你的部署目标设置为10.5,以及(2)你是否真的需要将部署设置为10.5。我猜测你可能有一个在10.5上开发的现有Xcode项目,然后从10.5的Xcode导入或升级到10.6的Xcode。如果是这样的话,我认为你只需要在项目窗口顶部的概览中将活动SDK从10.5改为10.6。这样做并强制执行“清理所有目标”应该能解决crt library not found
的错误;如果不行,那可能是项目依赖出了问题。
另一方面,如果你确实需要在10.6上开发以支持10.5,那么看起来你的gitversion.py引入了一个意外的对Python 2.6的依赖(从错误追踪中可以看出),而这个版本并不包含在10.5中。除非你真的需要Python 2.6的功能,否则你可以使用苹果在10.5和10.6上提供的Python 2.5来解决这个问题。在这种情况下,也许你只需要确保在构建阶段的脚本中调用Python时使用/usr/bin/python2.5,而不是直接使用python。
我也遇到了同样的问题,我想继续使用Python,因为用NSMutableDictionary
处理plist文件比用正则表达式处理Info.plist
要简单得多。
在Maxence的回答基础上,解决办法是把Python代码从构建阶段的运行脚本中提取出来,放到一个叫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)
然后把原来的运行脚本替换成一个shell脚本:
env MACOSX_DEPLOYMENT_TARGET=10.6 python gitversion.py
记得把Shell
的设置改成/bin/sh
哦。