簡體   English   中英

如何在Mac OS X 10.8上安裝hg convert所需的python subversion綁定?

[英]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

使用Apple的源代碼

這適用於Mountain Lion,但需要對Mavericks進行調整並導致單元測試失敗; 請看Simon Wright對這個問題的回答

可以使用Apple版本的subversion源代碼為Python構建subversion綁定。 生成的模塊將完全兼容並鏈接到所有系統庫。 然后hg convert將正常工作。

這是怎么做的:

  1. opensource.apple.com下載subversion tarball

  2. 打開包裝並進行配置:

     cd subversion-52/subversion && ./configure 
  3. 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

  4. 如果在最后一步中傳遞了單元測試,那么現在您已經擁有了用於subversion的全功能Python綁定! 如果你滿意的話,運行make installhg 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作為真實庫的符號鏈接。

試試這個:

  1. 在andrewdotn的Makefile ,編輯LDFLAGS (第二行)來說明

    /Library/Developer/CommandLineTools/usr/lib/libsvn_*-1.0.dylib \\

  2. 設置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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM