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