[python]安裝 libgit2, pygit2 on windows
總之,我的程式還是要在 windows 下跑,該弄懂的還是要弄懂。
因為 pygit2 是依附在 libgit2 之上,因此,
第一個要解決的就是 libgit2 要裝在 windows 的問題。
還好!
有人好心的教大家如何在 windows 安裝 libgit2!
https://github.com/libgit2/libgit2/wiki/Building-libgit2-on-Windows
首先,下載並安裝以下程式
- Microsoft Visual Studio 2010 express,請選 VC++ Express,網址 http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express。
- CMake,安裝 x86 exe 最簡單,網址 http://www.cmake.org/cmake/resources/software.html。
- 安裝 Python,網址 http://www.python.org/getit/
- 下載 libgit2 的 source code,我是在 c:\libgit2\git 執行底下的指令,接下來好講解。
git clone https://github.com/libgit2/libgit2.git
如果沒有裝 git,就裝 tortoisegit 吧!
以上四個東西都有了,接下來就開工了!
- 打開 VS2010 Command Prompt
- 到 libgit2 的 source code 位置,照剛剛的指令,會放在 C:\libgit2\git\libgit2
cd C:\libgit2\git\libgit2
- 輸入以下指令
mkdir build && cd build
cmake ..
cmake --build .
ctest -V
cmake --build . --target install
最後,libgit2 會裝在 Installing: C:/Program Files (x86)/libgit2
接下來,安裝 pygit2,把 source code 放在 C:\pygit2\git\pygit2
接下來設定以下的環境變數
set VS90COMNTOOLS=%VS100COMNTOOLS%
以上,是避免 error: Unable to find vcvarsall.bat
C:\pygit2\git\pygit2>setup.py install
running install
running build
running build_py
running build_ext
building '_pygit2' extension
error: Unable to find vcvarsall.bat
然後,接下來是難過的消息,就是安裝不上去,會得到
在執行 C:\pygit2\git\pygit2>setup.py install
都得到:C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN\cl.exe /c /nologo /Ox
/MD /W3 /GS- /DNDEBUG "-IC:\Program Files (x86)\libgit2\include" -Iinclude -IC:
\Python27\include -IC:\Python27\PC /Tcsrc\pygit2.c /Fobuild\temp.win32-2.7\Relea
se\src\pygit2.obj
pygit2.c
src\pygit2.c(146) : error C2275: 'git_clone_options' : 將此型別當做運算式的使用
方式不合法
c:\program files (x86)\libgit2\include\git2/clone.h(82) : 請參閱 'git_cl
one_options' 的宣告
src\pygit2.c(146) : error C2146: 語法錯誤 : 遺漏 ';' (在識別項 'opts' 之前)
src\pygit2.c(146) : error C2065: 'opts' : 未宣告的識別項
src\pygit2.c(146) : error C2059: 語法錯誤 : '{'
src\pygit2.c(156) : error C2065: 'opts' : 未宣告的識別項
src\pygit2.c(156) : warning C4133: '函式' : 不相容的型別 - 從 'int *' 至 'const
git_clone_options *'
error: command '"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN\cl.e
xe"' failed with exit status 2
我試過 libgit2 官網的方法,也試過 ahem 先生 在 https://github.com/libgit2/pygit2/issues/110 提過的方法,
mkdir build && cd build
cmake .. -DSTDCALL=OFF -G "Visual Studio 10"
cmake --build . --config release
ctest -V
cmake --build . --config release --target install
都一樣的結果。
註一:原來 ahem 先生的方法如下:
mkdir build && cd build
cmake .. -DSTDCALL=OFF -G "Visual Studio 10 Win64"
cmake --build . --config release
ctest -V
cmake --build . --config release --target install
只是我的環境不能加上 Win64。
C:\libgit2\git\libgit2\build>cmake .. -DSTDCALL=OFF -G "Visual Studio 10 Win64"
CMake Error at CMakeLists.txt:14 (PROJECT):
Cannot enable 64-bit tools with Visual Studio 2010 Express.Install the Microsoft Windows SDK v7.1 to get 64-bit tools:
http://msdn.microsoft.com/en-us/windows/bb980924.aspx
-- Configuring incomplete, errors occurred!
後來不死心,繼續研究 C2275 是什麼原因。找了很久,有人說也許是微軟編譯器,看到 .c 就只用 C89 來處理,也就是變數宣告,一定要在 block 的一開頭,所以,我就把 src/pygit2.c 裡的 146 行,變數宣告搬到前面,初始化也處理一下。
int err;
git_clone_options opts;if (!PyArg_ParseTuple(args, "zzIzzzzz",
&url, &path, &bare, &remote_name, &push_url,
&fetch_spec, &push_spec, &checkout_branch))
return NULL;opts.version = 1;
opts.bare = bare;
opts.remote_name=remote_name;
opts.pushurl=push_url;
opts.fetch_spec=fetch_spec;
opts.push_spec=push_spec;
opts.checkout_branch=checkout_branch;
後來的確 pygit2.c 可以過了,那接下來又換 repository.c 有相同問題,那也一起處理。結果!
正在建立程式庫 build\temp.win32-2.7\Release\src\_pygit2.lib 和物件 build\temp
.win32-2.7\Release\src\_pygit2.exp
remote.obj : error LNK2019: 無法解析的外部符號 _git_remote_fetchspec 在函式 _Rem
ote_fetchspec__get__ 中被參考
remote.obj : error LNK2019: 無法解析的外部符號 _git_remote_set_fetchspec 在函式
_Remote_fetchspec__set__ 中被參考
build\lib.win32-2.7\_pygit2.pyd : fatal error LNK1120: 2 個無法解析的外部符號
error: command '"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN\link
.exe"' failed with exit status 1120
中地雷又一枚…。