build: improve debug flags
[vis.git] / Makefile
blob7e9b0c50faf71e7844ee3696e72766a7da70543b
1 -include config.mk
3 REGEX_SRC ?= text-regex.c
5 SRC = array.c buffer.c libutf.c main.c map.c \
6 sam.c text.c text-motions.c text-objects.c text-util.c \
7 ui-terminal.c view.c vis.c vis-lua.c vis-modes.c vis-motions.c \
8 vis-operators.c vis-registers.c vis-marks.c vis-prompt.c vis-text-objects.c $(REGEX_SRC)
10 ELF = vis vis-menu vis-digraph
11 EXECUTABLES = $(ELF) vis-clipboard vis-complete vis-open
13 MANUALS = $(EXECUTABLES:=.1)
15 DOCUMENTATION = LICENSE README.md
17 VERSION = $(shell git describe --always --dirty 2>/dev/null || echo "v0.5-git")
19 CONFIG_HELP ?= 1
20 CONFIG_CURSES ?= 1
21 CONFIG_LUA ?= 1
22 CONFIG_LPEG ?= 0
23 CONFIG_TRE ?= 0
24 CONFIG_ACL ?= 0
25 CONFIG_SELINUX ?= 0
27 CFLAGS_STD ?= -std=c99 -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700 -DNDEBUG
28 CFLAGS_STD += -DVERSION=\"${VERSION}\"
29 LDFLAGS_STD ?= -lc
31 CFLAGS_LIBC ?= -DHAVE_MEMRCHR=0
33 CFLAGS_VIS = $(CFLAGS_AUTO) $(CFLAGS_TERMKEY) $(CFLAGS_CURSES) $(CFLAGS_ACL) \
34 $(CFLAGS_SELINUX) $(CFLAGS_TRE) $(CFLAGS_LUA) $(CFLAGS_LPEG) $(CFLAGS_STD) \
35 $(CFLAGS_LIBC)
37 CFLAGS_VIS += -DVIS_PATH=\"${SHAREPREFIX}/vis\"
38 CFLAGS_VIS += -DCONFIG_HELP=${CONFIG_HELP}
39 CFLAGS_VIS += -DCONFIG_CURSES=${CONFIG_CURSES}
40 CFLAGS_VIS += -DCONFIG_LUA=${CONFIG_LUA}
41 CFLAGS_VIS += -DCONFIG_LPEG=${CONFIG_LPEG}
42 CFLAGS_VIS += -DCONFIG_TRE=${CONFIG_TRE}
43 CFLAGS_VIS += -DCONFIG_SELINUX=${CONFIG_SELINUX}
44 CFLAGS_VIS += -DCONFIG_ACL=${CONFIG_ACL}
46 LDFLAGS_VIS = $(LDFLAGS_AUTO) $(LDFLAGS_TERMKEY) $(LDFLAGS_CURSES) $(LDFLAGS_ACL) \
47 $(LDFLAGS_SELINUX) $(LDFLAGS_TRE) $(LDFLAGS_LUA) $(LDFLAGS_LPEG) $(LDFLAGS_STD)
49 STRIP?=strip
50 TAR?=tar
51 DOCKER?=docker
53 all: $(ELF)
55 config.h:
56 cp config.def.h config.h
58 config.mk:
59 @touch $@
61 vis: config.h config.mk *.c *.h
62 ${CC} ${CFLAGS} ${CFLAGS_VIS} ${CFLAGS_EXTRA} ${SRC} ${LDFLAGS} ${LDFLAGS_VIS} -o $@
64 vis-menu: vis-menu.c
65 ${CC} ${CFLAGS} ${CFLAGS_AUTO} ${CFLAGS_STD} ${CFLAGS_EXTRA} $< ${LDFLAGS} ${LDFLAGS_STD} ${LDFLAGS_AUTO} -o $@
67 vis-digraph: vis-digraph.c
68 ${CC} ${CFLAGS} ${CFLAGS_AUTO} ${CFLAGS_STD} ${CFLAGS_EXTRA} $< ${LDFLAGS} ${LDFLAGS_STD} ${LDFLAGS_AUTO} -o $@
70 vis-single-payload.inc: $(EXECUTABLES) lua/*
71 for e in $(ELF); do \
72 ${STRIP} "$$e"; \
73 done
74 echo '#ifndef VIS_SINGLE_PAYLOAD_H' > $@
75 echo '#define VIS_SINGLE_PAYLOAD_H' >> $@
76 echo 'static unsigned char vis_single_payload[] = {' >> $@
77 $(TAR) --mtime='2014-07-15 01:23Z' --owner=0 --group=0 --numeric-owner --mode='a+rX-w' -c \
78 $(EXECUTABLES) $$(find lua -name '*.lua' | LC_ALL=C sort) | xz -T 1 | \
79 od -t x1 -v | sed -e 's/^[0-9a-fA-F]\{1,\}//g' -e 's/\([0-9a-f]\{2\}\)/0x\1,/g' >> $@
80 echo '};' >> $@
81 echo '#endif' >> $@
83 vis-single: vis-single.c vis-single-payload.inc
84 ${CC} ${CFLAGS} ${CFLAGS_AUTO} ${CFLAGS_STD} ${CFLAGS_EXTRA} $< ${LDFLAGS} ${LDFLAGS_STD} ${LDFLAGS_AUTO} -luntar -llzma -o $@
85 ${STRIP} $@
87 docker-kill:
88 -$(DOCKER) kill vis && $(DOCKER) wait vis
90 docker: docker-kill clean
91 $(DOCKER) build -t vis .
92 $(DOCKER) run --rm -d --name vis vis tail -f /dev/null
93 $(DOCKER) exec vis apk update
94 $(DOCKER) exec vis apk upgrade
95 $(DOCKER) cp . vis:/build/vis
96 $(DOCKER) exec -w /build/vis vis ./configure CC='cc --static' \
97 --enable-acl \
98 --enable-lua \
99 --enable-lpeg-static
100 $(DOCKER) exec -w /build/vis vis make VERSION="$(VERSION)" clean vis-single
101 $(DOCKER) cp vis:/build/vis/vis-single vis
102 $(DOCKER) kill vis
104 docker-clean: docker-kill clean
105 -$(DOCKER) image rm vis
107 debug: clean
108 @$(MAKE) CFLAGS_EXTRA='${CFLAGS_EXTRA} ${CFLAGS_DEBUG}'
110 profile: clean
111 @$(MAKE) CFLAGS_AUTO='' LDFLAGS_AUTO='' CFLAGS_EXTRA='-pg -O2'
113 coverage: clean
114 @$(MAKE) CFLAGS_EXTRA='--coverage'
116 test-update:
117 git submodule init
118 git submodule update --remote --rebase
120 test:
121 [ -e test/Makefile ] || $(MAKE) test-update
122 @$(MAKE) -C test
124 clean:
125 @echo cleaning
126 @rm -f $(ELF) vis-single vis-single-payload.inc vis-*.tar.gz *.gcov *.gcda *.gcno
128 dist: clean
129 @echo creating dist tarball
130 @git archive --prefix=vis-${VERSION}/ -o vis-${VERSION}.tar.gz HEAD
132 man:
133 @for m in ${MANUALS}; do \
134 echo "Generating $$m"; \
135 sed -e "s/VERSION/${VERSION}/" "man/$$m" | mandoc -W warning -T utf8 -T html -O man=%N.%S.html -O style=mandoc.css 1> "man/$$m.html" || true; \
136 done
138 luadoc:
139 @cd lua/doc && ldoc . && sed -e "s/RELEASE/${VERSION}/" -i index.html
141 luadoc-all:
142 @cd lua/doc && ldoc -a . && sed -e "s/RELEASE/${VERSION}/" -i index.html
144 luacheck:
145 @luacheck --config .luacheckrc lua test/lua | less -RFX
147 install: $(ELF)
148 @echo stripping executable
149 @for e in $(ELF); do \
150 ${STRIP} "$$e"; \
151 done
152 @echo installing executable files to ${DESTDIR}${PREFIX}/bin
153 @mkdir -p ${DESTDIR}${PREFIX}/bin
154 @for e in ${EXECUTABLES}; do \
155 cp -f "$$e" ${DESTDIR}${PREFIX}/bin && \
156 chmod 755 ${DESTDIR}${PREFIX}/bin/"$$e"; \
157 done
158 @test ${CONFIG_LUA} -eq 0 || { \
159 echo installing support files to ${DESTDIR}${SHAREPREFIX}/vis; \
160 mkdir -p ${DESTDIR}${SHAREPREFIX}/vis; \
161 cp -r lua/* ${DESTDIR}${SHAREPREFIX}/vis; \
162 rm -rf "${DESTDIR}${SHAREPREFIX}/vis/doc"; \
164 @echo installing documentation to ${DESTDIR}${DOCPREFIX}/vis
165 @mkdir -p ${DESTDIR}${DOCPREFIX}/vis
166 @for d in ${DOCUMENTATION}; do \
167 cp "$$d" ${DESTDIR}${DOCPREFIX}/vis && \
168 chmod 644 "${DESTDIR}${DOCPREFIX}/vis/$$d"; \
169 done
170 @echo installing manual pages to ${DESTDIR}${MANPREFIX}/man1
171 @mkdir -p ${DESTDIR}${MANPREFIX}/man1
172 @for m in ${MANUALS}; do \
173 sed -e "s/VERSION/${VERSION}/" < "man/$$m" > "${DESTDIR}${MANPREFIX}/man1/$$m" && \
174 chmod 644 "${DESTDIR}${MANPREFIX}/man1/$$m"; \
175 done
177 uninstall:
178 @echo removing executable file from ${DESTDIR}${PREFIX}/bin
179 @for e in ${EXECUTABLES}; do \
180 rm -f ${DESTDIR}${PREFIX}/bin/"$$e"; \
181 done
182 @echo removing documentation from ${DESTDIR}${DOCPREFIX}/vis
183 @for d in ${DOCUMENTATION}; do \
184 rm -f ${DESTDIR}${DOCPREFIX}/vis/"$$d"; \
185 done
186 @echo removing manual pages from ${DESTDIR}${MANPREFIX}/man1
187 @for m in ${MANUALS}; do \
188 rm -f ${DESTDIR}${MANPREFIX}/man1/"$$m"; \
189 done
190 @echo removing support files from ${DESTDIR}${SHAREPREFIX}/vis
191 @rm -rf ${DESTDIR}${SHAREPREFIX}/vis
193 .PHONY: all clean dist install uninstall debug profile coverage test test-update luadoc luadoc-all luacheck man docker-kill docker docker-clean