Yamamoto's Laboratory
make

make

プログラムのビルドツール make について,説明します.

目次


はじめに

ソースファイルから実行ファイルを作成するためには,コンパイルとリンクの処理が必要です.多くのソースフィルで構成された長いプログラムの場合,これらの処理を指示するコマンド入力に手間がかかります.その作業を軽減するために「make」を使います.その他にも,make にはいろいろと便利な機能があります.

make は万能ではありません.プログラマーは実行ファイルを作成するためのルールを指示しなくてはなりません.その指示内容を記述したファイルが,「Makefile」です.プログラマーはコマンド入力が軽減される代わりに,Makefile を書きます.どっちが楽か? makeを使った経験がある者は,Makefile を書く方が楽と言うに違いありません.

このMakefileをきちんと書くと,かなりの作業を自動化できます.例えば,更新されたソースコードのみがコンパイルの対象となり,実行ファイル作成時間が短くなります.更新されたか否かは make が判断するので,プログラマーがコンパイルに必要なファイルを選び出す必要はありません.

このページは,makeの使い方に関する私のメモです.完成まで時間がかかりますが,少しずつ書き加えるつもりです.

基本事項

  • コメント  シャープ記号(#)はコメント文のはじまりを表し,行末までがコメントになります.
  • 行の分割  長い行を分割したい場合,行末にバックスラッシュ(\)をつけます.バックスラッシュは改行の直前に書きます.
  • 基本的な書き方  Makefileはターゲット(タスク)を行うための,コンポーネントと命令からなります.
    • ターゲットは,実行するタスクのことです.多くの場合,コマンド行で作成するファイル名です.make ターゲットでそのコマンド行が実行されます.
    • 多くの場合,コンポーネントはターゲットを構成するためのファイルです.
    • コマンド行は,ターゲットを実行するためのコマンドです.行の先頭にはタブが必須で,.空白ではダメです.
      ターゲット : コンポーネント
      	コマンド行
      

マクロ

  • マクロ文字列置換  コロンを使うと文字列を置換します.
    SRCS = main.cpp hoge.cpp fuga.cpp
    OBJS = ${SRCS:.cpp=.o}
    
    この OBJS は,main.o hoge.o fuga.o を表します.
  • $@  ターゲットに置換されます.
  • $*  ターゲットから拡張子を除いた名前に置換されます.
  • $>  コンポーネントの先頭のファイル名に置換されます.

基本的な書き方

3個のプログラムのソースファイル(main.cpp, file_A.cpp, file_B.cpp)と2個のヘッダーファイル(file_A.h, file_B.h)から,実行ファイル (exec_file) を作成するための Makefile は,次のように書くことができます.

#-------------- basic settings ---------------
TARGET = exec_file
CFLAGS = -Wall
CC = g++

#-------------- compile and link ---------------
$(TARGET):main.o file_A.o file_B.o Makefile
	$(CC) $(CFLAGS) -o $(TARGET) main.o file_A.o file-B.o -lm

main.o:main.cpp
	$(CC) $(CFLAGS) -c -o $@ $*.cpp

file_A.o:file_A.cpp file_A.h
	$(CC) $(CFLAGS) -c -o $@ $*.cpp

file_B.o:file_B.cpp file_B.h
	$(CC) $(CFLAGS) -c -o $@ $*.cpp

#-------------- others ------------------------
.PHONY: clean
clean:
	rm *.o
	rm $(TARGET)

ページ作成情報

参考資料

  1. Andrew Oram and Steave Talbott, make 改訂版, オライリー・ジャパン, ISBN4-900900-60-5
  2. Mike Loukides and Andrew Oram, GNUソフトウェアプログラミング, オライリー・ジャパン, ISBN4-900900-20-6

更新履歴

2006年頃 ページの新規作成


no counter