15

MinGW GCC 3.4.5 を使用して LLVM 2.6 (llvm-2.6.tar.gz パッケージ) をビルドできました。私は適切にテストしていませんが、うまくいくようです。

問題は、GCC3 を使用してビルドしないが、GCC4 (テンプレートの問題) で正常に動作する独自のライブラリがあることです。MinGW の最初の公式 GCC4 バージョンは GCC 4.4.0 だと思います。

編集

整頓 - 「これを試した、あれを試した」情報で役立つすべての情報が回答に含まれるようになりました。

編集

この質問/回答のほとんどは LLVM 2.7 では冗長です。標準の構成、メイク ルーチンは、ハッキングや回避策なしで MinGW で正常に動作します。

4

1 に答える 1

12

最初はうまくいかないと…

MinGW GCC 4.4.0 を使用して LLVM 2.6 をビルドできるようになりました。方法がわかればそれほど難しくありません。DejaGNU テストを実行することはまだできませんが、一見したところそれほど難しくはないはずです。ほとんどの場合、dejagnu と expect には CygWin パッケージが必要になるでしょう。また、llvm-gcc もまだビルドしていません。

ステップバイステップの前に、ここに 3 つの問題があります...


問題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 <string>」行の直後に挿入...

#define alloca __builtin_alloca


問題3...

コンパイル エラーが修正されても、サンプル プログラムは実行されません。実行時エラーは...

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

これは、RWMutex.cpp の次の行で、pthreads ライブラリの使用に関連しています。

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

基本的な問題は、pthreads サポートが MinGW GCC に含まれており、非公式の TDM ビルドや MinGW GCC 4.4.0 を含む AFAICT のすべての GCC4 バリアントのビルドに含まれていることです。これはMinGW GCC 3.4.5 には含まれていませんでした。そのため、LLVM はそのコンパイラのデフォルト オプションで正常にビルドされます。4.4.0 を使用すると、LLVM 構成スクリプトは pthreads サポートを検出して使用しますが、使用される pthreads-w32 ライブラリは完全に互換性がないようです。

回避策の 1 つは、 http: //markmail.org/message/d7zw2zjq7svevsci で提案されているように、mingw gcc 4.4.0 から次のファイルを削除することです。 ..

  • mingw32\include\pthread.h
  • mingw32\include\sched.h
  • mingw32\include\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-dl​​l.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 テストにのみ必要ですが、まだ作業していません。

MinGW インストールの \bin フォルダーが PATH (コントロール パネル、システム、詳細設定、環境変数) にあることを確認してください。

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」を試してください

特に --enable-targets=host-only および --enable-doxygen configure スクリプト オプションを検討してください。

于 2010-01-30T19:46:57.883 に答える