Как собрать LLVM с помощью GCC 4 на Windows? - PullRequest
15 голосов
/ 25 января 2010

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

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

EDIT

Decluttered - все полезное в информации «попробовал это попробовал» теперь в ответе.

EDIT

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

1 Ответ

12 голосов
/ 30 января 2010

Если сначала вам не удастся ...

Теперь я могу собрать 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

Похоже, что указывается опция, которая отключает встроенную функцию alloca.

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

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

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

#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 \ включать \ pthread.h
  • mingw32 \ включать \ sched.h
  • mingw32 \ включать \ semaphore.h
  • mingw32 \ Lib \ libpthread.a

Тем не менее, лучше просто указать скрипту конфигурации отключить потоки ...

./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
  • НКА-полной-4,4,0-mingw32-бен-2.tar.lzma
  • макияж 3.81-20090914-mingw32-bin.tar.gz
  • tcltk-8.4.1-1.exe
  • MSYS-1.0.11.exe
  • msysDTK-1.0.1.exe
  • Баш-3.1.17-2-MSYS-1.0.11-bin.tar.lzma
  • Бизон-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-длл-0.tar.lzma

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

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

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

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

#define alloca __builtin_alloca

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

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

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

Полезный совет - попробуйте "./configure --help"

Рассмотрим, в частности, параметры сценариев настройки --enable-target = host-only и --enable-doxygen.

...