[C++] 再帰的にビルドするMakefile

   ## フォルダ構成 srcフォルダの下を再帰的にビルドするサンプルです。 フォルダ構成は以下の構成を想定しています。 ``` `gutter:false; |-- Makefile |-- ReadMe.md |-- obj ビルドしたオブジェクトが出力される `-- src Source ``` ソースファイルは全てsrcフォルダに入っているものとします。 ビルドしたオブジェクトはobjディレクトリに出力する事にします。 ## Makefile ``` CXX = g++ CFLAGS = -g -Wall -Werror # インクルードファイル(あれば) #INCS = -I./include INCS = LIBS = -lPocoFoundation TARGET = MakefileSample SRCROOT = src OBJROOT = obj ifeq "$(strip $(OBJROOT))" "" OBJROOT=. endif # SECROOTから再帰的にソースファイルを検索する SRCDIRS = $(shell find $(SRCROOT) -type d) SOURCES = $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.cc)) # SRCROOTを各SOURCESから削除する OBJSRCS = $(SOURCES:$(SRCROOT)/%=%) OBJECTS = $(addprefix $(OBJROOT)/, $(OBJSRCS:.cc=.o)) DEPENDS = $(OBJECTS:.o=.d) #$(warning SOURCES = $(SOURCES)) #$(warning OBJECTS = $(OBJECTS)) $(TARGET): $(OBJECTS) $(CXX) -o $@ $^ $(LIBS) # 再帰的にソースをビルド $(OBJROOT)/%.o : $(SRCROOT)/%.cc @if [ ! -e `dirname $@` ]; then mkdir -p `dirname $@`; fi $(CXX) $(CFLAGS) $(INCS) -o $@ -c $< all: clean $(TARGET) run : ./$(TARGET) clean: -rm -f $(OBJECTS) $(DEPENDS) $(TARGET) -include $(DEPENDS) ``` ## デバッグしたい時 変数の値をみたい時が多々あります。 ``` `gutter:false; $(warning HOGE = $(HOGE)) ``` ## その他 srcフォルダの下にMakefileを置く場合のサンプルはあったのですが、一番上のディレクトリに置く場合のサンプルがなかったのでその時に上手く依存関係が解決できませんでした。 (原因はobj/src/xxxx.oなどとなってしまっていたので、objディレクトリの下の場合はsrcを削除して作成する必要がありました) 実際に大きなプロジェクトでは確認できていないので、確認したいと思います。 ## サンプルプロジェクト サンプルプロジェクトは[Github](https://github.com/k28/makefile_cpp_sample)にあります。 ## 参考URL * [GNU Makefile テンプレート](https://qiita.com/tobira-code/items/42803d1e203cbf44636f) * [トリビアなmakefile入門](http://www.jsk.t.u-tokyo.ac.jp/~k-okada/makefile/) * [わたしの開発日記](http://giraffydev.hatenablog.com/entry/2016/10/04/101004) * [Functions for String Substitution and Analysis](https://www.gnu.org/savannah-checkouts/gnu/make/manual/html_node/Text-Functions.html)

0 件のコメント :

コメントを投稿