## -*-makefile-*-
-all::
+all:
+.PHONY: all
+
+clean::
+.PHONY: clean
+
.SECONDEXPANSION: #sorry
###--------------------------------------------------------------------------
## Silent rules machinery.
V = 0
-v_tag = $(call v_tag_$V,$1,$2)
-v_tag_0 = @printf " %-8s %s\n" "$1" $(call quote,$@);
V_AT = $(V_AT_$V)
V_AT_0 = @
+v_print = $(call v_print_$V,$1,$2)
+v_print_0 = \
+ printf " %-8s %s\n" "$1" $(call quote,$(patsubst $(HOME)/%,~/%,$2));
+v_tag = $(V_AT)$(call v_print_$V,$1,$@)
+
+## Making directories.
+%/:; $(call v_tag,MKDIR)mkdir -p $@
## Hack.
relax =
### Configuration.
## Figure out where I am.
-HERE = $(shell pwd)
+HERE := $(shell pwd)
## Decide on how to fetch things from URLs.
ifeq ($(shell (curl >/dev/null 2>&1 --version || [ $$? -eq 2 ]) && echo t),t)
EMACS := $(shell \
emacs=nil; \
for i in emacs24 emacs23 emacs22 emacs21 emacs; do \
- if type >/dev/null 2>&1 $$i; then echo $$i; break; fi; \
- done)
+ if type >/dev/null 2>&1 $$i; then emacs=$$i; break; fi; \
+ done; \
+ echo $$emacs)
## Whence to obtain externally hosted stuff.
REPO = https://ftp.distorted.org.uk/u/mdw/profile
dot-emacs_DEPS = make-regexp
SCRIPTLINKS += emacsclient-hack movemail-hack sendmail-hack
-SCRIPTLINKS += aspell-hack emerge-hack
+SCRIPTLINKS += aspell-hack emerge-hack wakey.sh
%.elc: %.el $$(foreach e, $$($$*_DEPS), $$(DEP_$$e))
$(call v_tag,EMACS)if ! $(EMACS) >$*.build-log 2>&1 \
-L el/ -L $(EMACSLIB) \
--batch --no-site-file \
- --eval '(byte-compile-file "$<")'; then \
+ --eval '(kill-emacs (if (byte-compile-file "$<") 0 2))'; then \
cat $*.build-log; exit 2; \
fi
$(addsuffix .el, $(ELISP)))
$(foreach e, $(LOCAL_ELISP), \
$(eval DEP_$(basename $e) = $(EMACSLIB)/$(e:.el=.elc)))
-$(addprefix $(EMACSLIB)/, $(LOCAL_ELISP)): $(EMACSLIB)/%: el/%
- $(call v_tag,SYMINK)mkdir -p $(EMACSLIB) && \
+$(addprefix $(EMACSLIB)/, $(LOCAL_ELISP)): $(EMACSLIB)/%: el/% | $(EMACSLIB)/
+ $(call v_tag,SYMINK) \
rm -f $@.new && \
ln -s $(HERE)/$< $@.new && \
mv $@.new $@
(error 1))))'; then \
echo t; \
fi),, $(EMACSLIB)/$(e:.el=.elc))))
-$(addprefix $(EMACSLIB)/, $(REMOTE_ELISP)): $(EMACSLIB)/%:
- $(call v_tag,FETCH)mkdir -p $(EMACSLIB) && \
+$(addprefix $(EMACSLIB)/, $(REMOTE_ELISP)): $(EMACSLIB)/%: | $(EMACSLIB)/
+ $(call v_tag,FETCH) \
$(call get-url,$@.new,$(REPO)/$*) && \
mv $@.new $@
DOTLINKS += .emacs .emacs-calc .vm .gnus.el .ercrc.el
-all:: $(foreach e, $(ELISP), $(DEP_$e))
+all: $(foreach e, $(ELISP), $(DEP_$e))
$(foreach e, $(ELISP), $(eval _emacs.$e: $(EMACSLIB)/$e.elc))
endif
## Packaging machinery.
SCRIPTLINKS += mdw-build mdw-sbuild mdw-sbuild-server
SCRIPTLINKS += update-buildable-branch
+DOTLINKS += .config/mdw-build.conf
+.config/mdw-build.conf_SRC = mdw-build.conf
## Shells.
DOTLINKS += .profile .shell-rc .shell-logout
.bash_logout_SRC = shell-logout
.zlogout_SRC = shell-logout
+all: zap-stale-zcompdump
+zap-stale-zcompdump:
+ $(V_AT)if [ $(HOME)/.zcompdump -ot dot/zshrc ]; then \
+ $(call v_print,ZAP,$(HOME)/.zcompdump)rm -f $(HOME)/.zcompdump; \
+ fi
+.PHONY: zap-stale-zcompdump
+
## The Plan 9 `rc' shell. This needs special hacking, because the Linux port
## and Plan 9 From User Space have incompatible syntax.
DOTLINKS += lib/profile
lib/profile_SRC = rcrc
-all:: $(HOME)/.rcrc
+all: $(HOME)/.rcrc
$(HOME)/.rcrc: dot/rcrc
$(call v_tag,SED)sed 's/; if not/else/' $< >$@.new && mv $@.new $@
SCRIPTLINKS += git-copyright-dates
DOTLINKS += .cgrc .tigrc
.gitconfig_SUBSTS = \
- $(call substvar,releasekey,$(call mdw-conf,release-key,481334C2))
+ $(call substvar,releasekey,$(call mdw-conf,releasekey,481334C2)) \
+ $(call substvar,email,$(call mdw-conf,email,mdw@distorted.org.uk))
$(HOME)/.gitconfig: $(HOME)/.mdw.conf
## PulseAudio.
DOTLINKS += .mailrc .signature .muttrc
## Lisp.
-DOTLINKS += .cmucl-init.lisp .sbclrc .clisprc.lisp .eclrc
+DOTLINKS += .cmucl-init.lisp .sbclrc .clisprc.lisp
+DOTLINKS += .eclrc .ccl-init.lisp .abclrc
.cmucl-init.lisp_SRC = lisp-init.lisp
.sbclrc_SRC = lisp-init.lisp
.clisprc.lisp_SRC = lisp-init.lisp
.eclrc_SRC = lisp-init.lisp
+.ccl-init.lisp_SRC = lisp-init.lisp
+.abclrc_SRC = lisp-init.lisp
DOTLINKS += .swank.lisp
-## IPython.
+## IPython, Jupyter, and related annoyances.
DOTLINKS += .ipython/profile_default/ipython_config.py
DOTLINKS += .ipython/profile_default/startup/50-key-bindings.py
+DOTLINKS += .jupyter/nbconfig/notebook.json
.ipython/profile_default/ipython_config.py_SRC = ipython-config.py
.ipython/profile_default/startup/50-key-bindings.py_SRC = ipython-key-bindings.py
+.jupyter/nbconfig/notebook.json_SRC = jupyter-notebook.json
## Other languages.
DOTLINKS += .guile
.tclshrc_SRC = tclshrc
.wishrc_SRC = tclshrc
+## The `nocss' machinery.
+SCRIPTLINKS += nocss
+all: $(HOME)/lib/hacks/nocss/libdvdcss.so.2
+$(HOME)/lib/hacks/nocss/libdvdcss.so.2: | $$(dir $$@)
+ $(call v_tag,TOUCH)touch $@
+
+## GnuPG.
+all: $(HOME)/.gnupg/gpg.conf
+$(HOME)/.gnupg/gpg.conf: \
+ dot/gpg.conf.m4 $(wildcard $(HOME)/.gnupg/gpg.local.conf) \
+ $(HOME)/.mdw.conf \
+ | $$(dir $$@)
+ $(call v_tag,M4)cd $(dir $@) && \
+ args= && \
+ key=$$(mdw-conf default-gpg-key nil) && \
+ case $$key in \
+ nil) ;; \
+ *) args=$${args+$$args }-DDEFAULT_KEY=$$key ;; \
+ esac && \
+ cd $(dir $@) && m4 -P $$args $(HERE)/$< >$@.new && \
+ mv $@.new $@
+DOTLINKS += .gnupg/gpg-agent.conf
+.gnupg/gpg-agent.conf_SRC = gpg-agent.conf
+
## Random scripts.
SCRIPTLINKS += mdw-editor mdw-pager
SCRIPTLINKS += mdw-conf
SCRIPTLINKS += svnwrap
SCRIPTLINKS += guest-console
SCRIPTLINKS += hyperspec
+SCRIPTLINKS += bdl
+SCRIPTLINKS += datasyms
+SCRIPTLINKS += fixsub
+SCRIPTLINKS += check-debsyms
+SCRIPTLINKS += check-blkdev-size
+SCRIPTLINKS += xremote
+SCRIPTLINKS += disorder-play-on-demand remote-disorder
+SCRIPTLINKS += remote-slideshow
## Random odds and ends.
-DOTLINKS += .lesskey .infokey .sqliterc
+DOTLINKS += .infokey .sqliterc
DOTLINKS += .gdbinit .toprc .aspell.conf
DOTLINKS += .dircolors .colordiffrc .screenrc .tmux.conf
DOTLINKS += .cvsrc .indent.pro .ditz-config
DOTLINKS += .lftp/rc
.lftp/rc_SRC = lftp-rc
+DOTLINKS += .a2ps/a2psrc
+.a2ps/a2psrc_SRC = a2psrc
DOTSUBST += .mykermrc
SCRIPTLINKS += lesspipe.sh
.mc/ini_SRC = mc-ini
.mc/panels.ini_SRC = mc-panels.ini
-DOTLINKS += .parallel/config
+DOTLINKS += .parallel/config .parallel/sshloginfile
.parallel/config_SRC = parallel-config
+.parallel/sshloginfile_SRC = parallel-hosts
+
+all: $(HOME)/.less
+$(HOME)/.less: dot/lesskey
+ $(V_AT)rm -f $(HOME)/.lesskey
+ $(call v_tag,LESSKEY)lesskey -o$@ $<
###--------------------------------------------------------------------------
### X11 configuration.
xtoys_DEPS = mlib
DOTLINKS += .xinitrc .xsession .xmodmap .vncrc .vncsession
-DOTLINKS += .fonts.conf
+DOTLINKS += .config/fontconfig/fonts.conf
+.config/fontconfig/fonts.conf_SRC = fonts.conf
DOTLINKS += .stalonetrayrc
-DOTLINKS += .putty/sessions/Default%20Settings
-.putty/sessions/Default%20Settings_SRC = putty-defaults
-
DOTLINKS += .config/gnome-session/sessions/mdw.session
.config/gnome-session/sessions/mdw.session_SRC = mdw.session
.config/gtk-3.0/gtk.css_SRC = gtk3.css
.config/gtk-3.0/settings.ini_SRC = gtk3-settings.ini
+DOTLINKS += .config/user-dirs.dirs .config/user-dirs.locale
+.config/user-dirs.dirs_SRC = user-dirs.dirs
+.config/user-dirs.locale_SRC = user-dirs.locale
+
SCRIPTLINKS += xinitcmd lock-screen xshutdown
SCRIPTLINKS += un-backslashify-selection
SCRIPTLINKS += xpra-start-xdummy
SCRIPTLINKS += play-rawk
+SCRIPTLINKS += x2x-privsep
+SCRIPTLINKS += xduplic-terminal
+SCRIPTLINKS += xzoomscr
DOTCPP += .Xdefaults
Xdefaults_DEFS = -DEMACSWD=$(call mdw-conf,emacs-width,77)
-$(HOME)/.Xdefaults: $(HOME)/.mdw.conf
+$(HOME)/.Xdefaults: $(HOME)/.mdw.conf dot/Xdefaults.pterm
ifeq ($(shell case $${DISPLAY-nil} in (:[0-9]*) echo t ;; (*) echo nil ;; esac),t)
dotfile-hook/.Xdefaults = \
- $(call v_tag,XRDB)xrdb -override $<
+ $(call v_tag,XRDB)xrdb -load $<
+endif
+
endif
+###--------------------------------------------------------------------------
+### Firefox things.
+
+ifeq ($(FIREFOX),t)
+
+clean::; rm -rf out/
+
+all: out/firefox/smartup-gestures.config
+out/firefox/smartup-gestures.config: firefox/smartup-gestures.json | out/firefox/
+ $(call v_tag,BLOB)\
+ jq -c . $< | bincode base64 >$@.new && mv $@.new $@
+
+all: out/firefox/stylus.json
+out/firefox/stylus.json: firefox/stylus/ firefox/stylus/*.css | out/firefox/
+ $(call v_tag,IMPLODE)\
+ firefox/implode-stylus firefox/stylus/ >$@.new && \
+ mv $@.new $@
endif
###--------------------------------------------------------------------------
+### General symlinking.
+
+misclink-source = $(HERE)/$(or $($1_SRC), $1)
+
+all: $(addprefix $(HOME)/, $(MISCLINKS))
+misclink-ok-p = \
+ $(call symlink-ok-p,$(HOME)/$1,$(call misclink-source,$1))
+$(addprefix $(HOME)/, $(subst %,\%,$(MISCLINKS))): $(HOME)/%: \
+ $$(if $$(call misclink-ok-p,$$*),,_force) | $$(dir $$@)
+ $(call v_tag,SYMLINK) \
+ rm -f $@.new && \
+ ln -s $(call misclink-source,$*) $@.new && \
+ mv $@.new $@
+ $(symlink-hook/$*)
+
+###--------------------------------------------------------------------------
### Processing dotfiles.
dotfile-source = $(HERE)/dot/$(or $($1_SRC), $(1:.%=%)$2)
## Easiest: just make symlinks.
dotlink-ok-p = \
$(call symlink-ok-p,$(HOME)/$1,$(call dotfile-source,$1))
-all:: $(addprefix $(HOME)/, $(DOTLINKS))
+all: $(addprefix $(HOME)/, $(DOTLINKS))
$(addprefix $(HOME)/, $(subst %,\%,$(DOTLINKS))): $(HOME)/%: \
- $$(if $$(call dotlink-ok-p,$$*),,_force)
- $(call v_tag,SYMLINK)mkdir -p $(dir $@) && \
+ $$(if $$(call dotlink-ok-p,$$*),,_force) | $$(dir $$@)
+ $(call v_tag,SYMLINK) \
rm -f $@.new && \
ln -s $(call dotfile-source,$*) $@.new && \
mv $@.new $@
$(dotfile-hook/$*)
## Hack with the C preprocessor.
-all:: $(addprefix $(HOME)/, $(DOTCPP))
+all: $(addprefix $(HOME)/, $(DOTCPP))
$(addprefix $(HOME)/, $(subst %,\%,$(DOTCPP))): $(HOME)/%: \
- $$(call dotfile-source,$$*) Makefile
- $(call v_tag,CPP)mkdir -p $(dir $@) && \
+ $$(call dotfile-source,$$*) Makefile | $$(dir $$@)
+ $(call v_tag,CPP) \
rm -f $@.new && \
cpp -P -o$@.new $($*_DEFS) $< && \
mv $@.new $@
substvar = -e $(call quote,s\a@$1@\a$2\ag)
SUBSTS += $(call substvar,home,$(HOME))
SUBSTS += $(call substvar,profile,$(HERE))
-all:: $(addprefix $(HOME)/, $(DOTSUBST))
+all: $(addprefix $(HOME)/, $(DOTSUBST))
$(addprefix $(HOME)/, $(subst %,\%,$(DOTSUBST))): $(HOME)/%: \
- $$(call dotfile-source,$$*,.in) Makefile
- $(call v_tag,SUBST)mkdir -p $(dir $@) && \
+ $$(call dotfile-source,$$*,.in) Makefile | $$(dir $$@)
+ $(call v_tag,SUBST) \
rm -f $@.new && \
sed -e "1i\
$(relax)### generated by $(HERE)/Makefile; do not edit!" \
script-source = $(HERE)/bin/$(or $($1_SRC), $1)
ifeq ($(prefix-shebang-p),t)
-all:: $(addprefix $(HOME)/bin/, $(SCRIPTLINKS))
+all: $(addprefix $(HOME)/bin/, $(SCRIPTLINKS))
$(addprefix $(HOME)/bin/, $(SCRIPTLINKS)): $(HOME)/bin/%: \
- $$(call script-source,$$*) Makefile
- $(call v_tag,SHEBANG)mkdir -p $(dir $@) && \
+ $$(call script-source,$$*) Makefile | $$(dir $$@)
+ $(call v_tag,SHEBANG) \
rm -f $@.new && \
sed "1s\a\(#! *\)/\a\1$(SHEBANG_PREFIX)/\a" \
$(call script-source,$*) >$@.new && \
else
scriptlink-ok-p = \
$(call symlink-ok-p,$(HOME)/bin/$1,$(call script-source,$1))
-all:: $(addprefix $(HOME)/bin/, $(SCRIPTLINKS))
+all: $(addprefix $(HOME)/bin/, $(SCRIPTLINKS))
$(addprefix $(HOME)/bin/, $(SCRIPTLINKS)): $(HOME)/bin/%: \
- $$(if $$(call scriptlink-ok-p,$$*),,_force)
- $(call v_tag,SYMLINK)mkdir -p $(dir $@) && \
+ $$(if $$(call scriptlink-ok-p,$$*),,_force) | $$(dir $$@)
+ $(call v_tag,SYMLINK) \
rm -f $@.new && \
ln -s $(call script-source,$*) $@.new && \
mv $@.new $@
$(script-hook/$*)
endif
-all:: $(addprefix $(HOME)/bin/, $(SCRIPTLINKS))
+all: $(addprefix $(HOME)/bin/, $(SCRIPTLINKS))
###--------------------------------------------------------------------------
### Building packages from source tarballs.
if $($p_CHECK) >/dev/null 2>&1 --version; then echo t; fi),, \
$(call pkg-stamp,$p,install))))
-$(PACKAGES:%=$(SRCDIR)/%.tar.gz): $(SRCDIR)/%.tar.gz:
- $(call v_tag,FETCH)mkdir -p $(SRCDIR) && \
+$(PACKAGES:%=$(SRCDIR)/%.tar.gz): $(SRCDIR)/%.tar.gz: | $(SRCDIR)/
+ $(call v_tag,FETCH) \
rm -f $@.new && \
$(call get-url,$@.new,$(REPO)/$*.tar.gz) && \
mv $@.new $@
touch install-stamp
$(package-hook/$*)
-all:: $(foreach p, $(PACKAGES), $(DEP_$p))
+all: $(foreach p, $(PACKAGES), $(DEP_$p))
$(foreach p, $(PACKAGES), $(eval _pkg.$p: $(call pkg-stamp,$p,install)))
###----- That's all, folks --------------------------------------------------