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 ファイルの削除を行うのだ。