如何在Mac OS X 10.8上安装hg convert所需的python subversion绑定?
我在寻找一个解决方案,希望能简单明了,让 hg convert
在 OS X 10.8 上能够处理 SVN 仓库。
现在,如果你尝试转换一个 SVN 仓库,就会出现 could not load Subversion python bindings
的错误。
注意:Alex Martelli 在另一个回答中建议安装 CollabNet 的 Subversion 版本,但似乎最新的 CollabNet 版本无法在 OS X 10.8 上安装(安装程序会锁定)。
4 个回答
这是对Mavericks系统的一个更新,针对andrewdotn的回答。
在Mavericks系统下,/usr/lib
(标准库文件存放位置)里唯一的SVN动态库,比如说,/usr/lib/libsvn_client-1.0.0.0.dylib
。这个库内部的名称(可以用otool -L
命令查看)会告诉动态加载器去找libsvn_client-1.0.dylib
。通常情况下,这个文件也会在/usr/lib
里作为指向真实库的链接存在。
试试这个方法:
在andrewdotn的
Makefile
文件中,修改第二行的LDFLAGS
,改成:/Library/Developer/CommandLineTools/usr/lib/libsvn_*-1.0.dylib \
设置
DYLD_LIBRARY_PATH
环境变量:export DYLD_LIBRARY_PATH=/Library/Developer/CommandLineTools/usr/lib
然后运行make
。我遇到了两个错误:
======================================================================
ERROR: test_get_pristine_copy_path (svn.tests.wc.SubversionWorkingCopyTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "../egg/svn/tests/wc.py", line 192, in test_get_pristine_copy_path
self.assertEqual(path_to_text_base, wc.get_pristine_copy_path(path_to_file))
File "../egg/libsvn/wc.py", line 2447, in svn_wc_get_pristine_copy_path
return apply(_wc.svn_wc_get_pristine_copy_path, args)
SubversionException: ("The node '/var/folders/_q/fvnxz46903z9hjh38fz0lyhm0000gs/T/tmp7vMRZu/foo' was not found.", 155010)
======================================================================
ERROR: test_lock (svn.tests.wc.SubversionWorkingCopyTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "../egg/svn/tests/wc.py", line 48, in test_lock
lock = wc.add_lock(self.path, core.svn_lock_create(core.Pool()), self.wc)
File "../egg/libsvn/wc.py", line 2601, in svn_wc_add_lock
return apply(_wc.svn_wc_add_lock, args)
SubversionException: ('sqlite: LOCK.lock_token may not be NULL', 200035)
----------------------------------------------------------------------
不过我还是安装了,结果hg convert
运行得很好。
我怀疑每次运行hg convert
时都需要像上面那样设置DYLD_LIBRARY_PATH
;希望你不需要太频繁地这样做!
我在用MacPorts安装hg的时候,需要输入这个命令:sudo port install subversion-python27bindings
。
使用 Homebrew
想要顺利安装,最简单的方法就是通过homebrew
来从源代码安装subversion
,并加上--with-python
这个选项。
首先,确保你的命令行工具已经安装好。在 Mavericks 和 Xcode 5 中,大部分命令像cc
都能正常工作,即使命令行工具没有完全安装。如果你没有/usr/include
这个文件夹,首先需要运行:
$ xcode-select --install
命令行工具安装完成后,运行:
$ brew install subversion --with-python
$ mkdir -p ~/Library/Python/2.7/lib/python/site-packages
$ echo $(brew --cellar)/subversion/1.8.5/lib/svn-python \
> ~/Library/Python/2.7/lib/python/site-packages/svn.pth
你可以通过运行单元测试来测试绑定是否成功:
$ svn co http://svn.apache.org/repos/asf/subversion/tags/1.8.5/subversion/bindings/swig/python/tests
$ cd tests && python run_all.py
使用苹果的源代码
这个方法在 Mountain Lion 上有效,但在 Mavericks 上需要一些调整,并且可能会导致单元测试失败;可以参考Simon Wright 对这个问题的回答。
你可以使用苹果版本的 subversion 源代码来构建 Python 的绑定。这样生成的模块会完全兼容,并且可以链接到所有系统库。然后hg convert
就能正常工作了。
下面是具体步骤:
从opensource.apple.com下载
subversion tarball
。解压文件并进行配置:
cd subversion-52/subversion && ./configure
在
subversion/bindings/swig/python
目录下,添加这个 Makefile,确保把开头的空格改成制表符:SHELL = /bin/bash -eu CC = gcc -g -O2 CFLAGS = -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK \ -I ../proxy \ -I ../../.. \ -I ../../../include \ -I /usr/include/apr-1 \ -I libsvn_swig_py \ -I /System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 \ LDFLAGS = \ /System/Library/Frameworks/Python.framework/Versions/2.7/lib/libpython2.7.dylib \ /usr/lib/libsvn_*-1.0.dylib \ /usr/lib/libapr-1.dylib \ .PHONY: build egg test clean install test: egg mkdir -p tmp && cd tmp \ && PYTHONPATH=../egg python -S -m svn.tests.run_all DESTDIR=$(HOME)/Library/Python/2.7/lib/python/site-packages install: egg mkdir -p "${DESTDIR}" rm -rf "$(DESTDIR)/svn.egg" cp -R egg "$(DESTDIR)/svn.egg" echo './svn.egg' > "$(DESTDIR)/svn.pth" egg: build rm -rf egg mkdir egg cp -R svn egg cp -R tests egg/svn touch egg/svn/tests/__init__.py mkdir egg/libsvn cp *.py egg/libsvn cp *.so *.dylib egg/libsvn # https://blogs.oracle.com/dipol/entry/dynamic_libraries_rpath_and_mac for F in egg/libsvn/*.so; do \ install_name_tool -change libsvn_swig_py.dylib \ '@loader_path/libsvn_swig_py.dylib' "$$F"; \ done strip -x egg/libsvn/*.so touch egg/libsvn/__init__.py mkdir -p egg/EGG-INFO echo 'Version: 1.6.8' > egg/EGG-INFO/PKG-INFO build: libsvn_swig_py.dylib _client.so _core.so _delta.so _diff.so _fs.so _ra.so _repos.so _wc.so libsvn_swig_py.dylib: $(CC) $(CFLAGS) -shared -dynamic libsvn_swig_py/swigutil_py.c -o $@ $(LDFLAGS) _client.so: svn_client.c _core.so: core.c _delta.so: svn_delta.c _diff.so: svn_diff.c _fs.so: svn_fs.c _repos.so: svn_repos.c _wc.so: svn_wc.c _%.so: svn_%.c libsvn_swig_py.dylib $(CC) $(CFLAGS) -bundle $^ -o $@ $(LDFLAGS) _%.so: %.c libsvn_swig_py.dylib $(CC) $(CFLAGS) -bundle $^ -o $@ $(LDFLAGS) clean: rm -rf *.o *.so *.dylib *.dSYM
然后在这个目录下运行
make
。如果上一步的单元测试通过了,你现在就有了完全功能的 Python 绑定!如果满意,就运行
make install
,这样hg convert
就可以开始工作了。
像往常一样,重写构建系统比搞清楚现有的系统要简单得多。
苹果和 Subversion 的所有脚本让事情变得复杂,但其实你只需要复制.py
文件,构建一个包含公共代码的共享库,然后为每个 C 语言的 Python 模块构建。弄清楚要用哪些包含文件和库很简单:尝试从不包含任何文件或库开始构建,当构建失败时,添加缺失的包含路径或库的引用。比较棘手的是告诉 C 语言模块像_core.so
在哪里找到公共代码的动态库。