Visual Studioのインストールを避けつつMatlabのmexのコンパイラにcl.exeを使いたい

# はじめに
Matlabのmexを利用するためのC言語コンパイラとして無料のMinGWが使われることが多いですが、Visual Studioのコンパイラを使いたいケースがあるかと思います。
そんなとき無料のVisual Studio Communityなどをインストールすれば事足りるのですが、Visual Studioをインストールするとドライブの容量を多く占有してしまうので、私のようにVisual Studioを使わない人間はやや尻込みしてしまいます。

そこで今回はVisual Studioをインストールせずにコンパイラだけを使用可能にする「Build Tools for Visual Studio」を使います。
ただし、Build Tools for Visual StudioをインストールしていてもMatlabのmexはコンパイラを見つけてくれないのでいくつか設定ファイルを変更する必要があります。
その方法をこちらにメモしておきます。

私の環境はWindowsです。Matlabは2022aですが他のバージョンでも大丈夫だと思います。

# Build Tools for Visual Studioのインストール
少し見つけづらいですが、下記ページの「Visual Studio 2022用のツール」のタブを開くと一番下に「Build Tools for Visual Studio 2022」のダウンロードボタンが現れます。

https://visualstudio.microsoft.com/ja/downloads/#build-tools-for-visual-studio-2022

# Matlabの設定ファイル
管理者権限でMatlabを起動します（右クリックして「管理者として実行」）。
そして次のコマンドにより編集が必要なファイルが格納されたディレクトリに移動します。
``` matlab
cd([matlabroot,'\bin\win64\mexopts'])
```

複数のXMLファイルが入っていますが、この中の「MSVC～」がMicrosoft関連のコンパイラの設定ファイルです。Build Toolsのバージョンに合った「msvc~.xml」と「msvcpp~.xml」を編集していきます。

ここでは例としてBuild Tools 2022をインストールしたものとして下記の２つのファイルを編集します。
・msvc2022.xml
・msvcpp2022.xml

# xmlファイルの編集内容

オリジナルのmsvc2022.xml、msvcpp2022.xml内では下記３つについて記載があります。
・Microsoft.VisualStudio.Product.Enterprise
・Microsoft.VisualStudio.Product.Professional
・Microsoft.VisualStudio.Product.Community

Visual StudioのEnterprise、Professional、Communityのインストール有無を探すという設定です。
ここにBuild Toolsが含まれていないことにより、mexではBuild Toolsを探すことをしません。

そこでBuild Toolsも探せるように、
・Microsoft.VisualStudio.Product.BuildTools
を追加していきます。

例えばmsvc2022.xml内で「Microsoft.VisualStudio.Product.Enterprise」の検索をしますと４か所ヒットします。
ですのでmsvc2022.xmlで４か所、msvcpp2022.xmlでも同様に４か所、計８か所変更する必要があります。
例えばmsvc2022.xmlの１つ目は次のように変更します。追加内容の４行目に「Microsoft.VisualStudio.Product.BuildTools」と書いています。

``` xml
<VCROOT>
    <or>
		<and>
			<envVarExists name="ProgramFiles(x86)" />
			<fileExists name="$$\Microsoft Visual Studio\Installer\vswhere.exe" />
			<cmdReturns name="&quot;$$\\vswhere.exe&quot; -version &quot;[17.0,18.0)&quot; -products Microsoft.VisualStudio.Product.Enterprise -property installationPath -format value" />
			<cmdReturns name="set &quot;vcroot=$$&quot;&amp;for /f &quot;delims= &quot; %a in ('type &quot;$$\VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt&quot;') do @if exist &quot;$$\VC\Tools\MSVC\%a\bin\HostX64\x64\cl.exe&quot; call echo %vcroot%" />
		</and>
		<and>
			<envVarExists name="ProgramFiles(x86)" />
			<fileExists name="$$\Microsoft Visual Studio\Installer\vswhere.exe" />
			<cmdReturns name="&quot;$$\\vswhere.exe&quot; -version &quot;[17.0,18.0)&quot; -products Microsoft.VisualStudio.Product.Professional -property installationPath -format value" />
			<cmdReturns name="set &quot;vcroot=$$&quot;&amp;for /f &quot;delims= &quot; %a in ('type &quot;$$\VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt&quot;') do @if exist &quot;$$\VC\Tools\MSVC\%a\bin\HostX64\x64\cl.exe&quot; call echo %vcroot%" />
		</and>
		<and>
			<envVarExists name="ProgramFiles(x86)" />
			<fileExists name="$$\Microsoft Visual Studio\Installer\vswhere.exe" />
			<cmdReturns name="&quot;$$\\vswhere.exe&quot; -version &quot;[17.0,18.0)&quot; -products Microsoft.VisualStudio.Product.Community -property installationPath -format value" />
			<cmdReturns name="set &quot;vcroot=$$&quot;&amp;for /f &quot;delims= &quot; %a in ('type &quot;$$\VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt&quot;') do @if exist &quot;$$\VC\Tools\MSVC\%a\bin\HostX64\x64\cl.exe&quot; call echo %vcroot%" />
		</and>
<!-- 追加ここから -->
		<and>
			<envVarExists name="ProgramFiles(x86)" />
			<fileExists name="$$\Microsoft Visual Studio\Installer\vswhere.exe" />
			<cmdReturns name="&quot;$$\\vswhere.exe&quot; -version &quot;[17.0,18.0)&quot; -products Microsoft.VisualStudio.Product.BuildTools -property installationPath -format value" />
			<cmdReturns name="set &quot;vcroot=$$&quot;&amp;for /f &quot;delims= &quot; %a in ('type &quot;$$\VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt&quot;') do @if exist &quot;$$\VC\Tools\MSVC\%a\bin\HostX64\x64\cl.exe&quot; call echo %vcroot%" />
		</and>
<!-- 追加ここまで -->
	</or>
</VCROOT>
```


面倒な場合はmsvc2022.xmlとmsvcpp2022.xmlの「Microsoft.VisualStudio.Product.Enterprise」を「Microsoft.VisualStudio.Product.BuildTools」に一括置換することでも目的は達成できます。
このときEnterpriseを探さないことになりますが、Enterpriseを購入してインストールしない限り影響は出ません。


# ライセンス

ライセンスに関しては下記に記載されています。

https://visualstudio.microsoft.com/ja/license-terms/vs2022-ga-diagnosticbuildtools/


> 1. インストールと使用権。
a. ライセンス。お客様は、Visual Studio Community、Visual Studio Professional、Visual Studio Enterprise と共に使用する場合に限り、本ソフトウェアの任意の数の複製をインストールして使用し、お客様のアプリケーションを開発およびテストすることができます。

「Visual Studio Community、Visual Studio Professional、Visual Studio Enterprise と共に使用する場合に限り」と明記がありますので、３つのうちいずれかを使用できる環境が必須のようです。注意が必要ですね。