Python Debian 8 上的 numba / llvmlite - 我无法构建 llvmlite

Python numba / llvmlite on Debian 8 - i can't build llvmlite

我正在尝试按照此处所述在 Debian 8 系统上安装 numba:http://llvmlite.pydata.org/en/latest/install/index.html(第 2.2.3 节)。

我已经安装了 LLVM 3.5,它似乎找到了它,但是在使用 setup.py:

构建 llvmlite 时我总是遇到错误
# python setup.py build

这是完整的输出:

running build
got version from VCS {'version': '0.9.0.dev+7.gf5a7007.dirty', 'full': 'f5a70072ce0e7f5e432d6645056a60b00f957c66.dirty'}
running build_ext
/usr/bin/python ffi/build.py
LLVM version... 3.5.0
# static-libstdc++ avoids runtime dependencies on a
# particular libstdc++ version.
g++ -static-libstdc++ -shared -flto `llvm-config-3.5 --cxxflags` -fno-rtti -g assembly.cpp bitcode.cpp core.cpp initfini.cpp module.cpp value.cpp executionengine.cpp transforms.cpp passmanagers.cpp targets.cpp dylib.cpp linker.cpp -o libllvmlite.so -flto `llvm-config-3.5 --ldflags` -Wl,--exclude-libs=ALL `llvm-config-3.5 --system-libs --libs all`
assembly.cpp: In function ‘LLVMOpaqueModule* LLVMPY_ParseAssembly(LLVMContextRef, const char*, const char**)’:
assembly.cpp:25:64: error: ‘parseAssemblyString’ was not declared in this scope
     Module *m = parseAssemblyString(ir, error, *unwrap(context)).release();
                                                                ^
bitcode.cpp: In function ‘void LLVMPY_WriteBitcodeToString(LLVMModuleRef, const char**, size_t*)’:
bitcode.cpp:13:62: error: ‘LLVMWriteBitcodeToMemoryBuffer’ was not declared in this scope
     LLVMMemoryBufferRef MB = LLVMWriteBitcodeToMemoryBuffer(M);
                                                              ^
core.cpp: In function ‘void LLVMPY_SetCommandLine(const char*, const char*)’:
core.cpp:36:46: error: ‘LLVMParseCommandLineOptions’ was not declared in this scope
     LLVMParseCommandLineOptions(2, argv, NULL);
                                              ^
module.cpp: In function ‘LLVMOpaqueModule* LLVMPY_CloneModule(LLVMModuleRef)’:
module.cpp:223:29: error: ‘LLVMCloneModule’ was not declared in this scope
     return LLVMCloneModule(M);
                             ^
executionengine.cpp: In function ‘LLVMOpaqueExecutionEngine* create_execution_engine(LLVMModuleRef, LLVMTargetMachineRef, char**)’:
executionengine.cpp:72:74: error: no matching function for call to ‘llvm::EngineBuilder::EngineBuilder(std::unique_ptr<llvm::Module>)’
     llvm::EngineBuilder eb(std::unique_ptr<llvm::Module>(llvm::unwrap(M)));
                                                                          ^
executionengine.cpp:72:74: note: candidates are:
In file included from executionengine.cpp:6:0:
/usr/lib/llvm-3.5/include/llvm/ExecutionEngine/ExecutionEngine.h:594:3: note: llvm::EngineBuilder::EngineBuilder(llvm::Module*)
   EngineBuilder(Module *m) : M(m) {
   ^
/usr/lib/llvm-3.5/include/llvm/ExecutionEngine/ExecutionEngine.h:594:3: note:   no known conversion for argument 1 from ‘std::unique_ptr<llvm::Module>’ to ‘llvm::Module*’
/usr/lib/llvm-3.5/include/llvm/ExecutionEngine/ExecutionEngine.h:570:7: note: llvm::EngineBuilder::EngineBuilder(const llvm::EngineBuilder&)
 class EngineBuilder {
       ^
/usr/lib/llvm-3.5/include/llvm/ExecutionEngine/ExecutionEngine.h:570:7: note:   no known conversion for argument 1 from ‘std::unique_ptr<llvm::Module>’ to ‘const llvm::EngineBuilder&’
/usr/lib/llvm-3.5/include/llvm/ExecutionEngine/ExecutionEngine.h:570:7: note: llvm::EngineBuilder::EngineBuilder(llvm::EngineBuilder&&)
/usr/lib/llvm-3.5/include/llvm/ExecutionEngine/ExecutionEngine.h:570:7: note:   no known conversion for argument 1 from ‘std::unique_ptr<llvm::Module>’ to ‘llvm::EngineBuilder&&’
executionengine.cpp: In function ‘uint64_t LLVMPY_GetGlobalValueAddress(LLVMExecutionEngineRef, const char*)’:
executionengine.cpp:107:46: error: ‘LLVMGetGlobalValueAddress’ was not declared in this scope
     return LLVMGetGlobalValueAddress(EE, Name);
                                              ^
executionengine.cpp: In function ‘uint64_t LLVMPY_GetFunctionAddress(LLVMExecutionEngineRef, const char*)’:
executionengine.cpp:114:43: error: ‘LLVMGetFunctionAddress’ was not declared in this scope
     return LLVMGetFunctionAddress(EE, Name);
                                           ^
executionengine.cpp: At global scope:
executionengine.cpp:187:45: error: ‘llvm::MemoryBufferRef’ has not been declared
                                       llvm::MemoryBufferRef MBR)
                                             ^
executionengine.cpp:200:49: error: conflicting return type specified for ‘virtual std::unique_ptr<llvm::MemoryBuffer> LLVMPYObjectCache::getObject(const llvm::Module*)’
     virtual std::unique_ptr<llvm::MemoryBuffer> getObject(const llvm::Module* M)
                                                 ^
In file included from executionengine.cpp:8:0:
/usr/lib/llvm-3.5/include/llvm/ExecutionEngine/ObjectCache.h:36:25: error:   overriding ‘virtual llvm::MemoryBuffer* llvm::ObjectCache::getObject(const llvm::Module*)’
   virtual MemoryBuffer* getObject(const Module* M) = 0;
                         ^
/usr/lib/llvm-3.5/include/llvm/ExecutionEngine/ObjectCache.h:30:16: warning: ‘virtual void llvm::ObjectCache::notifyObjectCompiled(const llvm::Module*, const llvm::MemoryBuffer*)’ was hidden [-Woverloaded-virtual]
   virtual void notifyObjectCompiled(const Module *M, const MemoryBuffer *Obj) = 0;
                ^
executionengine.cpp:186:18: warning:   by ‘virtual void LLVMPYObjectCache::notifyObjectCompiled(const llvm::Module*, int)’ [-Woverloaded-virtual]
     virtual void notifyObjectCompiled(const llvm::Module *M,
                  ^
executionengine.cpp: In member function ‘virtual void LLVMPYObjectCache::notifyObjectCompiled(const llvm::Module*, int)’:
executionengine.cpp:191:42: error: request for member ‘getBufferStart’ in ‘MBR’, which is of non-class type ‘int’
                                      MBR.getBufferStart(),
                                          ^
executionengine.cpp:192:42: error: request for member ‘getBufferSize’ in ‘MBR’, which is of non-class type ‘int’
                                      MBR.getBufferSize() };
                                          ^
executionengine.cpp: In member function ‘virtual std::unique_ptr<llvm::MemoryBuffer> LLVMPYObjectCache::getObject(const llvm::Module*)’:
executionengine.cpp:211:21: error: no match for ‘operator=’ (operand types are ‘std::unique_ptr<llvm::MemoryBuffer>’ and ‘llvm::MemoryBuffer*’)
                 res = llvm::MemoryBuffer::getMemBufferCopy(
                     ^
executionengine.cpp:211:21: note: candidates are:
In file included from /usr/include/c++/4.9/memory:81:0,
                 from /usr/lib/llvm-3.5/include/llvm/ADT/SmallVector.h:28,
                 from /usr/lib/llvm-3.5/include/llvm/IR/DataLayout.h:24,
                 from /usr/lib/llvm-3.5/include/llvm/IR/Module.h:20,
                 from executionengine.cpp:5:
/usr/include/c++/4.9/bits/unique_ptr.h:249:7: note: std::unique_ptr<_Tp, _Dp>& std::unique_ptr<_Tp, _Dp>::operator=(std::unique_ptr<_Tp, _Dp>&&) [with _Tp = llvm::MemoryBuffer; _Dp = std::default_delete<llvm::MemoryBuffer>]
       operator=(unique_ptr&& __u) noexcept
       ^
/usr/include/c++/4.9/bits/unique_ptr.h:249:7: note:   no known conversion for argument 1 from ‘llvm::MemoryBuffer*’ to ‘std::unique_ptr<llvm::MemoryBuffer>&&’
/usr/include/c++/4.9/bits/unique_ptr.h:269:2: note: template<class _Up, class _Ep> typename std::enable_if<std::__and_<std::is_convertible<typename std::unique_ptr<_Up, _Ep>::pointer, typename std::unique_ptr<_Tp, _Dp>::_Pointer::type>, std::__not_<std::is_array<_Up> > >::value, std::unique_ptr<_Tp, _Dp>&>::type std::unique_ptr<_Tp, _Dp>::operator=(std::unique_ptr<_Up, _Ep>&&) [with _Up = _Up; _Ep = _Ep; _Tp = llvm::MemoryBuffer; _Dp = std::default_delete<llvm::MemoryBuffer>]
  operator=(unique_ptr<_Up, _Ep>&& __u) noexcept
  ^
/usr/include/c++/4.9/bits/unique_ptr.h:269:2: note:   template argument deduction/substitution failed:
executionengine.cpp:211:21: note:   mismatched types ‘std::unique_ptr<_Tp, _Dp>’ and ‘llvm::MemoryBuffer*’
                 res = llvm::MemoryBuffer::getMemBufferCopy(
                     ^
In file included from /usr/include/c++/4.9/memory:81:0,
                 from /usr/lib/llvm-3.5/include/llvm/ADT/SmallVector.h:28,
                 from /usr/lib/llvm-3.5/include/llvm/IR/DataLayout.h:24,
                 from /usr/lib/llvm-3.5/include/llvm/IR/Module.h:20,
                 from executionengine.cpp:5:
/usr/include/c++/4.9/bits/unique_ptr.h:278:7: note: std::unique_ptr<_Tp, _Dp>& std::unique_ptr<_Tp, _Dp>::operator=(std::nullptr_t) [with _Tp = llvm::MemoryBuffer; _Dp = std::default_delete<llvm::MemoryBuffer>; std::nullptr_t = std::nullptr_t]
       operator=(nullptr_t) noexcept
       ^
/usr/include/c++/4.9/bits/unique_ptr.h:278:7: note:   no known conversion for argument 1 from ‘llvm::MemoryBuffer*’ to ‘std::nullptr_t’
executionengine.cpp: In function ‘LLVMPYObjectCache* LLVMPY_CreateObjectCache(ObjectCacheNotifyFunc, ObjectCacheGetObjectFunc, void*)’:
executionengine.cpp:233:72: error: invalid new-expression of abstract class type ‘LLVMPYObjectCache’
     return new LLVMPYObjectCache(notify_func, getobject_func, user_data);
                                                                        ^
executionengine.cpp:176:7: note:   because the following virtual functions are pure within ‘LLVMPYObjectCache’:
 class LLVMPYObjectCache : public llvm::ObjectCache {
       ^
In file included from executionengine.cpp:8:0:
/usr/lib/llvm-3.5/include/llvm/ExecutionEngine/ObjectCache.h:30:16: note:   virtual void llvm::ObjectCache::notifyObjectCompiled(const llvm::Module*, const llvm::MemoryBuffer*)
   virtual void notifyObjectCompiled(const Module *M, const MemoryBuffer *Obj) = 0;
                ^
linker.cpp: In function ‘int LLVMPY_LinkModules(LLVMModuleRef, LLVMModuleRef, int, const char**)’:
linker.cpp:19:32: error: ‘DiagnosticInfo’ does not name a type
     auto diagnose = [&] (const DiagnosticInfo &DI) {
                                ^
linker.cpp:30:6: error: expected ‘)’ before ‘;’ token
     };
      ^
linker.cpp: In lambda function:
linker.cpp:30:6: error: expected ‘{’ before ‘;’ token
linker.cpp: In function ‘int LLVMPY_LinkModules(LLVMModuleRef, LLVMModuleRef, int, const char**)’:
linker.cpp:32:34: error: ‘LLVMCloneModule’ was not declared in this scope
         Src = LLVMCloneModule(Src);
                                  ^
linker.cpp:33:74: error: no matching function for call to ‘llvm::Linker::LinkModules(llvm::Module*, llvm::Module*, LLVMPY_LinkModules(LLVMModuleRef, LLVMModuleRef, int, const char**)::<lambda(int)>&)’
     bool failed = Linker::LinkModules(unwrap(Dest), unwrap(Src), diagnose);
                                                                          ^
linker.cpp:33:74: note: candidate is:
In file included from linker.cpp:4:0:
/usr/lib/llvm-3.5/include/llvm/Linker/Linker.h:51:17: note: static bool llvm::Linker::LinkModules(llvm::Module*, llvm::Module*, unsigned int, std::string*)
     static bool LinkModules(Module *Dest, Module *Src, unsigned Mode,
                 ^
/usr/lib/llvm-3.5/include/llvm/Linker/Linker.h:51:17: note:   candidate expects 4 arguments, 3 provided
Makefile.linux:17: recipe for target 'libllvmlite.so' failed
make: *** [libllvmlite.so] Error 1
Traceback (most recent call last):
  File "ffi/build.py", line 114, in <module>
    main()
  File "ffi/build.py", line 104, in main
    main_posix('linux', '.so')
  File "ffi/build.py", line 96, in main_posix
    subprocess.check_call(['make', '-f', makefile])
  File "/usr/lib/python2.7/subprocess.py", line 540, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['make', '-f', 'Makefile.linux']' returned non-zero exit status 2
error: command '/usr/bin/python' failed with exit status 1

谁能帮我弄清楚我错过了什么?

[更新]

我使用 llvm 3.6 修复了它,方法是安装软件包“llmv-3.6-dev”并将“ffi/Makefile.linux”中的“LLVM_CONFIG”变量更改为“ llvm-config-3.6´.

但现在我收到以下错误:

running build
got version from VCS {'version': '0.9.0.dev+7.gf5a7007.dirty', 'full': 'f5a70072ce0e7f5e432d6645056a60b00f957c66.dirty'}
running build_ext
/usr/bin/python ffi/build.py
LLVM version... 3.6.2
# static-libstdc++ avoids runtime dependencies on a
# particular libstdc++ version.
g++ -static-libstdc++ -shared -flto `llvm-config-3.6 --cxxflags` -fno-rtti -g assembly.cpp bitcode.cpp core.cpp initfini.cpp module.cpp value.cpp executionengine.cpp transforms.cpp passmanagers.cpp targets.cpp dylib.cpp linker.cpp -o libllvmlite.so -flto `llvm-config-3.6 --ldflags` -Wl,--exclude-libs=ALL `llvm-config-3.6 --system-libs --libs all`
/usr/bin/ld: cannot find -lz
collect2: error: ld returned 1 exit status
Makefile.linux:17: recipe for target 'libllvmlite.so' failed
make: *** [libllvmlite.so] Error 1
Traceback (most recent call last):
  File "ffi/build.py", line 114, in <module>
    main()
  File "ffi/build.py", line 104, in main
    main_posix('linux', '.so')
  File "ffi/build.py", line 96, in main_posix
    subprocess.check_call(['make', '-f', makefile])
  File "/usr/lib/python2.7/subprocess.py", line 540, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['make', '-f', 'Makefile.linux']' returned non-zero exit status 2
error: command '/usr/bin/python' failed with exit status 1 

我不确定错误的含义,而且我的 google foo 不够强大,无法找到任何类型的解决方案。有帮助吗?

要获取 llvm 3.6,您可以添加一个 /etc/apt/sources.list.d/llvm.list 文件::

# cat /etc/apt/sources.list.d/llvm.list
   deb http://llvm.org/apt/jessie/ llvm-toolchain-jessie main
   deb-src http://llvm.org/apt/jessie/ llvm-toolchain-jessie main
   # 3.6
   deb http://llvm.org/apt/jessie/ llvm-toolchain-jessie-3.6 main
   deb-src http://llvm.org/apt/jessie/ llvm-toolchain-jessie-3.6 main

您也需要添加密钥::

# gpg --keyserver pgpkeys.mit.edu --recv-key 15CF4D18AF4F7421
# gpg -a --export 15CF4D18AF4F7421 | apt-key add -

apt-get 更新并安装 llvm-3.6::

apt-get update
apt-get install cython python-llvm build-essential libedit-dev
apt-get install llvm-3.6 llvm-3.6-dev llvm-dev

然后在你的 virtualenv::

pip install enum34
LLVM_CONFIG=/usr/lib/llvm-3.6/bin/llvm-config pip install llvmlite
LLVM_CONFIG=/usr/lib/llvm-3.6/bin/llvm-config pip install numba