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