You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Makefile 9.1 KiB

10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. # Makefile --- 10sr make dotfiles
  2. # 2014, 10sr. Unlicensed <http://unlicense.org>
  3. # Variable definitions
  4. home ?= $(HOME)
  5. dotfiles_url_base := https://raw.githubusercontent.com/10sr/dotfiles/master
  6. dotfiles_git := git@github.com:10sr/dotfiles.git
  7. dotfiles_git_pub := http://github.com/10sr/dotfiles.git
  8. use_git ?= t
  9. ifeq (,$(dotfiles_dir))
  10. ifeq (,$(DOTFILES_DIR))
  11. $(warning Neigher DOTFILES_DIR nor dotfiles_dir not defined.)
  12. $(warning Use $(home)/10sr_dotfiles for default.)
  13. dotfiles_dir := $(home)/10sr_dotfiles
  14. else
  15. $(warning dotfiles_dir is set from DOTFILES_DIR: $(DOTFILES_DIR))
  16. dotfiles_dir := $(DOTFILES_DIR)
  17. endif
  18. endif
  19. localdir := $(home)/.local
  20. vardir := $(home)/.var
  21. bindir := $(localdir)/bin
  22. current := $(shell date)
  23. uname := $(shell uname)
  24. shrc_loadables := sh bash zsh
  25. emacs ?= $(shell which emacs 2>/dev/null)
  26. git ?= $(shell which git 2>/dev/null)
  27. curl ?= $(shell which curl 2>/dev/null)
  28. grep ?= GREP_OPTIONS= $(shell which grep 2>/dev/null)
  29. # Targets
  30. all: default
  31. tests := test-el
  32. test: test-syntax $(tests)
  33. test_syntaxes := test-syntax-el test-syntax-sh
  34. test-syntax: $(test_syntaxes)
  35. setups := setup-darwin setup-directories setup-emacs setup-gitconf \
  36. setup-repository setup-util setup-rc
  37. # `make setup` to setup these all sounds to be too match
  38. setup-all: $(setups)
  39. # `make check` is just an alias for `make test`
  40. check: test
  41. # Similarly, check-syntax is test-syntax
  42. check-syntax: test-syntax
  43. .PHONY: all default \
  44. test check $(tests) \
  45. test-syntax check-syntax $(test_syntaxes)\
  46. setup-all $(setups)
  47. # System detection
  48. # ================
  49. # Is this usefull? Just checking uname is not enough?
  50. ismsys :=
  51. iscygwin :=
  52. iswindows :=
  53. isdarwin :=
  54. isfreebsd :=
  55. isbsd :=
  56. islinux :=
  57. ifneq (,$(findstring MINGW,$(uname)))
  58. ismsys := t
  59. endif
  60. ifneq (,$(findstring CYGWIN,$(uname)))
  61. iscygwin := t
  62. endif
  63. ifneq (,$(ismsys)$(iscygwin))
  64. iswindows := t
  65. endif
  66. ifneq (,$(findstring Darwin,$(uname)))
  67. isdarwin := t
  68. endif
  69. ifneq (,$(findstring FreeBSD,$(uname)))
  70. isfreebsd := t
  71. endif
  72. ifneq (,$(isdarwin)$(isfreebsd))
  73. isbsd := t
  74. endif
  75. ifneq (,$(findstring Linux,$(uname)))
  76. islinux := t
  77. endif
  78. # preparing files
  79. # ===============
  80. ifeq (,$(use_git))
  81. $(warning 'use_git' is set to empty. Use curl to fetch files)
  82. $(dotfiles_dir)/%:
  83. mkdir -vp $(dotfiles_dir)
  84. curl --url $(dotfiles_url_base)/$* --output $@
  85. else
  86. $(warning 'use_git' is set to non-empty. Use git to fetch files)
  87. $(dotfiles_dir)/%: setup-repository
  88. test -f "$@"
  89. endif
  90. # Shortcut target for interactive usage
  91. # For example, `make file-emacs.el use_git=` will fetch emacs.el from web with
  92. # curl program.
  93. # NOTE: Is there any way to make all `file-%` targets phony?
  94. file-%: $(dotfiles_dir)/%
  95. test -f "$<"
  96. # Make sure $(dotfiles_dir)/% wont be removed as intermidiate files
  97. .PRECIOUS: $(dotfiles_dir)/%
  98. # setups
  99. # ======
  100. # setup git repository
  101. # --------------------
  102. setup-repository: $(dotfiles_dir)/.git
  103. $(dotfiles_dir)/.git:
  104. ifeq (,$(git))
  105. false "Git not installed"
  106. endif
  107. if ssh git@github.com 2>&1 | grep 'successfully authenticated'; \
  108. then \
  109. echo "Using $(dotfiles_git)"; \
  110. $(git) clone $(dotfiles_git) $(dotfiles_dir); \
  111. else \
  112. echo "Using $(dotfiles_git_pub)"; \
  113. $(git) clone $(dotfiles_git_pub) $(dotfiles_dir); \
  114. fi
  115. # utils
  116. # -----
  117. setup_utils := colortable16.sh 256colors2.pl pacapt ack-2.12
  118. setup-util: $(setup_utils)
  119. .PHONY: $(setup_utils)
  120. setup_utils_path := $(setup_utils:%=$(bindir)/%)
  121. $(setup_utils): %: $(bindir)/%
  122. $(setup_utils_path):
  123. $(curl) -L --url "$(util_url)" --output "$@"
  124. chmod +x "$@"
  125. colortable16.sh: \
  126. util_url := https://gist.github.com/10sr/6852317/raw/colortable16.sh
  127. 256colors2.pl: util_url := https://gist.github.com/10sr/6852331/raw/256colors2.pl
  128. pacapt: util_url := https://github.com/icy/pacapt/raw/ng/pacapt
  129. ack-2.12: util_url := http://beyondgrep.com/ack-2.12-single-file
  130. # create directories
  131. # ------------------
  132. setup_directories := $(localdir) $(vardir) $(bindir)
  133. setup-directory: $(setup_directories)
  134. $(localdir) $(vardir) $(bindir):
  135. mkdir -vp $@
  136. # darwin setup
  137. # ------------
  138. setup_darwins := setup-darwin-defaults setup-darwin-daemon
  139. setup-darwin: $(setup_darwins)
  140. .PHONY: $(setup_darwins)
  141. setup-darwin-defaults:
  142. # http://appdrill.net/60641/mac-boot-mute.html
  143. #sudo nvram SystemAudioVolume=%80
  144. # add quit entry in menu
  145. defaults write com.apple.finder QuitMenuItem -bool YES
  146. # show full path on titlebar
  147. defaults write com.apple.finder _FXShowPosixPathInTitle -bool YES
  148. # do not show desktop icons
  149. defaults write com.apple.finder CreateDesktop -boolean false
  150. killall Finder
  151. # disable dashboard
  152. #defaults write com.apple.dashboard mcx-disabled -bool YES
  153. setup-darwin-daemon:
  154. test "`launchctl getenv LC_ALL`" = C || sudo launchctl setenv LC_ALL C
  155. if ! (launchctl list | grep com.apple.locate) >/dev/null ;\
  156. then \
  157. sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist ;\
  158. fi
  159. # emacs setup
  160. # -----------
  161. setup-emacs: $(dotfiles_dir)/emacs.el
  162. $(emacs) -q --debug-init --batch --load $< -f my-auto-install-package
  163. # git config setup
  164. # ----------------
  165. ifneq (,$(git))
  166. git_conf := $(git) config --global
  167. endif
  168. xz := $(shell which xz 2>/dev/null)
  169. setup-gitconf:
  170. ifeq (,$(git))
  171. $(warnning "Git program not found")
  172. else
  173. $(git_conf) user.name '10sr'
  174. $(git_conf) user.email '8slashes+git@gmail.com'
  175. $(git_conf) core.autocrlf false
  176. $(git_conf) core.excludesfile '~/.gitignore'
  177. $(git_conf) color.ui auto
  178. $(git_conf) status.relativePaths false
  179. $(git_conf) status.showUntrackedFiles normal
  180. $(git_conf) log.date iso
  181. $(git_conf) push.default current
  182. ifneq (,$(xz))
  183. $(git_conf) tar.txz.command "xz -c"
  184. endif
  185. $(git_conf) alias.graph "log --graph --date-order -C -M --pretty=tformat:\"%C(green)%h%C(reset) %C(white)%ad%C(reset) %C(red)%an%C(reset)%C(yellow)%d%C(reset) %C(white bold)%s%C(reset)\" --date=short -n 499"
  186. $(git_conf) alias.st "status -s -b"
  187. $(git_conf) alias.b "branch"
  188. $(git_conf) alias.sb "show-branch"
  189. $(git_conf) alias.ci "commit --verbose"
  190. $(git_conf) alias.co "checkout"
  191. $(git_conf) alias.cim "commit --verbose -m"
  192. $(git_conf) alias.di "diff --color"
  193. $(git_conf) alias.me "merge --no-ff --stat --verbose"
  194. $(git_conf) alias.ffme "merge --ff-only --stat --verbose"
  195. $(git_conf) alias.gr "grep -n"
  196. $(git_conf) alias.ls "ls-files"
  197. # $(git_conf) alias.ls "ls-files -v --full-name"
  198. # $(git_conf) alias.ls "status -u -s ."
  199. $(git_conf) alias.sl "!sl"
  200. # $(git_conf) alias.my-ls "ls-files | xargs ls"
  201. # $(git_conf) alias.ll "!git ls-files | xargs ls -l -CFG --color=auto --time-style=long-iso"
  202. $(git_conf) alias.addi "add -i"
  203. # Add patch to index
  204. $(git_conf) alias.ap "apply --cached"
  205. $(git_conf) alias.clean-p "diff --quiet"
  206. $(git_conf) alias.echo-ref "for-each-ref --format='%(refname:short)'"
  207. $(git_conf) alias.todo "grep -nH -E -i 'todo:|note:|fixme:'"
  208. $(git_conf) alias.snap '! gitdir="`git rev-parse --git-dir`" && : >>"$gitdir"/logs/refs/snapshot && cmt=`git stash create` && test -n "$cmt" && git update-ref refs/snapshot $cmt && echo Snapshot created: $cmt'
  209. #$(git_conf) alias.wc "!git ls-files -z | xargs -0 wc"
  210. # $(git_conf) push.default "simple"
  211. ifneq (,$(iswindows))
  212. $(git_conf) core.fileMode false
  213. endif
  214. endif
  215. # setup rc files
  216. # --------------
  217. # Generate load codes from the files themselves.
  218. # Load codes are defined by following SETUP_LOAD: indicator.
  219. # String DOTFILES_DIR in the load codes will be replaced into the value of
  220. # $(dotfiles_dir).
  221. # If append_load is non-empty, the load codes are appended to $(topfile),
  222. # otherwise the code will be just printed out to stdout.
  223. setup_rcs := setup-rc-vimrc setup-rc-tmux.conf setup-rc-emacs.el
  224. setup-rc: $(setup_rcs)
  225. .PHONY: $(setup_rcs)
  226. command_extract_setup_load := $(grep) -e 'SETUP_LOAD: ' | \
  227. sed -e 's/^.*SETUP_LOAD: //' -e 's|DOTFILES_DIR|$(dotfiles_dir)|'
  228. $(setup_rcs): setup-rc-%: $(dotfiles_dir)/%
  229. ifeq (,$(append_load))
  230. @echo "\`append_load' is not defined. Just print load command."
  231. cat "$<" | $(command_extract_setup_load)
  232. else
  233. cat "$<" | $(command_extract_setup_load) | tee -a "$(topfile)"
  234. endif
  235. setup-rc-vimrc: topfile := $(home)/.vimrc
  236. setup-rc-tmux.conf: topfile := $(home)/.tmux.conf
  237. setup-rc-emacs.el: topfile := $(home)/.emacs.d/init.el
  238. # test
  239. # ====
  240. test_els := test-el-emacs.el
  241. test-el: $(test_els)
  242. .PHONY: $(test_els)
  243. $(test_els): test-el-%: $(dotfiles_dir)/%
  244. $(emacs) -Q -batch -f batch-byte-compile $<
  245. EMACS_EL_DRY_RUN=t $(emacs) -q --debug-init --batch \
  246. --eval "(setq debug-on-error t)" --load $<c --kill
  247. # test syntax
  248. # ===========
  249. test_syntax_shs := test-syntax-shrc test-syntax-profile \
  250. test-syntax-xinitrc test-syntax-xprograms
  251. test-syntax-sh: $(test_syntax_shs)
  252. .PHONY: $(test_syntax_shs)
  253. $(test_syntax_shs): test-syntax-%: $(dotfiles_dir)/%
  254. sh -ec 'for sh in $(shrc_loadables); do $$sh -n $<; done'
  255. test_syntax_els := test-syntax-emacs.el
  256. test-syntax-el: $(test_syntax_els)
  257. .PHONY: $(test_syntax_els)
  258. sexp_elisp_syntax_check := \
  259. (with-temp-buffer \
  260. (emacs-lisp-mode) \
  261. (insert-file-contents file) \
  262. (condition-case err \
  263. (check-parens) \
  264. (user-error \
  265. (error (format "%s:%d:%d:Unmatched brancet or quote" \
  266. file \
  267. (line-number-at-pos) \
  268. (- (point) (point-at-bol)))))))
  269. $(test_syntax_els): test-syntax-%: $(dotfiles_dir)/%
  270. $(emacs) -Q --debug-init --batch \
  271. --eval '(let ((file "$<")) $(sexp_elisp_syntax_check))' --kill