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

  

フォルダ構成

srcフォルダの下を再帰的にビルドするサンプルです。
フォルダ構成は以下の構成を想定しています。

|-- Makefile
|-- ReadMe.md
|-- obj         ビルドしたオブジェクトが出力される
`-- src         Source

ソースファイルは全てsrcフォルダに入っているものとします。
ビルドしたオブジェクトはobjディレクトリに出力する事にします。

Makefile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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)

デバッグしたい時

変数の値をみたい時が多々あります。

$(warning HOGE = $(HOGE))

その他

srcフォルダの下にMakefileを置く場合のサンプルはあったのですが、一番上のディレクトリに置く場合のサンプルがなかったのでその時に上手く依存関係が解決できませんでした。
(原因はobj/src/xxxx.oなどとなってしまっていたので、objディレクトリの下の場合はsrcを削除して作成する必要がありました)
実際に大きなプロジェクトでは確認できていないので、確認したいと思います。

サンプルプロジェクト

サンプルプロジェクトはGithubにあります。

参考URL

0 件のコメント :

コメントを投稿