xref: /Universal-ctags/makefiles/testing.mak (revision 0a48205621ab3df464612df83b01304f31354c2c)
1# -*- makefile -*-
2.PHONY: check units fuzz noise tmain tinst tlib man-test clean-units clean-tlib clean-tmain clean-gcov clean-man-test run-gcov codecheck cppcheck dicts validate-input check-genfile
3
4EXTRA_DIST += misc/units misc/units.py misc/man-test.py
5EXTRA_DIST += misc/tlib misc/mini-geany.expected
6MAN_TEST_TMPDIR = ManTest
7
8check: tmain units tlib man-test check-genfile
9
10# We may use CLEANFILES, DISTCLEANFILES, or etc.
11# clean-tlib and clean-gcov are not included
12clean-local: clean-units clean-tmain clean-man-test
13
14CTAGS_TEST = ./ctags$(EXEEXT)
15READTAGS_TEST = ./readtags$(EXEEXT)
16MINI_GEANY_TEST = ./mini-geany$(EXEEXT)
17OPTSCRIPT_TEST = ./optscript$(EXEEXT)
18
19if HAVE_TIMEOUT
20TIMEOUT = 1
21else
22TIMEOUT = 0
23endif
24
25LANGUAGES=
26CATEGORIES=
27UNITS=
28PMAP=
29
30SILENT = $(SILENT_@AM_V@)
31SILENT_ = $(SILENT_@AM_DEFAULT_V@)
32SILENT_0 = @
33
34V_RUN = $(V_RUN_@AM_V@)
35V_RUN_ = $(V_RUN_@AM_DEFAULT_V@)
36V_RUN_0 = @echo "  RUN      $@";
37
38#
39# FUZZ Target
40#
41# SHELL must be dash or bash.
42#
43fuzz: $(CTAGS_TEST)
44	$(V_RUN) \
45	if test -n "$${ZSH_VERSION+set}"; then set -o SH_WORD_SPLIT; fi; \
46	if test x$(VG) = x1; then		\
47		VALGRIND=--with-valgrind;	\
48	fi;					\
49	c="$(srcdir)/misc/units fuzz \
50		--ctags=$(CTAGS_TEST) \
51		--languages=$(LANGUAGES) \
52		$${VALGRIND} --run-shrink \
53		--with-timeout=`expr $(TIMEOUT) '*' 10`"; \
54	$(SHELL) $${c} $(srcdir)/Units
55
56#
57# NOISE Target
58#
59noise: $(CTAGS_TEST)
60	$(V_RUN) \
61	if test -n "$${ZSH_VERSION+set}"; then set -o SH_WORD_SPLIT; fi; \
62	if test x$(VG) = x1; then		\
63		VALGRIND=--with-valgrind;	\
64	fi;					\
65	c="$(srcdir)/misc/units noise \
66		--ctags=$(CTAGS_TEST) \
67		--languages=$(LANGUAGES) \
68		$${VALGRIND} --run-shrink \
69		--with-timeout=$(TIMEOUT)"; \
70	$(SHELL) $${c} $(srcdir)/Units
71
72#
73# CHOP Target
74#
75chop: $(CTAGS_TEST)
76	$(V_RUN) \
77	if test -n "$${ZSH_VERSION+set}"; then set -o SH_WORD_SPLIT; fi; \
78	if test x$(VG) = x1; then		\
79		VALGRIND=--with-valgrind;	\
80	fi;					\
81	c="$(srcdir)/misc/units chop \
82		--ctags=$(CTAGS_TEST) \
83		--languages=$(LANGUAGES) \
84		$${VALGRIND} --run-shrink \
85		--with-timeout=$(TIMEOUT)"; \
86	$(SHELL) $${c} $(srcdir)/Units
87slap: $(CTAGS_TEST)
88	$(V_RUN) \
89	if test -n "$${ZSH_VERSION+set}"; then set -o SH_WORD_SPLIT; fi; \
90	if test x$(VG) = x1; then		\
91		VALGRIND=--with-valgrind;	\
92	fi;					\
93	c="$(srcdir)/misc/units slap \
94		--ctags=$(CTAGS_TEST) \
95		--languages=$(LANGUAGES) \
96		$${VALGRIND} --run-shrink \
97		--with-timeout=$(TIMEOUT)"; \
98	$(SHELL) $${c} $(srcdir)/Units
99
100#
101# UNITS Target
102#
103units: $(CTAGS_TEST)
104	$(V_RUN) \
105	if test -n "$${ZSH_VERSION+set}"; then set -o SH_WORD_SPLIT; fi; \
106	if test x$(VG) = x1; then		\
107		VALGRIND=--with-valgrind;	\
108	fi;					\
109	if ! test x$(CI) = x; then	\
110		SHOW_DIFF_OUTPUT=--show-diff-output;		\
111	fi;							\
112	builddir=$$(pwd); \
113	if ! test x$(PYTHON) = x; then	\
114		PROG=$(PYTHON);		\
115		SCRIPT=$(srcdir)/misc/units.py;	\
116		if type cygpath > /dev/null 2>&1; then	\
117			builddir=$$(cygpath -m "$$(pwd)");	\
118			if ! test x$(SHELL) = x; then	\
119				SHELL_OPT=--shell=$$(cygpath -m $(SHELL));	\
120			fi;	\
121		else	\
122			if ! test x$(SHELL) = x; then	\
123				SHELL_OPT=--shell=$(SHELL);	\
124			fi;	\
125		fi;	\
126	else	\
127		PROG=$(SHELL);		\
128		SCRIPT=$(srcdir)/misc/units;	\
129	fi;	\
130	mkdir -p $${builddir}/Units && \
131	\
132	c="$${SCRIPT} run \
133		--ctags=$(CTAGS_TEST) \
134		--languages=$(LANGUAGES) \
135		--categories=$(CATEGORIES) \
136		--units=$(UNITS) \
137		--with-pretense-map=$(PMAP) \
138		$${VALGRIND} --run-shrink \
139		--with-timeout=`expr $(TIMEOUT) '*' 10`\
140		$${SHELL_OPT} \
141		$${SHOW_DIFF_OUTPUT}"; \
142		 $${PROG} $${c} $(srcdir)/Units $${builddir}/Units
143
144clean-units:
145	$(SILENT) echo Cleaning test units
146	$(SILENT) if test -d $$(pwd)/Units; then \
147		$(SHELL) $(srcdir)/misc/units clean $$(pwd)/Units; \
148	fi
149
150#
151# VALIDATE-INPUT Target
152#
153validate-input:
154	$(V_RUN) \
155	if test -n "$${ZSH_VERSION+set}"; then set -o SH_WORD_SPLIT; fi; \
156	if test -n "$(VALIDATORS)"; then	\
157		VALIDATORS="--validators=$(VALIDATORS)"; \
158	fi; \
159	c="$(srcdir)/misc/units validate-input $${VALIDATORS}"; \
160		$(SHELL) $${c} $(srcdir)/Units $(srcdir)/misc/validators
161#
162# Test main part, not parsers
163#
164tmain: $(CTAGS_TEST) $(READTAGS_TEST) $(OPTSCRIPT_TEST)
165	$(V_RUN) \
166	if test -n "$${ZSH_VERSION+set}"; then set -o SH_WORD_SPLIT; fi; \
167	if test x$(VG) = x1; then		\
168		VALGRIND=--with-valgrind;	\
169	fi;					\
170	if ! test x$(CI) = x; then	\
171		SHOW_DIFF_OUTPUT=--show-diff-output;		\
172	fi;							\
173	builddir=$$(pwd); \
174	if ! test x$(PYTHON) = x; then	\
175		PROG=$(PYTHON);		\
176		SCRIPT=$(srcdir)/misc/units.py;	\
177		if type cygpath > /dev/null 2>&1; then	\
178			builddir=$$(cygpath -m "$$(pwd)");	\
179			if ! test x$(SHELL) = x; then	\
180				SHELL_OPT=--shell=$$(cygpath -m $(SHELL));	\
181			fi;	\
182		else	\
183			if ! test x$(SHELL) = x; then	\
184				SHELL_OPT=--shell=$(SHELL);	\
185			fi;	\
186		fi;	\
187	else	\
188		PROG=$(SHELL);		\
189		SCRIPT=$(srcdir)/misc/units;	\
190	fi;	\
191	mkdir -p $${builddir}/Tmain && \
192	\
193	c="$${SCRIPT} tmain \
194		--ctags=$(CTAGS_TEST) \
195		--units=$(UNITS) \
196		$${VALGRIND} \
197		$${SHELL_OPT} \
198		$${SHOW_DIFF_OUTPUT}"; \
199		$${PROG} $${c} $(srcdir)/Tmain $${builddir}/Tmain
200
201clean-tmain:
202	$(SILENT) echo Cleaning main part tests
203	$(SILENT) if test -d $$(pwd)/Tmain; then \
204		$(SHELL) $(srcdir)/misc/units clean-tmain $$(pwd)/Tmain; \
205	fi
206
207tlib: $(MINI_GEANY_TEST)
208	$(V_RUN) \
209	builddir=$$(pwd); \
210	mkdir -p $${builddir}/misc; \
211	if test -s '$(MINI_GEANY_TEST)'; then \
212		if $(SHELL) $(srcdir)/misc/tlib $(MINI_GEANY_TEST) \
213			$(srcdir)/misc/mini-geany.expected \
214			$${builddir}/misc/mini-geany.actual \
215			$(VG); then \
216			echo 'mini-geany: OK'; \
217		else \
218			echo 'mini-geany: FAILED'; \
219		fi; \
220	else \
221		echo 'mini-geany: SKIP'; \
222	fi
223clean-tlib:
224	$(SILENT) echo Cleaning libctags part tests
225	$(SILENT) builddir=$$(pwd); \
226		rm -f $${builddir}/misc/mini-geany.actual
227
228#
229# Test installation
230#
231tinst:
232	$(V_RUN) \
233	builddir=$$(pwd); \
234	rm -rf $$builddir/$(TINST_ROOT); \
235	$(SHELL) $(srcdir)/misc/tinst $(srcdir) $$builddir/$(TINST_ROOT)
236
237#
238# Test readtags
239#
240if USE_READCMD
241roundtrip: $(READTAGS_TEST)
242	$(V_RUN) \
243	if ! test x$(CI) = x; then	\
244		ROUNDTRIP_FLAGS=--minitrip;			\
245	fi;							\
246	builddir=$$(pwd); \
247	$(SHELL) $(srcdir)/misc/roundtrip $(READTAGS_TEST) $${builddir}/Units $${ROUNDTRIP_FLAGS}
248else
249roundtrip:
250endif
251
252#
253# Checking code in ctags own rules
254#
255codecheck: $(CTAGS_TEST)
256	$(V_RUN) $(SHELL) misc/src-check
257
258#
259# Report coverage (usable only if ctags is built with "configure --enable-coverage-gcov".)
260#
261run-gcov:
262	$(CTAGS_TEST) -o - $$(find ./Units -name 'input.*'| grep -v '.*b/.*') > /dev/null
263	gcov $$(find -name '*.gcda')
264
265clean-gcov:
266	$(SILENT) echo Cleaning coverage reports
267	$(SILENT) rm -f $(ALL_SRCS:.c=.gcda)
268	$(SILENT) rm -f $(srcdir)/*.gcov
269
270#
271# Cppcheck
272#
273CPPCHECK_DEFS   = -DHAVE_LIBYAML -DHAVE_LIBXML -DHAVE_COPROC -DHAVE_DECL___ENVIRON
274CPPCHECK_UNDEFS = -UDEBUG -UMIO_DEBUG -UCXX_DEBUGGING_ENABLED
275CPPCHECK_FLAGS  = --enable=all
276
277cppcheck:
278	cppcheck $(CPPCHECK_DEFS) $(CPPCHECK_UNDEFS) $(CPPCHECK_FLAGS) \
279		 $$(git  ls-files | grep '^\(parsers\|main\)/.*\.[ch]' )
280#
281# Testing examples in per-language man pages
282#
283man-test: $(CTAGS_TEST)
284	$(V_RUN) \
285	$(PYTHON) $(srcdir)/misc/man-test.py $(MAN_TEST_TMPDIR) $(CTAGS_TEST) $(srcdir)/man/ctags-lang-*.7.rst.in
286
287clean-man-test:
288	rm -rf $(MAN_TEST_TMPDIR)
289
290# check if generated files are committed.
291#   Note: "make -B" cannot be used here, since it reruns automake
292chkgen_verbose = $(chkgen_verbose_@AM_V@)
293chkgen_verbose_ = $(chkgen_verbose_@AM_DEFAULT_V@)
294chkgen_verbose_0 = @echo CHKGEN "    $@";
295check-genfile:
296if BUILD_IN_GIT_REPO
297# OPTLIB2C_SRCS : committed for win32 build
298	$(chkgen_verbose)rm -f $(OPTLIB2C_SRCS)
299	$(chkgen_verbose)$(MAKE) $(OPTLIB2C_SRCS)
300	$(chkgen_verbose)if ! git diff --exit-code $(OPTLIB2C_DIR); then \
301		echo "Files under $(OPTLIB2C_DIR) are not up to date." ; \
302		echo "If you change $(OPTLIB2C_DIR)/foo.ctags, don't forget to add $(OPTLIB2C_DIR)/foo.c to your commit." ; \
303		exit 1 ; \
304	else \
305		echo "Files under $(OPTLIB2C_DIR) are up to date." ; \
306	fi
307# TXT2CSTR_SRCS : committed for win32 build
308	$(chkgen_verbose)rm -f $(TXT2CSTR_SRCS)
309	$(chkgen_verbose)$(MAKE) $(TXT2CSTR_SRCS)
310	$(chkgen_verbose)if ! git diff --exit-code $(TXT2CSTR_DIR); then \
311		echo "Files under $(TXT2CSTR_DIR) are not up to date." ; \
312		echo "If you change $(TXT2CSTR_DIR)/foo.ps, don't forget to add $(TXT2CSTR_DIR)/foo.c to your commit." ; \
313		exit 1 ; \
314	else \
315		echo "Files under $(TXT2CSTR_DIR) are up to date." ; \
316	fi
317if HAVE_RST2MAN
318# man/*.in : committed for man pages to be genrated without rst2man
319#   make clean-docs remove both man/*.in and docs/man/*.rst
320	$(chkgen_verbose)$(MAKE) -C man clean-docs
321	$(chkgen_verbose)$(MAKE) -C man man-in
322	$(chkgen_verbose)if ! git diff --exit-code -- man; then \
323		echo "Files under man/ are not up to date." ; \
324		echo "Please execute 'make -C man man-in' and commit them." ; \
325		exit 1 ; \
326	else \
327		echo "Files under man are up to date." ; \
328	fi
329# docs/man/*.rst : committed for Read the Docs
330	$(chkgen_verbose)$(MAKE) -C man update-docs
331	$(chkgen_verbose)if ! git diff --exit-code -- docs/man; then \
332		echo "Files under docs/man/ are not up to date." ; \
333		echo "Please execute 'make -C man update-docs' and commit them." ; \
334		exit 1 ; \
335	else \
336		echo "Files under docs/man are up to date." ; \
337	fi
338endif
339# win32/ctags_vs2013.vcxproj* : committed for win32 build without POSIX tools
340#   regenerate files w/o out-of-source build and w/ GNU make
341	$(chkgen_verbose)if test "$(top_srcdir)" = "$(top_builddir)" \
342		&& ($(MAKE) --version) 2>/dev/null | grep -q GNU ; then \
343		$(MAKE) -BC win32 ; \
344	fi
345	$(chkgen_verbose)if ! git diff --exit-code -- win32; then \
346		if test "$(SKIP_CHECKGEN_WIN32)" = "yes"; then \
347			echo "Skip checking the files under win32." ; \
348			exit 0 ; \
349		else \
350			echo "Files under win32/ are not up to date." ; \
351			echo "Please execute 'make -BC win32' and commit them." ; \
352			exit 1 ; \
353		fi \
354	else \
355		echo "Files under win32 are up to date." ; \
356	fi
357endif
358