複数のディレクトリにあるプログラムをコンパイルするmakefileを作成しています。すべてのソースファイルは/srcにあり、ヘッダーは/ incにあり、オブジェクトファイルは/ objに作成され、実行可能ファイルは/binに作成されます。3つのmakefileがあり、全体として1つは/ objディレクトリにあり、もう1つは/binディレクトリにあります。obj makefileはオブジェクトファイルを作成し、binmakefileは実行可能ファイルを作成するファイルをリンクします。このmakefileは可能な限り一般的である必要があるため、値をハードコーディングすることは想定されていません。これには、ファイル名とディレクトリ名のハードコーディングが含まれます。
以下のコードは、オブジェクトファイルを作成するmakefileです。オブジェクトファイルを作成しますが、依存関係を適切にチェックしないため、1つのファイルを更新すると、すべてのオブジェクトファイルが再作成されます。GNU Makefileマニュアルを読んでいますが、何が問題になっているのかまだわかりません。
CC:= gcc
CCFLAGS:= -MMD -g -Wall
INCLUDE:= -I "../inc"
LDFLAGS:= -lcurses -lgdbm -lncurses -lgdbm_compat
SRC:= ../src
SOURCES:= $(wildcard $(SRC)/*.c)
OBJS:=$(patsubst $(SRC)/%.c,%.o,$(SOURCES))
all: $(OBJS)
$(OBJS): $(SOURCES)
$(CC) $(CCFLAGS) $(INCLUDE) -c $^
VPATH= ../$(PROG)
$(SOURCES):
$(CC) $(CC_FLAGS) $(INCLUDE) -c $<
.PHONY: clean
clean:
rm -f *.[od] *.o
-include *.d
必要に応じて、他の2つのmakefileを投稿できます。