始めに
ビルド専用環境でWDKを使ったプロジェクトのコンパイルに失敗していたので対応方法を書く。
状況としては https://qiita.com/SnowCait/items/aa9e38478c73d3717ba6 の記事で起こったエラーと多分同じ。
問題
Jenkinsやgithub actionsのエージェントが動くような環境では、Visual Studio本体のUI等は必要なく、msbuildやvc等、ビルドするためのツールだけあればいい。
そのような環境では、Build Tools for Visual Studioを使って余計なものを入れないようにすることになるが、
WDK(Windows Driver Kits)を使ったプロジェクトをコンパイルする際、以下のようなメッセージが出てビルドに失敗する。
error MSB8020: The build tools for WindowsApplicationForDrivers10.0 (Platform Toolset = 'WindowsApplicationForDrivers10.0') cannot be found.
WindowsApplicationForDrivers10.0
の部分はWindowsKernelModeDriver10.0
だったり、WindowsUserModeDriver10.0
だったりする場合もあるが、意味としては対応するプラットフォームツールセットが無いという意味である。
通常の解決方法と、その問題
この問題はmsbuild側がWDKで使用するPlatformToolsetの存在を知らないからだが、ProfessionalやCommunity等ではWDKのインストールの終わりにVS拡張のインストールを行うか、
[WDKインストールパス]\VS[VSバージョン]\[WDKバージョン]\WDK.vsix
を後からインストールすれば、使用することができる。([WDKバージョン]
を間に挟まない場合もある)
通常はこれで問題ないが、Build Toolsしかない環境では、VSIXのインストールに失敗する。
これはWDK.vsixがBuildToolsへのインストールを想定してない(VSIXの中の対応SKUに記述が無い)ことに起因する。
EWDKを使った対応
一応 EWDK(Enterprise WDK) を使うという手も無くはないというか、多分公式はこっち使えという感じだと思うが、丸々一つのWindows SDK+WDK+Visual Studioビルドツールを展開することになるので、イメージが膨らみ、かつビルドスクリプトも多少複雑になりがちなので、今回は別の方法を紹介する。
BuildToolsしかない場合の解決方法
以下の手順を行う。事前にWindows SDKとWDKのインストールは完了させておくこと。
- WDK.vsixを別のディレクトリに、"WDK.zip"としてコピーする
- zipを展開する
- 特に意識しないとzipと同じフォルダにファイルを展開されてしまうので注意すること
-
$MSBuild/Microsoft/VC/vc[VCのバージョン]/[CPUアーキテクチャ]
を、[VSインストールディレクトリ]/MSBuild/Microsoft/VC/vc[VCのバージョン]/[CPUアーキテクチャ]
にコピーする
これでビルドできるようになるはず。
終わりに
WDKの方でBuildToolsの存在も想定してくれればこの対応も不要になるが、今の所そうではないので書いた。
なお、この記事は https://stackoverflow.com/questions/69448098/vs-2019-compilation-error-using-windows-sdk-and-wdk-on-windows-containers を参考にしている。
VSやWDKのバージョン等細部は異なるが、他のバージョンにも応用は効くと思う。