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