Сборка и запуск llvm-py на Mac OS X
Я пытался собрать llvm-py на Mac OS X.
Это то, что я пытался сделать, мне нужно было загрузить 11vm-2.7, и файл README содержит следующий комментарий: Убедитесь, что '--enable-pic' передан в 'configure' LLVM
- Скачать llvm 2.7.
- Сборка llvm 2.7: Запуск
./configure --prefix=LLVM_DIRECTORY --enable-pic
- Скачать llvm-py 0.6.
- Сборка 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
, но я получил ошибку компиляции.
ADDED
После ответа locojay, я мог бы собрать варево и 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 ответа
Вот как я заставил это работать.
- Установите llvm с заваркой
export REQUIRES_RTTI=1
brew install llvm --enable-shared --with-clang --with-asan --rtti --enable-jit
- Вы можете пропустить --enable-jit или --with-clang
- Скачать llvm-py
git clone https://github.com/llvmpy/llvmpy.git
- Сборка llvm-py
LLVM_CONFIG_PATH=/usr/local/opt/llvm/bin/llvm-config python setup.py install
- Возможно, вам придется проверить, не нужно ли вам получить root-доступ для этой команды
- Тестовое задание
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
Посмотри @ документы llvmpy
Для LLVM 3.2 убедитесь, что переменная окружения REQUIRES_RTTI=1 определена при запуске make. В противном случае вы можете увидеть "неопределенный символ: _ZTIN4llvm24PassRegistrationListenerE". Пожалуйста, обратитесь к http://llvm.org/docs/Packaging.html для деталей.
так что для меня это сработало
export REQUIRES_RTTI=1
brew install llvm --rtti
pip install git+https://github.com/llvmpy/llvmpy
Я думаю, что всегда можно попробовать анаконду в худшем случае....