ソースからソフトウェアをインストールするときは、通常、「make」、「make install」、これらすべての make コマンドが実際に何をしているのか疑問に思ったことはありませんか?確かに、ソフトウェアをコンパイルしてインストールしようとしていることはわかっています。でも、なんで作るの?それは実際に何をしますか?
単一の C プログラムをコンパイルするには、cc コマンドが非常に役立ちます。複数の C プログラムをコンパイルするには、Make ユーティリティが非常に役立ちます。
また、C プログラマーとシステム管理者は、make ユーティリティを使用してコンパイル関連のタスクを自動化すると便利です。この記事では、make コマンドの使用方法をおさらいしましょう。
1.簡単なコンパイル用の Makefile の作成
helloworld.c というサンプル C プログラム ファイルがあるとします。 cc コマンドを使用して、通常は以下に示すようにコンパイルします。
$ cc -o helloworld helloworld.c
単一のプログラムをコンパイルするために make を使用する必要はありませんが、次の例は make の使用方法のアイデアを提供します。以下に示すようにメイクファイルを作成します。
$ vim makefile helloworld : helloworld.c cc -o helloworld helloworld.c
以下に示すように、make を実行して helloworld 実行可能ファイルを作成します。
$ make helloworld (or) $ make
makefile にはターゲット「helloworld」が 1 つしか含まれていないため、上記のように引数なしで make コマンドを呼び出すこともできます。
Makefile とソース コードの両方が同じディレクトリにあることを確認してください。それ以外の場合は、makefile でソース ファイルのそれぞれのパスを指定してください。
デフォルトでは、make コマンドは make ファイル名が Makefile のいずれかであると想定します。 または メイクファイル . make ファイル名がこれら 2 つのいずれとも異なる場合は、以下に示すように -f オプションを使用して make コマンドに指定する必要があります。
$ make -f sample.txt
C を初めて使用する場合は、C Hello World プログラムの記事をお読みください。
2.複数のファイルをコンパイルする Makefile の作成
複数ファイルのコンパイルでは、getname.c、getaccno.c、main.c の 3 つのファイルを使用します。
これら 3 つの *.c ファイルに基づいて、「getinto」という実行可能ファイルを作成しましょう。
cc コマンドを使用すると、通常、以下に示すようにコンパイルを実行できます。
$ cc -o getinfo main.c getname.c getaccno.c header.h
以下に示すように個々の *.c ファイルをコンパイルし、最後に以下に示すように「getinfo」実行可能ファイルを作成することもできます。
$ cc -c getname.c $ cc -c getaccno.c $ cc -c main.c $ cc -o getinfo main.o getname.o getaccno.o header.h
以下に示すように、使いやすい make ユーティリティを使用すると、これを効果的に行うことができます。
$ vim makefile getinfo:getname.o getaccno.o main.o header.h cc -o getinfo getname.o getaccno.o main.o header.h main.o:main.c cc -c main.c getaccno.o:getaccno.c cc -c getaccno.c getname.o:getname.c cc -c getname.c
最後に、以下に示すように make コマンドを実行します。
$ make getinfo
注: make コマンドが呼び出されるたびに、変更されたファイルのみをチェックしてコンパイルします。これは、通常、複数の C ファイルを持ち、開発段階でプロジェクト全体を数回コンパイルする C プログラマーにとっては大きな問題です。
gdb を使用して C プログラムをデバッグすることもできます。
3.クリーンアップ プロセスのターゲットを追加
以下に示すように、makefile (または Makefile) 内に、オブジェクト ファイルをクリーンアップするターゲットを追加することもできます。
clean : rm getname.o getaccno.o main.o
次に示すように、現在のディレクトリからオブジェクト ファイルを消去できます。
$ make clean
注: rm コマンドで個々の *.o ファイルを指定する代わりに、rm *.o を指定することもできます。
ar コマンドを使用して C アーカイブ ファイル (*.a) を作成することもできます。
4. Makefile での変数処理
makefile (または Makefile) 内では、makefile 全体で使用できる変数を使用できます。使用例を以下に示します。$obj にはすべてのオブジェクト ファイル名が含まれます。
$ vim makefile obj= getname.o getaccno.o main.o getinfo: $(obj) header.h cc -o getinfo getname.o getaccno.o main.o header.h main.o:main.c cc -c main.c getaccno.o:getaccno.c cc -c getaccno.c getname.o:getname.c cc -c getname.c clean: rm getinfo $(obj)
5. Makefile をさらに簡素化する
Make ユーティリティは、暗黙的に cc -c コマンドを呼び出して、対応する .c ファイルの .o ファイルを生成します。 makefile 内で「cc -c」を指定する必要はありません。したがって、以下に示すように、この暗黙のルールを反映するようにメイクファイルを書き直すことができます。
$ vim makefile obj= getname.o getaccno.o main.o getinfo: $(obj) header.h cc -o getinfo getname.o getaccno.o main.o header.h main.o: getaccno.o: getname.o: clean: rm getinfo $(obj)
6. Makefile 内にデバッグ メッセージを挿入
大きなプロジェクトをコンパイルしているとき、わかりやすいメッセージを表示したい場合があります。 Make ユーティリティはメッセージを標準出力に出力できます。これは、make プロセスで発生する可能性のある問題をデバッグするのに役立つ場合があります。以下に示すように、メイクファイル全体で @echo ステートメントを使用して、カスタム メッセージを表示します。
$ vim makefile obj= getname.o getaccno.o main.o getinfo: $(obj) header.h cc -o getinfo getname.o getaccno.o main.o header.h @echo "make complete." main.o: getaccno.o: getname.o: clean: rm getinfo $(obj) @echo "getinfo, $(obj) files are removed."
そこにあります。 Makeはもはやミステリーではありません。この記事が気に入ったら、おいしいにブックマークするか、つまずいてください。