and support the _HEADERS variables as well
[apps/madtty.git] / am / footer.mk
1 #[ Rules and Depends ]##################################################{{{#
2
3 AUTO_DEPENDS += filter_c
4 filter_c = $(addprefix $2/,$(patsubst %.c,%.o,$(filter %.c,$1)))
5
6 # this implicit rule is used to force directory existence, without depending
7 # on the directory itself, since its mtime changes too often.
8 %/.exists: Makefile $(CONFDIR)/$(wildcard *.mk)
9         @$(RM) -r $*
10         @-mkdir -p $*
11         @touch $@
12 # We don't want make to remove these files because of default rules.
13 .PRECIOUS: %/.exists
14
15 define RULE_C_tpl
16 $(_cobjs)/$1/%.o: %.c $(_cobjs)/$1/.exists
17         $(CC) $$(CFLAGS) $$($1_CPPFLAGS) $2 -MMD -MT "$$(@D)/$$*.d $$(@D)/$$*.o" -MF $$(@D)/$$*.d -g -c -o $$@ $$<
18
19 $(_cobjs)/$1/%.d: %.c $(_cobjs)/$1/.exists
20         @$(CPP) $$(CFLAGS) $$($1_CPPFLAGS) $2 -MM -MT "$$(@D)/$$*.d $$(@D)/$$*.o" -MF $$(@D)/$$*.d $$<
21
22 -include $$(wildcard $(_cobjs)/$1/*.d) /dev/null
23 endef
24
25 ########################################################################}}}#
26 #[ Classes ]############################################################{{{#
27
28 deps_create = $(foreach f,$(AUTO_DEPENDS),$(call $f,$1,$2))
29
30 ##
31 ##  rules for *_PROGRAMS
32 ##
33
34 install-PROGRAMS/%::
35         $(if $($*dir),$(INSTALL_DIR) $(DESTDIR)$($*dir))
36         $(if $($*dir),$(INSTALL_PROGRAMS) $($*_PROGRAMS:=.so*) $(DESTDIR)$($*dir))
37
38 define CLASS_PROGRAMS_tpl
39   all:: $1
40   install-PROGRAMS/$2:: $1
41   install:: install-PROGRAMS/$2
42
43   $1: $$(call deps_create,$$($1_SOURCES),$(_cobjs)/$1)
44         $(CC) $$(CFLAGS) $$($1_CPPFLAGS) -o $$@ $$(filter %.o,$$^) \
45                 $$(LDFLAGS) $$($1_LDFLAGS) $$($1_LIBADD)
46
47   $$(eval $$(call RULE_C_tpl,$1,))
48
49   clean::
50             $(RM) $1
51 endef
52 $(foreach v,$(filter %_PROGRAMS,$(.VARIABLES)), \
53             $(foreach x,$($v),$(eval $(call CLASS_PROGRAMS_tpl,$x,$(v:_PROGRAMS=)))))
54
55 ##
56 ##  rules for *_LIBRARIES
57 ##
58
59 install-LIBRARIES/%::
60         $(if $($*dir),$(INSTALL_DIR) $(DESTDIR)$($*dir))
61         $(if $($*dir),$(INSTALL_DATA) $($*_LIBRARIES:=.so*) $(DESTDIR)$($*dir))
62
63 define CLASS_LIBRARIES_tpl
64   all:: $1.so$3
65   install-LIBRARIES/$2:: $1.so$3
66
67   install:: install-LIBRARIES/$2
68
69   $1.so$3: $$(call deps_create,$$($1_SOURCES),$(_cobjs)/$1)
70         $(CC) $$(CFLAGS) $$($1_CPPFLAGS) -fPIC -shared -o $$@ $$(filter %.o,$$^) \
71                 $$(LDFLAGS) $$($1_LDFLAGS) $$($1_LIBADD)
72         $$(if $$(word 2,$$(subst ., ,$3)),ln -sf $$@ $1.so.$$(word 1,$$(subst ., ,$3)))
73         $$(if $$($1_VERSION), ln -sf $$@ $1.so)
74
75   $$(eval $$(call RULE_C_tpl,$1,-fPIC))
76
77   clean::
78             $(RM) $1.so*
79 endef
80 $(foreach v,$(filter %_LIBRARIES,$(.VARIABLES)), \
81             $(foreach x,$($v),$(eval $(call CLASS_LIBRARIES_tpl,$x,$(v:_LIBRARIES=),$(...\
82             ...)$(if $($x_VERSION),.$($x_VERSION))))))
83
84
85 ##
86 ##  rules for *_DATA
87 ##
88
89 install-DATA/%::
90         $(if $($*dir), $(INSTALL_DIR) $(DESTDIR)$($*dir))
91         $(if $($*dir), $(INSTALL_DATA) $($*_DATA) $(DESTDIR)$($*dir))
92
93 install:: $(foreach v,$(filter %_DATA,$(.VARIABLES)),$(patsubst %_DATA,install-DATA/%,$v))
94
95 ##
96 ##  rules for *_SCRIPTS
97 ##
98
99 install-SCRIPTS/%::
100         $(if $($*dir), $(INSTALL_DIR) $(DESTDIR)$($*dir))
101         $(if $($*dir), $(INSTALL_PROGRAMS) $($*_SCRIPTS) $(DESTDIR)$($*dir))
102
103 install:: $(foreach v,$(filter %_SCRIPTS,$(.VARIABLES)),$(patsubst %_SCRIPTS,install-SCRIPTS/%,$v))
104
105 ##
106 ##  rules for *_HEADERS
107 ##
108
109 install-HEADERS/%::
110         $(if $($*dir), $(INSTALL_DIR) $(DESTDIR)$($*dir))
111         $(if $($*dir), $(INSTALL_DATA) $($*_HEADERS) $(DESTDIR)$($*dir))
112
113 install:: $(foreach v,$(filter %_HEADERS,$(.VARIABLES)),$(patsubst %_HEADERS,install-HEADERS/%,$v))
114
115
116 ########################################################################}}}#
117 #[ Candy ]##############################################################{{{#
118
119 echo-root:
120         @echo $(DEPTH)
121
122 echo-tags:
123         @echo $(DEPTH)/.tags
124
125 ifeq (".","$(DEPTH)")
126 tags:
127         ctags -o .$@ --recurse=yes --exclude=.svn --exclude=\*.mk --totals=yes;
128
129 distclean clober::
130         $(RM) -f .tags
131 else
132 tags:
133         $(MAKE) -C $(DEPTH) $@
134 endif
135
136 .PHONY: tags
137
138 ########################################################################}}}#
139
140 all check clobber distclean install::
141         @set -e $(patsubst %,; $(MAKE) -rC % $@,$(SUBDIRS))
142
143 CLEAN_RECURSE=1
144 clean::
145         $(RM) -r $(_cobjs) $(CLEANFILES)
146         @$(if $(CLEAN_RECURSE),$(patsubst %,$(MAKE) -rC % $@;,$(SUBDIRS)))
147
148 clobber distclean:: CLEAN_RECURSE=
149 clobber distclean:: clean
150         $(RM) -r .objs* $(DISTCLEANFILES)
151
152 ifeq (".","$(DEPTH)")
153 clobber distclean::
154         $(RM) $(patsubst %.in,%,$(wildcard $(CONFDIR)/*.in))
155 endif
156
157 .PHONY: all check clean clobber distclean install FORCE