Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

Makefile 11 KiB

10 år sedan
9 år sedan
10 år sedan
10 år sedan
10 år sedan
10 år sedan
10 år sedan
10 år sedan
10 år sedan
10 år sedan
10 år sedan
10 år sedan
10 år sedan
10 år sedan
10 år sedan
10 år sedan
10 år sedan
10 år sedan
10 år sedan
10 år sedan
10 år sedan
10 år sedan
9 år sedan
10 år sedan
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. # Makefile --- 10sr make dotfiles
  2. # 2014, 10sr. Unlicensed <http://unlicense.org>
  3. # TODO: Add help message
  4. # Variable definitions
  5. dotfiles_url_base := https://raw.githubusercontent.com/10sr/dotfiles/master
  6. use_git ?= t
  7. git_auth ?= t
  8. dotfiles_git_path := 10sr/dotfiles.git
  9. ifneq (,$(git_auth))
  10. $(warning 'git_auth' is not empty. Use git repository with push right.)
  11. dotfiles_git := git@github.com:$(dotfiles_git_path)
  12. else
  13. $(warning 'git_auth' is empty. Use public read-only git repository.)
  14. dotfiles_git := https://github.com/$(dotfiles_git_path)
  15. endif
  16. current_origin_url := $(shell git config remote.origin.url)
  17. ifeq (,$(dotfiles_dir))
  18. ifneq (,$(findstring $(dotfiles_git_path),$(current_origin_url)))
  19. $(warning Currently in dotfiles repository)
  20. dotfiles_dir := $(PWD)
  21. else
  22. # Current directory is not 10sr/dotfiles.git reposioty
  23. ifeq (,$(DOTFILES_DIR))
  24. $(warning Neigher 'DOTFILES_DIR' nor 'dotfiles_dir' is defined)
  25. $(warning Use default value)
  26. dotfiles_dir := $(HOME)/10sr_dotfiles
  27. else
  28. # dotfiles_dir is empty but DOTFILES_DIR has a value
  29. $(warning 'dotfiles_dir' is set from 'DOTFILES_DIR')
  30. dotfiles_dir := $(DOTFILES_DIR)
  31. endif
  32. endif
  33. endif
  34. $(warning dotfiles_dir: $(dotfiles_dir))
  35. dotfiles_home_dir := $(dotfiles_dir)/.home
  36. ifeq ($(home),)
  37. ifeq ($(global_home),)
  38. $(warning 'home' not set and 'global_home' is empty)
  39. # TODO: What this should be?
  40. home := $(dotfiles_home_dir)
  41. else
  42. home := $(HOME)
  43. endif
  44. endif
  45. $(warning home: $(home))
  46. localdir := $(home)/.local
  47. vardir := $(home)/.var
  48. bindir := $(localdir)/bin
  49. directories := $(dotfiles_dir) $(home) $(localdir) $(vardir) $(bindir) \
  50. $(home)/.emacs.d
  51. current := $(shell date)
  52. uname := $(shell uname)
  53. shrc_loadables := sh bash zsh
  54. emacs ?= $(shell which emacs 2>/dev/null)
  55. git ?= $(shell which git 2>/dev/null)
  56. curl ?= $(shell which curl 2>/dev/null)
  57. grep ?= GREP_OPTIONS= $(shell which grep 2>/dev/null)
  58. ifeq ($(emacs),)
  59. $(warning Emacs program not found)
  60. endif
  61. files := Makefile emacs.el profile shrc tmux.conf vimrc _keysnail.js
  62. # Targets
  63. default: help
  64. tests := test-el
  65. test: test-syntax $(tests)
  66. test_syntaxes := test-syntax-el test-syntax-sh
  67. test-syntax: $(test_syntaxes)
  68. setups := setup-darwin setup-directories setup-emacs setup-gitconf \
  69. setup-repository setup-rc
  70. # `make setup` to setup these all sounds to be too match
  71. setup-all: $(setups)
  72. runs := run-emacs run-bash run-zsh
  73. # `make check` is just an alias for `make test`
  74. check: test
  75. # Similarly, check-syntax is test-syntax
  76. check-syntax: test-syntax
  77. .PHONY: all default clean \
  78. test check $(tests) \
  79. test-syntax check-syntax $(test_syntaxes)\
  80. setup-all $(setups)
  81. $(directories):
  82. test -d "$@" || mkdir -vp "$@"
  83. # System detection
  84. # ================
  85. # Is this usefull? Just checking uname is not enough?
  86. ismsys :=
  87. iscygwin :=
  88. iswindows :=
  89. isdarwin :=
  90. isfreebsd :=
  91. isbsd :=
  92. islinux :=
  93. ifneq (,$(findstring MINGW,$(uname)))
  94. ismsys := t
  95. endif
  96. ifneq (,$(findstring CYGWIN,$(uname)))
  97. iscygwin := t
  98. endif
  99. ifneq (,$(ismsys)$(iscygwin))
  100. iswindows := t
  101. endif
  102. ifneq (,$(findstring Darwin,$(uname)))
  103. isdarwin := t
  104. endif
  105. ifneq (,$(findstring FreeBSD,$(uname)))
  106. isfreebsd := t
  107. endif
  108. ifneq (,$(isdarwin)$(isfreebsd))
  109. isbsd := t
  110. endif
  111. ifneq (,$(findstring Linux,$(uname)))
  112. islinux := t
  113. endif
  114. # Help
  115. # ====
  116. help_message := "Available targets are:\
  117. setup-repository\
  118. Clone git repository"
  119. help:
  120. @echo "10sr Makefile Usage:"
  121. @echo
  122. @echo "Some of available targers are:"
  123. @echo " setup-repository Clone git repository"
  124. @echo " setup-rc Init rc files"
  125. @echo " setup-gitconf Run some git config"
  126. @echo " run-emacs Start Emacs process with dotfiles init file"
  127. # Clean
  128. # =====
  129. # Usage: Define a target as a dependency for clean and .PHONY
  130. clean: clean-home
  131. .PHONY: clean-home
  132. clean-home:
  133. $(RM) -r $(dotfiles_home_dir)
  134. # preparing files
  135. # ===============
  136. files_fullpath := $(files:%=$(dotfiles_dir)/%)
  137. fetch_files := $(files:%=fetch-%)
  138. .PHONY: $(fetch_files)
  139. $(fetch_files): fetch-%: $(dotfiles_dir)
  140. curl --url $(dotfiles_url_base)/$* --output $@
  141. ifeq (,$(use_git))
  142. $(files_fullpath): $(dotfiles_dir)/%: fetch-%
  143. $(warning 'use_git' is empty. Use curl to fetch files)
  144. else
  145. $(warning 'use_git' is not empty. Use git to retrieve files)
  146. $(files_fullpath): setup-repository
  147. test -f "$@"
  148. endif
  149. # setups
  150. # ======
  151. # setup git repository
  152. # --------------------
  153. setup-repository: $(dotfiles_dir)/.git
  154. $(dotfiles_dir)/.git:
  155. ifeq (,$(git))
  156. false "Git not installed"
  157. endif
  158. $(git) clone $(dotfiles_git) $(dotfiles_dir)
  159. # darwin setup
  160. # ------------
  161. setup_darwins := setup-darwin-defaults setup-darwin-daemon
  162. setup-darwin: $(setup_darwins)
  163. .PHONY: $(setup_darwins)
  164. setup-darwin-defaults:
  165. # http://appdrill.net/60641/mac-boot-mute.html
  166. #sudo nvram SystemAudioVolume=%80
  167. # add quit entry in menu
  168. defaults write com.apple.finder QuitMenuItem -bool YES
  169. # show full path on titlebar
  170. defaults write com.apple.finder _FXShowPosixPathInTitle -bool YES
  171. # do not show desktop icons
  172. defaults write com.apple.finder CreateDesktop -boolean false
  173. killall Finder
  174. # disable dashboard
  175. #defaults write com.apple.dashboard mcx-disabled -bool YES
  176. setup-darwin-daemon:
  177. test "`launchctl getenv LC_ALL`" = C || sudo launchctl setenv LC_ALL C
  178. if ! (launchctl list | grep com.apple.locate) >/dev/null ;\
  179. then \
  180. sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist ;\
  181. fi
  182. # emacs setup
  183. # -----------
  184. setup-emacs: $(dotfiles_dir)/emacs.el
  185. test -n "$(emacs)" && $(emacs) -q --batch \
  186. --eval "(setq user-emacs-directory \"$(home)/.emacs.d/\")" \
  187. --load $< \
  188. -f my-auto-install-package
  189. # git config setup
  190. # ----------------
  191. ifneq (,$(git))
  192. git_conf := $(git) config --global
  193. endif
  194. xz := $(shell which xz 2>/dev/null)
  195. setup-gitconf:
  196. ifeq (,$(git))
  197. $(warnning "Git program not found")
  198. else
  199. $(git_conf) user.name '10sr'
  200. $(git_conf) user.email '8slashes+git@gmail.com'
  201. $(git_conf) core.autocrlf false
  202. $(git_conf) core.excludesfile '~/.gitignore'
  203. $(git_conf) color.ui auto
  204. $(git_conf) status.relativePaths false
  205. $(git_conf) status.showUntrackedFiles normal
  206. $(git_conf) log.date iso
  207. $(git_conf) push.default current
  208. ifneq (,$(xz))
  209. $(git_conf) tar.txz.command "xz -c"
  210. endif
  211. $(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"
  212. $(git_conf) alias.st "status -s -b"
  213. $(git_conf) alias.b "branch"
  214. $(git_conf) alias.sb "show-branch"
  215. $(git_conf) alias.ci "commit --verbose"
  216. $(git_conf) alias.co "checkout"
  217. $(git_conf) alias.cim "commit --verbose -m"
  218. $(git_conf) alias.di "diff --color"
  219. $(git_conf) alias.me "merge --no-ff --stat --verbose"
  220. $(git_conf) alias.ffme "merge --ff-only --stat --verbose"
  221. $(git_conf) alias.gr "grep -n"
  222. $(git_conf) alias.ls "ls-files"
  223. # $(git_conf) alias.ls "ls-files -v --full-name"
  224. # $(git_conf) alias.ls "status -u -s ."
  225. $(git_conf) alias.sl "!sl"
  226. # $(git_conf) alias.my-ls "ls-files | xargs ls"
  227. # $(git_conf) alias.ll "!git ls-files | xargs ls -l -CFG --color=auto --time-style=long-iso"
  228. $(git_conf) alias.addi "add -i"
  229. # Add patch to index
  230. $(git_conf) alias.ap "apply --cached"
  231. $(git_conf) alias.clean-p "diff --quiet"
  232. $(git_conf) alias.echo-ref "for-each-ref --format='%(refname:short)'"
  233. $(git_conf) alias.todo "grep -nH -E -i 'todo:|note:|fixme:'"
  234. $(git_conf) alias.stashsnap '! 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'
  235. $(git_conf) alias.snap '! gitdir="`git rev-parse --git-dir`" && export GIT_INDEX_FILE="$$gitdir"/snapshot.index && cp "$$gitdir"/index "$$GIT_INDEX_FILE" && git add -A && : >>"$$gitdir"/logs/refs/snapshot && git update-ref refs/snapshot $$(git commit-tree $$(git write-tree) -m Snapshot -p HEAD) && git show --stat snapshot'
  236. $(git_conf) alias.setcmd '! f(){ git config alias.$$1 "! $$2"; }; f'
  237. $(git_conf) alias.make '!make'
  238. #$(git_conf) alias.wc "!git ls-files -z | xargs -0 wc"
  239. # $(git_conf) push.default "simple"
  240. ifneq (,$(iswindows))
  241. $(git_conf) core.fileMode false
  242. endif
  243. endif
  244. # setup rc files
  245. # --------------
  246. # Generate load codes from the files themselves.
  247. # Load codes are defined by following SETUP_LOAD: indicator.
  248. # String DOTFILES_DIR in the load codes will be replaced into the value of
  249. # $(dotfiles_dir).
  250. # The load codes are appended to $(topfile).
  251. setup_rcs := setup-rc-vimrc setup-rc-tmux.conf setup-rc-emacs.el
  252. setup-rc: $(setup_rcs)
  253. .PHONY: $(setup_rcs)
  254. setup-rc-vimrc: $(home)/.vimrc
  255. setup-rc-tmux.conf: $(home)/.tmux.conf
  256. setup-rc-emacs.el: $(home)/.emacs.d/init.el
  257. $(home)/.emacs.d/init.el: $(dotfiles_dir)/emacs.el $(home) $(home)/.emacs.d
  258. $(home)/.vimrc: $(dotfiles_dir)/vimrc $(home)
  259. $(home)/.tmux.conf: $(dotfiles_dir)/tmux.conf $(home)
  260. command_extract_setup_load := $(grep) -e 'SETUP_LOAD: ' | \
  261. sed -e 's/^.*SETUP_LOAD: //' -e 's|DOTFILES_DIR|$(dotfiles_dir)|'
  262. setup_rc_marker := ADDED BY 10sr_dotfiles/Makefile
  263. $(home)/.emacs.d/init.el $(home)/.vimrc $(home)/.tmux.conf:
  264. set -x; if ! $(grep) "$(setup_rc_marker)" "$@"; \
  265. then \
  266. (echo $(line_comment) $(setup_rc_marker); cat "$<" | $(command_extract_setup_load)) \
  267. | tee -a "$@"; \
  268. fi
  269. $(home)/.emacs.d/init.el: line_comment := ';;'
  270. $(home)/.vimrc: line_comment := '"'
  271. $(home)/.tmux.conf: line_comment := '\#'
  272. # run
  273. # ===
  274. run-emacs: $(home)/.emacs.d/init.el
  275. test -n "$(emacs)" && $(emacs) -q \
  276. --eval "(setq user-emacs-directory \"$(home)/.emacs.d/\")" --load "$<"
  277. # test
  278. # ====
  279. test_els := test-el-emacs.el
  280. test-el: $(test_els)
  281. .PHONY: $(test_els)
  282. $(test_els): test-el-%: $(dotfiles_dir)/% $(home)
  283. test -n "$(emacs)" && \
  284. $(emacs) -Q -batch -f batch-byte-compile $<
  285. # EMACS_EL_DRY_RUN=t $(emacs) -q --debug-init --batch \
  286. # --eval "(setq debug-on-error t)" \
  287. # --eval "(setq user-emacs-directory \"$(home)/.emacs.d/\")" \
  288. # --load $<c --kill
  289. # test syntax
  290. # ===========
  291. test_syntax_shs := test-syntax-shrc test-syntax-profile
  292. test-syntax-sh: $(test_syntax_shs)
  293. .PHONY: $(test_syntax_shs)
  294. $(test_syntax_shs): test-syntax-%: $(dotfiles_dir)/%
  295. sh -ec 'for sh in $(shrc_loadables); do $$sh -n $<; done'
  296. test_syntax_els := test-syntax-emacs.el
  297. test-syntax-el: $(test_syntax_els)
  298. .PHONY: $(test_syntax_els)
  299. sexp_elisp_syntax_check := \
  300. (with-temp-buffer \
  301. (emacs-lisp-mode) \
  302. (insert-file-contents file) \
  303. (condition-case err \
  304. (check-parens) \
  305. (user-error \
  306. (error (format "%s:%d:%d:Unmatched brancet or quote" \
  307. file \
  308. (line-number-at-pos) \
  309. (- (point) (point-at-bol)))))))
  310. $(test_syntax_els): test-syntax-%: $(dotfiles_dir)/%
  311. test -n "$(emacs)" && \
  312. $(emacs) -Q --debug-init --batch \
  313. --eval '(let ((file "$<")) $(sexp_elisp_syntax_check))' --kill