LLVM ClangをMSVC + Ninjaでビルドする
LLVM ClangをMSVC + Ninjaでビルドする方法を紹介します。
環境
LLVM Clang 11.0.1
Visual Studio 2019 16.9.2
CMake 3.1.8.4
Ninja 1.10.2
https://github.com/llvm/llvm-project
Ninja
Ninjaは依存解決の速度早くプログラムのビルド時間を短くする事が出来るビルドシステムです。CMakeからNinja用のビルド設定ファイルを出力出来るので、LLVM ClangもNinjaでビルドする事が出来ます。
Ninjaの最新版はGitHubのTagからReleaseを選択する事で取得出来ます。
https://github.com/ninja-build/ninja
ビルドする
LLVMとClangをそれぞれ解凍したら、clang は、llvm/tools/clangへと配置します。
次に、下記のいずれかの方法でVisual Studioで配布されているVC ToolsetへとPATHを通します。
- スタートメニューから"x64 Native Tools Command Prompt for VS 2019″を選択してコマンドプロンプトを起動する
- コマンドラインから"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"を実行する
vcvars64.batの場所はVisual StudioがCommunity、Professional、Enterpriseかによって変わってくるので、vswhereの使用を推奨します。
for /f "usebackq delims=" %%a in (`"%ProgramFiles(x86)%/Microsoft Visual Studio/Installer/vswhere" -version 16 -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath`) do set VSPATH=%%a
"%VSPATH%/VC/Auxiliary/Build/vcvars64.bat"
cmakeを実行する時には out-of-source buildが推奨されているので、ビルド用のディレクトリを作成します。
-DCMAKE_MAKE_PROGRAMはNinja.exeへのPathを指定します。
GitHubからCloneした場合と、圧縮されているソースコードをダウンロードした場合とで少し手順が違います。
GitHubからClone
git clone https://github.com/llvm/llvm-project.git
mkdir build
cmake -S llvm -B build -G "Ninja" -DLLVM_ENABLE_PROJECTS="clang" -DCMAKE_MAKE_PROGRAM=ninja.exe -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_CXX_FLAGS_RELEASE:STRING="/MT" -DCMAKE_CXX_FLAGS_DEBUG:STRING="/MTd"
cd build
ninja build-Release.ninja
CMakeを実行してNinjaの設定ファイルを出力する
mkdir build
cd build
cmake -G Ninja -DCMAKE_MAKE_PROGRAM=ninja.exe -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_CXX_FLAGS_RELEASE:STRING="/MT" -DCMAKE_CXX_FLAGS_DEBUG:STRING="/MTd" -DCMAKE_INSTALL_PREFIX:PATH="../install/release" ../
ninja
ビルドターゲットを指定してビルド
プロジェクトを個別にビルドする時はプロジェクト名を指定します。
Ninja clangAST
同時に複数のビルドターゲットを指定できます。
Ninja clangAST clangTooling
Ninja Multi-Config
NinjaはMulti-Configに対応しているので、複数のConfigureをcmakeで出力できます。
-G オプションの設定を変えるで、それ以外は同じです。
cmake -G "Ninja Multi-Config"
ビルドする時には、Configure毎のファイルを指定します。
# Build with Debug configuration
ninja build-Debug.ninja
# Build with Release configuration
ninja build-Release.ninja
バイナリの出力先もDebug/lib、Release/libのように分けられるので便利です。
MSBuildでビルドする方法はこちらの記事で紹介しています。