summaryrefslogtreecommitdiffstats
path: root/Makefile.rules.in
blob: 67c4ff6de8d9b7abb66ada13fcfa702ff01655f1 (plain)
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
include Makefile.defs

makedeps		+= $(SUBDIR)Makefile
makedeps		+= Makefile
makedeps		+= Makefile.defs
makedeps		+= Makefile.rules

configure:		configure.ac
			sh autogen.sh

%:			%.in	configure
			sh configure

%.o:			%.c	$(makedeps)
			@echo -e "  CC\t\t$<"
			$(CC) $(CFLAGS) -c -o $@ $<

.%.d:			%.c	$(makedeps)
			@echo -e "  DEP\t\t$<"
			$(RM) $@
			$(CC) -M $(CFLAGS) $< | sed 's,$(*F)\.o[ :]*,$*.o $@ : ,g' > $@

%.c %.h:		%.y	$(makedeps)
			@echo -e "  YACC\t\t$<"
			$(YACC) $(YACCFLAGS) -d -o $@ $<

%.c %.h:		%.l	$(makedeps)
			@echo -e "  LEX\t\t$<"
			$(LEX) -t --header-file=$(<:.l=.h) $< > $@

%.8:			%.xml	$(makedeps)
			@echo -e "  MAN\t\t$@"
			(cd $(SUBDIR); docbook2x-man ../$<)

%.pdf:			%.xml	$(makedeps)
			@echo -e "  PDF\t\t$@"
			db2pdf -o $(SUBDIR) $<

define program_template
$(1)-obj		:= $$(patsubst %,$(SUBDIR)%,$$($(1)-obj))
$(1)-extra-clean-files	:= $$(patsubst %,$(SUBDIR)%,$$($(1)-extra-clean-files))

depfiles		:= $$(patsubst $(SUBDIR)%.o,$(SUBDIR).%.d,$$($(1)-obj))

$(SUBDIR)$(1):		$$($(1)-extra-targets) $$($(1)-obj)
			@echo -e "  LD\t\t$$@"
			$$(CC) $$($(1)-obj) $$(LDFLAGS) -o $$@
all_targets		+= $(SUBDIR)$(1)

.PHONY:			$(1)-clean
$(1)-clean:
			@echo -e "  CLEAN\t\t$(1)"
			$$(RM) $$($(1)-obj) $$(depfiles) $$($(1)-extra-clean-files) $(SUBDIR)$(1)
clean_targets		+= $(1)-clean

.PHONY:			$(1)-install
$(1)-install:
			@echo -e "  INSTALL\t$1"
			$(MKDIR_P) $$(DESTDIR)/$$($(1)-destdir)
			$(INSTALL) -m 755 -o root -g root \
				$(SUBDIR)$(1) \
				$$(DESTDIR)/$$($(1)-destdir)/$(1)
install_targets		+= $(1)-install

ifneq ($(MAKECMDGOALS),clean)
-include $$(depfiles)
endif
endef

ifneq ($(SUBDIR),)
include $(SUBDIR)/Makefile
$(foreach prog,$(PROGRAMS),$(eval $(call program_template,$(prog))))
endif

.DEFAULT_GOAL		:= all

.PHONY:			all clean install
all:			$(SUBDIRS) $(all_targets)
clean:			$(SUBDIRS) $(clean_targets)
install:		all $(SUBDIRS) $(install_targets)

.PHONY: $(SUBDIRS)
$(SUBDIRS):
			@echo -e "  SUBDIR\t$@/"
			@$(MAKE) -s -f Makefile.rules $(MAKECMDGOALS) SUBDIR="$@/"