複数の拡張子のソースコードをビルドしたい時のMakefileの書き方

タイトルの件、わからないことがあったので覚書を残す。

 
・わからなかったこと
カレントディレクトリ以下のファイルを検索して、ビルド対象の拡張子毎にオブジェクトリストを生成し、最後にそれらをリンクしたかった。
しかし、オブジェクトのリストに*.o以外の拡張子も含まれてしまい、リンクエラーになる。

 
どんなコードを書いたか忘れてしまったが、例えば*.cのオブジェクトリストを見ると、下記のようになっていた。
OBJC   =  main.c hoge.c foo.c foobar.c main.o hoge.o foo.o foobar.o

この状態でOBJCをリンカに与えると、処理できない拡張子(つまりは*.c)が含まれているため、リンクエラーになる。
また、cleanのルールがrm -f $(TARGET) $(OBJC)とかになっていると、ソースも一緒に消えてしまう。
 

・正しいコード
C/C++の開発をしていると、拡張子が3個以上になる事がよくある。
規模が小さいならbashでビルド書いてもいいが、Makefileの方が小さく纏まり、拡張も簡単なのでメモとしてテンプレートを残す。

 

TARGET = GnuMakePractice

CC  = gcc
CXX = g++

CFLAGS    = -O0 -Wall
XFLAGS    = -O0 -Wall
LDFLAGS   =  
INCLUDE   = .
SRCDIR    = .

SRCC = $(shell find $(SRCDIR) -type f -name "*.c")
SRCX = $(shell find $(SRCDIR) -type f -name "*.cpp")
OBJC = $(SRCC:.c=.o)
OBJX = $(SRCX:.cpp=.o)

all: $(TARGET)

$(TARGET): $(OBJC) $(OBJX)
	$(CC) -o $(LDFLAGS) $@ $(OBJC) $(OBJX)
%.c.o : %.c
	$(CC) -c $(CFLAGS) $(INCLUDE) $(SRCC) -o $@ $(OBJC)
%.cpp.o : %.cpp
	$(CXX) -c $(XFLAGS) $(INCLUDE) $(SRCX) -o $@ $(OBJX)

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

GitHub - mogu383/GnuMakePractice: This is a Gnu Make practice repository.

[2020/12/6追記]
アクセス数が増えていたので、コードの不備を直しました。
このようなMakefileを書こうとした時、拡張子が2つ以上でシンプルな作りのサンプルは少ないように感じました。
何か作る時、このMakefileをベースにするのもいいかもしれません。