vis
a vi-like editor based on Plan 9's structural regular expressions
git clone https://9o.is/git/vis.git
Makefile
(6610B)
1 -include config.mk
2
3 REGEX_SRC ?= text-regex.c
4
5 SRC = array.c \
6 buffer.c \
7 event-basic.c \
8 libutf.c \
9 main.c \
10 map.c \
11 sam.c \
12 text-common.c \
13 text-io.c \
14 text-iterator.c \
15 text-motions.c \
16 text-objects.c \
17 text-util.c \
18 text.c \
19 ui-terminal.c \
20 view.c \
21 vis-lua.c \
22 vis-marks.c \
23 vis-modes.c \
24 vis-motions.c \
25 vis-operators.c \
26 vis-prompt.c \
27 vis-registers.c \
28 vis-subprocess.c \
29 vis-text-objects.c \
30 vis.c \
31 $(REGEX_SRC)
32 OBJ = $(SRC:%.c=obj/%.o)
33
34 ELF = vis vis-menu vis-digraph
35 EXECUTABLES = $(ELF) vis-clipboard vis-complete vis-open
36
37 MANUALS = $(EXECUTABLES:=.1)
38
39 DOCUMENTATION = LICENSE README.md
40
41 VERSION = $(shell git describe --always --dirty 2>/dev/null || echo "v0.9-git")
42
43 CONFIG_HELP ?= 1
44 CONFIG_CURSES ?= 1
45 CONFIG_LUA ?= 1
46 CONFIG_LPEG ?= 0
47 CONFIG_TRE ?= 0
48 CONFIG_ACL ?= 0
49 CONFIG_SELINUX ?= 0
50
51 CFLAGS_STD ?= -std=c99 -U_XOPEN_SOURCE -D_XOPEN_SOURCE=700 -DNDEBUG -MMD
52 CFLAGS_STD += -DVERSION=\"${VERSION}\"
53 LDFLAGS_STD ?= -lc
54
55 CFLAGS_LIBC ?= -DHAVE_MEMRCHR=0
56
57 CFLAGS_VIS = $(CFLAGS_AUTO) $(CFLAGS_TERMKEY) $(CFLAGS_CURSES) $(CFLAGS_ACL) \
58 $(CFLAGS_SELINUX) $(CFLAGS_TRE) $(CFLAGS_LUA) $(CFLAGS_LPEG) $(CFLAGS_STD) \
59 $(CFLAGS_LIBC)
60
61 CFLAGS_VIS += -DVIS_PATH=\"${SHAREPREFIX}/vis\"
62 CFLAGS_VIS += -DCONFIG_HELP=${CONFIG_HELP}
63 CFLAGS_VIS += -DCONFIG_CURSES=${CONFIG_CURSES}
64 CFLAGS_VIS += -DCONFIG_LUA=${CONFIG_LUA}
65 CFLAGS_VIS += -DCONFIG_LPEG=${CONFIG_LPEG}
66 CFLAGS_VIS += -DCONFIG_TRE=${CONFIG_TRE}
67 CFLAGS_VIS += -DCONFIG_SELINUX=${CONFIG_SELINUX}
68 CFLAGS_VIS += -DCONFIG_ACL=${CONFIG_ACL}
69
70 LDFLAGS_VIS = $(LDFLAGS_AUTO) $(LDFLAGS_TERMKEY) $(LDFLAGS_CURSES) $(LDFLAGS_ACL) \
71 $(LDFLAGS_SELINUX) $(LDFLAGS_TRE) $(LDFLAGS_LUA) $(LDFLAGS_LPEG) $(LDFLAGS_STD)
72
73 STRIP?=strip
74 TAR?=tar
75 DOCKER?=docker
76
77 all: $(ELF)
78
79 config.h:
80 cp config.def.h config.h
81
82 config.mk:
83 @touch $@
84
85 obj/.tstamp:
86 mkdir obj
87 touch obj/.tstamp
88
89 obj/main.o: config.h
90
91 $(OBJ): config.mk obj/.tstamp
92 ${CC} ${CFLAGS} ${CFLAGS_VIS} ${CFLAGS_EXTRA} -o $@ -c $(@:obj/%.o=%.c)
93
94 -include obj/*.d
95
96 vis: ${OBJ}
97 ${CC} -o $@ ${OBJ} ${LDFLAGS} ${LDFLAGS_VIS} ${LDFLAGS_EXTRA}
98
99 vis-menu: vis-menu.c
100 ${CC} ${CFLAGS} ${CFLAGS_AUTO} ${CFLAGS_STD} ${CFLAGS_EXTRA} $< ${LDFLAGS} ${LDFLAGS_STD} ${LDFLAGS_AUTO} ${LDFLAGS_EXTRA} -o $@
101
102 vis-digraph: vis-digraph.c
103 ${CC} ${CFLAGS} ${CFLAGS_AUTO} ${CFLAGS_STD} ${CFLAGS_EXTRA} $< ${LDFLAGS} ${LDFLAGS_STD} ${LDFLAGS_AUTO} ${LDFLAGS_EXTRA} -o $@
104
105 vis-single-payload.inc: $(EXECUTABLES) lua/*
106 for e in $(ELF); do \
107 ${STRIP} "$$e"; \
108 done
109 echo '#ifndef VIS_SINGLE_PAYLOAD_H' > $@
110 echo '#define VIS_SINGLE_PAYLOAD_H' >> $@
111 echo 'static unsigned char vis_single_payload[] = {' >> $@
112 $(TAR) --mtime='2014-07-15 01:23Z' --owner=0 --group=0 --numeric-owner --mode='a+rX-w' -c \
113 $(EXECUTABLES) $$(find lua -name '*.lua' | LC_ALL=C sort) | xz -T 1 | \
114 od -t x1 -A n -v | sed 's/\([0-9a-f]\{2\}\)/0x\1,/g' >> $@
115 echo '};' >> $@
116 echo '#endif' >> $@
117
118 vis-single: vis-single.c vis-single-payload.inc
119 ${CC} ${CFLAGS} ${CFLAGS_AUTO} ${CFLAGS_STD} ${CFLAGS_EXTRA} $< ${LDFLAGS} ${LDFLAGS_STD} ${LDFLAGS_AUTO} -luntar -llzma -o $@
120 ${STRIP} $@
121
122 docker-kill:
123 -$(DOCKER) kill vis && $(DOCKER) wait vis
124
125 docker: docker-kill clean
126 $(DOCKER) build -t vis .
127 $(DOCKER) run --rm -d --name vis vis tail -f /dev/null
128 $(DOCKER) exec vis apk update
129 $(DOCKER) exec vis apk upgrade
130 $(DOCKER) cp . vis:/build/vis
131 $(DOCKER) exec -w /build/vis vis ./configure CC='cc --static' \
132 --enable-acl \
133 --enable-lua \
134 --enable-lpeg-static
135 $(DOCKER) exec -w /build/vis vis make VERSION="$(VERSION)" clean vis-single
136 $(DOCKER) cp vis:/build/vis/vis-single vis
137 $(DOCKER) kill vis
138
139 docker-clean: docker-kill clean
140 -$(DOCKER) image rm vis
141
142 debug: clean
143 @$(MAKE) CFLAGS_EXTRA='${CFLAGS_EXTRA} ${CFLAGS_DEBUG}'
144
145 profile: clean
146 @$(MAKE) CFLAGS_AUTO='' LDFLAGS_AUTO='' CFLAGS_EXTRA='-pg -O2'
147
148 coverage: clean
149 @$(MAKE) CFLAGS_EXTRA='--coverage' LDFLAGS_EXTRA='--coverage'
150
151 test:
152 @$(MAKE) -C test
153
154 testclean:
155 @echo cleaning the test artifacts
156 [ ! -e test/Makefile ] || $(MAKE) -C test clean
157
158 clean:
159 @echo cleaning
160 @rm -rf obj
161 @rm -f $(ELF) vis-single vis-single-payload.inc vis-*.tar.gz *.gcov *.gcda *.gcno *.d
162
163 distclean: clean testclean
164 @echo cleaning build configuration
165 @rm -f config.h config.mk
166
167 dist: distclean
168 @echo creating dist tarball
169 @git archive --prefix=vis-${VERSION}/ -o vis-${VERSION}.tar.gz HEAD
170
171 man:
172 @for m in ${MANUALS}; do \
173 echo "Generating $$m"; \
174 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; \
175 done
176
177 luadoc:
178 @cd lua/doc && ldoc . && sed -e "s/RELEASE/${VERSION}/" -i index.html
179
180 luadoc-all:
181 @cd lua/doc && ldoc -a . && sed -e "s/RELEASE/${VERSION}/" -i index.html
182
183 luacheck:
184 @luacheck --config .luacheckrc lua test/lua | less -RFX
185
186 install: $(ELF)
187 @echo installing executable files to ${DESTDIR}${PREFIX}/bin
188 @mkdir -p ${DESTDIR}${PREFIX}/bin
189 @for e in ${EXECUTABLES}; do \
190 cp -f "$$e" ${DESTDIR}${PREFIX}/bin && \
191 chmod 755 ${DESTDIR}${PREFIX}/bin/"$$e"; \
192 done
193 @test ${CONFIG_LUA} -eq 0 || { \
194 echo installing support files to ${DESTDIR}${SHAREPREFIX}/vis; \
195 mkdir -p ${DESTDIR}${SHAREPREFIX}/vis; \
196 cp -r lua/* ${DESTDIR}${SHAREPREFIX}/vis; \
197 rm -rf "${DESTDIR}${SHAREPREFIX}/vis/doc"; \
198 }
199 @echo installing documentation to ${DESTDIR}${DOCPREFIX}/vis
200 @mkdir -p ${DESTDIR}${DOCPREFIX}/vis
201 @for d in ${DOCUMENTATION}; do \
202 cp "$$d" ${DESTDIR}${DOCPREFIX}/vis && \
203 chmod 644 "${DESTDIR}${DOCPREFIX}/vis/$$d"; \
204 done
205 @echo installing manual pages to ${DESTDIR}${MANPREFIX}/man1
206 @mkdir -p ${DESTDIR}${MANPREFIX}/man1
207 @for m in ${MANUALS}; do \
208 sed -e "s/VERSION/${VERSION}/" < "man/$$m" > "${DESTDIR}${MANPREFIX}/man1/$$m" && \
209 chmod 644 "${DESTDIR}${MANPREFIX}/man1/$$m"; \
210 done
211
212 install-strip: install
213 @echo stripping executables
214 @for e in $(ELF); do \
215 ${STRIP} ${DESTDIR}${PREFIX}/bin/"$$e"; \
216 done
217
218 uninstall:
219 @echo removing executable file from ${DESTDIR}${PREFIX}/bin
220 @for e in ${EXECUTABLES}; do \
221 rm -f ${DESTDIR}${PREFIX}/bin/"$$e"; \
222 done
223 @echo removing documentation from ${DESTDIR}${DOCPREFIX}/vis
224 @for d in ${DOCUMENTATION}; do \
225 rm -f ${DESTDIR}${DOCPREFIX}/vis/"$$d"; \
226 done
227 @echo removing manual pages from ${DESTDIR}${MANPREFIX}/man1
228 @for m in ${MANUALS}; do \
229 rm -f ${DESTDIR}${MANPREFIX}/man1/"$$m"; \
230 done
231 @echo removing support files from ${DESTDIR}${SHAREPREFIX}/vis
232 @rm -rf ${DESTDIR}${SHAREPREFIX}/vis
233
234 .PHONY: all clean testclean dist distclean install install-strip uninstall debug profile coverage test test-update luadoc luadoc-all luacheck man docker-kill docker docker-clean