### 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
###--------------------------------------------------------------------------
### 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 += aspell-hack emerge-hack
%.elc: %.el $$(foreach e, $$($$*_DEPS), $$(DEP_$$e))
- $(call v_tag,EMACS)$(EMACS) -L el/ -L $(EMACSLIB) \
+ $(call v_tag,EMACS)if ! $(EMACS) >$*.build-log 2>&1 \
+ -L el/ -L $(EMACSLIB) \
--batch --no-site-file \
- --eval '(byte-compile-file "$<")'
+ --eval '(byte-compile-file "$<")'; then \
+ cat $*.build-log; exit 2; \
+ fi
LOCAL_ELISP = $(filter $(notdir $(wildcard el/*.el)), \
$(addsuffix .el, $(ELISP)))
all:: $(foreach e, $(ELISP), $(DEP_$e))
$(foreach e, $(ELISP), $(eval _emacs.$e: $(EMACSLIB)/$e.elc))
+endif
+
###--------------------------------------------------------------------------
### Other simpler things.
## 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
+
+## 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))
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
DOTSUBST += .mykermrc
SCRIPTLINKS += lesspipe.sh
SCRIPTLINKS += xinitcmd lock-screen xshutdown
SCRIPTLINKS += un-backslashify-selection
SCRIPTLINKS += xpra-start-xdummy
+SCRIPTLINKS += play-rawk
+SCRIPTLINKS += media-keys
+SCRIPTLINKS += disorder-notify
DOTCPP += .Xdefaults
Xdefaults_DEFS = -DEMACSWD=$(call mdw-conf,emacs-width,77)
$(HOME)/.Xdefaults: $(HOME)/.mdw.conf
+ifeq ($(shell case $${DISPLAY-nil} in (:[0-9]*) echo t ;; (*) echo nil ;; esac),t)
+dotfile-hook/.Xdefaults = \
+ $(call v_tag,XRDB)xrdb -override $<
+endif
+
endif
###--------------------------------------------------------------------------
rm -f $@.new && \
ln -s $(call dotfile-source,$*) $@.new && \
mv $@.new $@
+ $(dotfile-hook/$*)
## Hack with the C preprocessor.
all:: $(addprefix $(HOME)/, $(DOTCPP))
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,profile,$(HERE))
all:: $(addprefix $(HOME)/, $(DOTSUBST))
$(addprefix $(HOME)/, $(subst %,\%,$(DOTSUBST))): $(HOME)/%: \
- $$(call dotsubst-source,$$*,.in) Makefile
+ $$(call dotfile-source,$$*,.in) Makefile
$(call v_tag,SUBST)mkdir -p $(dir $@) && \
rm -f $@.new && \
sed -e "1i\
$(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
+ $(call v_tag,SHEBANG)mkdir -p $(dir $@) && \
+ 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))
rm -f $@.new && \
ln -s $(call script-source,$*) $@.new && \
mv $@.new $@
+ $(script-hook/$*)
+endif
all:: $(addprefix $(HOME)/bin/, $(SCRIPTLINKS))
$(call v_tag,INSTALL)cd $(dir $@) && \
$(MAKE) $($*_MAKEFLAGS) install >>buildlog 2>&1 && \
touch install-stamp
+ $(package-hook/$*)
all:: $(foreach p, $(PACKAGES), $(DEP_$p))
$(foreach p, $(PACKAGES), $(eval _pkg.$p: $(call pkg-stamp,$p,install)))