gccrun.cmd その3
前回に引き続き、gccrun.cmd のソースコードについて、コメントを書き残していく。
:var REM コンパイルオプション set copt= if %win%==1 set copt=-mwindows set src=%~dp1%~nx1 set srb=%~dp1%~n1
set src=%~dp1%~nx1
では、変数 src に %~dp1%~nx1
を代入している。%~dp1 とは、第一引数 %1 に d と p を適用したものである。 d は drive であり、ドライブ名を表している。 p は path であり、ディレクトリ名を表す。 "%1" が、たとえば、"hello.c" という実在するファイル名で、それが "C:\src\hello.c" というパスだった場合は、"%~dp1" は "C:\src\" という文字列を表す。
%~nx1
の n は name, x は extension だ。それぞれ、ファイル名と、ファイルの拡張子を表す。
すなわち、%~dp1%~nx1
は、ファイルのフルパスを表している。これによって、第一引数に相対パスが指定されていても、常にフルパスを変数 src に代入する。
今、この文章を書いていて気付いたのだが、%~dpnx1 とすれば、同じことがよりコンパクトにできる。
set srb=%~dp1%~n1
では、変数 srb を作成し、フルパスから拡張子を除いた文字列を代入している。
:main REM コンパイル前処理 if exist %srb%.exe del %srb%.exe
次に、:main
ラベル以下にある処理について言及していく。
まず、%srb%.exe
が存在するなら、それを削除するという処理をしている。%srb%
とは、先述の変数 srb を表している。srb は %~dp1%~n1
なので、"%1" が "C:\src\hello.c" ならば、%srb%.exe
は "C:\src\hello.exe" を表している。
"hello.c" がコンパイルされて出来上がるアプリケーションのファイル名として、"hello.exe" を予定している。
コンパイルエラーでアプリケーションが作成できなかった場合においても、同ディレクトリに hello.exe が存在していると、コンパイルが成功したと誤認してしまい、混乱の元となる。そのため、まずは、該当する名前の .exe ファイルの削除を行うのだ。