最初はうまくいかないと…
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-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 テストにのみ必要ですが、まだ作業していません。
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 スクリプト オプションを検討してください。