-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
155 lines (121 loc) · 4.69 KB
/
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# coding: utf-8
#
# The MIT License (MIT)
# Copyright (c) 2017 ADMIS_Walker (Blog: https://admiswalker.blogspot.jp/)
# 想定するディレクトリ構成例
#
# exampledir/
# |
# + Makefile (this file)
# |
# + exe (executable file)
# |
# + make_temp/ (temporary directory for make)
# |
# + *.cpp
# |
# + source/
# | |
# | + *.cpp
# | |
# | + SubDir1/
# | |
# | + *.cpp
# |
# + include/
# |
# + *.hpp
# .o: Objects file
# .d: Depends file
#============================================================
# 各項目を設定してください
# ソースファイルの場所 ($make steps コマンドで,ヘッダファイルの行数もカウントする場合は,
# ヘッダファイルのディレクトリも追加する必要があります.また,拡張子を記述してはいけません)
# 例: SRCDIR = *. source/*. source/SubDir1/*.
DIR = *. source/*. include/*.
# 生成ファイル名
TARGET = exe
# 親ディレクトリ名にする場合
# TARGET = $(shell basename `readlink -f .`).exe
# コンパイルオプション
# 例: CFLAGS += -L/home/usr/lib -I/home/usr/include
# 例: CFLAGS += -lssl -lcrypto # OpenSSL
# 例: CFLAGS += -pthread # thread
CFLAGS += -std=c++14 # C++14
CFLAGS += -Wall
CFLAGS += -O3
#============================================================
SRCDIR = $(patsubst %., %.cpp, $(DIR))
SRCS = $(wildcard $(SRCDIR))
HDIR = $(patsubst %., %.h, $(DIR))
HEADS = $(wildcard $(HDIR))
HPPDIR = $(patsubst %., %.hpp, $(DIR))
HEADppS = $(wildcard $(HPPDIR))
TEMP_DIR = make_temp
OBJS = $(addprefix $(TEMP_DIR)/, $(patsubst %.cpp, %.o, $(SRCS)))
#OBJS = $(addprefix $(TEMP_DIR)/, $(SRCS:%.cpp=%.o))#別表記
DEPS = $(addprefix $(TEMP_DIR)/, $(patsubst %.cpp, %.d, $(SRCS)))
#DEPS = $(addprefix $(TEMP_DIR)/, $(SRCS:%.cpp=%.d))#別表記
# exe ファイルの生成
$(TARGET): $(OBJS)
@echo ""
@echo "============================================================"
@echo ""
@echo "SRCS: "
@echo "$(SRCS)"
@echo ""
@echo "OBJS: "
@echo "$(OBJS)"
@echo ""
@echo "CFLAGS: "
@echo "$(CFLAGS)"
@echo ""
@echo "============================================================"
@echo ""
$(CXX) -o $(TARGET) $(OBJS) $(CFLAGS)
@echo ""
# 各ファイルの分割コンパイル
$(TEMP_DIR)/%.o: %.cpp
@echo ""
mkdir -p $(dir $@);\
$(CXX) $< -c -o $@ $(CFLAGS)
# 「-include $(DEPS)」により,必要な部分のみ分割で再コンパイルを行うため,依存関係を記した *.d ファイルに生成する
$(TEMP_DIR)/%.d: %.cpp
@echo ""
mkdir -p $(dir $@);\
$(CXX) $< -MM $(CFLAGS)\
| sed 's/$(notdir $*)\.o/$(subst /,\/,$(patsubst %.d,%.o,$@) $@)/' > $@;\
[ -s $@ ] || rm -f $@
# @echo $* # for debug
# @echo $@ # for debug
.PHONY: all
all:
@(make clean)
@(make)
# make clean ; \ #別表記
# make #別表記
.PHONY: clean
clean:
-rm -rf $(TEMP_DIR) $(TARGET)
# -rm -f $(OBJS) $(DEPS) $(TARGET)
.PHONY: onece
onece:
$(CXX) -o $(TARGET) $(SRCS) $(CFLAGS)
.PHONY: steps
steps: $(SRCS) $(HEADppS) $(HEADS)
@echo "$^" | xargs wc -l
-include $(DEPS)
# Reference:
#
# [1] Makefile 別ディレクトリに中間ファイル & 自動依存関係設定 - 電脳律速: http://d-rissoku.net/2013/06/makefile-%E5%88%A5%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AB%E4%B8%AD%E9%96%93%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-%E8%87%AA%E5%8B%95%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82/
# [2] Makefileでワイルドカードを使う方法 - nao-bambooの日記: http://tech.chocolatoon.com/entry/2015/09/11/175832
# [3] Makefileの関数 - Qiita: http://qiita.com/chibi929/items/b8c5f36434d5d3fbfa4a
# [4] Makeでヘッダファイルの依存関係に対応する - wagavulin's blog: http://blog.wagavulin.jp/entry/20120405/1333629926
# [5] シンプルで応用の効くmakefileとその解説 - URIN HACK: http://urin.github.io/posts/2013/simple-makefile-for-clang/
# [6] シェルの初歩の初歩 - One Two.jp: http://www.onetwo.jp/proginfo/pub/unix/sh.htm
# [7] sedコマンドの備忘録 - Qiita: http://qiita.com/takech9203/items/b96eff5773ce9d9cc9b3
# [8] ディレクトリ構成図を書くときに便利な記号 - Qiita: http://qiita.com/paty-fakename/items/c82ed27b4070feeceff6
# [9] https://github.com/T-matsuno07/mtnMakefile/blob/master/makefile
# [10] プログラムのステップ数をカウントする方法 - nishio-dens's diary: http://nishio.hateblo.jp/entry/20101110/1289398449
# [11] シェル(bash)のfor文の違いを吸収するMakefileの書き方 - 檜山正幸のキマイラ飼育記: http://d.hatena.ne.jp/m-hiyama/20080724/1216874932
# [12] Javaのステップ数を数える - kumai@github: http://qiita.com/kumai@github/items/3b9e6f73d71323a1bc1d