]> git.tuebingen.mpg.de Git - dss.git/blob - Makefile
build: Generate intermediate files in build/.
[dss.git] / Makefile
1 # SPDX-License-Identifier: GPL-2.0
2
3 PACKAGE := dss
4 SLOGAN := the dyadic snapshot scheduler
5 define DESCRIPTION1 :=
6         $(PACKAGE) maintains hardlink-based snapshots of a given directory on a
7         remote or local host using rsync's link-dest feature. The snapshots
8         are organized so that any snapshot can directly be deployed as an
9         (emergency) replacement for the primary system.
10 endef
11 define DESCRIPTION2 :=
12         $(PACKAGE) is admin friendly: It is easy to configure and needs little
13         attention after the initial setup. In particular, no full, incremental
14         or differential backups need to be configured, and there is no database
15         to maintain. $(PACKAGE) is also user-friendly: Assuming the snapshot server
16         allows read-only user access over the network, users can restore
17         accidentically removed files without admin intervention, using their
18         favorite file browser to copy files from the snapshot directory back
19         to the primary system.
20 endef
21 define DESCRIPTION3 :=
22         $(PACKAGE) keeps track of the age and the state of existing snapshots and
23         triggers snapshot creation and removal according to the configuration
24         settings. It tries to maintain a scheme where many recent snapshots
25         and few old snapshots exist, for example 16 snapshots newer than a
26         week, 8 snapshots between one and two weeks old, 4 snapshots between
27         two and three weeks old, and so on.
28 endef
29 AUTHOR := Andre Noll
30 EMAIL := maan@tuebingen.mpg.de
31 URL := https://people.tuebingen.mpg.de/maan/$(PACKAGE)/
32 CLONE_URL := https://git.tuebingen.mpg.de/$(PACKAGE)
33 GITWEB_URL := https://git.tuebingen.mpg.de/$(PACKAGE).git
34 PACKAGE_HOMEPAGE := https://people.tuebingen.mpg.de/maan/$(PACKAGE)/
35 HOME_URL := https://people.tuebingen.mpg.de/maan/
36 LICENSE := GPL-2.0
37 LICENSE_URL := https://www.gnu.org/licenses/
38
39 PREFIX ?= /usr/local
40 INSTALL ?= install
41 INSTALL_PROGRAM ?= $(INSTALL)
42 INSTALL_DATA ?= $(INSTALL) -m 644
43 MKDIR_P := mkdir -p
44 B := build
45 VERSION := $(shell $(MKDIR_P) $(B) && ./version-gen.sh $(PACKAGE) $(B)/version.c)
46 RM := rm -f
47 LSG := lopsubgen
48 GROFF := groff -m man -Thtml -P -l -P -r
49 GZIP := gzip -cfn9
50 M4 := m4 \
51         -D "AUTHOR=$(AUTHOR)" \
52         -D "PACKAGE=$(PACKAGE)" \
53         -D "SLOGAN=$(SLOGAN)" \
54         -D "EMAIL=$(EMAIL)" \
55         -D "URL=$(URL)" \
56         -D "CLONE_URL=$(CLONE_URL)" \
57         -D "GITWEB_URL=$(GITWEB_URL)" \
58         -D "HOME_URL=$(HOME_URL)" \
59         -D "PACKAGE_HOMEPAGE=$(PACKAGE_HOMEPAGE)" \
60         -D "LICENSE=$(LICENSE)" \
61         -D "LICENSE_URL=$(LICENSE_URL)" \
62         -D "DESCRIPTION1=$(DESCRIPTION1)" \
63         -D "DESCRIPTION2=$(DESCRIPTION2)" \
64         -D "DESCRIPTION3=$(DESCRIPTION3)"
65 c_source := $(PACKAGE) str file exec sig daemon df tv snap ipc
66 c_generated := $(B)/$(PACKAGE).lsg $(B)/version
67 objs := $(addsuffix .o, $(c_generated) $(addprefix $(B)/, $(c_source)))
68 deps := $(objs:.o=.d)
69 all := $(PACKAGE) $(PACKAGE).1.gz
70
71 all: $(all)
72 man: $(PACKAGE).1.gz
73 $(objs): $(B)/$(PACKAGE).lsg.h Makefile
74 -include $(deps)
75
76 DSS_CPPFLAGS += -Wunused-macros
77 DSS_CPPFLAGS += -I$(B)
78
79 DSS_CFLAGS := -Wno-sign-compare -g -Wunused -Wundef
80 DSS_CFLAGS += -Wredundant-decls
81 DSS_CFLAGS += -Os
82 DSS_CFLAGS += -Wall
83 DSS_CFLAGS += -Wuninitialized
84 DSS_CFLAGS += -Wchar-subscripts
85 DSS_CFLAGS += -Wformat-security
86 DSS_CFLAGS += -Werror-implicit-function-declaration
87 DSS_CFLAGS += -Wmissing-format-attribute
88 DSS_CFLAGS += -Wunused-parameter
89 DSS_CFLAGS += -Wbad-function-cast
90 DSS_CFLAGS += -Wshadow
91
92 CC_CMD = $(CC) -c -o $@ $(DSS_CPPFLAGS) $(CPPFLAGS) $(DSS_CFLAGS) $(CFLAGS) \
93                 -MMD -MF $(B)/$(*F).d -MT $@ $<
94
95 .ONESHELL:
96 .SHELLFLAGS := -ec
97 ifeq ("$(origin V)", "command line")
98         SAY =
99 else
100         SAY = @printf '%s\n' '$(strip $(1))'
101 endif
102 $(B)/version.c:
103         $(call SAY, VG $@)
104         ./version-gen.sh $(PACKAGE) version.c > /dev/null
105 $(PACKAGE): $(objs)
106         $(call SAY, LD $@)
107         $(CC) -o $@ $(objs) $(LDFLAGS) -llopsub
108 $(B)/%.o: $(B)/%.c
109         $(call SAY, CC $<)
110         $(CC_CMD)
111 $(B)/%.o: %.c
112         $(call SAY, CC $<)
113         $(CC_CMD)
114
115 .PHONY: all clean install README
116 .PRECIOUS: $(B)/%.lsg.c $(B)/%.lsg.h $(B)/%.suite $(B)/%.1
117 $(B)/$(PACKAGE).suite: $(PACKAGE).suite.m4 Makefile
118         $(call SAY, M4 $<)
119         $(M4) $< > $@
120 $(B)/%.lsg.h: $(B)/%.suite
121         $(call SAY, LSGH $<)
122         $(LSG) --gen-h=$@ < $<
123 $(B)/%.lsg.c: $(B)/%.suite
124         $(call SAY, LSGC $<)
125         $(LSG) --gen-c=$@ < $<
126 $(B)/%.1: $(B)/%.suite
127         $(call SAY, LSGM $<)
128         $(LSG) --gen-man=$@ --version-string=$(VERSION) < $<
129 %.1.gz: $(B)/%.1
130         $(call SAY, GZIP $<)
131         $(GZIP) < $< > $@
132 $(B)/%.1.html: $(B)/%.1
133         $(call SAY, GROFF $<)
134         $(GROFF) $< > $@
135 clean:
136         $(call SAY, CLEAN)
137         $(RM) -r $(B) $(all)
138
139 ifneq ($(findstring strip, $(MAKECMDGOALS)),)
140        strip_option := -s
141 endif
142 bindir := $(DESTDIR)$(PREFIX)/bin
143 mandir := $(DESTDIR)$(PREFIX)/share/man/man1
144 install install-strip: all
145         $(MKDIR_P) $(bindir) $(mandir)
146         $(INSTALL_PROGRAM) $(strip_option) $(PACKAGE) $(bindir)
147         $(INSTALL_DATA) $(PACKAGE).1.gz $(mandir)
148
149 define README :=
150 $(PACKAGE) - $(SLOGAN)
151
152 $(DESCRIPTION1)
153
154 $(DESCRIPTION2)
155
156 $(DESCRIPTION3)
157
158 Resources
159 ~~~~~~~~~
160 web page: $(PACKAGE_HOMEPAGE)
161 git clone URL: $(CLONE_URL)
162 gitweb: $(GITWEB_URL)
163 author home page: $(HOME_URL)
164 report bugs to: $(AUTHOR) <$(EMAIL)>
165 endef
166
167 README:
168         @printf '%s\n' "$(README)"
169
170 $(B)/index.html: index.html.m4 Makefile
171         $(call SAY, M4 $@)
172         $(M4) $< > $@
173
174 -include Makefile.local