2021年02月05日
Visual Studio 2017でClang 13(git HEAD)のビルドとテストをする
職場の開発 PC が AMD Ryzen 9 5950X(16 コア 32 スレッド)RAM 32GB になったのですが、これまで 1 時間以上かかっていたビルドが数分で終わるようになったので劇的に効率が上がりました。Release ビルドならば 16 並列で CPU ほぼ 100% 使い切りメモリも足りているようです。Debug ビルドは 8 並列ぐらいまで落としてもメモリ不足で失敗しますが、何回か繰り返すと最後まで終わるので、デバッグ時なら許容範囲かなという感じです。LLVM の開発をするならば、できれば RAM は 64GB 欲しい所ですね。
新規にビルド環境を作ったので、その時のメモです。
新規にビルド環境を作ったので、その時のメモです。
Clang をビルドする時は、以下の公式ドキュメントの Using Visual Studio を参照し、Visual Studio のバージョンを確認します。どんどんバージョンが上がっていて、現在は Visual Studio 2017 が必須です。
https://clang.llvm.org/get_started.html
〇 必要ソフトウェアのインストール
- Git
https://github.com/git-for-windows/git/releases/download/v2.30.0.windows.2/Git-2.30.0.2-64-bit.exe
- CMake
https://github.com/Kitware/CMake/releases/download/v3.19.4/cmake-3.19.4-win64-x64.msi
- Python
https://www.python.org/ftp/python/2.7.18/python-2.7.18.amd64.msi
https://www.python.org/ftp/python/3.9.1/python-3.9.1-amd64.exe
ちなみにデフォルトだと Python 3 は %LOCALAPPDATA%\Programs\Python\Python39\python.exe という変な所にインストールされてしまい、CMake から見つからないようで苦労しました。CMake の引数で指定しているパスは、適宜読み替えてください。
- Visual Studio 2017
- GnuWin32
以前 https://sourceforge.net/projects/getgnuwin32/ のインストーラとバッチファイルでインストールしようとした所、どうもメンテナンスが終了しているらしくリンク切れで DL が失敗してしまったので、今回は以下のサイトを参考に NuGet でインストールしてみました。
https://www.kkaneko.jp/tools/cygwin/gnuwin.html
管理者権限で PowerShell を起動。
〇 Clang のビルド
コマンドプロンプトを起動して、適当な所でソースを取得します。
USE_CRT_XXX は VS のライブラリを static リンクするための設定です。
今回は X86 をビルドしないので、DEFAULT_TARGET_TRIPLE を指定しないと、デフォルトが有効になっていない i686-pc-windows-msvc になってしまいテストで大量のエラーが出てしまうことにも注意です。
CMake で生成された LLVM.sln を VS2017 で開いて Release を選択します。(どうも今でも CMAKE_BUILD_TYPE は効かないようです。)
CMakePredefinedTargets > ALL_BUILD をビルド。できたバイナリが実行できることを確認します。(以前ここで zlib1.dll が無いとエラーが出てしまったので、前述の設定で Zlib は無効にしてあります。)x64 バイナリをビルドする時は -A x64 -Thost=x64 を追加してください。
Clang tests > check-clang をビルドします。
https://clang.llvm.org/get_started.html
〇 必要ソフトウェアのインストール
- Git
https://github.com/git-for-windows/git/releases/download/v2.30.0.windows.2/Git-2.30.0.2-64-bit.exe
- CMake
https://github.com/Kitware/CMake/releases/download/v3.19.4/cmake-3.19.4-win64-x64.msi
- Python
https://www.python.org/ftp/python/2.7.18/python-2.7.18.amd64.msi
https://www.python.org/ftp/python/3.9.1/python-3.9.1-amd64.exe
ちなみにデフォルトだと Python 3 は %LOCALAPPDATA%\Programs\Python\Python39\python.exe という変な所にインストールされてしまい、CMake から見つからないようで苦労しました。CMake の引数で指定しているパスは、適宜読み替えてください。
- Visual Studio 2017
- GnuWin32
以前 https://sourceforge.net/projects/getgnuwin32/ のインストーラとバッチファイルでインストールしようとした所、どうもメンテナンスが終了しているらしくリンク切れで DL が失敗してしまったので、今回は以下のサイトを参考に NuGet でインストールしてみました。
https://www.kkaneko.jp/tools/cygwin/gnuwin.html
管理者権限で PowerShell を起動。
PS C:\Windows\system32> Get-ExecutionPolicy Restricted PS C:\Windows\system32> Set-ExecutionPolicy AllSigned 実行ポリシーの変更 実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170) で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか? [Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): Y次で Set-ExecutionPolicy やってるから不要かもしれません。この権限の変更は一時的なもの(PowerShell を終了するまで)のようです。
PS C:\Windows\system32> Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))途中でこんな警告が出るので、やはりもう GnuWin32 自体がメンテナンスされていない感じです。しかし今回は Clang が要求するので仕方ありません。
GetGnuWin32 update successful. Now checking to ensure all updated files are valid and fixing any that are not. (For example any 'Permission denied' files during the update will be retried.) WARNING: GnuWin32 has not been updated in several years. I have left this script and our GetGnuWin32 downloader functional for legacy purposes. If you need the latest packages consider using MSYS2 MINGW or Cygwin instead.無事に終わると、PATH に C:\GnuWin\bin が追加されています。なので PATH が反映されているコマンドプロンプトならば CMake に -DLLVM_LIT_TOOLS_DIR="c:\gnuwin\bin" は不要ですが、一応付けています。
〇 Clang のビルド
コマンドプロンプトを起動して、適当な所でソースを取得します。
>git clone https://github.com/llvm/llvm-project.git >cd llvm-project >git log -1 commit 96fb49c3ff8e08680127ddd4ec45a0e6c199243b (HEAD -> main, origin/main, origin/HEAD) Author: Zequan WuPython3 のパス区切りがバックスラッシュではなくスラッシュなのは、過去に Python3 スクリプトの中でバックスラッシュがエスケープシーケンスとして解釈されてエラーが発生してしまったことがあったためです。また、今回は -DLLVM_ENABLE_ZLIB=Off で Zlib は使わない設定でビルドします。Date: Thu Feb 4 17:00:09 2021 -0800 [AST] Update LVal before evaluating lambda decl fields. Differential Revision: https://reviews.llvm.org/D96092 >mkdir build_riscv install_riscv >cd build_riscv > cmake -DLLVM_ENABLE_PROJECTS=clang -G "Visual Studio 15 2017" ..\llvm -DLLVM_ENABLE_ASSERTIONS=On -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=..\install_riscv -DLLVM_TARGETS_TO_BUILD="RISCV" -DLLVM_DEFAULT_TARGET_TRIPLE=riscv64-unknown-elf -DLLVM_USE_CRT_DEBUG=MTd -DLLVM_USE_CRT_MINSIZEREL=MT -DLLVM_USE_CRT_RELEASE=MT -DLLVM_USE_CRT_RELWITHDEBINFO=MT -DLLVM_LIT_TOOLS_DIR="c:\gnuwin\bin" -DPython3_EXECUTABLE=c:/Users/kmc/AppData/Local/Programs/Python/Python39/python.exe -DLLVM_ENABLE_ZLIB=Off
USE_CRT_XXX は VS のライブラリを static リンクするための設定です。
今回は X86 をビルドしないので、DEFAULT_TARGET_TRIPLE を指定しないと、デフォルトが有効になっていない i686-pc-windows-msvc になってしまいテストで大量のエラーが出てしまうことにも注意です。
CMake で生成された LLVM.sln を VS2017 で開いて Release を選択します。(どうも今でも CMAKE_BUILD_TYPE は効かないようです。)
CMakePredefinedTargets > ALL_BUILD をビルド。できたバイナリが実行できることを確認します。(以前ここで zlib1.dll が無いとエラーが出てしまったので、前述の設定で Zlib は無効にしてあります。)x64 バイナリをビルドする時は -A x64 -Thost=x64 を追加してください。
>Release\bin\clang.exe -v clang version 13.0.0 (https://github.com/llvm/llvm-project.git 96fb49c3ff8e08680127ddd4ec45a0e6c199243b) Target: riscv64-unknown-unknown-elf Thread model: posix InstalledDir: D:\work\clang\llvm-project\build_riscv\Release\bin念のため VS 2017 のコマンドプロンプトを開いて、dumpbin コマンドでシステム dll 以外に依存 dll が無いことを確認します。
>dumpbin /dependents Release\bin\clang.exe Microsoft (R) COFF/PE Dumper Version 14.16.27045.0 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file Release\bin\clang.exe File Type: EXECUTABLE IMAGE Image has the following dependencies: VERSION.dll ADVAPI32.dll KERNEL32.dll OLEAUT32.dll Image has the following delay load dependencies: SHELL32.dll ole32.dll Summary 63000 .data 96F000 .rdata 20F000 .reloc 1000 .rsrc 28AD000 .text〇 Clang のテスト
Clang tests > check-clang をビルドします。
101>Failed Tests (33): 101> Clang :: ClangScanDeps/vfsoverlay.cpp 101> Clang :: Driver/as-options.s 101> Clang :: Driver/clang-s-opts.s 101> Clang :: Driver/lto.c 101> Clang-Unit :: Tooling/Release/ToolingTests.exe/ASTSelectionFinder.AvoidImplicitDeclarations 101> Clang-Unit :: Tooling/Release/ToolingTests.exe/ASTSelectionFinder.CanonicalizeFuncCalleeToCall 101> Clang-Unit :: Tooling/Release/ToolingTests.exe/ASTSelectionFinder.CanonicalizeMemberCalleeToCall 101> Clang-Unit :: Tooling/Release/ToolingTests.exe/ASTSelectionFinder.CanonicalizeObjCStringLiteral 101> Clang-Unit :: Tooling/Release/ToolingTests.exe/ASTSelectionFinder.CorrectEndForObjectiveCImplementation 101> Clang-Unit :: Tooling/Release/ToolingTests.exe/ASTSelectionFinder.CursorAtStartOfFunction 101> Clang-Unit :: Tooling/Release/ToolingTests.exe/ASTSelectionFinder.EmptyRangeFallbackToCursor 101> Clang-Unit :: Tooling/Release/ToolingTests.exe/ASTSelectionFinder.FunctionInObjCImplementationCarefulWithEarlyExit 101> Clang-Unit :: Tooling/Release/ToolingTests.exe/ASTSelectionFinder.MultipleFunctionSelection 101> Clang-Unit :: Tooling/Release/ToolingTests.exe/ASTSelectionFinder.MultipleStatementSelection 101> Clang-Unit :: Tooling/Release/ToolingTests.exe/ASTSelectionFinder.OutOfBodyCodeRange 101> Clang-Unit :: Tooling/Release/ToolingTests.exe/ASTSelectionFinder.SelectEntireDeclStmtRange 101> Clang-Unit :: Tooling/Release/ToolingTests.exe/ASTSelectionFinder.SelectEntireDeclStmtRangeWithMultipleDecls 101> Clang-Unit :: Tooling/Release/ToolingTests.exe/ASTSelectionFinder.SelectObjectiveCPseudoObjectExprs 101> Clang-Unit :: Tooling/Release/ToolingTests.exe/ASTSelectionFinder.SelectVarDeclStmt 101> Clang-Unit :: Tooling/Release/ToolingTests.exe/ASTSelectionFinder.SelectionInFunctionInObjCImplementation 101> Clang-Unit :: Tooling/Release/ToolingTests.exe/ASTSelectionFinder.SimpleCodeRangeASTSelection 101> Clang-Unit :: Tooling/Release/ToolingTests.exe/ASTSelectionFinder.SimpleCodeRangeASTSelectionInObjCMethod 101> Clang-Unit :: Tooling/Release/ToolingTests.exe/ASTSelectionFinder.WholeFunctionSelection 101> Clang-Unit :: Tooling/Release/ToolingTests.exe/TransformerTest.IfBound2Args 101> Clang-Unit :: Tooling/Release/ToolingTests.exe/TransformerTest.NoEdits 101> Clang-Unit :: Tooling/Syntax/Release/SyntaxTests.exe/SyntaxTreeTests/BuildSyntaxTreeTest.CharacterLiteral_Utf/10 101> Clang-Unit :: Tooling/Syntax/Release/SyntaxTests.exe/SyntaxTreeTests/BuildSyntaxTreeTest.CharacterLiteral_Utf/11 101> Clang-Unit :: Tooling/Syntax/Release/SyntaxTests.exe/SyntaxTreeTests/BuildSyntaxTreeTest.CharacterLiteral_Utf/12 101> Clang-Unit :: Tooling/Syntax/Release/SyntaxTests.exe/SyntaxTreeTests/BuildSyntaxTreeTest.CharacterLiteral_Utf/13 101> Clang-Unit :: Tooling/Syntax/Release/SyntaxTests.exe/SyntaxTreeTests/BuildSyntaxTreeTest.CharacterLiteral_Utf/6 101> Clang-Unit :: Tooling/Syntax/Release/SyntaxTests.exe/SyntaxTreeTests/BuildSyntaxTreeTest.CharacterLiteral_Utf/7 101> Clang-Unit :: Tooling/Syntax/Release/SyntaxTests.exe/SyntaxTreeTests/BuildSyntaxTreeTest.CharacterLiteral_Utf/8 101> Clang-Unit :: Tooling/Syntax/Release/SyntaxTests.exe/SyntaxTreeTests/BuildSyntaxTreeTest.CharacterLiteral_Utf/9 101> 101> 101>Testing Time: 163.49s 101> Unsupported : 1035 101> Passed : 26054 101> Expectedly Failed: 24 101> Failed : 33