4 .SECONDEXPANSION
: #sorry
6 ###--------------------------------------------------------------------------
10 quote
= '$(subst ','\'',$1)'#'
12 ## Suss out how to print stuff.
13 print = printf
"%s" $(call quote
,$1)
15 ## Looking configuration things up.
16 mdw-conf
= $(shell bin
/mdw-conf
"$1" "$2")
18 ## Checking symlink targets.
19 symlink-ok-p
= $(shell \
20 case
$$(readlink
2>/dev
/null
$1) in
($2) echo t
;; esac
)
22 ## Silent rules machinery.
26 v_print
= $(call v_print_
$V,$1,$2)
28 printf
" %-8s %s\n" "$1" $(call quote
,$(patsubst $(HOME
)/%,~
/%,$2));
29 v_tag
= $(V_AT
)$(call v_print_
$V,$1,$@
)
34 ###--------------------------------------------------------------------------
37 ## Figure out where I am.
40 ## Decide on how to fetch things from URLs.
41 ifeq ($(shell (curl
>/dev
/null
2>&1 --version ||
[ $$?
-eq
2 ]) && echo t
),t
)
42 get-url
= curl
-fs
-o
$1 $2
44 get-url
= wget
-q
-O
$1 $2
47 ## Which Emacs should I use?
50 for i in emacs24 emacs23 emacs22 emacs21 emacs
; do \
51 if type
>/dev
/null
2>&1 $$i; then emacs
=$$i; break
; fi
; \
55 ## Whence to obtain externally hosted stuff.
56 REPO
= https
://ftp.distorted.org.uk
/u
/mdw
/profile
58 ## Additional local configuration.
61 ###--------------------------------------------------------------------------
62 ### Some utility rules.
67 ###--------------------------------------------------------------------------
72 EMACSLIB
= $(HOME
)/lib
/emacs
74 EMACS_VERSION
:= $(shell $(EMACS
) 2>&1 -Q
--batch
--eval \
75 '(message "%s %s" emacs-major-version emacs-minor-version)' | \
77 emacs-version-p
= $(shell set
-- $(EMACS_VERSION
); \
78 if
[ $$1 -gt
$1 ] ||
([ $$1 -eq
$1 ] && [ $$2 -ge
$2 ]); then \
82 ELISP
+= make-regexp ew-hols
83 ELISP
+= mdw-gnus-patch
84 ELISP
+= mdw-multiple-cursors
85 ELISP
+= git git-blame vc-git stgit quilt
87 ifeq ($(call emacs-version-p
,24,3),t
)
88 ELISP
+= bracketed-paste
92 dot-emacs_DEPS
= make-regexp
94 SCRIPTLINKS
+= emacsclient-hack movemail-hack sendmail-hack
95 SCRIPTLINKS
+= aspell-hack emerge-hack wakey.sh
97 %.elc
: %.el
$$(foreach e
, $$($$*_DEPS
), $$(DEP_
$$e))
98 $(call v_tag
,EMACS
)if
! $(EMACS
) >$*.build-log
2>&1 \
99 -L el
/ -L
$(EMACSLIB
) \
100 --batch
--no-site-file \
101 --eval
'(byte-compile-file "$<")'; then \
102 cat
$*.build-log
; exit
2; \
105 LOCAL_ELISP
= $(filter $(notdir $(wildcard el
/*.el
)), \
106 $(addsuffix .el
, $(ELISP
)))
107 $(foreach e
, $(LOCAL_ELISP
), \
108 $(eval DEP_
$(basename $e) = $(EMACSLIB
)/$(e
:.el
=.elc
)))
109 $(addprefix $(EMACSLIB
)/, $(LOCAL_ELISP
)): $(EMACSLIB
)/%: el
/%
110 $(call v_tag
,SYMINK
)mkdir
-p
$(EMACSLIB
) && \
112 ln
-s
$(HERE
)/$< $@.new
&& \
115 REMOTE_ELISP
= $(filter-out $(notdir $(wildcard el
/*.el
)), \
116 $(addsuffix .el
, $(ELISP
)))
117 $(foreach e
, $(REMOTE_ELISP
), \
118 $(eval DEP_
$(basename $e) = $(if
$(shell \
119 if
$(EMACS
) >/dev
/null
2>&1 --no-site-file
-q
--batch \
122 (kill-emacs (condition-case nil \
123 (progn (load-library "$e") 0) \
124 (error 1))))'; then \
126 fi
),, $(EMACSLIB
)/$(e
:.el
=.elc
))))
127 $(addprefix $(EMACSLIB
)/, $(REMOTE_ELISP
)): $(EMACSLIB
)/%:
128 $(call v_tag
,FETCH
)mkdir
-p
$(EMACSLIB
) && \
129 $(call get-url
,$@.new
,$(REPO
)/$*) && \
132 DOTLINKS
+= .emacs .emacs-calc .vm .gnus.el .ercrc.el
134 all:: $(foreach e
, $(ELISP
), $(DEP_
$e))
135 $(foreach e
, $(ELISP
), $(eval _emacs.
$e: $(EMACSLIB
)/$e.elc
))
139 ###--------------------------------------------------------------------------
140 ### Other simpler things.
143 $(call v_tag
,COPY
)cp mdw.conf
$@.new
&& mv
$@.new
$@
146 PACKAGES
+= mlib checkpath
147 mlib_CHECK
= crc-mktab
148 checkpath_CHECK
= tmpdir
149 checkpath_DEPS
= mlib
151 ## Packaging machinery.
152 SCRIPTLINKS
+= mdw-build mdw-sbuild mdw-sbuild-server
153 SCRIPTLINKS
+= update-buildable-branch
156 DOTLINKS
+= .profile .shell-rc .shell-logout
158 DOTLINKS
+= .zprofile .zshrc .zlogout .zshenv
159 DOTLINKS
+= .bash_profile .bash_completion .bash_logout
160 DOTLINKS
+= .bashrc .inputrc
161 .bash_profile_SRC
= bash-profile
162 .bash_completion_SRC
= bash-completion
163 .bash_logout_SRC
= shell-logout
164 .zlogout_SRC
= shell-logout
167 $(V_AT
)if
[ $(HOME
)/.zcompdump
-ot dot
/zshrc
]; then \
168 $(call v_print
,ZAP
,$(HOME
)/.zcompdump
)rm -f
$(HOME
)/.zcompdump
; \
171 ## The Plan 9 `rc' shell. This needs special hacking, because the Linux port
172 ## and Plan 9 From User Space have incompatible syntax.
173 DOTLINKS
+= lib
/profile
174 lib
/profile_SRC
= rcrc
176 $(HOME
)/.rcrc
: dot
/rcrc
177 $(call v_tag
,SED
)sed
's/; if not/else/' $< >$@.new
&& mv
$@.new
$@
180 DOTSUBST
+= .gitconfig
181 SCRIPTLINKS
+= git-copyright-dates
182 DOTLINKS
+= .cgrc .tigrc
183 .gitconfig_SUBSTS
= \
184 $(call substvar
,releasekey
,$(call mdw-conf
,releasekey
,481334C2
)) \
185 $(call substvar
,email
,$(call mdw-conf
,email
,mdw@distorted.org.uk
))
186 $(HOME
)/.gitconfig
: $(HOME
)/.mdw.conf
189 DOTLINKS
+= .pulse
/daemon.conf
190 DOTSUBST
+= .pulse
/default.pa
191 .pulse
/daemon.conf_SRC
= pulse-daemon.conf
192 .pulse
/default.pa_SRC
= pulse-default.pa.in
195 DOTLINKS
+= .vimrc .mg .zile
198 DOTLINKS
+= .mailrc .signature .muttrc
201 DOTLINKS
+= .cmucl-init.lisp .sbclrc .clisprc.lisp .eclrc
202 .cmucl-init.lisp_SRC
= lisp-init.lisp
203 .sbclrc_SRC
= lisp-init.lisp
204 .clisprc.lisp_SRC
= lisp-init.lisp
205 .eclrc_SRC
= lisp-init.lisp
206 DOTLINKS
+= .swank.lisp
209 DOTLINKS
+= .ipython
/profile_default
/ipython_config.py
210 DOTLINKS
+= .ipython
/profile_default
/startup
/50-key-bindings.py
211 .ipython
/profile_default
/ipython_config.py_SRC
= ipython-config.py
212 .ipython
/profile_default
/startup
/50-key-bindings.py_SRC
= ipython-key-bindings.py
216 DOTLINKS
+= .tclshrc .wishrc
217 .tclshrc_SRC
= tclshrc
218 .wishrc_SRC
= tclshrc
221 SCRIPTLINKS
+= mdw-editor mdw-pager
222 SCRIPTLINKS
+= mdw-conf
223 SCRIPTLINKS
+= svnwrap
224 SCRIPTLINKS
+= guest-console
225 SCRIPTLINKS
+= hyperspec
227 SCRIPTLINKS
+= datasyms
228 SCRIPTLINKS
+= fixsub
229 SCRIPTLINKS
+= check-debsyms
230 SCRIPTLINKS
+= check-blkdev-size
232 ## Random odds and ends.
233 DOTLINKS
+= .infokey .sqliterc
234 DOTLINKS
+= .gdbinit .toprc .aspell.conf
235 DOTLINKS
+= .dircolors .colordiffrc .screenrc .tmux.conf
236 DOTLINKS
+= .cvsrc .indent.pro .ditz-config
238 .lftp
/rc_SRC
= lftp-rc
239 DOTSUBST
+= .mykermrc
240 SCRIPTLINKS
+= lesspipe.sh
242 SCRIPTLINKS
+= run-with-shell-env
243 SCRIPTLINKS
+= start-ssh-agent start-ssh-pageant
244 SCRIPTLINKS
+= add-ssh-keys
245 SCRIPTLINKS
+= hacks
/ssh
/ssh
246 hacks
/ssh
/ssh_SRC
= hacks
/ssh
248 DOTLINKS
+= .w3m
/config .elinks
/elinks.conf
249 .w3m
/config_SRC
= w3m-config
250 .elinks
/elinks.conf_SRC
= elinks.conf
252 DOTLINKS
+= .mc
/ini .mc
/panels.ini
254 .mc
/panels.ini_SRC
= mc-panels.ini
256 DOTLINKS
+= .parallel
/config
257 .parallel
/config_SRC
= parallel-config
260 $(HOME
)/.less
: dot
/lesskey
261 $(V_AT
)rm -f
$(HOME
)/.lesskey
262 $(call v_tag
,LESSKEY
)lesskey
-o
$@
$<
264 ###--------------------------------------------------------------------------
265 ### X11 configuration.
273 DOTLINKS
+= .xinitrc .xsession .xmodmap .vncrc .vncsession
274 DOTLINKS
+= .config
/fontconfig
/fonts.conf
275 .config
/fontconfig
/fonts.conf_SRC
= fonts.conf
276 DOTLINKS
+= .stalonetrayrc
278 DOTLINKS
+= .putty
/sessions
/Default
%20Settings
279 .putty
/sessions
/Default
%20Settings_SRC
= putty-defaults
281 DOTLINKS
+= .config
/gnome-session
/sessions
/mdw.session
282 .config
/gnome-session
/sessions
/mdw.session_SRC
= mdw.session
284 DOTLINKS
+= .Eterm
/themes
/Eterm
/theme.cfg
285 DOTLINKS
+= .enlightenment
/keybindings.cfg
286 DOTLINKS
+= .enlightenment-vnc
/keybindings.cfg
287 DOTLINKS
+= .e16
/bindings.cfg
288 .Eterm
/themes
/Eterm
/theme.cfg_SRC
= eterm-theme.cfg
289 .enlightenment
/keybindings.cfg_SRC
= e-keybindings.cfg
290 .enlightenment-vnc
/keybindings.cfg_SRC
= evnc-keybindings.cfg
291 .e16
/bindings.cfg_SRC
= e16-bindings
293 DOTLINKS
+= .gtkrc-2.0
294 DOTLINKS
+= .config
/gtk-3.0
/gtk.css
295 DOTLINKS
+= .config
/gtk-3.0
/settings.ini
296 .config
/gtk-3.0
/gtk.css_SRC
= gtk3.css
297 .config
/gtk-3.0
/settings.ini_SRC
= gtk3-settings.ini
299 SCRIPTLINKS
+= xinitcmd lock-screen xshutdown
300 SCRIPTLINKS
+= un-backslashify-selection
301 SCRIPTLINKS
+= xpra-start-xdummy
302 SCRIPTLINKS
+= play-rawk
303 SCRIPTLINKS
+= media-keys
304 SCRIPTLINKS
+= disorder-notify
307 Xdefaults_DEFS
= -DEMACSWD
=$(call mdw-conf
,emacs-width
,77)
308 $(HOME
)/.Xdefaults
: $(HOME
)/.mdw.conf
310 ifeq ($(shell case
$${DISPLAY-nil
} in
(:[0-9]*) echo t
;; (*) echo nil
;; esac
),t
)
311 dotfile-hook
/.Xdefaults
= \
312 $(call v_tag
,XRDB
)xrdb
-override $<
317 ###--------------------------------------------------------------------------
318 ### Processing dotfiles.
320 dotfile-source
= $(HERE
)/dot
/$(or
$($1_SRC), $(1:.
%=%)$2)
322 ## Easiest: just make symlinks.
324 $(call symlink-ok-p
,$(HOME
)/$1,$(call dotfile-source
,$1))
325 all:: $(addprefix $(HOME
)/, $(DOTLINKS
))
326 $(addprefix $(HOME
)/, $(subst %,\
%,$(DOTLINKS
))): $(HOME
)/%: \
327 $$(if
$$(call dotlink-ok-p
,$$*),,_force
)
328 $(call v_tag
,SYMLINK
)mkdir
-p
$(dir $@
) && \
330 ln
-s
$(call dotfile-source
,$*) $@.new
&& \
334 ## Hack with the C preprocessor.
335 all:: $(addprefix $(HOME
)/, $(DOTCPP
))
336 $(addprefix $(HOME
)/, $(subst %,\
%,$(DOTCPP
))): $(HOME
)/%: \
337 $$(call dotfile-source
,$$*) Makefile
338 $(call v_tag
,CPP
)mkdir
-p
$(dir $@
) && \
340 cpp -P
-o
$@.new
$($*_DEFS
) $< && \
344 ## Hack by making simple substitutions.
345 substvar
= -e
$(call quote
,s
\a@
$1@
\a$2\ag
)
346 SUBSTS
+= $(call substvar
,home
,$(HOME
))
347 SUBSTS
+= $(call substvar
,profile
,$(HERE
))
348 all:: $(addprefix $(HOME
)/, $(DOTSUBST
))
349 $(addprefix $(HOME
)/, $(subst %,\
%,$(DOTSUBST
))): $(HOME
)/%: \
350 $$(call dotfile-source
,$$*,.in
) Makefile
351 $(call v_tag
,SUBST
)mkdir
-p
$(dir $@
) && \
354 $(relax)### generated by $(HERE)/Makefile; do not edit!" \
355 $(SUBSTS
) $($*_SUBSTS
) \
356 $(call dotfile-source
,$*,.in
) >$@.new
&& \
360 ###--------------------------------------------------------------------------
361 ### Processing script links.
363 script-source
= $(HERE
)/bin
/$(or
$($1_SRC), $1)
365 ifeq ($(prefix-shebang-p
),t
)
366 all:: $(addprefix $(HOME
)/bin
/, $(SCRIPTLINKS
))
367 $(addprefix $(HOME
)/bin
/, $(SCRIPTLINKS
)): $(HOME
)/bin
/%: \
368 $$(call script-source
,$$*) Makefile
369 $(call v_tag
,SHEBANG
)mkdir
-p
$(dir $@
) && \
371 sed
"1s\a\(#! *\)/\a\1$(SHEBANG_PREFIX)/\a" \
372 $(call script-source
,$*) >$@.new
&& \
373 chmod
--reference
=$(call script-source
,$*) $@.new
&& \
378 $(call symlink-ok-p
,$(HOME
)/bin
/$1,$(call script-source
,$1))
379 all:: $(addprefix $(HOME
)/bin
/, $(SCRIPTLINKS
))
380 $(addprefix $(HOME
)/bin
/, $(SCRIPTLINKS
)): $(HOME
)/bin
/%: \
381 $$(if
$$(call scriptlink-ok-p
,$$*),,_force
)
382 $(call v_tag
,SYMLINK
)mkdir
-p
$(dir $@
) && \
384 ln
-s
$(call script-source
,$*) $@.new
&& \
389 all:: $(addprefix $(HOME
)/bin
/, $(SCRIPTLINKS
))
391 ###--------------------------------------------------------------------------
392 ### Building packages from source tarballs.
394 SRCDIR
= $(HOME
)/src
/profile
396 pkg-builddir
= $(SRCDIR
)/$1/build
397 pkg-stamp
= $(call pkg-builddir
,$1)/$2-stamp
399 $(foreach p
, $(PACKAGES
), $(eval DEP_
$p = $(if
$(shell \
400 if
$($p_CHECK) >/dev
/null
2>&1 --version
; then echo t
; fi
),, \
401 $(call pkg-stamp
,$p,install))))
403 $(PACKAGES
:%=$(SRCDIR
)/%.
tar.gz
): $(SRCDIR
)/%.
tar.gz
:
404 $(call v_tag
,FETCH
)mkdir
-p
$(SRCDIR
) && \
406 $(call get-url
,$@.new
,$(REPO
)/$*.
tar.gz
) && \
409 $(foreach p
, $(PACKAGES
), $(call pkg-stamp
,$p,unpack
)): \
410 $(call pkg-stamp
,%,unpack
): $(SRCDIR
)/%.
tar.gz
411 $(call v_tag
,EXTRACT
)rm -rf
$(SRCDIR
)/$* && \
412 mkdir
$(SRCDIR
)/$*.tmp-unpack
&& \
413 cd
$(SRCDIR
)/$*.tmp-unpack
&& \
414 gzip
-cd ..
/$*.
tar.gz |
tar xf
- && \
417 rmdir
$*.tmp-unpack
&& \
419 touch
$*/build
/unpack-stamp
421 $(foreach p
, $(PACKAGES
), $(call pkg-stamp
,$p,configure
)): \
422 $(call pkg-stamp
,%,configure
): \
423 $(call pkg-stamp
,%,unpack
) \
424 $$(foreach p
, $$($$*_DEPS
), $$(DEP_
$$p))
425 $(call v_tag
,CONFIG
)cd
$(dir $@
) && \
426 ..
/configure
--prefix=$(HOME
) \
427 PKG_CONFIG_PATH
=$(HOME
)/lib
/pkgconfig \
428 $($*_CONFIG
) >>buildlog
2>&1 && \
429 touch configure-stamp
431 $(foreach p
, $(PACKAGES
), $(call pkg-stamp
,$p,build
)): \
432 $(call pkg-stamp
,%,build
): \
433 $(call pkg-stamp
,%,configure
)
434 $(call v_tag
,BUILD
)cd
$(dir $@
) && \
435 $(MAKE
) $($*_MAKEFLAGS
) >>buildlog
2>&1 && \
438 $(foreach p
, $(PACKAGES
), $(call pkg-stamp
,$p,install)): \
439 $(call pkg-stamp
,%,install): \
440 $(call pkg-stamp
,%,build
)
441 $(call v_tag
,INSTALL
)cd
$(dir $@
) && \
442 $(MAKE
) $($*_MAKEFLAGS
) install >>buildlog
2>&1 && \
446 all:: $(foreach p
, $(PACKAGES
), $(DEP_
$p))
447 $(foreach p
, $(PACKAGES
), $(eval _pkg.
$p: $(call pkg-stamp
,$p,install)))
449 ###----- That's all, folks --------------------------------------------------