0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-05-22

はじめに

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="&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を購入してインストールしない限り影響は出ません。

ライセンス

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

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?