見切り発車

とりあえずかきとめたい

Visual Studio 標準のClang/LLVM のカスタマイズ方法を試す

概要

Microsoft 公式の「Visual Studio プロジェクトでの Clang/LLVM のサポート」によるclang-cl.exe の差し替えができるか試しました。

リンク先の内容が難なく理解できるのであれば問題ありませんがところどころ明確でない点があったので書きとめます。

試したこと

Visual Studio 2019 バージョン 116.9 以降ではLLVM のカスタムツールセットのバージョンを設定できるそうです。

Visual Studio 2019 や2022 ではインストール時に個別のコンポーネントとして「v143 ビルドツール用C++ Clang-cl」や「WindowsC++ Clang コンパイラ」などを選択しているとVisual Studio の一部としてLLVM/clang がインストールされます。

しかし、LLVMGithub で提供されているものを利用したい場合にはvcxproj やsln と同じ階層にDirectory.build.props というファイルを作成して置いておくという方法で対応が可能というものです。

例として挙げられているDirectory.build.props の内容は以下のようになっています。

<Project>
  <PropertyGroup>
    <LLVMInstallDir>C:\MyLLVMRootDir</LLVMInstallDir>
    <LLVMToolsVersion>15.0.0</LLVMToolsVersion>
  </PropertyGroup>
</Project>

今回、自分の環境にhttps://github.com/llvm/llvm-project/releases/download/llvmorg-16.0.0 から取得したLLVM-16.0.0-win64.exe でLLVM をインストールしてみたのでそちらの利用を試してみます。

やってみる

まずLLVMInstallDir ですが、LLVM-16.0.0-win64.exe でのデフォルトのインストール先は「C:\Program Files\LLVM」となっていたのでこれを指定します。

LLVMToolsVersion にはカスタム LLVM ツールセットバージョンを指定するのですがインストール先のC:\Program Files\LLVM 直下にはバージョンごとのディレクトリは見当たりません。ひとまずインストールしたバージョンの16.0.0 を指定してみます。

<Project>
  <PropertyGroup>
    <LLVMInstallDir>C:\Program Files\LLVM</LLVMInstallDir>
    <LLVMToolsVersion>16.0.0</LLVMToolsVersion>
  </PropertyGroup>
</Project>

ビルドを実行してみると以下のようにエラーとなりました。

  C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.Cpp.ClangCl.Common.targets(74,5): error MSB8073: LLVM ツールセット バージョン '16.0.0' が見つかりません: フォルダー ''C:\Program Files\LLVM\lib\clang\16.0.0'' が存在しません。LLVM ツールセット バージョン '16.0.0' がインストールされていることを確認するか、別のツールセット バージ ョンを選択してください。

C:\Program Files\LLVM\lib\clang を見てみると「16」というディレクトリが存在しています。そこでDirectory.build.props のLLVMToolsVersion の値を「16」に変更してみたところビルドができました。

Directory.build.props でCLToolExe の差し替えを試す

前回 はvcxproj を編集してclang-cl.exe の代わりに自作のプログラムが呼び出されるようにしましたが、Directory.build.props で変更できるかどうか試してみました。

<Project>
  <PropertyGroup>
    <LLVMInstallDir>C:\Program Files\LLVM</LLVMInstallDir>
    <LLVMToolsVersion>16.0.0</LLVMToolsVersion>
    <CLToolExe>clang-hook.exe</CLToolExe>
    <ExecutablePath>$(SolutionDir)hook\$(Configuration);$(ExecutablePath)</ExecutablePath>
  </PropertyGroup>
</Project>

しかし、clang-hook.exe は呼び出されませんでした。Directory.build.props でCLToolExe を指定しても反映されないようです。