複数の拡張子のソースコードをビルドしたい時の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をベースにするのもいいかもしれません。