[英]How to install python subversion bindings needed by hg convert on Mac OS X 10.8?
我正在尋找一個解決方案,最好是干凈簡單,使hg convert
能夠在帶有SVN存儲庫的OS X 10.8上運行。
目前,如果您嘗試轉換SVN存儲庫,您將could not load Subversion python bindings
錯誤。
注意:Alex Martelli在另一個答案中建議為OS X安裝CollabNet subversion發行版,但似乎最新的CollabNet版本無法安裝在OS X 10.8上(安裝程序鎖定)。
最簡單的方法是使用homebrew
和--with-python
標志從源代碼安裝subversion
。
首先,確保安裝了命令行工具。 使用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對這個問題的回答 。
可以使用Apple版本的subversion源代碼為Python構建subversion綁定。 生成的模塊將完全兼容並鏈接到所有系統庫。 然后hg convert
將正常工作。
這是怎么做的:
打開包裝並進行配置:
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
。
如果在最后一步中傳遞了單元測試,那么現在您已經擁有了用於subversion的全功能Python綁定! 如果你滿意的話,運行make install
, hg convert
將開始工作。
通常情況下,從頭開始重寫構建系統比找出現有構建系統更容易。
來自Apple和Subversion的所有腳本確實使它復雜化,但您真正需要做的就是復制.py
文件,使用公共代碼構建共享庫,然后構建每個C語言Python模塊。 確定要使用哪些包含文件和庫是很簡單的:嘗試在沒有任何包含或庫的情況下開始構建它,並且當構建失敗時,添加對導致構建失敗的缺少包含路徑或庫的引用。 棘手的部分是告訴C語言模塊如_core.so
在哪里可以找到公共代碼的動態庫。
使用MacPorts中的hg,我需要sudo port install subversion-python27bindings
。
在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
。 我有2個錯誤:
======================================================================
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
; 希望不是那么經常!
您可以嘗試使用帶有subvertpy而不是hg convert的hgsubversion。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.