1# $NetBSD: bsd.test.mk,v 1.26 2019/01/21 21:11:54 christos Exp $
2#
3
4.include <bsd.init.mk>
5
6_TESTS:=  # empty
7
8.if defined(TESTS_SUBDIRS)
9SUBDIR+=  ${TESTS_SUBDIRS}
10.endif
11.if defined(TESTS_SUBDIR_INSTALL_ONLY)
12SUBDIR+=  ${TESTS_SUBDIR_INSTALL_ONLY}
13.endif
14
15.include <bsd.subdir.mk>
16
17.if defined(TESTS_C)
18_TESTS+=  ${TESTS_C}
19PROGS+=             ${TESTS_C}
20.  for _T in ${TESTS_C}
21BINDIR.${_T}=       ${TESTSDIR}
22LDADD.${_T}+=       -latf-c
23DPADD.${_T}+=       ${LIBATF_C}
24MAN.${_T}?=         # empty
25.  endfor
26.endif
27
28.if defined(TESTS_CXX)
29_TESTS+=  ${TESTS_CXX}
30PROGS_CXX+=         ${TESTS_CXX}
31.  for _T in ${TESTS_CXX}
32BINDIR.${_T}=       ${TESTSDIR}
33LDADD.${_T}+=       -latf-c++ -latf-c
34DPADD.${_T}+=       ${LIBATF_CXX} ${LIBATF_C}
35MAN.${_T}?=         # empty
36.  endfor
37.endif
38
39.if defined(TESTS_SH)
40_TESTS+=            ${TESTS_SH}
41CLEANDIRFILES+=               ${TESTS_SH}
42
43.  for _T in ${TESTS_SH}
44SCRIPTS+=           ${_T}
45SCRIPTSDIR_${_T}=   ${TESTSDIR}
46
47CLEANDIRFILES+=               ${_T}.tmp
48
49TESTS_SH_SRC_${_T}?=          ${_T}.sh
50${_T}: ${TESTS_SH_SRC_${_T}}
51          ${_MKTARGET_BUILD}
52          echo '#! /usr/bin/atf-sh' >${.TARGET}.tmp
53          cat ${.ALLSRC} >>${.TARGET}.tmp
54          chmod +x ${.TARGET}.tmp
55          ${MV} ${.TARGET}.tmp ${.TARGET}
56.  endfor
57.endif
58
59ATFFILE?= auto
60.if ${MKKYUA} != "no"
61KYUAFILE?=          ${ATFFILE}
62.else
63KYUAFILE= no
64.endif
65
66# Additional list of 'tp' entries to add to the Atffile when ATFFILE=auto.
67# These entries must all correspond to subdirectories to descend into.
68#
69# This is useful in the cases where the tests in a single directory come
70# from various sources (e.g. src/tests and src/external/.../tests) and
71# the installation of some of those tests rely on MK* variables being set.
72ATFFILE_EXTRA_SUBDIRS?=
73
74.if ${ATFFILE:tl} != "no"
75FILES+=                       Atffile
76FILESDIR_Atffile=   ${TESTSDIR}
77
78.  if ${ATFFILE:tl} == "auto"
79CLEANDIRFILES+=     Atffile Atffile.tmp
80
81realall: Atffile
82Atffile: Makefile
83          ${_MKTARGET_CREATE}
84          @{ echo 'Content-Type: application/X-atf-atffile; version="1"'; \
85          echo; \
86          echo '# Automatically generated by bsd.test.mk.'; \
87          echo; \
88          echo 'prop: test-suite = "NetBSD"'; \
89          echo; \
90          for tp in ${TESTS_SUBDIRS:N.WAIT} ${_TESTS} ${ATFFILE_EXTRA_SUBDIRS}; \
91          do \
92              echo "tp: $${tp}"; \
93          done; } >Atffile.tmp
94          @${MV} Atffile.tmp Atffile
95.  endif
96.endif
97
98.if ${KYUAFILE:tl} != "no"
99FILES+=                       Kyuafile
100FILESDIR_Kyuafile=  ${TESTSDIR}
101
102.  if ${KYUAFILE:tl} == "auto"
103CLEANDIRFILES+=     Kyuafile Kyuafile.tmp
104
105realall: Kyuafile
106Kyuafile: Makefile
107          ${_MKTARGET_CREATE}
108          @{ \
109              echo '-- Automatically generated by bsd.test.mk.'; \
110              echo; \
111              echo 'syntax(2)'; \
112              echo; \
113              echo 'test_suite("NetBSD")'; \
114              if [ -n "${_TESTS}" ]; then \
115                  echo; \
116                  for tp in ${_TESTS}; do \
117                      echo "atf_test_program{name=\"$${tp}\"}"; \
118                  done; \
119              fi; \
120              if [ -n "${TESTS_SUBDIRS:N.WAIT}" -o \
121                   -n "${ATFFILE_EXTRA_SUBDIRS}" ]; then \
122                  echo; \
123                  for subdir in ${TESTS_SUBDIRS:N.WAIT} \
124                                ${ATFFILE_EXTRA_SUBDIRS}; do \
125                      echo "include(\"$${subdir}/Kyuafile\")"; \
126                  done; \
127              fi; \
128          } >Kyuafile.tmp
129          @${MV} Kyuafile.tmp Kyuafile
130.  endif
131.endif
132
133.if ${ATFFILE:tl} != "no" || ${KYUAFILE:tl} != "no"
134.  include <bsd.files.mk>
135.endif
136
137.if !empty(SCRIPTS) || !empty(PROGS) || !empty(PROGS_CXX)
138.  include <bsd.prog.mk>
139.endif
140
141#
142# Definition of the "make test" target and supporting variables.
143#
144# This target, by necessity, can only work for native builds (i.e. a NetBSD
145# host building a release for the same system).  The target runs ATF, which is
146# not in the toolchain, and the tests execute code built for the target host.
147#
148# Due to the dependencies of the binaries built by the source tree and how they
149# are used by tests, it is highly possible for a execution of "make test" to
150# report bogus results unless the new binaries are put in place.
151#
152
153TESTS_PATH += ${DESTDIR}/bin ${DESTDIR}/sbin ${DESTDIR}/usr/bin ${DESTDIR}/usr/sbin
154TESTS_LD_LIBRARY_PATH += ${DESTDIR}/lib ${DESTDIR}/usr/lib
155
156TESTS_ENV += ATF_BUILD_CC=${DESTDIR}/usr/bin/cc
157TESTS_ENV += ATF_BUILD_CPP=${DESTDIR}/usr/bin/cpp
158TESTS_ENV += ATF_BUILD_CXX=${DESTDIR}/usr/bin/c++
159TESTS_ENV += ATF_CONFDIR=${DESTDIR}/etc
160TESTS_ENV += ATF_INCLUDEDIR=${DESTDIR}/usr/include
161TESTS_ENV += ATF_LIBDIR=${DESTDIR}/usr/lib
162TESTS_ENV += ATF_LIBEXECDIR=${DESTDIR}/usr/libexec
163TESTS_ENV += ATF_PKGDATADIR=${DESTDIR}/usr/share/atf
164TESTS_ENV += ATF_SHELL=${DESTDIR}/bin/sh
165TESTS_ENV += LD_LIBRARY_PATH=${TESTS_LD_LIBRARY_PATH:tW:S/ /:/g}
166TESTS_ENV += PATH=${TESTS_PATH:tW:S/ /:/g}
167
168_TESTS_FIFO = ${.OBJDIR}/atf-run.fifo
169_TESTS_LOG = ${.OBJDIR}/atf-run.log
170CLEANDIRFILES += ${_TESTS_FIFO} ${_TESTS_LOG}
171
172.PHONY: test
173.if defined(TESTSDIR)
174.  if ${TESTSDIR} == ${TESTSBASE}
175# Forbid this case.  It is likely to cause false positives/negatives and it
176# does not cover all the tests (e.g. it misses testing software in external).
177test:
178          @echo "*** Sorry, you cannot use make test from src/tests.  Install the"
179          @echo "*** tests into their final location and run them from /usr/tests"
180          @false
181.  else
182test:
183          @echo "*** WARNING: make test is experimental"
184          @echo "***"
185          @echo "*** Using this test does not preclude you from running the tests"
186          @echo "*** installed in /usr/tests.  This test run may raise false"
187          @echo "*** positives and/or false negatives."
188          @echo
189          @set -e; \
190          cd ${DESTDIR}${TESTSDIR}; \
191          rm -f ${_TESTS_FIFO}; \
192          mkfifo ${_TESTS_FIFO}; \
193          cat ${_TESTS_FIFO} | tee ${_TESTS_LOG} | \
194              ${TESTS_ENV} ${DESTDIR}/usr/bin/atf-report & \
195          result=0; \
196          ${TESTS_ENV} ${DESTDIR}/usr/bin/atf-run >>${_TESTS_FIFO} || result=1; \
197          wait; \
198          rm -f ${_TESTS_FIFO}; \
199          echo; \
200          echo "*** The verbatim output of atf-run has been saved to ${_TESTS_LOG}"; \
201          echo "*** Once again, note that "make test" is unsupported."; \
202          test $${result} -eq 0
203.  endif
204.else
205test:
206          @echo "*** No TESTSDIR defined; nothing to do."
207.endif
208
209##### Pull in related .mk logic
210.include <bsd.clean.mk>
211