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 を起動。
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 Wu 
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
Python3 のパス区切りがバックスラッシュではなくスラッシュなのは、過去に Python3 スクリプトの中でバックスラッシュがエスケープシーケンスとして解釈されてエラーが発生してしまったことがあったためです。また、今回は -DLLVM_ENABLE_ZLIB=Off で Zlib は使わない設定でビルドします。
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


kmckk at 12:40コメント(0)Clang | 若槻 

コメントする

名前
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード