2014-02-15 35 views
2

我想用cmake和g ++ 4.8.1在mingw32(www.mingw.org)上構建llvm-3.4穩定版本。我遇到這個錯誤:如何禁用llvm-c測試與mingw32建立llvm

[ 98%] Building C object tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/include-al 
l.c.obj 
In file included from c:/temp/llvm-3.4/tools/llvm-c-test/include-all.c:33:0: 
C:/temp/llvm-3.4/include/llvm-c/lto.h:158:54: error: unknown type name 'off_t' 
            size_t map_size, off_t offset); 

經過一番研究,事實證明,這是由於一個子目錄llvm-c-test使用非標準型off_t,但請求本身使用標準的C被編譯,而且LLVM-C測試不是必需的。

我試圖通過在tools/CMakeList.txt中註釋掉它來禁用llvm-c-test。但我仍然得到這個錯誤。

我的問題是,如何禁用編譯llvm-c-test或以其他方式解決此錯誤。

回答

2

和你一樣,我確定必須有一個正確的方法來使用CMake禁用目標。我終於放棄了CMake(至少用於MinGW),而不是用makefile配置腳本。使用此構建方法的說明是here

然後禁用LLVM-C測試的目標,你可以直接從PARALLEL_DIRS變量的末尾刪除它在< LLVM> /工具/ Makefile中:與MinGW的

PARALLEL_DIRS := opt llvm-as llvm-dis llc llvm-ar llvm-nm llvm-link \ 
      lli llvm-extract llvm-mc bugpoint llvm-bcanalyzer llvm-diff \ 
      macho-dump llvm-objdump llvm-readobj llvm-rtdyld \ 
      llvm-dwarfdump llvm-cov llvm-size llvm-stress llvm-mcmarkup \ 
      llvm-profdata llvm-symbolizer obj2yaml yaml2obj llvm-c-test 

another problem建立(從llvm幹線)此刻,你可能還會遇到。 make命令行修復似乎可行。

+0

謝謝。這按照描述工作。任何在TDM-GCC 64位上構建llvm的指針? – tinlyx

0

這個問題與CMake無關。這是Ting使用的特殊MinGW tool chain中的一個錯誤。所有其他32位MinGW的工具鏈編譯LLVM - 3.4成功地與CMake的2.8.12.2,即使在64位Windows:

  1. TDM-GCC

  2. 的MinGW-構建

  3. 贏-Builds

  4. MSys2

MSys2甚至可以使用64位工具鏈進行編譯,只需使用pacman更新binutils並設置「CXXFLAGS = -Wa,-mbig-obj」即可。 (不幸的是,在撰寫本文時,沒有其他工具鏈的更新可用)。

順便說一句:即使您將llvm-3.0設爲「CXXFLAGS = -D_GLIBCXX_HAVE_FENV_H」到llvm-3.2,舊的MinGW工具鏈也會運行走入誤區(其它工具鏈會碰上其他錯誤):

llvm-3.0\llvm\tools\clang\lib\Basic\FileManager.cpp:290:66: error: no matching function for call to 'clang::FileManager::getStatValue(const char*&, _stat64i32&, int)' 
llvm-3.0\llvm\tools\clang\lib\Basic\FileManager.cpp:358:61: error: no matching function for call to 'clang::FileManager::getStatValue(const char*&, _stat64i32&, int*)' 
llvm-3.0\llvm\tools\clang\lib\Basic\FileManager.cpp:429:61: error: no matching function for call to 'clang::FileManager::getStatValue(const char*&, _stat64i32&, int*)' 
llvm-3.0\llvm\tools\clang\lib\Basic\FileManager.cpp:539:6: error: prototype for 'bool clang::FileManager::getStatValue(const char*, _stat64i32&, int*)' does not match any in class 'clang::FileManager' 
llvm-3.0\llvm\tools\clang\lib\Basic\FileManager.cpp:554:6: error: prototype for 'bool clang::FileManager::getNoncachedStatValue(llvm::StringRef, _stat64i32&)' does not match any in class 'clang::FileManager' 
llvm-3.1\llvm\tools\clang\lib\Basic\FileManager.cpp:295:66: error: no matching function for call to 'clang::FileManager::getStatValue(const char*&, _stat64i32&, int)' 
llvm-3.1\llvm\tools\clang\lib\Basic\FileManager.cpp:363:61: error: no matching function for call to 'clang::FileManager::getStatValue(const char*&, _stat64i32&, int*)' 
llvm-3.1\llvm\tools\clang\lib\Basic\FileManager.cpp:434:61: error: no matching function for call to 'clang::FileManager::getStatValue(const char*&, _stat64i32&, int*)' 
llvm-3.1\llvm\tools\clang\lib\Basic\FileManager.cpp:544:6: error: prototype for 'bool clang::FileManager::getStatValue(const char*, _stat64i32&, int*)' does not match any in class 'clang::FileManager' 
llvm-3.1\llvm\tools\clang\lib\Basic\FileManager.cpp:559:6: error: prototype for 'bool clang::FileManager::getNoncachedStatValue(llvm::StringRef, _stat64i32&)' does not match any in class 'clang::FileManager' 
llvm-3.2\llvm\projects\compiler-rt\lib\enable_execute_stack.c:13:22: fatal error: sys/mman.h: No such file or directory 

與LLVM-3.2的最後一個錯誤確實是通用於所有MinGW的工具鏈與LLVM-3.3以下錯誤:

mingw32-make[2]: *** No rule to make target 'lib/Target/AArch64/AArch64GenSubtargetInfo.inc', needed by 'lib/Target/AArch64/Utils/CMakeFiles/LLVMAArch64Utils.dir/AArch64BaseInfo.cpp.obj'. Stop. 
+0

您能否給出在TDM-GCC 64下構建llvm所需的具體步驟?我早些時候嘗試過,並遇到了caml綁定的問題,這會阻止llvm運行http://stackoverflow.com/questions/22478383。謝謝 – tinlyx

+0

MSys2是我所知道的唯一可以編譯llvm-3的64位工具鏈。4. TDM-GCC-64會遇到以下錯誤:「c:/ tdm-gcc-64/bin /../ lib/gcc/x86_64-w64-mingw32/4.8.1 /../../。 ./../x86_64-w64-mingw32/bin/as.exe:CMakeFiles \ clangDynamicASTMatchers.dir \ Registry.cpp.obj:太多部分(39644)「。不幸的是,沒有更新可用於TDM-GCC的binutils。 – Adrian