-
-
Notifications
You must be signed in to change notification settings - Fork 15
/
Makefile
170 lines (144 loc) · 6.46 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# 2 An Introduction to Makefiles
# 2.1 What a Rule Looks Like
# https://www.gnu.org/software/make/manual/html_node/Rule-Introduction.html#Rule-Introduction
# target … : prerequisites …
# recipe
# …
# A _target_ is usually the name of a file that is generated by a
# program; examples of targets are executable or object files.
# A _target_ can also be the name of an action to carry out,
# such as ‘clean’ (see Phony Targets).
# A _prerequisite_ is a file that is used as input to create the
# target. A target often depends on several files.
# A _recipe_ is an action that make carries out.
# You need to put a tab character at the beginning of every
# _recipe_ line!
#
# 2.2 A Simple Makefile
# https://www.gnu.org/software/make/manual/html_node/Simple-Makefile.html#Simple-Makefile
# 4.6 Phony Targets
# https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html#index-phony-targets
# 6.5 Setting Variables
# https://www.gnu.org/software/make/manual/html_node/Setting.html
# Variables defined with ‘=’ are recursively expanded variables.
# Variables defined with ‘:=’ or ‘::=’ are simply expanded variables.
# Here we are defining package subfolder names.
PACKAGES := stan-mode ac-stan stan-snippets company-stan eldoc-stan flycheck-stan
# Target _all_ requires _build-src_, etc, and has no recipe.
# No file named _all_ is created. So it will run every time.
# Here .PHONY ensures this behavior even if such a file existed.
#
# USAGE:
# all: Default rule to run the following.
#
# stan-lang: Create a JSON file in the stan-language-definitions submodule.
#
# deps: cask install dependencies in each package directory under .cask.
#
# build-src: Create required data files from the language definition
# JSON file. For stan-snippets, this process requires
# yasnippet, thus, make deps must precede.
#
# local-melpa: Create package files in the local-melpa submodule.
# This is done to make all developmental packages
# appear installable to linters.
#
# compile: Byte-compile *.el files except *-pkg.el.
#
# test: Test packages via buttercup.
#
# lint: Perform linting via package-lint and elisp-lint.
#
# Note that both stan-lang and local-melpa submodules are required
# to run make all.
#
.PHONY : all stan-lang deps build-src local-melpa compile test lint
all : stan-lang deps build-src local-melpa compile test lint
# The preceding @ supresses implicit echoing of the statement.
# 5.2 Recipe Echoing
# https://www.gnu.org/software/make/manual/html_node/Echoing.html
stan-lang :
@echo "\n### Building language definition JSON under stan-lang! ###"
make -C stan-language-definitions all
# Many of the following recipes are looped recursive calls.
# 5.7 Recursive Use of make
# https://www.gnu.org/software/make/manual/html_node/Recursion.html
# 9.7 Summary of Options
# https://www.gnu.org/software/make/manual/html_node/Options-Summary.html
# -C: Change to directory dir before reading the makefiles.
# As a result, make X is invoked in a subdirectory.
deps :
@echo "\n### Running dependency installation via Cask for each package! ###"
$(foreach pkg, $(PACKAGES), make -C $(pkg) deps ; )
# Requires the language definition file and dependency packages.
build-src : stan-lang deps
@echo "\n### Building required data files for each package! ###"
$(foreach pkg, $(PACKAGES), make -C $(pkg) build-src ; )
#
# Move into the local-melpa and prepare
# # https://www.gnu.org/software/emacs/manual/html_node/elisp/Package-Archives.html
# https://emacs.stackexchange.com/questions/33627/how-to-generate-and-activate-autoloads-for-local-packages
local-melpa :
@echo "\n### Setting up a local package archive in local-melpa! ###"
make -C ./local-melpa all
@echo "### Stable packages (Errors allowed here)"
-STABLE=t make -C ./local-melpa all
# This did not work with Travis. Use -L to specify other local folders
# to avoid dependency issues.
link :
@echo "\n### Handling internal dependency each package via cask link! ###"
$(foreach pkg, $(PACKAGES), make -C $(pkg) link ; )
# Requires data files.
compile : build-src
@echo "\n### Compiling .elc files for each package! ###"
$(foreach pkg, $(PACKAGES), make -C $(pkg) compile ; )
# Requires data files.
test : build-src
@echo "\n### Running buttercup tests for each package! ###"
$(foreach pkg, $(PACKAGES), make -C $(pkg) test ; )
lint : lint-package lint-elisp
# Additional rules
.PHONY : lint-package lint-elisp dist show snippets
lint-package : local-melpa build-src
@echo "\n### Running package-lint for each package! ###"
$(foreach pkg, $(PACKAGES), make -C $(pkg) lint-package ; )
lint-elisp : local-melpa build-src
@echo "\n### Running elisp-lint for each package! ###"
$(foreach pkg, $(PACKAGES), make -C $(pkg) lint-elisp ; )
# This creates files under pkg/dist similar to local-melpa/packages.
dist :
@echo "\n### Running cask package for each package! ###"
$(foreach pkg, $(PACKAGES), make -C $(pkg) dist ; )
show :
@echo "\n### Showing .el files to be compiled for each package! ###"
$(foreach pkg, $(PACKAGES), make -C $(pkg) show ; )
snippets:
@echo "\n### Moving snippet files to the snippets directory! ###"
-mkdir -p snippets/stan-mode
cp -v stan-snippets/snippets/stan-mode/.yas-compiled-snippets.el snippets/stan-mode
cp -v stan-snippets/snippets/stan-mode/.yas-make-groups snippets/stan-mode
cp -v stan-snippets/snippets/stan-mode/.yas-parents snippets/stan-mode
# Cleaning rules in the same order as the creating rules above.
.PHONY : clean clean-stan-lang clean-deps clean-src clean-local-melpa clean-elc clean-dist clean-snippets
clean : clean-stan-lang clean-deps clean-src clean-local-melpa clean-elc clean-dist clean-snippets
clean-stan-lang :
@echo "\n### Cleaning the stan-lang JSON definition file! ###"
make -C stan-language-definitions clean
clean-deps :
@echo "\n### Cleaning dependencies in .cask for each package! ###"
$(foreach pkg, $(PACKAGES), make -C $(pkg) clean-deps ; )
clean-src :
@echo "\n### Cleaning data files for each package! ###"
$(foreach pkg, $(PACKAGES), make -C $(pkg) clean-src ; )
clean-local-melpa :
@echo "\n### Cleaning the package archive in local-melpa! ###"
make -C local-melpa clean
clean-elc :
@echo "\n### Cleaning .elc files for each package! ###"
$(foreach pkg, $(PACKAGES), make -C $(pkg) clean-elc ; )
clean-dist :
@echo "\n### Cleaning dist folder for each package! ###"
$(foreach pkg, $(PACKAGES), make -C $(pkg) clean-dist ; )
clean-snippets :
@echo "\n### Cleaning the snippets directory! ###"
rm -rf snippets