# Generalizing Makefiles for All Occasions - Rules are bad, - standards are good, - habits are better. *** # General Standards - `make help` - `make check` - `sudo make install` **NB:** we separate `make` from `make install` so that the files are not build with the user `root` as the owner. *** # Service Standards - `make backup.tgz` - `make install` ## Service Backups in Two Files - `configs`: configuration files, all tracked in git. - `store`: passwords and binary files, not tracked in git. ## New Abilities Unlocked - Open Access Administration. - Sharing admin configs with hacker spaces. *** ## BEHOLD: The Everything Makefile *** ```make CONFIGS = $(patsubst /%,%,$(shell cat configs)) STORE = $(patsubst /%,%,$(shell cat store)) CP = mkdir -p $(dir $@) && cp -a IGNORE_FILE = $(shell test -d .git/info && echo .git/info/exclude || echo .gitignore) GIT_COMMIT = git commit -m"add $@" --no-gpg-sign --no-signoff SELECTOR != command -v sk || command -v fzy || command -f fzf .PHONY: all all: init backup.tgz $(IGNORE_FILE) backup.tgz: $(CONFIGS) $(STORE) tar czf $@ $^ $(IGNORE_FILE): store echo $(STORE) backup.tgz | tr ' ' '\n' > $@ .PHONY: init init: configs store configs store: while con="$$(find /var /etc/ /sys/ -maxdepth 2 -mindepth 1 -type f 2>/dev/null | $(SELECTOR) -p "Select files for $@\nPress Ctrl+d once done")"; do \ echo "$$con"; \ done > $@ $(CONFIGS): %: /% $(CP) $< $@ git add $@ $(GIT_COMMIT) $(info made git commit for $@) $(STORE): %: /% $(CP) $< $@ clean: $(RM) -r $(CONFIGS) $(STORE) backup.tgz ``` *** ## Example: Soft Serve Makefile
The `configs` file: ``` /etc/soft-serve.conf /var/lib/soft-serve/data/config.yaml /var/lib/soft-serve/data/file /etc/nginx/sites-enabled/soft.dmz.rs /etc/nginx/sites-available/soft.dmz.rs ```
The `store` file: ``` /var/lib/soft-serve/data/lfs /var/lib/soft-serve/data/repo /var/lib/soft-serve/data/soft /etc/letsencrypt/archive/soft /etc/letsencrypt/live/soft.dm /var/lib/soft-serve/data/ssh/ ``` *** # Other Build Systems > "*What if I want to use this other thing, instead of a makefile?" *** # Other Build Systems (Sans Heresy) > "*What if I want to use this other thing, instead of a makefile?" - Easy: just use a Makefile. ```make [ ... ] public/: src/ python build_pages.py ```