在Mac OS X上构建和运行llvm-py

pro*_*eek 5 python macos build llvm llvm-py

我试图在Mac OS X上构建llvm-py.

这是我试图做的,我需要下载11vm-2.7,而README文件有这样的评论:确保'--enable-pic'传递给LLVM的'configure'

  1. 下载llvm 2.7.
  2. 构建llvm 2.7:运行 ./configure --prefix=LLVM_DIRECTORY --enable-pic
  3. 下载llvm-py 0.6.
  4. 构建llvm-py 0.6:运行 python setup.py build --llvm-config=LLVM_DIRECTORY/bin/llvm-config

一切都编译没有错误,但当我试图运行测试文件时,我收到此错误消息.

ImportError: 'dlopen(/Library/Python/2.7/site-packages/llvm/_core.so, 2): Symbol not found: __ZTVN4llvm16ExtractValueInstE\n Referenced from: /Library/Python/2.7/site-packages/llvm/_core.so\n Expected in: flat namespace\n in /Library/Python/2.7/site-packages/llvm/_core.so'

消息错误似乎表示缺少具有平面namemspace问题的函数"llvmExtractValueInst".这有什么问题?

在llvm 2.7中,Makefile.rules有这一行

SharedLinkOptions=-Wl,-flat_namespace -Wl,-undefined -Wl,suppress \ -dynamiclib

我试图删除flat_namespace,但我得到编译错误.

添加

按照locojay的回答,我可以建立brew和llvmpy.

export REQUIRES_RTTI=1
brew install llvm --rtti
sudo pip install git+https://github.com/llvmpy/llvmpy
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试在测试目录中执行示例时,我仍然遇到了不同类型的错误 -

test> python example.py 
Traceback (most recent call last):
  File "example.py", line 4, in <module>
    from llvm import *
  File "/Library/Python/2.7/site-packages/llvm/__init__.py", line 11, in <module>
    from llvm import _core
ImportError: dlopen(/Library/Python/2.7/site-packages/llvm/_core.so, 2): Symbol not found: __ZN4llvm10DataLayout2IDE
  Referenced from: /Library/Python/2.7/site-packages/llvm/_core.so
  Expected in: flat namespace
 in /Library/Python/2.7/site-packages/llvm/_core.so 
Run Code Online (Sandbox Code Playgroud)

这是我跑步时的结果 otool -L /Library/Python/2.7/site-packages/llvm/_core.so

/Library/Python/2.7/site-packages/llvm/_core.so:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)
Run Code Online (Sandbox Code Playgroud)

pro*_*eek 1

这就是我让它发挥作用的方法。

  1. 使用brew安装llvm
    • export REQUIRES_RTTI=1
    • brew install llvm --enable-shared --with-clang --with-asan --rtti --enable-jit
    • 您可以跳过 --enable-jit 或 --with-clang
  2. 下载 llvm-py
    • git clone https://github.com/llvmpy/llvmpy.git
  3. 构建 llvm-py
    • LLVM_CONFIG_PATH=/usr/local/opt/llvm/bin/llvm-config python setup.py install
    • 您可能需要检查是否不需要获取此命令的 root 访问权限
  4. 测试
    • python -c 'import llvm; llvm.test()'

它在 OS X Mavericks 下的 llvm 3.3 下运行。

test_scalar_type (llvm.tests.test_type_hash.TestTypeHash) ... ok
test_struct_type (llvm.tests.test_type_hash.TestTypeHash) ... ok
test_uses (llvm.tests.test_uses.TestUses) ... ok
test_volatile (llvm.tests.test_volatile.TestVolatile) ... ok
test_volatile_another (llvm.tests.test_volatile.TestVolatile) ... ok

----------------------------------------------------------------------
Ran 75 tests in 0.249s

OK (skipped=4)
-------------------------------run isolated tests-------------------------------
                    testing llvm.tests.test_intel_native_asm                    
.
----------------------------------------------------------------------
Ran 1 test in 0.008s

OK
Run Code Online (Sandbox Code Playgroud)

我也尝试过kaleidscope,它似乎工作得很好:

$ python kaleidoscope.py 
ready> 3+5
Evaluated to: 8.0
ready> 1-34-5
Evaluated to: -38.0
ready> 
Run Code Online (Sandbox Code Playgroud)

/Library/Python/2.7/site-packages/llvmpy/capsule.py第 114 行进行了一项修改。我不确定这是否有害,但它适用于此更改。

def release_ownership(old):
    logger.debug('Release %s', old)
    addr = getPointer(old)
    name = getName(old)
    if _addr2dtor.get((name, addr)) is None:
        clsname = getClassName(old)

        if not _pyclasses[clsname]._has_dtor():
            return
            # Guard duplicated release <-- raises an error 
        return
        raise Exception("Already released")
    _addr2dtor[(name, addr)] = None
Run Code Online (Sandbox Code Playgroud)