dot/gpg.conf.m4, dot/gpg-agent.conf, Makefile: Adopt GnuPG configuration.
[profile] / Makefile
index 8c0aa48..29359c0 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,11 @@
 ## -*-makefile-*-
 
-all::
+all:
+.PHONY: all
+
+clean::
+.PHONY: clean
+
 .SECONDEXPANSION: #sorry
 
 ###--------------------------------------------------------------------------
@@ -21,10 +26,15 @@ symlink-ok-p                 = $(shell \
 
 ## 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                   =
@@ -33,7 +43,7 @@ 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)
@@ -46,8 +56,9 @@ endif
 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
@@ -64,25 +75,38 @@ _force:
 ###--------------------------------------------------------------------------
 ### Emacs.
 
+ifneq ($(EMACS),nil)
+
 EMACSLIB                = $(HOME)/lib/emacs
 
+EMACS_VERSION          := $(shell $(EMACS) 2>&1 -Q --batch --eval \
+       '(message "%s %s" emacs-major-version emacs-minor-version)' | \
+       tail -n1)
+emacs-version-p                 = $(shell set -- $(EMACS_VERSION); \
+       if [ $$1 -gt $1 ] || ([ $$1 -eq $1 ] && [ $$2 -ge $2 ]); then \
+         echo t; \
+       fi)
+
 ELISP                  += make-regexp ew-hols
 ELISP                  += mdw-gnus-patch
 ELISP                  += mdw-multiple-cursors
 ELISP                  += git git-blame vc-git stgit quilt
+
+ifeq ($(call emacs-version-p,24,3),t)
 ELISP                  += bracketed-paste
+endif
 
 ELISP                  += dot-emacs
 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
 
@@ -90,8 +114,8 @@ LOCAL_ELISP           = $(filter $(notdir $(wildcard el/*.el)), \
                                $(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 $@
@@ -108,16 +132,18 @@ $(foreach e, $(REMOTE_ELISP), \
                                          (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
+
 ###--------------------------------------------------------------------------
 ### Other simpler things.
 
@@ -133,20 +159,42 @@ checkpath_DEPS             = mlib
 ## 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
-DOTLINKS               += .shrc .rcrc
-DOTLINKS               += .zprofile .zshrc .zshenv
-DOTLINKS               += .bash_profile .bash_completion .bashrc .inputrc
+DOTLINKS               += .shrc
+DOTLINKS               += .zprofile .zshrc .zlogout .zshenv
+DOTLINKS               += .bash_profile .bash_completion .bash_logout
+DOTLINKS               += .bashrc .inputrc
 .bash_profile_SRC       = bash-profile
 .bash_completion_SRC    = bash-completion
+.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
+$(HOME)/.rcrc: dot/rcrc
+       $(call v_tag,SED)sed 's/; if not/else/' $< >$@.new && mv $@.new $@
 
 ## Git.
 DOTSUBST               += .gitconfig
+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.
@@ -162,18 +210,23 @@ DOTLINKS          += .vimrc .mg .zile
 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
@@ -181,18 +234,54 @@ DOTLINKS          += .tclshrc .wishrc
 .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
 
@@ -210,8 +299,14 @@ DOTLINKS           += .mc/ini .mc/panels.ini
 .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.
@@ -223,12 +318,10 @@ xtoys_CHECK                = xatom
 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
 
@@ -247,17 +340,65 @@ DOTLINKS          += .config/gtk-3.0/settings.ini
 .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 -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)
@@ -265,53 +406,71 @@ 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 $@
+       $(dotfile-hook/$*)
 
 ## Hack by making simple substitutions.
 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 dotsubst-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!" \
                        $(SUBSTS) $($*_SUBSTS) \
                        $(call dotfile-source,$*,.in) >$@.new && \
                mv $@.new $@
+       $(dotfile-hook/$*)
 
 ###--------------------------------------------------------------------------
 ### Processing script links.
 
 script-source           = $(HERE)/bin/$(or $($1_SRC), $1)
+
+ifeq ($(prefix-shebang-p),t)
+all: $(addprefix $(HOME)/bin/, $(SCRIPTLINKS))
+$(addprefix $(HOME)/bin/, $(SCRIPTLINKS)): $(HOME)/bin/%: \
+               $$(call script-source,$$*) Makefile | $$(dir $$@)
+       $(call v_tag,SHEBANG) \
+               rm -f $@.new && \
+               sed "1s\a\(#! *\)/\a\1$(SHEBANG_PREFIX)/\a" \
+                       $(call script-source,$*) >$@.new && \
+               chmod --reference=$(call script-source,$*) $@.new && \
+               mv $@.new $@
+       $(script-hook/$*)
+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.
@@ -325,8 +484,8 @@ $(foreach p, $(PACKAGES), $(eval DEP_$p = $(if $(shell \
        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 $@
@@ -366,8 +525,9 @@ $(foreach p, $(PACKAGES), $(call pkg-stamp,$p,install)): \
        $(call v_tag,INSTALL)cd $(dir $@) && \
                $(MAKE) $($*_MAKEFLAGS) install >>buildlog 2>&1 && \
                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 --------------------------------------------------