1# Copyright (c) 2016 Robert Virding
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#     http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13#  limitations under the License.
14
15# Makefile for LFE
16
17BINDIR = bin
18EBINDIR = ebin
19SRCDIR = src
20CSRCDIR = c_src
21LSRCDIR = src
22INCDIR = include
23EMACSDIR = emacs
24PREFIX ?= /usr/local
25INSTALL = install
26INSTALL_DIR = $(INSTALL) -m755 -d
27INSTALL_DATA = $(INSTALL) -m644
28INSTALL_BIN = $(INSTALL) -m755
29DESTLIBDIR := $(PREFIX)/lib/lfe
30DESTEBINDIR := $(DESTLIBDIR)/$(EBINDIR)
31DESTBINDIR := $(DESTLIBDIR)/$(BINDIR)
32
33VPATH = $(SRCDIR)
34
35MKDIR_P = mkdir -p
36MANDB = $(shell which mandb)
37
38ERLCFLAGS = -W1
39ERLC = erlc
40
41LFECFLAGS = -pa ../lfe
42LFEC = $(BINDIR)/lfe $(BINDIR)/lfec
43APP_DEF = lfe.app
44
45LIB=lfe
46
47# To run erl as bash
48FINISH=-run init stop -noshell
49
50# Scripts to be evaluated
51
52GET_VERSION = '{ok,[App]}=file:consult("src/$(LIB).app.src"), \
53	V=proplists:get_value(vsn,element(3,App)), \
54	io:format("~p~n",[V])' \
55	$(FINISH)
56
57
58## The .erl, .xrl, .yrl and .beam files
59ESRCS = $(notdir $(wildcard $(SRCDIR)/*.erl))
60XSRCS = $(notdir $(wildcard $(SRCDIR)/*.xrl))
61YSRCS = $(notdir $(wildcard $(SRCDIR)/*.yrl))
62LSRCS = $(notdir $(wildcard $(LSRCDIR)/*.lfe))
63EBINS = $(ESRCS:.erl=.beam) $(XSRCS:.xrl=.beam) $(YSRCS:.yrl=.beam)
64LBINS = $(LSRCS:.lfe=.beam)
65
66CSRCS = $(notdir $(wildcard $(CSRCDIR)/*.c))
67BINS = $(CSRCS:.c=)
68
69EMACSRCS = $(notdir $(wildcard $(EMACSDIR)/*.el))
70ELCS = $(EMACSRCS:.el=.elc)
71
72.SUFFIXES: .erl .beam
73
74$(BINDIR)/%: $(CSRCDIR)/%.c
75	cc -o $@ $<
76
77$(EBINDIR)/%.beam: $(SRCDIR)/%.erl
78	@$(MKDIR_P) $(EBINDIR)
79	$(ERLC) -I $(INCDIR) -o $(EBINDIR) $(COMP_OPTS) $(ERLCFLAGS) $<
80
81%.erl: %.xrl
82	$(ERLC) -o $(SRCDIR) $<
83
84%.erl: %.yrl
85	$(ERLC) -o $(SRCDIR) $<
86
87$(EBINDIR)/%.beam: $(LSRCDIR)/%.lfe
88	$(LFEC) -I $(INCDIR) -o $(EBINDIR) $(LFECFLAGS) $<
89
90all: compile
91
92.PHONY: compile erlc-compile lfec-compile erlc-lfec emacs install docs clean docker-build docker-push docker update-mandb
93
94compile: comp_opts.mk
95	$(MAKE) $(MFLAGS) erlc-lfec
96
97## Compile Erlang files using erlc
98erlc-compile: $(addprefix $(EBINDIR)/, $(EBINS)) $(addprefix $(BINDIR)/, $(BINS))
99
100## Compile LFE files using lfec
101lfec-compile: $(addprefix $(EBINDIR)/, $(LBINS))
102
103$(addprefix $(EBINDIR)/, $(LBINS)): $(addprefix $(EBINDIR)/, $(EBINS))
104
105$(EBINDIR)/$(APP_DEF): $(SRCDIR)/$(APP_DEF).src
106	cp $(SRCDIR)/$(APP_DEF).src $(EBINDIR)/$(APP_DEF)
107
108## Compile Erlang files using erlc and LFE files using lfec
109erlc-lfec: erlc-compile $(EBINDIR)/$(APP_DEF) lfec-compile
110
111emacs:
112	cd $(EMACSDIR) ; \
113	emacs -L . -batch -f batch-byte-compile inferior-lfe.el lfe-mode.el lfe-indent.el
114
115comp_opts.mk:
116	escript get_comp_opts.escript
117
118-include comp_opts.mk
119
120install: compile install-beam install-bin install-man
121
122install-beam:
123	rm -Rf $(DESTEBINDIR)
124	$(INSTALL_DIR) $(DESTEBINDIR)
125	$(INSTALL_DATA) $(EBINDIR)/$(APP_DEF) $(DESTEBINDIR)
126	$(INSTALL_DATA) $(addprefix $(EBINDIR)/, $(EBINS)) $(DESTEBINDIR)
127	$(INSTALL_DATA) $(addprefix $(EBINDIR)/, $(LBINS)) $(DESTEBINDIR)
128	$(INSTALL_DIR) $(DESTBINDIR)
129	$(MAKE) $(BINDIR)/lfe $(BINDIR)/lfec $(BINDIR)/lfedoc $(BINDIR)/lfescript
130	ln -sf $(DESTBINDIR)/* $(PREFIX)/bin/
131
132clean:
133	rm -rf $(EBINDIR)/*.beam erl_crash.dump comp_opts.mk
134
135echo:
136	@ echo $(ESRCS)
137	@ echo $(XSRCS)
138	@ echo $(YSRCS)
139	@ echo $(EBINS)
140
141get-version:
142	@echo
143	@echo "Getting version info ..."
144	@echo
145	@echo -n app.src: ''
146	@erl -eval $(GET_VERSION)
147
148# Target to regenerate the src/lfe_parse.erl file from its original
149# src/lfe_parse.spell1 definition.  You will need to have spell1
150# installed somewhere in your $ERL_LIBS path.
151regenerate-parser:
152	erl -noshell -eval 'spell1:file("src/lfe_parse", [report,verbose,{outdir,"./src/"},{includefile,code:lib_dir(spell1,include) ++ "/spell1inc.hrl"}]), init:stop().'
153
154# Targets for generating docs and man pages
155DOCDIR = doc
156DOCSRC = $(DOCDIR)/src
157MANDIR = $(DOCDIR)/man
158PDFDIR = $(DOCDIR)/pdf
159EPUBDIR = $(DOCDIR)/epub
160MANINSTDIR ?= $(PREFIX)/share/man
161
162MAN1_SRCS = $(notdir $(wildcard $(DOCSRC)/*1.md))
163MAN1S = $(MAN1_SRCS:.1.md=.1)
164TXT1S = $(MAN1_SRCS:.1.md=.txt)
165PDF1S = $(MAN1_SRCS:.1.md=.pdf)
166EPUB1S = $(MAN1_SRCS:.1.md=.epub)
167MAN3_SRCS = $(notdir $(wildcard $(DOCSRC)/*3.md))
168MAN3S = $(MAN3_SRCS:.3.md=.3)
169TXT3S = $(MAN3_SRCS:.3.md=.txt)
170PDF3S = $(MAN3_SRCS:.3.md=.pdf)
171EPUB3S = $(MAN3_SRCS:.3.md=.epub)
172MAN7_SRCS = $(notdir $(wildcard $(DOCSRC)/*7.md))
173MAN7S = $(MAN7_SRCS:.7.md=.7)
174TXT7S = $(MAN7_SRCS:.7.md=.txt)
175PDF7S = $(MAN7_SRCS:.7.md=.pdf)
176EPUB7S = $(MAN7_SRCS:.7.md=.epub)
177
178# Just generate the docs that are tracked in git
179docs: docs-txt
180
181# Generate all docs, even those not tracked in git
182docs-all: docs docs-epub docs-pdf
183
184docs-man: \
185	$(addprefix $(MANDIR)/, $(MAN1S)) \
186	$(addprefix $(MANDIR)/, $(MAN3S)) \
187	$(addprefix $(MANDIR)/, $(MAN7S))
188
189
190$(MANDIR)/%.1: $(DOCSRC)/%.1.md
191	pandoc -f markdown -s -t man -o $@ $<
192
193$(MANDIR)/%.3: $(DOCSRC)/%.3.md
194	pandoc -f markdown -s -t man -o $@ $<
195
196$(MANDIR)/%.7: $(DOCSRC)/%.7.md
197	pandoc -f markdown -s -t man -o $@ $<
198
199clean-docs:
200	rm -f $(DOCDIR)/*.txt $(MANDIR)/*.[0-9] $(PDFDIR)/*.pdf $(EPUBDIR)/*.epub
201
202docs-txt: docs-man \
203	$(addprefix $(DOCDIR)/, $(TXT1S)) \
204	$(addprefix $(DOCDIR)/, $(TXT3S)) \
205	$(addprefix $(DOCDIR)/, $(TXT7S))
206	@if [ -f $(DOCDIR)/lfe_guide.txt ]; then \
207		cp $(DOCDIR)/lfe_guide.txt $(DOCDIR)/user_guide.txt ; \
208	fi
209
210$(DOCDIR)/%.txt: export GROFF_NO_SGR=1
211
212$(DOCDIR)/%.txt: $(MANDIR)/%.1
213	groff -t -e -mandoc -Tutf8 -Kutf8 $< | col -bx > $@
214
215$(DOCDIR)/%.txt: $(MANDIR)/%.3
216	groff -t -e -mandoc -Tutf8 -Kutf8 $< | col -bx > $@
217
218$(DOCDIR)/%.txt: $(MANDIR)/%.7
219	groff -t -e -mandoc -Tutf8 -Kutf8 $< | col -bx > $@
220
221$(PDFDIR):
222	@$(MKDIR_P) $(PDFDIR)
223
224docs-pdf: $(PDFDIR) \
225	$(addprefix $(PDFDIR)/, $(PDF1S)) \
226	$(addprefix $(PDFDIR)/, $(PDF3S)) \
227	$(addprefix $(PDFDIR)/, $(PDF7S))
228
229$(PDFDIR)/%.pdf: $(DOCSRC)/%.1.md
230	pandoc -f markdown --latex-engine=xelatex -o $@ $<
231
232$(PDFDIR)/%.pdf: $(DOCSRC)/%.3.md
233	pandoc -f markdown --latex-engine=xelatex -o $@ $<
234
235$(PDFDIR)/%.pdf: $(DOCSRC)/%.7.md
236	pandoc -f markdown --latex-engine=xelatex -o $@ $<
237
238$(EPUBDIR):
239	@$(MKDIR_P) $(EPUBDIR)
240
241docs-epub: $(EPUBDIR) \
242	$(addprefix $(EPUBDIR)/, $(EPUB1S)) \
243	$(addprefix $(EPUBDIR)/, $(EPUB3S)) \
244	$(addprefix $(EPUBDIR)/, $(EPUB7S))
245
246$(EPUBDIR)/%.epub: $(DOCSRC)/%.1.md
247	pandoc -f markdown -t epub -o $@ $<
248
249$(EPUBDIR)/%.epub: $(DOCSRC)/%.3.md
250	pandoc -f markdown -t epub -o $@ $<
251
252$(EPUBDIR)/%.epub: $(DOCSRC)/%.7.md
253	pandoc -f markdown -t epub -o $@ $<
254
255$(MANINSTDIR)/man%:
256	@$(MKDIR_P) -p $@
257
258ifeq (,$(findstring mandb,$(MANDB)))
259install-man: $(MANINSTDIR)/man1 $(MANINSTDIR)/man3 $(MANINSTDIR)/man7
260else
261install-man: $(MANINSTDIR)/man1 $(MANINSTDIR)/man3 $(MANINSTDIR)/man7 update-mandb
262endif
263	$(INSTALL_DATA) $(MANDIR)/*.1 $(MANINSTDIR)/man1/
264	$(INSTALL_DATA) $(MANDIR)/*.3 $(MANINSTDIR)/man3/
265	$(INSTALL_DATA) $(MANDIR)/*.7 $(MANINSTDIR)/man7/
266
267update-mandb:
268	@echo "Updating man page database ..."
269	$(MANDB) $(MANINSTDIR)
270
271# Targets for working with Docker
272docker-build:
273	docker build -t lfex/lfe:latest .
274	docker build -t lfex/lfe-docs:latest ./doc
275
276docker-push:
277	docker push lfex/lfe:latest
278	docker push lfex/lfe-docs:latest
279
280docker: docker-build docker-push
281
282docker-run:
283	docker run -i -t lfex/lfe:latest lfe
284
285docker-docs:
286	docker run -v `pwd`/doc:/docs -t lfex/lfe-docs:latest
287	sudo chown -R $(USER):$(USER) doc/*
288
289docker-docs-bash:
290	docker run -i -v `pwd`/doc:/docs -t lfex/lfe-docs:latest bash
291
292travis:
293	@rebar3 ct
294	@rebar3 eunit -m clj-tests,prop_lfe_doc
295