gccrun.cmd その2

というわけで、バッチファイルでは、for /f を使って、ファイルの中身を読むのだ。

set win=0
if "%2"=="-c" set win=0
if "%2"=="-w" set win=1
if "%2"=="" for /f "tokens=2 delims=<>" %%a in (%1) do (
  if "%%a"=="windows.h" set win=1
)

C で書かれたソースコードの中に #include <windows.h> という行があれば、windows.h だけが %%a に入る。もし、そのコードが windows.h をインクルードしているのであれば、変数 win1 を代入する。

このバッチファイル gccrun.cmd の第 2 引数に -c も -w も指定されなかった場合は、そうした処理により、win の値が決まる。

:var
  REM コンパイルオプション
  set copt=
  if %win%==1 set copt=-mwindows

ラベル var を作成している。どこかで goto var をすれば、この行に処理が移る。変数 copt を作成し、変数 win1 ならば、-mwindows という文字列を代入する。-mwindows とは、gcc のコンパイルオプションの一つである。これを指定していれば、起動時にコンソール画面が開かないアプリケーションが出来上がる。

ソースコードの中に #include <windows.h> があれば、win1 になるということだったが、つまり、gcc-mwindows が付加されることを意味する。

windows.h をインクルードしているからといって、必ずしも、コンソール不使用アプリケーションでないとは限らない。なぜならば、main() 関数を使用しているなら、絶対にコンソールアプリケーションだからだ。しかも、それを使用しておらず、WinMain() 関数を使用していたとしても、printf() などの標準入出力関数を使っているならば、それは、コンソールアプリケーションだ。

ソースに含まれる文:main()WinMain()
コンソールアプリか?はいありえる
ウィンドウアプリか?いいえありえる

コンソール画面を使用しないアプリケーションであると断定するには、main() がなく、WinMain() があり、かつ、printf() などの標準入出力関数がないということを調べ上げなければならない。くわえて、標準入出力を使わないからといって、コンソール画面を開いてはならないという決まりはない。

ソースファイルの中身をバッチファイルに読ませて、アプリケーションの種類を自動判別することは不可能なのである。

妥協案として、windows.h のインクルードの有無で判別しているのだ。

つづk