Как собрать LLVM с помощью GCC 4 в Windows?

Мне удалось собрать LLVM 2.6 (пакет llvm-2.6.tar.gz), используя MinGW GCC 3.4.5. Я не проверял должным образом, но, похоже, это работает.

Проблема в том, что у меня есть собственные библиотеки, которые не собираются с использованием GCC3, но отлично работают в GCC4 (проблемы с шаблонами). Я считаю, что первой официальной версией GCC4 для MinGW является GCC 4.4.0.

ИЗМЕНИТЬ

Расхламлено - все полезное в информации "попробовал это попробовал это" теперь находится в ответе.

ИЗМЕНИТЬ

Большая часть этого вопроса/ответа избыточна для LLVM 2.7 — стандартная процедура configure, make отлично работает в MinGW без каких-либо хаков или обходных путей.


person Steve314    schedule 24.01.2010    source источник
comment
На данный момент я принял свой собственный ответ и перехожу к использованию библиотеки, но я могу вернуться и добавить ответ для сборки с использованием llvm-gcc и некоторых других вещей в какой-то момент, когда я это выясню.   -  person Steve314    schedule 01.02.2010


Ответы (1)


Если сначала у вас не получится...

Теперь я могу собрать LLVM 2.6, используя MinGW GCC 4.4.0, и это не так уж сложно, если вы знаете, как это сделать. Я все еще не могу запустить тесты DejaGNU, хотя на первый взгляд это не должно быть так сложно - скорее всего, мне понадобятся пакеты CygWin для dejagnu и ожидать. Я также еще не собрал llvm-gcc.

Перед пошаговым описанием вот три проблемы...


Проблема 1...

Попытка собрать llvm с использованием стандартных инструкций по сборке завершается сбоем со следующей ошибкой компилятора в Signals.cpp (win32/Program.inc)

llvm[1]: Compiling Signals.cpp for Release build
In file included from Signals.cpp:33:
Win32/Signals.inc: In function 'LONG LLVMUnhandledExceptionFilter(_EXCEPTION_POINTERS*)':
Win32/Signals.inc:234: error: exception handling disabled, use -fexceptions to enable

Обходной путь — использовать «make -k -fexceptions» — ответ, найденный в документации по чистому языку.


Проблема 2...

Даже при первом обходном пути возникает следующая ошибка компилятора...

ExternalFunctions.cpp: In function 'bool ffiInvoke(void (*)(), llvm::Function*, const std::vector<llvm::GenericValue, std::allocator<llvm::GenericValue> >&, const llvm::TargetData*, llvm::GenericValue&)':
ExternalFunctions.cpp:207: error: 'alloca' was not declared in this scope

Кажется, указана опция, которая отключает встроенную «аллоку».

Обходной путь - отредактировать проблемный файл

C:\llvm-2.6\lib\ExecutionEngine\Interpreter\ExternalFunctions.cpp

Сразу после строки "#include ‹string›" вставьте...

#define alloca __builtin_alloca


Проблема 3...

Даже с исправлением ошибок компиляции примеры программ не запустятся. Ошибки во время выполнения...

Assertion failed: errorcode == 0, file RWMutex.cpp, line 87

Это относится к использованию библиотеки pthreads в следующих строках RWMutex.cpp.

86:   // Initialize the rwlock
87:   errorcode = pthread_rwlock_init(rwlock, &attr);
88:   assert(errorcode == 0);

Основная проблема заключается в том, что поддержка pthreads включена в MinGW GCC и включена в сборки AFAICT всех вариантов GCC4, включая неофициальные сборки TDM, а также включая MinGW GCC 4.4.0. Это было не включено в MinGW GCC 3.4.5, поэтому LLVM отлично строится с параметрами по умолчанию для этого компилятора. Используя 4.4.0, скрипт конфигурации LLVM обнаруживает поддержку pthreads и использует ее, но используемая библиотека pthreads-w32 кажется не полностью совместимой.

Одним из обходных путей является удаление следующих файлов из mingw gcc 4.4.0, как это предлагается в http://markmail.org/message/d7zw2zjq7svevsci - да, я знаю, что ранее говорил, что их там нет, но я перепутал расположение папок...

  • mingw32\include\pthread.h
  • mingw32\include\sched.h
  • mingw32\include\semaphore.h
  • mingw32\lib\libpthread.a

Однако лучше просто указать скрипту configure отключить потоки...

./configure --disable-threads


Итак, шаги...

Сначала установите следующие пакеты MinGW и MSYS...

  • binutils-2.20-1-mingw32-bin.tar.gz
  • mingwrt-3.17-mingw32-dev.tar.gz
  • mingwrt-3.17-mingw32-dll.tar.gz
  • w32api-3.14-mingw32-dev.tar.gz
  • gcc-full-4.4.0-mingw32-bin-2.tar.lzma
  • make-3.81-20090914-mingw32-bin.tar.gz
  • tcltk-8.4.1-1.exe
  • MSYS-1.0.11.exe
  • msysDTK-1.0.1.exe
  • bash-3.1.17-2-msys-1.0.11-bin.tar.lzma
  • bison-2.4.1-1-msys-1.0.11-bin.tar.lzma
  • flex-2.5.35-1-msys-1.0.11-bin.tar.lzma
  • libregex-0.12-1-msys-1.0.11-dll-0.tar.lzma

Этот список пакетов может быть больше, чем нужно - в частности, tcl tk нужен только для тестов DejaGNU, которые у меня еще не работают.

Убедитесь, что папка \bin вашей установки MinGW находится в ПУТИ (Панель управления, Система, Дополнительно, Переменные среды).

Извлечь llvm-2.6.tar.gz

Отредактируйте файл C:\llvm-2.6\lib\ExecutionEngine\Interpreter\ExternalFunctions.cpp и сразу после строки "#include ‹string>" добавьте строку

#define alloca __builtin_alloca

Запустите командную строку MSYS и запустите...

cd /c/llvm-2.6
./configure --disable-threads
make -k CXXFLAGS=-fexceptions

Я предполагаю, что вы распаковали llvm в c:\llvm-2.6

Удобный совет - попробуйте "./configure --help"

В частности, обратите внимание на опции скрипта configure --enable-targets=host-only и --enable-doxygen.

person Steve314    schedule 30.01.2010