Visual Studioのコマンドラインについて色々調べてみた
ECLがVisual Studioのコンパイラを使うので、Visual Studioのコマンドプロンプトから起動しないといけなくて面倒なのでVisual Studioが何してるか把握できれば、一々専用のコマンドプロンプトから起動しなくて済むようにできるかと思ったので調査してみました。
なお。対象はVisual Studio 2008。2010でも大差ないと思います。
「Visual Studio 2008 コマンド プロンプト」って何
clとかlinkとかのプログラムを実行するときに使うVisual Studio コマンド プロンプト
ショートカットから調査開始
これは、「%comspec% /k ""C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"" x86」へのリンク。
C:\Documents and Settings\f9078010>echo %comspec% C:\WINDOWS\system32\cmd.exe
どうやら、cmdの場所を返す便利な環境変数があるらしい。
vcvarsall.batの中身
C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.batの中身(一部抜粋)
:x86 if not exist "%~dp0bin\vcvars32.bat" goto missing call "%~dp0bin\vcvars32.bat" goto :eof
こんな感じでvcvars32.batが呼ばれるぽい。
%~dp0ってなんだろう
http://tenukipg.seesaa.net/article/10084212.htmlより。
実行ファイルと同一のホルダに設定ファイルなどを置くことって多いですよね。作業ホルダにしたいこともあります。そうすると、起動したバッチファイルが置かれているホルダが取得したい訳ですよね。
%0 には、起動されたバッチファイルのフルパスが格納されていますから、これのドライブ名と、ファイル名を除くパスの部分を取り出せばいいですよね。
ズバリ、このように展開するように指定しているのです。~ (チルダ) を付けて ~d でドライブ名に展開せよっていうこと。~p でファイル名を除くパスの部分に展開せよっていうこと。合わせて ~dp でドライブ名とファイル名を除くパスの部分に展開せよってことなんだ。0 の意味は解かるよね。
簡単に取り出せる記述だから、%~dp0 はよく使うし、ひょっとしたら細かい説明をしているものが少ないのかなぁ〜
なるほどー。
なので、この場合はC:\Program Files\Microsoft Visual Studio 9.0\VC\bin\vcvars32.batが呼ばれるみたい。
vcvars32.batの中身
短い。
"%VS90COMNTOOLS%vsvars32.bat"
が実行される
%VS90COMNTOOLS%は
C:\Documents and Settings\f9078010>echo %VS90COMNTOOLS% C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\
vsvars32.batの中身
C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.batでは
@SET VSINSTALLDIR=C:\Program Files\Microsoft Visual Studio 9.0 @SET VCINSTALLDIR=C:\Program Files\Microsoft Visual Studio 9.0\VC @SET FrameworkDir=C:\WINDOWS\Microsoft.NET\Framework @SET FrameworkVersion=v2.0.50727 @SET Framework35Version=v3.5 @if "%VSINSTALLDIR%"=="" goto error_no_VSINSTALLDIR @if "%VCINSTALLDIR%"=="" goto error_no_VCINSTALLDIR @echo Setting environment for using Microsoft Visual Studio 2008 x86 tools. @call :GetWindowsSdkDir @if not "%WindowsSdkDir%" == "" ( set "PATH=%WindowsSdkDir%bin;%PATH%" set "INCLUDE=%WindowsSdkDir%include;%INCLUDE%" set "LIB=%WindowsSdkDir%lib;%LIB%" ) @rem @rem Root of Visual Studio IDE installed files. @rem @set DevEnvDir=C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE @set PATH=C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE;C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN;C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools;C:\WINDOWS\Microsoft.NET\Framework\v3.5;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727;C:\Program Files\Microsoft Visual Studio 9.0\VC\VCPackages;%PATH% @set INCLUDE=C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE;%INCLUDE% @set LIB=C:\Program Files\Microsoft Visual Studio 9.0\VC\LIB;%LIB% @set LIBPATH=C:\WINDOWS\Microsoft.NET\Framework\v3.5;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727;C:\Program Files\Microsoft Visual Studio 9.0\VC\LIB;%LIBPATH% @goto end :GetWindowsSdkDir @call :GetWindowsSdkDirHelper HKLM > nul 2>&1 @if errorlevel 1 call :GetWindowsSdkDirHelper HKCU > nul 2>&1 @if errorlevel 1 set WindowsSdkDir=%VCINSTALLDIR%\PlatformSDK\ @exit /B 0 :GetWindowsSdkDirHelper @for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Microsoft\Microsoft SDKs\Windows" /v "CurrentInstallFolder"') DO ( if "%%i"=="CurrentInstallFolder" ( SET "WindowsSdkDir=%%k" ) ) @if "%WindowsSdkDir%"=="" exit /B 1 @exit /B 0 :error_no_VSINSTALLDIR @echo ERROR: VSINSTALLDIR variable is not set.  @goto end :error_no_VCINSTALLDIR @echo ERROR: VCINSTALLDIR variable is not set.  @goto end :end
おー。
やっとコンパイラとかの設定が行なわれてるっぽいですね。
これをシェルスクリプトにすればECLの起動を楽にできるかも?