C言語-ファイルの分割 |
1つのファイルから実行ファイルを作成するのは、簡単に行える。例えば、C言語のファイルprog.cからprog.exe(UNIXはprog)を作成するには次のようにする。ここでは、Cコンパイラコマンドをccとする。
MS-DOS UNIX > cc prog.c % cc -o prog prog.c
しかし、プログラムが大きくなると複数のファイルに分割して作成することになる。例えば、実行ファイルporg.exeを作成するのにprog1.c〜prog5.cとヘッダファイルprog.hの6つのファイルが必要な場合、次のようになる。
MS-DOS > cc -o prog.exe prog1.c prog2.c prog3.c prog4.c prog5.c UNIX % cc -o prog prog1.c prog2.c prog3.c prog4.c prog5.c
毎回、長いコマンドを入力するのは大変であるし、例えば、prog1.cだけ修正したときも上の例ではすべてのファイルが再コンパイルされる。
このように、コマンドmakeは、目的とするソフトウェアを効率良く更新(コンパイル)するためにmakefileまたはMakefileというファイルの記述にしたがってコマンドを実行する。
実行ファイルporg.exeを作成するのにprog1.c〜prog5.cとヘッダファイルprog.hの6つのファイルが必要な場合、makefileは次のようになる。
# prog1.c - prog5.c から prog.exe を作る prog.exe : prog1.obj prog2.obj prog3.obj prog4.obj prog5.obj [TAB] cc -o prog.exe prog1.obj prog2.obj prog3.obj prog4.obj prog5.obj prog1.obj : prog1.c prog.h ※ UNIXでは.objではなく、.oになる。 [TAB] cc -c prog1.c prog2.obj : prog2.c prog.h [TAB] cc -c prog2.c prog3.obj : prog3.c prog.h [TAB] cc -c prog3.c prog4.obj : prog4.c prog.h [TAB] cc -c prog4.c prog5.obj : prog5.c prog.h [TAB] cc -c prog5.c
1行目の#で始まる行は、コメントになる。
2行目のように:で区切られた行を依存記述行といい、:の左側がターゲット、右側が依存ファイルになる。すなわち、「prog.exeはprog1.obj, prog2.obj, prog3.obj, prog4.obj,
prog5.objから作られ、その手順は次(3行目)のとおりである。」ということを表している。4行目以降も意味は同じである。
3行目には、実際に実行するのコマンドを書く。必ず先頭にタブ([TAB])が必要である。
このような makefile を用意しておけば、次のように入力するだけでエラーがなければ実行ファイルが作成される。
MS-DOS UNIX > make % make
最初はすべてのファイルがコンパイルされるが、2回目以降は変更されたファイルだけが再コンパイルされる。コマンドmakeがターゲットより依存ファイルの方が新しいければコマンドを実行する。
上の makefile では、よく似た記述が並んでいる。コマンドmakeには、手順を省略したときの暗黙の規則というものがあり、次のように簡単に書くことができる。
# prog1.c - prog5.c から prog.exe を作る
prog.exe : prog1.obj prog2.obj prog3.obj prog4.obj prog5.obj
[TAB] cc -o prog.exe prog1.obj prog2.obj prog3.obj prog4.obj prog5.obj
prog1.obj prog2.obj prog3.obj prog4.obj prog5.obj : prog.h
4行目のターゲットが複数書かれているが、依存ファイルと同様に空白で区切って複数書いても良い。また、4行目の依存記述行に対するコマンド行が省略されているが、暗黙の規則により、prog1.cがあれば自動的に cc -c prog1.c が実行される。
マクロ名を使用して文字列を定義し、後で引用することができる。定義は次のようにする。
マクロ名=文字列
マクロを引用(参照)するには、$の後にマクロ名を書く。マクロ名の後が空白以外の場合は、マクロ名を( )で囲む必要がある。
# prog1.c - prog5.c から prog.exe を作る
OBJ = prog1.obj prog2.obj prog3.obj prog4.obj prog5.obj
prog.exe : $(OBJ)
[TAB] cc -o prog.exe $(OBJ)
$(OBJ) : prog.h
次のマクロは、コマンドの中で使用できる特殊なマクロである。
$? | ターゲットより新しいすべてのソース名におきかわる。 |
$# | すべてのソース名におきかわる。 |
$& | $#と同じであるが、拡張子(.より後)が取り除かれる。 |
$@ | ターゲット名におきかわる。 |
$* | $@と同じだが、拡張子が取り除かれる。 |
$< | 1番左にあるソース名におきかわる。 |
$> | $<と同じであるが、拡張子が取り除かれる。 |
$:c | $?, $#, $& は二つ以上の名前に展開されることがある。それらの間には通常空白が入るが、$:の次に文字cを書くと、空白の代りにその文字が使われる。 |
${...} | ファイルmake.iが作られ、${と}の間の文字列がそこに書き込まれる。そして${から}まではmake.iという文字列におきかわる。これは応答ファイルを自動的に作成するのに使われる。たとえば、
alpha.exe : beta.obj gamma.obj delta.obj
[TAB] lcc ${ -o $@ $# -lintlib }
というmakefileを実行すると、コマンドは次のように展開される。
|
MS-DOSのコマンドラインは最大でも127文字までに制限されているが、lccの@オプションとmakeの${...}マクロを組み合わせることによって、長いコマンドラインをあたえることが可能になる。
コマンドmakeのバージョン等によって違いはあるが、おおよそ次のとおりである。
書式 make [-f filename] [option] [macro] [target]
-f filename: makefileまたはMakefileとは別のファイル名を使用するときに指定する。
option: マニュアル等を参照すること。
macro: マクロ定義を”マクロ名=値”の形式で指定する。
この文字列中にシェルのメタキャラが存在する場合は引用符で囲む必要がある。
target: makefile中のターゲット名を指定する。省略した場合、先頭のターゲットが実行される。
Copyright © 2001 Hiroshi Masuda |