コマンドプロンプトで一時的にMicrosoft謹製のコンパイラを使う

これは半分備忘録。

ふと「.NETの勉強をしよう」と思い立って、勉強用の環境を整えることにした。言語はC#C++/CLIJScript .NET。盛り沢山だけど、一気に全部使う訳ではない。触ってみて気に入った言語を継続して勉強しよう、という魂胆だ。

環境を整えるといってもVisual Studio 2005 Professionalはインストールされている。ただマシンパワーが潤沢ではないので、ちょっとした勉強ごときで一々IDEを起動させるのは面倒だ。なのでコマンドプロンプトからコンパイラを直接叩けるようにしたい。

Visual Studio 2005には「Visual Studio 2005 コマンド プロンプト」、.NET Framework SDK v2.0には「SDK コマンド プロンプト」というショートカットが用意されているので、これらを使えば各種環境変数が設定された状態でコマンドプロンプトが起動する。しかしこの方法は、ファイラーから現在表示しているディレクトリをカレントとしてckwを起動してコンソールツールを使う私のスタイルとは相容れない。

では必要な環境変数を自分で登録してしまう方法ではどうかというと、それを調べるのは手間だし、他の既存のツールと衝突するリスクを負いたくない。

なので姑息な手段をとることにした。

Visual Studio 2005 コマンド プロンプト」のリンク先を調べると、

%comspec% /k ""C:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat"" x86

と書かれていた。vcvarsall.batの中を掘り下げていくと、各種環境変数を設定していることが分かった。

ということは、コンパイラを叩く直前にvcvarsall.batを実行して環境変数を設定してしまえば良い筈だ。

SDK コマンド プロンプト」の場合は、

C:\WINDOWS\system32\cmd.exe /k ""C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sdkvars.bat""

となっていて、大体似たようなことをやっているので、同じような仕組みで何とかなるだろう。

取り合えず簡単な勉強用に使うので、ソースファイルも1プログラム1ファイル程度になるはずだ。その前提で、簡単なバッチファイルを書いてみた。

例えばC#の場合。このバッチファイルは「csc.bat foo.cs」と実行してfoo.exeを生成する、という流れを想定して書いてある。

@echo off
:: csc.bat
setlocal

call "C:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat" x86

csc.exe /w:4 /checked+ %*

endlocal

vcvarsall.batをcall付きで実行しないとうまくいかないので注意。

JScriptの場合も、コンパイラ名とオプションが違うだけでOK。

@echo off
:: jsc.bat
setlocal

call "C:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat" x86

jsc.exe /w:4 %*

endlocal

C++/CLIも同じく。

@echo off
:: clr.bat
setlocal

call "C:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat" x86

cl.exe /CLR /GS /W4 %*

endlocal

C#JScriptの場合はsdkvars.batを叩く方法でも大丈夫なはず。C++/CLIの場合も同様だが、それ以前にコンパイラが入っているか否か注意すること。.NET Framework SDKだけではcl.exeは入っていないはずだ。

Visual Studioのバージョンが異なると叩くバッチファイルの場所も変わるし、場合によっては叩くバッチファイルも違ってくるようだが、アプローチの方法は同じはずだ。とりあえずメニューに登録されたショートカットのプロパティでリンク先を見れば何とかなるだろう。