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.

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