diagnostics: add tptest_stop functionality
[juci.git] / Makefile
1 DIRS-y:=juci
2 PLUGINS-y:=plugins
3
4 BIN:=bin
5
6 BACKEND_BIN_DIR:=$(BIN)/usr/libexec/rpcd/
7 CODE_DIR:=$(BIN)/www/js
8 CSS_DIR:=$(BIN)/www/css
9 TMP_DIR:=tmp
10 TARGETS:=
11 PHONY:=debug release clean prepare node_modules
12 CP:=cp -Rp
13 Q:=@
14 INSTALL_DIR:=mkdir -p
15
16 all: release
17
18 -include Makefile.local
19
20 define Plugin/Default
21         CODE_LOAD:=
22         JAVASCRIPT-y:=
23         TEMPLATES-y:=
24         STYLES-y:=
25 endef
26
27 define BuildDir-y
28         $(eval BIN:=$(if $(local),bin,bin/$(1)))
29         $(eval $(call Plugin/Default))
30         $(eval BACKEND_BIN_DIR:=$(BIN)/usr/libexec/rpcd)
31         $(eval CODE_DIR:=$(BIN)/www/$(if $(3),$(3),js))
32         $(eval PO-y:=po/*.po)
33         $(eval JAVASCRIPT-y:=src/*.js src/pages/*.js src/widgets/*.js src/widgets/*/*.js)
34         $(eval TEMPLATES-y:=src/widgets/*.html src/pages/*.html src/widgets/*/*.html)
35         $(eval STYLES-y:=src/css/*.css)
36         $(eval STYLES_LESS-y:=src/css/*.less)
37         $(eval PLUGIN_DIR:=$(2))
38         $(eval PLUGIN:=$(1))
39         $(eval -include $(PLUGIN_DIR)/Makefile)
40         $(eval $(Plugin/$(1)))
41         $(eval PAGES:=$(wildcard $(PLUGIN_DIR)/src/pages/*.html))
42         $(eval TARGETS+=$(PLUGIN)-install)
43         $(eval JAVASCRIPT_$(PLUGIN):=$(wildcard $(addprefix $(PLUGIN_DIR)/,$(JAVASCRIPT-y))))
44         $(eval TEMPLATES_$(PLUGIN):=$(wildcard $(addprefix $(PLUGIN_DIR)/,$(TEMPLATES-y))))
45         $(eval STYLES_$(PLUGIN):=$(wildcard $(addprefix $(PLUGIN_DIR)/,$(STYLES-y))))
46         $(eval STYLES_LESS_$(PLUGIN):=$(wildcard $(addprefix $(PLUGIN_DIR)/,$(STYLES_LESS-y))))
47         $(eval STYLES_LESS_DEFAULT:=$(wildcard $(CURDIR)/juci/src/css/*))
48         $(eval PO_$(PLUGIN):=$(wildcard $(addprefix $(PLUGIN_DIR)/,$(PO-y))))
49         PHONY += $(PLUGIN)-install
50         # ex. tmp/50-my-awesome-plugin.js: first_file.js second_file.js first_po_file.po ...
51 $(TMP_DIR)/$(if $(CODE_LOAD),$(CODE_LOAD)-,)$(PLUGIN).js: $(JAVASCRIPT_$(PLUGIN)) $(PO_$(PLUGIN)) $(wildcard $(PLUGIN_DIR)/Makefile)
52         @echo -e "\033[0;33m[JS]\t$(PLUGIN) -> $$@\033[m"
53         @echo "" > $$@
54         $(Q)if [ "" != "$(JAVASCRIPT_$(PLUGIN))" ]; then for file in $(JAVASCRIPT_$(PLUGIN)); do cat $$$$file >> $$@; echo "" >> $$@; done; fi
55         $(Q)if [ "" != "$(PO_$(PLUGIN))" ]; then ./scripts/po2js $(PO_$(PLUGIN)) >> $$@; echo "" >> $$@; fi
56 $(TMP_DIR)/$(PLUGIN).css: $(STYLES_$(PLUGIN)) $(TMP_DIR)/$(PLUGIN)-compiled-styles.css
57         @echo -e "\033[0;33m[CSS]\t$(PLUGIN) -> $$@\033[m"
58         @echo "" > $$@
59         $(Q)if [ "" != "$$^" ]; then for file in $$^; do cat $$$$file >> $$@; echo "" >> $$@; done; fi
60 $(TMP_DIR)/$(PLUGIN).css.js: $(TMP_DIR)/$(PLUGIN).css
61         $(Q)./scripts/css-to-js $$^
62 $(TMP_DIR)/$(PLUGIN)-compiled-styles.css: $(STYLES_LESS_$(PLUGIN))
63         @echo -e "\033[033m[LESS]\t$(PLUGIN) -> $$@\033[m"
64         @echo "" > $$@
65         $(Q)if [ "$(3)" == "themes" ]; then\
66                 $(INSTALL_DIR) $(TMP_DIR)/themes/$(PLUGIN)/css;\
67                 for file in "$(STYLES_LESS_DEFAULT)"; do\
68                         cp $$$$file $(TMP_DIR)/themes/$(PLUGIN)/css/$(notdir $(file));\
69                 done;\
70                 for file in "$(STYLES_LESS_$(PLUGIN))"; do\
71                         cp $$$$file $(TMP_DIR)/themes/$(PLUGIN)/css/$(notdir $(file));\
72                 done;\
73         fi
74         $(Q)if [ "" != "$$^" ]; then\
75                 if [ -d $(TMP_DIR)/themes/$(PLUGIN)/css ]; then\
76                         for file in $$$$(find $(TMP_DIR)/themes/$(PLUGIN)/css/ -name *.less); do\
77                                 lessc $$$$file >> $$@;\
78                                 echo "" >> $$@;\
79                         done;\
80                 else\
81                         for file in $$^; do lessc $$$$file >> $$@; echo "" >> $$@; done;\
82                 fi\
83         fi
84 $(TMP_DIR)/$(PLUGIN).tpl.js: $(TEMPLATES_$(PLUGIN))
85         @echo -e "\033[0;33m[HTML]\t$(PLUGIN) -> $$@\033[m"
86         @echo "" > $$@
87         $(Q)if [ "" != "$$^" ]; then ./scripts/juci-build-tpl-cache $$^ $$@; fi
88 $(PLUGIN_DIR)/po/template.pot: $(JAVASCRIPT_$(PLUGIN)) $(TEMPLATES_$(PLUGIN))
89         @echo -e "\033[0;33m[POT]\t$(PLUGIN) -> $$@\033[m"
90         $(Q)$(INSTALL_DIR) "$$(dir $$@)"
91         @echo "" > $$@
92         $(Q)if [ "" != "$$^" ]; then ./scripts/extract-strings $$^ > $$@; msguniq --no-wrap $$@ > $$@.tmp; mv $$@.tmp $$@; fi
93         @echo "" >> $$@
94         @for file in $(PAGES); do PAGE=$$$${file%%.*}; echo -e "# $$$$file \nmsgid \"menu-$$$$(basename $$$$PAGE)-title\"\nmsgstr \"\"\n" >> $$@; done
95 $(CODE_DIR)/$(if $(CODE_LOAD),$(CODE_LOAD)-,)$(PLUGIN).js: $(TMP_DIR)/$(if $(CODE_LOAD),$(CODE_LOAD)-,)$(PLUGIN).js $(TMP_DIR)/$(PLUGIN).css.js $(TMP_DIR)/$(PLUGIN).tpl.js
96         @echo -e "\033[0;32m[INSTALLING] $(PLUGIN)\033[m"
97         $(Q)$(INSTALL_DIR) "$$(dir $$@)"
98         $(Q)cat $$^ > $$@
99 $(PLUGIN)-install: $(PLUGIN_DIR)/po/template.pot $(CODE_DIR)/$(if $(CODE_LOAD),$(CODE_LOAD)-,)$(PLUGIN).js
100         $(call Plugin/$(PLUGIN)/install,$(BIN))
101         $(Q)if [ -d $(PLUGIN_DIR)/ubus ]; then mkdir -p $(BACKEND_BIN_DIR); $(CP) $(PLUGIN_DIR)/ubus/* $(BACKEND_BIN_DIR); chmod +x $(BACKEND_BIN_DIR)/*; fi
102         $(Q)if [ -f $(PLUGIN_DIR)/menu.json ]; then mkdir -p $(BIN)/usr/share/rpcd/menu.d; $(CP) $(PLUGIN_DIR)/menu.json $(BIN)/usr/share/rpcd/menu.d/$(PLUGIN).json; fi
103         $(Q)if [ -f $(PLUGIN_DIR)/access.json ]; then mkdir -p $(BIN)/usr/share/rpcd/acl.d; $(CP) $(PLUGIN_DIR)/access.json $(BIN)/usr/share/rpcd/acl.d/$(PLUGIN).json; fi
104 endef
105
106 ifeq ($(local),true)
107 $(eval $(call BuildDir-$(CONFIG_PACKAGE_juci),juci,$(CURDIR)/juci/))
108 $(foreach th,$(wildcard plugins/*),$(eval $(call BuildDir-$(CONFIG_PACKAGE_$(notdir $(th))),$(notdir $(th)),$(th))))
109 $(foreach th,$(wildcard themes/*),$(eval $(call BuildDir-$(CONFIG_PACKAGE_$(notdir $(th))),$(notdir $(th)),$(th),themes)))
110 else
111 ifneq ($(THEME_PATH),)
112 $(foreach th,$(wildcard $(THEME_PATH)*),$(eval $(call BuildDir-y,$(notdir $(th)),$(th),themes)))
113 endif
114 $(foreach th,$(wildcard themes/*),$(eval $(call BuildDir-y,$(notdir $(th)),$(th),themes)))
115 $(foreach pl,$(wildcard plugins/*),$(eval $(call BuildDir-y,$(notdir $(pl)),$(pl))))
116 $(eval $(call BuildDir-y,juci,$(CURDIR)/juci/))
117 endif
118
119
120 export CC:=$(CC)
121 export CFLAGS:=$(CFLAGS)
122
123 ifeq ($(DESTDIR),)
124         DESTDIR:=/
125 endif
126
127 Makefile.local: ;
128
129 .cleaned: Makefile Makefile.local
130         @make clean 
131         @touch .cleaned
132
133 JSLINT_FILES:=$(wildcard $(PLUGINS-y)/**/src/widgets/*.js $(PLUGINS-y)/**/src/pages/*.js)
134
135 prepare: .cleaned
136         @echo "======= JUCI CONFIG ========="
137         @echo "TARGETS: $(TARGETS)"
138         @echo "DIRS: $(DIRS-y)"
139         @./scripts/bootstrap.sh
140         $(Q)$(INSTALL_DIR) $(TMP_DIR)
141         $(Q)$(INSTALL_DIR) $(BIN)/www/js/
142         $(Q)$(INSTALL_DIR) $(BIN)/www/themes/
143         $(Q)$(INSTALL_DIR) $(BIN)/www/css/
144         $(Q)$(INSTALL_DIR) $(BIN)/sbin/
145         $(Q)$(INSTALL_DIR) $(BIN)/usr/bin/
146         $(Q)$(INSTALL_DIR) $(BIN)/usr/share/rpcd/menu.d/
147         $(Q)$(INSTALL_DIR) $(BIN)/usr/share/rpcd/acl.d/
148         $(Q)$(INSTALL_DIR) $(BACKEND_BIN_DIR)
149         
150 node_modules: package.json
151         npm install --production
152
153 release: prepare node_modules $(TARGETS)
154         @echo "======= JUCI RELEASE =========="
155         @./scripts/juci-compile
156         @cp scripts/juci-update $(BIN)/usr/bin/
157
158 debug: prepare node_modules $(TARGETS)
159         @echo "======= JUCI DEBUG =========="
160         @echo -e "\033[0;33m [GRUNT] $@ \033[m"
161         @echo -e "\033[0;33m [UPDATE] $@ \033[m"
162         @./scripts/juci-update $(BIN)/www DEBUG
163         @cp scripts/juci-update $(BIN)/usr/bin/
164
165 DOCS_MD:= README.md $(wildcard juci/docs/*.md docs/*.md $(PLUGINS-y)/**/docs/*.md) docs/juci.md
166 DOCS_HTML:= $(patsubst %.md,%.html,$(DOCS_MD)) docs/juci.html
167 PHONY+=docs
168 docs: $(DOCS_HTML)
169         @echo -e "\033[0;33m [DOCS] $@ $^ \033[m"
170         $(Q)$(INSTALL_DIR) manual/js
171         $(Q)$(INSTALL_DIR) manual/css
172         @cp juci/src/lib/js/bootstrap.min.js manual/js/
173         @cp juci/src/lib/css/bootstrap.min.css manual/css/
174         @# remove juci generated md file
175         @rm -f docs/juci.md
176
177 docs/juci.md: $(wildcard $(PLUGINS-y)/**/docs/*.md)
178         @# for md in $^; do sed -i "/%PLUGINS_TOC%/a [$$(head -n 1 $$md)]($$(basename $${md%.md}))" docs/juci.md; done
179         @./scripts/build_docs .
180
181 %.html: %.md
182         @echo -e "\033[0;33m[DOC]: $^\033[m"
183         $(Q)$(INSTALL_DIR) manual
184         @ronn --pipe -f $^ > docs/.tmp.ronn
185         @cp docs/page.html.tpl docs/.tmp
186         @sed -i -e '/%CONTENT%/r docs/.tmp.ronn' -e 's///' docs/.tmp
187         @mv docs/.tmp $(addprefix manual/,$(notdir $@))
188         @rm -f docs/.tmp.ronn
189
190 install:
191         $(INSTALL_DIR) $(BIN)/usr/bin/
192         @cp scripts/juci-update $(BIN)/usr/bin/
193
194 .PHONY: $(PHONY)
195
196 clean:
197         @echo "===== CLEAN ====="
198         rm -rf ./bin ./tmp ./node_modules
199         @find . -name template.pot -exec rm {} \;