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