# SPDX-License-Identifier: GPL-2.0
PACKAGE := dss
-SLOGAN := the dyadic snapshot scheduler
-define DESCRIPTION1 :=
- $(PACKAGE) maintains hardlink-based snapshots of a given directory on a
- remote or local host using rsync's link-dest feature. The snapshots
- are organized so that any snapshot can directly be deployed as an
- (emergency) replacement for the primary system.
-endef
-define DESCRIPTION2 :=
- $(PACKAGE) is admin friendly: It is easy to configure and needs little
- attention after the initial setup. In particular, no full, incremental
- or differential backups need to be configured, and there is no database
- to maintain. $(PACKAGE) is also user-friendly: Assuming the snapshot server
- allows read-only user access over the network, users can restore
- accidentically removed files without admin intervention, using their
- favorite file browser to copy files from the snapshot directory back
- to the primary system.
-endef
-define DESCRIPTION3 :=
- $(PACKAGE) keeps track of the age and the state of existing snapshots and
- triggers snapshot creation and removal according to the configuration
- settings. It tries to maintain a scheme where many recent snapshots
- and few old snapshots exist, for example 16 snapshots newer than a
- week, 8 snapshots between one and two weeks old, 4 snapshots between
- two and three weeks old, and so on.
-endef
-AUTHOR := Andre Noll
-EMAIL := maan@tuebingen.mpg.de
-URL := https://people.tuebingen.mpg.de/maan/$(PACKAGE)/
-CLONE_URL := https://git.tuebingen.mpg.de/$(PACKAGE)
-GITWEB_URL := https://git.tuebingen.mpg.de/$(PACKAGE).git
-PACKAGE_HOMEPAGE := https://people.tuebingen.mpg.de/maan/$(PACKAGE)/
-HOME_URL := https://people.tuebingen.mpg.de/maan/
-LICENSE := GPL-2.0
-LICENSE_URL := https://www.gnu.org/licenses/
-
PREFIX ?= /usr/local
INSTALL ?= install
INSTALL_PROGRAM ?= $(INSTALL)
INSTALL_DATA ?= $(INSTALL) -m 644
MKDIR_P := mkdir -p
-VERSION := $(shell ./version-gen.sh $(PACKAGE) version.c)
+B := build
+VERSION := $(shell $(MKDIR_P) $(B) && ./version-gen.sh $(PACKAGE) $(B)/version.c)
RM := rm -f
LSG := lopsubgen
-GROFF := groff -m man -Thtml -P -l -P -r
+GROFF := groff -m man -t -Thtml -P -l -P -r -P -I -P image
GZIP := gzip -cfn9
-units := $(PACKAGE) $(PACKAGE).lsg str file exec sig daemon df tv snap ipc version
-M4 := m4 \
- -D "AUTHOR=$(AUTHOR)" \
- -D "PACKAGE=$(PACKAGE)" \
- -D "SLOGAN=$(SLOGAN)" \
- -D "EMAIL=$(EMAIL)" \
- -D "URL=$(URL)" \
- -D "CLONE_URL=$(CLONE_URL)" \
- -D "GITWEB_URL=$(GITWEB_URL)" \
- -D "HOME_URL=$(HOME_URL)" \
- -D "PACKAGE_HOMEPAGE=$(PACKAGE_HOMEPAGE)" \
- -D "LICENSE=$(LICENSE)" \
- -D "LICENSE_URL=$(LICENSE_URL)" \
- -D "DESCRIPTION1=$(DESCRIPTION1)" \
- -D "DESCRIPTION2=$(DESCRIPTION2)" \
- -D "DESCRIPTION3=$(DESCRIPTION3)"
-objs := $(addsuffix .o, $(units))
-deps := $(addsuffix .d, $(units))
+GIT := git
+M4 := m4 -D "PACKAGE=$(PACKAGE)" defs.m4
+c_source := $(PACKAGE) str file exec sig daemon df tv snap ipc
+c_generated := $(B)/$(PACKAGE).lsg $(B)/version
+objs := $(addsuffix .o, $(c_generated) $(addprefix $(B)/, $(c_source)))
+deps := $(objs:.o=.d)
all := $(PACKAGE) $(PACKAGE).1.gz
+www := $(B)/index.html $(B)/$(PACKAGE).1.html
all: $(all)
+www: $(www)
man: $(PACKAGE).1.gz
-$(objs): $(PACKAGE).lsg.h Makefile
+$(objs): $(B)/$(PACKAGE).lsg.h Makefile
-include $(deps)
DSS_CPPFLAGS += -Wunused-macros
+DSS_CPPFLAGS += -I$(B)
DSS_CFLAGS := -Wno-sign-compare -g -Wunused -Wundef
DSS_CFLAGS += -Wredundant-decls
DSS_CFLAGS += -Wbad-function-cast
DSS_CFLAGS += -Wshadow
+CC_CMD = $(CC) -c -o $@ $(DSS_CPPFLAGS) $(CPPFLAGS) $(DSS_CFLAGS) $(CFLAGS) \
+ -MMD -MF $(B)/$(*F).d -MT $@ $<
+
.ONESHELL:
.SHELLFLAGS := -ec
ifeq ("$(origin V)", "command line")
else
SAY = @printf '%s\n' '$(strip $(1))'
endif
-version.c:
+$(B)/version.c:
$(call SAY, VG $@)
./version-gen.sh $(PACKAGE) version.c > /dev/null
$(PACKAGE): $(objs)
$(call SAY, LD $@)
$(CC) -o $@ $(objs) $(LDFLAGS) -llopsub
-%.o: %.c
+$(B)/%.o: $(B)/%.c
$(call SAY, CC $<)
- $(CC) -c -o $@ $(DSS_CPPFLAGS) $(CPPFLAGS) $(DSS_CFLAGS) $(CFLAGS) \
- -MMD -MF $(*F).d -MT $@ $<
-.PHONY: all clean install README
-.PRECIOUS: %.lsg.c %.lsg.h %.suite %.1
-$(PACKAGE).suite: $(PACKAGE).suite.m4 Makefile
+ $(CC_CMD)
+$(B)/%.o: %.c
+ $(call SAY, CC $<)
+ $(CC_CMD)
+
+.PHONY: all www clean distclean maintainer-clean install README
+.PRECIOUS: $(B)/%.lsg.c $(B)/%.lsg.h $(B)/%.suite $(B)/%.1
+$(B)/$(PACKAGE).suite: $(PACKAGE).suite.m4 defs.m4 Makefile
$(call SAY, M4 $<)
$(M4) $< > $@
-%.lsg.h: %.suite
+$(B)/%.lsg.h: $(B)/%.suite
$(call SAY, LSGH $<)
$(LSG) --gen-h=$@ < $<
-%.lsg.c: %.suite
+$(B)/%.lsg.c: $(B)/%.suite
$(call SAY, LSGC $<)
$(LSG) --gen-c=$@ < $<
-%.1: %.suite
+$(B)/%.1: $(B)/%.suite
$(call SAY, LSGM $<)
$(LSG) --gen-man=$@ --version-string=$(VERSION) < $<
-%.1.gz: %.1
+%.1.gz: $(B)/%.1
$(call SAY, GZIP $<)
$(GZIP) < $< > $@
-%.1.html: %.1
+$(B)/%.1.html: $(B)/%.1
$(call SAY, GROFF $<)
- $(GROFF) $< > $@
+ cd $(B)
+ $(GROFF) ../$< > ../$@
+$(B)/index.html: index.html.m4 Makefile defs.m4 dss.svg
+ $(call SAY, M4 $@)
+ $(M4) $< > $@
clean:
$(call SAY, CLEAN)
- $(RM) *.[od] $(all) *.html $(PACKAGE).1 $(PACKAGE).suite \
- $(PACKAGE).lsg.[ch] version.c
+ $(RM) $(B)/*.o $(B)/*.d $(all) $(www)
+distclean: clean
+ $(call SAY, DISTCLEAN)
+ $(RM) -r $(B)
+maintainer-clean: distclean
+ $(call SAY, MAINTANER-CLEAN)
+ $(GIT) clean -dfqxe Makefile.local
ifneq ($(findstring strip, $(MAKECMDGOALS)),)
strip_option := -s
$(INSTALL_PROGRAM) $(strip_option) $(PACKAGE) $(bindir)
$(INSTALL_DATA) $(PACKAGE).1.gz $(mandir)
-define README :=
-$(PACKAGE) - $(SLOGAN)
-
-$(DESCRIPTION1)
-
-$(DESCRIPTION2)
-
-$(DESCRIPTION3)
-
-Resources
-~~~~~~~~~
-web page: $(PACKAGE_HOMEPAGE)
-git clone URL: $(CLONE_URL)
-gitweb: $(GITWEB_URL)
-author home page: $(HOME_URL)
-report bugs to: $(AUTHOR) <$(EMAIL)>
-endef
-
README:
- @printf '%s\n' "$(README)"
-
-index.html: index.html.m4 Makefile
- $(call SAY, M4 $@)
- $(M4) $< > $@
+ @$(M4) README.m4
-include Makefile.local