Сборка и запуск llvm-py на Mac OS X - PullRequest
5 голосов
/ 30 января 2012

Я пытался собрать llvm-py на Mac OS X.

Это то, что я пытался сделать, мне нужно было скачать 11vm-2.7, и файл README имеет этокомментарий: убедитесь, что '--enable-pic' передан в 'configure' LLVM

  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'

Сообщение об ошибке, похоже, говорит о том, что отсутствует функция "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

Однако, когда я попытался выполнить примеры в тестовой директории, япо-прежнему возникает ошибка другого типа -

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 

Это результат, когда я запускаю 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)

Ответы [ 2 ]

4 голосов
/ 05 января 2013

посмотрите @ документы llvmpy

Для LLVM 3.2, убедитесь, что переменная среды REQUIRES_RTTI = 1 имеет значение определяется при запуске make. В противном случае вы можете увидеть «неопределенный символ: _ZTIN4llvm24PassRegistrationListenerE ". Подробнее см. http://llvm.org/docs/Packaging.html#c-features.

так что для меня это сработало

export REQUIRES_RTTI=1
brew install llvm --rtti
pip install git+https://github.com/llvmpy/llvmpy

Полагаю, всегда можно попробовать анаконду в худшем случае ...

1 голос
/ 15 января 2014

Вот как я заставил это работать.

  1. Установите llvm с заваркой
    • export REQUIRES_RTTI=1
    • brew install llvm --enable-shared --with-clang --with-asan --rtti --enable-jit
    • Вы можете пропустить --enable-jit или --with-clang
  2. Скачать llvm-py
  3. Сборка llvm-py
    • LLVM_CONFIG_PATH=/usr/local/opt/llvm/bin/llvm-config python setup.py install
    • Возможно, вам потребуется проверить, не требуется ли вам получить root-доступ для этой команды
  4. Test
    • python -c 'import llvm; llvm.test()'

Работает под llvm 3.3 под OS X Mavericks.

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

Я тоже пробовал с калейдоскопом , и вроде бы нормально работает:

$ python kaleidoscope.py 
ready> 3+5
Evaluated to: 8.0
ready> 1-34-5
Evaluated to: -38.0
ready> 

С одной модификацией в /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
...