第13回
エラーメッセージと対処方法(3)~開発手順の効率化

自動処理の作成

必要なツールができ上がったら、コンパイル~エディタ起動~再コンパイル──という、自動処理を作っていきます。DOSではバッチファイル、UNIX系OSではシェルスクリプトを使います。

DOS版バッチファイル

yesno.exeを使用するDOS版のバッチファイル“CMK.BAT”はリスト2のようになります。アンダーラインの箇所は、適宜書き換えてください。エディタには「メモ帳」(NOTEPAD.EXE)を指定しています。ここも自由に書き換えて構いません。

以下のように実行します。
CMK <ソースファイル名>
<ソースファイル名>には拡張子は付けません。また、パスも不要で、バッチファイル内で指定したフォルダ(例では“C:\CLANG\SRC”)にソースファイルが存在するという前提になっています。

ex1301.cをコンパイルするなら
CMK ex1301[Enter]
とします。成功すればバッチファイル内で指定したフォルダ(例では“C:\CLANG\EXE”)に実行ファイル(例では“ex1301.exe”)が生成されます。エラーがあればエディタが起動し、ソースと同じフォルダ(例では“C:\CLANG\SRC”)に生成されたエラーメッセージを記録したファイル(例では“ex1301.err”)が開きます。

これを参照してソースファイルを修正し保存すると、「再コンパイルしますか? <y/n>」というメッセージが表示されるので、[Y][Enter]と入力すれば修正したソースファイルが再コンパイルされ、[Y]以外の文字を入力すれば処理は終了します(再コンパイルは行われません)。

なお、メモ帳ではタグジャンプが使えないため、エラーメッセージからソースファイルを開いて該当する行にカーソルを移動……という処理は行えません。タグジャンプ機能を搭載したDOS版のエディタをお奨めします。

リスト2:コンパイル・エラー修正・再コンパイルを自動実行するバッチファイル~(CMK.BAT)
ECHO OFF
CLS
IF [%1] == [] GOTO ERR
:START
    ECHO %1 コンパイル中...
    LCC -j -oC:\CLANG\EXE\%1.EXE C:\CLANG\SRC\%1.C > C:\CLANG\SRC\%1.ERR
    IF ERRORLEVEL 1 GOTO EDIT
    GOTO SUCCESS
:EDIT
    C:\WINDOWS\SYSTEM32\NOTEPAD.EXE C:\CLANG\SRC\%1.ERR
                        ↑エディタは適宜書き換えてください

    YESNO 再コンパイルしますか?
    IF ERRORLEVEL 1 GOTO EXIT
    GOTO START
:SUCCESS
    ECHO コンパイルは成功しました!
    GOTO EXIT
:ERR
    ECHO CMK : ファイル名を指定してください。拡張子は不要です。
:EXIT

Windowsならもっとシンプルに

Windowsのコマンド プロンプトから実行する場合は、リスト3のような“CMKW.BAT”が便利です。Windows環境ではGUI版のエディタでソースファイルを開いたままにしておき(もちろん内容を保存して)、このバッチファイルを動かします。

コンパイルでエラーが発生すればコマンド プロンプトに「再コンパイルしますか? <y/n>」というメッセージが表示されるので、エディタに移動してエラーメッセージを保存した<ソースファイル名>.errファイルを開き、タグジャンプ機能でソースを修正して保存します。

そこでコマンド プロンプトに戻って[Y][Enter]と入力すれば再コンパイルが始まります。コマンド プロンプトとGUI版のエディタを切り替えて使えるため、このようなシンプルな形になります。

リスト3:Windows環境用(CMKW.BAT)
ECHO OFF
CLS
IF [%1] == [] GOTO ERR
:START
    ECHO %1 コンパイル中...
    LCC -j -oC:\CLANG\EXE\%1.EXE C:\CLANG\SRC\%1 > C:\CLANG\SRC\%1.ERR
    YESNO 再コンパイルしますか?
    IF ERRORLEVEL 1 GOTO EXIT
    GOTO START
:ERR
    ECHO CC : ファイル名を指定してください。拡張子は不要です。
:EXIT

UNIX系OSのシェルスクリプト

LinuxなどUNIX系OSでGCCを使用する場合は、リスト4のようなシェルスクリプト“cmk”を使ってください。ソースはホームディレクトリのsrcに保存します。

エディタは“emacs”としてありますが、自由に書き換えてください。なお、シェルにはshを使っています。シェルが異なるとシェルスクリプトの文法も変わるため、注意してください。

リスト4:UNIX系OS用のシェルスクリプト~(cmk)
#! /bin/sh
if [ "$1" = "" ]
then
  echo "usage:cmk <filename>"
  exit 1
fi
# Compile the source file
status=0
gcc $HOME/src/$1.c -o $HOME/src/$1 > $HOME/src/$1.err
status=$?
while [ $status != 0 ]
do
# Display prompt and waiting for user's answer 'y' or 'n'
  yesno "Edit and re-compile, ok?"
  if [ $? = 0 ]
  then
    emacs $HOME/src/$1.c $HOME/src/$1.err
    ↑エディタは適宜書き換えてください
    gcc $HOME/src/$1.c -o $HOME/src/$1  > $HOME/src/$1.err
    status=$?
  else
    status=0
  fi
done
echo "cmk : terminated."