プログラミングユーティリティ

デバッグ用およびプロファイル用のプログラムをコンパイルする

以下のメークファイルは、指定したターゲットに応じて、最適化された C プログラム、デバッグ用の C プログラム、プロファイル用の C プログラムのいずれかの形式の C プログラム (デフォルトでは最適化されたプログラム) をコンパイルします。コマンドの依存関係が検査されるので、上記 3 つのうちで形式を切り換えると、プログラムおよびそのオブジェクトファイルが再コンパイルされます。

表 4-12 デバッグ形式またはプロファイル形式の C プログラムを生成するメークファイル
# デバッグ形式またはプロファイル形式の
# C プログラムを生成するメークファイル

CFLAGS= -O 

.KEEP_STATE:

all debug profile: functions 

debug := CFLAGS = -g 
profile := CFLAGS = -pg -O 

functions: main.o data.o 
       	$(LINK.c) -o $@ main.o data.o -lcurses
        -ltermlib 
lint: main.ln data.ln 
       	$(LINT.c) main.ln data.ln 
clean: 
       	rm -f functions main.o data.o main.ln data.ln

最初のターゲットエントリは、all によって 3 つのターゲットを指定しています。


注 -

通常最終的な完成プログラムには、デバッグ形式およびプロファイル形式のコードが含まれないようにします。


慣例として、メークファイルの最初のターゲットとして、代替の開始ターゲット (またはターゲットのリストを処理するターゲット) とともに all を記述します。all の依存関係は、種類を問わず、最終的に構築されるすべてのターゲットになります。この場合は、最終的には最適化されたプログラムが構築されます。ターゲットエントリは、debug および profilefunctions ($(PROGRAM) の値) に依存することも示しています。

次の 2 行は、CFLAGS の条件付きマクロ定義です。

次に、functions のターゲットエントリが記述されています。debugfunctions に依存している場合は、-g オプションを使用してコンパイルされます。

次の例では、同様の手法を C のオブジェクトライブラリの管理に使用しています。

表 4-13 デバッグ形式またはプロファイル形式の C ライブラリを生成するメークファイル
# デバッグ形式またはプログラム形式の
# C ライブラリファイルを生成するメークファイル

CFLAGS= -O 

.KEEP_STATE
.PRECIOUS:  libpkg.a

all debug profile: libpkg.a 
debug := CFLAGS= -g 
profile := CFLAGS= -pg -O 

libpkg.a: libpkg.a(calc.o map.o draw.o) 
         	ar rv $@ $? 
         	libpkg.a(%.o): %.o 
         	@true 
lint: calc.ln map.ln draw.ln 
         	$(LINT.c) calc.ln map.ln draw.ln 
clean: 
         	rm -f libpkg.a calc.o map.o draw.o ¥
          calc.ln map.ln draw.ln