Makefileの修正
[YACASL2.git] / src / Makefile
1 INCLUDEDIR := ../include
2 INCLUDE = -I $(INCLUDEDIR)
3
4 # コマンド
5 CC := gcc
6 CFLAGS := -g -Wall -Wextra $(INCLUDE)
7 CTAGS := ctags
8 ETAGS := etags
9 SED := sed
10 WHICH := which
11
12 # ソースの分類
13 CMDOBJ := casl2 comet2 dumpword
14 COMMONOBJ := word cmem cerr
15 CASL2OBJ := struct hash
16 ASOBJ := assemble token label
17 EXECOBJ := exec dump
18
19 .PHONY: all build tag clean
20
21 all: build tag
22
23 # ヘッダファイルの依存関係を.dファイルに出力する
24 %.d: %.c
25         @($(CC) -MM -I $(INCLUDEDIR) $< | $(SED) 's/\($*\.o\):/\1 $@:/g' >$@ && echo '$@ is created from $<')
26
27 # .dファイルからヘッダファイルの依存関係を取得する
28 # ターゲットに clean が含まれている場合は除く
29 ifneq ($(findstring $(MAKECMDGOALS),clean),clean)
30   -include $(addsuffix .d,$(CMDOBJ) $(COMMONOBJ) $(CASL2OBJ) $(ASOBJ) $(EXECOBJ))
31 endif
32
33 # casl2、comet2、dumpwordのビルド
34 build: $(CMDOBJ)
35
36 casl2: casl2.o $(addsuffix .o,$(COMMONOBJ) $(CASL2OBJ) $(ASOBJ) $(EXECOBJ))
37
38 comet2: comet2.o $(addsuffix .o,$(COMMONOBJ) $(CASL2OBJ) $(EXECOBJ))
39
40 dumpword: dumpword.o $(addsuffix .o,$(COMMONOBJ))
41
42 # tagファイル作成 - ctags & etags
43 # コマンドがない場合はなにもしない
44 tag: tags TAGS
45
46 tags: $(INCLUDEDIR)/*.h *.c
47         $(if $(strip $(shell $(WHICH) $(CTAGS))),$(CTAGS) $^,@$(ECHO) '$(CTAGS): not found')
48
49 TAGS: $(INCLUDEDIR)/*.h *.c
50         $(if $(strip $(shell $(WHICH) $(ETAGS))),$(ETAGS) $^,@$(ECHO) '$(ETAGS): not found')
51
52 # makeで生成したファイルの削除
53 clean: clean-cmd clean-work clean-tag
54
55 clean-cmd:
56         @$(RM) casl2 comet2 dumpword
57
58 clean-work:
59         @$(RM) *.o *.d
60
61 clean-tag:
62         @$(RM) TAGS tags