Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

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