はじめに
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」のダウンロードボタンが現れます。
Matlabの設定ファイル
管理者権限でMatlabを起動します(右クリックして「管理者として実行」)。
そして次のコマンドにより編集が必要なファイルが格納されたディレクトリに移動します。
cd([matlabroot,'\bin\win64\mexopts'])
複数のXMLファイルが入っていますが、この中の「MSVC~」がMicrosoft関連のコンパイラの設定ファイルです。Build Toolsのバージョンに合った「msvc~.xml」と「msvcpp~.xml」を編集していきます。
ここでは例としてBuild Tools 2022をインストールしたものとして下記の2つのファイルを編集します。
・msvc2022.xml
・msvcpp2022.xml
xmlファイルの編集内容
オリジナルのmsvc2022.xml、msvcpp2022.xml内では下記3つについて記載があります。
・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」の検索をしますと4か所ヒットします。
ですのでmsvc2022.xmlで4か所、msvcpp2022.xmlでも同様に4か所、計8か所変更する必要があります。
例えばmsvc2022.xmlの1つ目は次のように変更します。追加内容の4行目に「Microsoft.VisualStudio.Product.BuildTools」と書いています。
<VCROOT>
<or>
<and>
<envVarExists name="ProgramFiles(x86)" />
<fileExists name="$$\Microsoft Visual Studio\Installer\vswhere.exe" />
<cmdReturns name=""$$\\vswhere.exe" -version "[17.0,18.0)" -products Microsoft.VisualStudio.Product.Enterprise -property installationPath -format value" />
<cmdReturns name="set "vcroot=$$"&for /f "delims= " %a in ('type "$$\VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt"') do @if exist "$$\VC\Tools\MSVC\%a\bin\HostX64\x64\cl.exe" call echo %vcroot%" />
</and>
<and>
<envVarExists name="ProgramFiles(x86)" />
<fileExists name="$$\Microsoft Visual Studio\Installer\vswhere.exe" />
<cmdReturns name=""$$\\vswhere.exe" -version "[17.0,18.0)" -products Microsoft.VisualStudio.Product.Professional -property installationPath -format value" />
<cmdReturns name="set "vcroot=$$"&for /f "delims= " %a in ('type "$$\VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt"') do @if exist "$$\VC\Tools\MSVC\%a\bin\HostX64\x64\cl.exe" call echo %vcroot%" />
</and>
<and>
<envVarExists name="ProgramFiles(x86)" />
<fileExists name="$$\Microsoft Visual Studio\Installer\vswhere.exe" />
<cmdReturns name=""$$\\vswhere.exe" -version "[17.0,18.0)" -products Microsoft.VisualStudio.Product.Community -property installationPath -format value" />
<cmdReturns name="set "vcroot=$$"&for /f "delims= " %a in ('type "$$\VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt"') do @if exist "$$\VC\Tools\MSVC\%a\bin\HostX64\x64\cl.exe" call echo %vcroot%" />
</and>
<!-- 追加ここから -->
<and>
<envVarExists name="ProgramFiles(x86)" />
<fileExists name="$$\Microsoft Visual Studio\Installer\vswhere.exe" />
<cmdReturns name=""$$\\vswhere.exe" -version "[17.0,18.0)" -products Microsoft.VisualStudio.Product.BuildTools -property installationPath -format value" />
<cmdReturns name="set "vcroot=$$"&for /f "delims= " %a in ('type "$$\VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt"') do @if exist "$$\VC\Tools\MSVC\%a\bin\HostX64\x64\cl.exe" call echo %vcroot%" />
</and>
<!-- 追加ここまで -->
</or>
</VCROOT>
面倒な場合はmsvc2022.xmlとmsvcpp2022.xmlの「Microsoft.VisualStudio.Product.Enterprise」を「Microsoft.VisualStudio.Product.BuildTools」に一括置換することでも目的は達成できます。
このときEnterpriseを探さないことになりますが、Enterpriseを購入してインストールしない限り影響は出ません。
ライセンス
ライセンスに関しては下記に記載されています。
- インストールと使用権。
a. ライセンス。お客様は、Visual Studio Community、Visual Studio Professional、Visual Studio Enterprise と共に使用する場合に限り、本ソフトウェアの任意の数の複製をインストールして使用し、お客様のアプリケーションを開発およびテストすることができます。
「Visual Studio Community、Visual Studio Professional、Visual Studio Enterprise と共に使用する場合に限り」と明記がありますので、3つのうちいずれかを使用できる環境が必須のようです。注意が必要ですね。