## フォルダ構成
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 件のコメント :
コメントを投稿