Home | History | Annotate | Line # | Download | only in make
      1  1.9  rillig # $NetBSD: test-variants.mk,v 1.9 2024/06/25 05:18:38 rillig Exp $
      2  1.1  rillig #
      3  1.1  rillig # Build several variants of make and run the tests on them.
      4  1.1  rillig #
      5  1.1  rillig # The output of this test suite must be inspected manually to see the
      6  1.1  rillig # interesting details.  The main purpose is to list the available build
      7  1.1  rillig # options.
      8  1.1  rillig 
      9  1.1  rillig .MAIN: usage
     10  1.1  rillig usage:
     11  1.1  rillig 	@echo 'usage: ${MAKE} -f ${MAKEFILE} list'
     12  1.1  rillig 	@echo '       ${MAKE} -f ${MAKEFILE} all'
     13  1.5  rillig 	@echo '       ${MAKE} -f ${MAKEFILE} <test>...'
     14  1.1  rillig 
     15  1.1  rillig 
     16  1.1  rillig TESTS+=			default
     17  1.1  rillig #ENV.default=		VAR=value...
     18  1.1  rillig #CPPFLAGS.default=	-DMACRO -I...
     19  1.1  rillig #CFLAGS.default=	-O1
     20  1.1  rillig #SKIP.default=		yes
     21  1.1  rillig #SKIP_TESTS.default=	varmod-subst
     22  1.1  rillig 
     23  1.7  rillig TESTS+=			sanitize
     24  1.7  rillig ENV.sanitize=		MKSANITIZER=yes LIMIT_RESOURCES=:
     25  1.7  rillig CPPFLAGS.sanitize=	-DCLEANUP
     26  1.7  rillig CFLAGS.sanitize=	-O2 -ggdb
     27  1.7  rillig 
     28  1.1  rillig # Try a different compiler, with slightly different warnings and error
     29  1.1  rillig # messages.  Clang has a few stricter checks than GCC, concerning enums
     30  1.1  rillig # and non-literal format strings.
     31  1.1  rillig #
     32  1.1  rillig TESTS+=			llvm
     33  1.1  rillig ENV.llvm=		HAVE_LLVM="yes"
     34  1.1  rillig 
     35  1.1  rillig # Use emalloc for memory allocation.
     36  1.1  rillig TESTS+=			emalloc
     37  1.1  rillig ENV.emalloc=		TOOLDIR=""
     38  1.1  rillig 
     39  1.1  rillig # NetBSD 10 fails with:
     40  1.1  rillig # filemon_dev.c:93:19: error: 'FILEMON_SET_FD' undeclared
     41  1.1  rillig TESTS+=			filemon-dev
     42  1.1  rillig ENV.filemon-dev=	USE_FILEMON="dev"
     43  1.1  rillig SKIP.filemon-dev=	yes
     44  1.1  rillig 
     45  1.1  rillig TESTS+=			filemon-ktrace
     46  1.1  rillig ENV.filemon-ktrace=	USE_FILEMON="ktrace"
     47  1.1  rillig 
     48  1.2  rillig TESTS+=			filemon-none
     49  1.2  rillig ENV.filemon-none=	USE_FILEMON="no"
     50  1.2  rillig # The following tests only fail due to the extra variable in the debug log.
     51  1.2  rillig SKIP_TESTS.filemon-none= \
     52  1.2  rillig 			opt-debug-graph1 \
     53  1.2  rillig 			opt-debug-graph2 \
     54  1.2  rillig 			opt-debug-graph3 \
     55  1.2  rillig 			suff-main-several \
     56  1.2  rillig 			suff-transform-debug
     57  1.2  rillig 
     58  1.1  rillig TESTS+=			no-meta
     59  1.1  rillig ENV.no-meta=		USE_META="no"
     60  1.1  rillig SKIP_TESTS.no-meta=	depsrc-meta meta-cmd-cmp
     61  1.1  rillig 
     62  1.1  rillig TESTS+=			cleanup
     63  1.8  rillig ENV.cleanup=		MKLINT=yes
     64  1.1  rillig CPPFLAGS.cleanup=	-DCLEANUP
     65  1.1  rillig 
     66  1.1  rillig TESTS+=			debug-refcnt
     67  1.1  rillig CPPFLAGS.debug-refcnt=	-DDEBUG_REFCNT
     68  1.1  rillig 
     69  1.1  rillig TESTS+=			debug-hash
     70  1.1  rillig CPPFLAGS.debug-hash=	-DDEBUG_HASH_LOOKUP
     71  1.1  rillig SKIP_TESTS.debug-hash=	opt-debug-hash	# mixes regular and debug output
     72  1.1  rillig 
     73  1.1  rillig TESTS+=			debug-meta
     74  1.1  rillig CPPFLAGS.debug-meta=	-DDEBUG_META_MODE
     75  1.1  rillig SKIP_TESTS.debug-meta=	depsrc-meta meta-cmd-cmp # generate extra debug output
     76  1.1  rillig 
     77  1.1  rillig # Produces lots of debugging output.
     78  1.1  rillig #
     79  1.1  rillig TESTS+=			debug-src
     80  1.1  rillig CPPFLAGS.debug-src=	-DDEBUG_SRC
     81  1.1  rillig SKIP.debug-src=		yes
     82  1.1  rillig 
     83  1.1  rillig # NetBSD 8.0 x86_64
     84  1.1  rillig # In file included from arch.c:135:0:
     85  1.1  rillig # /usr/include/sys/param.h:357:0: error: "MAXPATHLEN" redefined [-Werror]
     86  1.1  rillig TESTS+=			maxpathlen
     87  1.1  rillig CPPFLAGS.maxpathlen=	-DMAXPATHLEN=20
     88  1.1  rillig SKIP.maxpathlen=	yes
     89  1.1  rillig 
     90  1.1  rillig # NetBSD 8.0 x86_64 says:
     91  1.1  rillig # In file included from /usr/include/sys/param.h:115:0,
     92  1.1  rillig #                 from arch.c:135:
     93  1.1  rillig # /usr/include/sys/syslimits.h:60:0: error: "PATH_MAX" redefined [-Werror]
     94  1.1  rillig TESTS+=			path_max
     95  1.1  rillig CPPFLAGS.path_max=	-DPATH_MAX=20
     96  1.1  rillig SKIP.path_max=		yes
     97  1.1  rillig 
     98  1.1  rillig # This higher optimization level may trigger additional "may be used
     99  1.1  rillig # uninitialized" errors. Could be combined with other compilers as well.
    100  1.1  rillig #
    101  1.1  rillig TESTS+=			opt-3
    102  1.1  rillig CFLAGS.opt-3=		-O3
    103  1.1  rillig 
    104  1.1  rillig # When optimizing for small code size, GCC gets confused by the initialization
    105  1.1  rillig # status of local variables in some cases.
    106  1.1  rillig TESTS+=			opt-size
    107  1.1  rillig CFLAGS.opt-size=	-Os
    108  1.1  rillig 
    109  1.1  rillig TESTS+=			opt-none
    110  1.1  rillig CFLAGS.opt-none=	-O0 -ggdb
    111  1.1  rillig 
    112  1.1  rillig # Ensure that every inline function is declared as MAKE_ATTR_UNUSED.
    113  1.1  rillig TESTS+=			no-inline
    114  1.1  rillig CPPFLAGS.no-inline=	-Dinline=
    115  1.1  rillig 
    116  1.1  rillig # Is expected to fail with "<stdbool.h> is included in pre-C99 mode" since
    117  1.1  rillig # main.c includes <sys/sysctl.h>, which includes <stdbool.h> even in pre-C99
    118  1.1  rillig # mode.  This would lead to inconsistent definitions of bool and thus
    119  1.1  rillig # differently sized struct CmdOpts and others.
    120  1.1  rillig TESTS+=			c90-plain
    121  1.1  rillig ENV.c90-plain=		USE_FILEMON=no	# filemon uses designated initializers
    122  1.1  rillig CFLAGS.c90-plain=	-std=c90 -ansi -pedantic -Wno-system-headers
    123  1.1  rillig SKIP.c90-plain=		yes
    124  1.1  rillig 
    125  1.1  rillig # The make source code is _intended_ to be compatible with C90, it uses some
    126  1.1  rillig # C99 features though (snprintf).  The workaround with USE_C99_BOOLEAN is
    127  1.1  rillig # necessary on NetBSD 9.99 since main.c includes <sys/sysctl.h>, which
    128  1.1  rillig # includes <stdbool.h> even in pre-C99 mode.
    129  1.1  rillig TESTS+=			c90-stdbool
    130  1.1  rillig ENV.c90-stdbool=	USE_FILEMON=no	# filemon uses designated initializers
    131  1.1  rillig CFLAGS.c90-stdbool=	-std=c90 -ansi -pedantic -Wno-system-headers
    132  1.1  rillig CPPFLAGS.c90-stdbool=	-DUSE_C99_BOOLEAN
    133  1.1  rillig 
    134  1.1  rillig # Ensure that there are only side-effect-free conditions in the assert
    135  1.1  rillig # macro, or at least none that affect the outcome of the tests.
    136  1.1  rillig #
    137  1.1  rillig TESTS+=			no-assert
    138  1.1  rillig CPPFLAGS.no-assert=	-DNDEBUG
    139  1.1  rillig 
    140  1.1  rillig # Only in native mode, make dares to use a shortcut in Compat_RunCommand
    141  1.1  rillig # that circumvents the shell and instead calls execvp directly.
    142  1.1  rillig # Another effect is that the shell is run with -q, which prevents the
    143  1.1  rillig # -x and -v flags from echoing the commands from profile files.
    144  1.1  rillig TESTS+=			non-native
    145  1.1  rillig CPPFLAGS.non-native=	-UMAKE_NATIVE
    146  1.1  rillig CPPFLAGS.non-native+=	-DHAVE_STRERROR -DHAVE_SETENV -DHAVE_VSNPRINTF
    147  1.1  rillig 
    148  1.1  rillig # Running the code coverage using gcov took a long time on NetBSD < 10, due to
    149  1.1  rillig # https://gnats.netbsd.org/55808.
    150  1.1  rillig #
    151  1.1  rillig # Combining USE_COVERAGE with HAVE_LLVM does not work since ld fails to link
    152  1.1  rillig # with the coverage library.
    153  1.1  rillig #
    154  1.1  rillig # Turning the optimization off is required because gcov does not work on the
    155  1.1  rillig # source code level but on the intermediate code after optimization:
    156  1.1  rillig # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96622
    157  1.1  rillig #
    158  1.1  rillig TESTS+=			coverage
    159  1.1  rillig ENV.coverage=		USE_COVERAGE="yes"
    160  1.1  rillig CFLAGS.coverage=	-O0 -ggdb
    161  1.1  rillig 
    162  1.1  rillig TESTS+=			fort
    163  1.1  rillig ENV.fort=		USE_FORT="yes"
    164  1.1  rillig 
    165  1.1  rillig # Ensure that the tests can be specified either as relative filenames or
    166  1.1  rillig # as absolute filenames.
    167  1.1  rillig TESTS+=			abs
    168  1.1  rillig ENV.abs=		USE_ABSOLUTE_TESTNAMES="yes"
    169  1.1  rillig 
    170  1.3  rillig # This test is the result of reading through the GCC 10 "Warning Options"
    171  1.1  rillig # documentation, noting down everything that sounded interesting.
    172  1.1  rillig #
    173  1.3  rillig TESTS+=			gcc-warn
    174  1.3  rillig CFLAGS.gcc-warn=	-Wmisleading-indentation
    175  1.3  rillig CFLAGS.gcc-warn+=	-Wmissing-attributes
    176  1.3  rillig CFLAGS.gcc-warn+=	-Wmissing-braces
    177  1.3  rillig CFLAGS.gcc-warn+=	-Wextra
    178  1.3  rillig CFLAGS.gcc-warn+=	-Wnonnull
    179  1.3  rillig CFLAGS.gcc-warn+=	-Wnonnull-compare
    180  1.3  rillig CFLAGS.gcc-warn+=	-Wnull-dereference
    181  1.3  rillig CFLAGS.gcc-warn+=	-Wimplicit
    182  1.3  rillig CFLAGS.gcc-warn+=	-Wimplicit-fallthrough=4
    183  1.3  rillig CFLAGS.gcc-warn+=	-Wignored-qualifiers
    184  1.3  rillig CFLAGS.gcc-warn+=	-Wunused
    185  1.3  rillig CFLAGS.gcc-warn+=	-Wunused-but-set-variable
    186  1.3  rillig CFLAGS.gcc-warn+=	-Wunused-parameter
    187  1.3  rillig CFLAGS.gcc-warn+=	-Wduplicated-branches
    188  1.3  rillig CFLAGS.gcc-warn+=	-Wduplicated-cond
    189  1.3  rillig CFLAGS.gcc-warn+=	-Wunused-macros
    190  1.3  rillig CFLAGS.gcc-warn+=	-Wcast-function-type
    191  1.3  rillig CFLAGS.gcc-warn+=	-Wconversion
    192  1.3  rillig CFLAGS.gcc-warn+=	-Wenum-compare
    193  1.3  rillig CFLAGS.gcc-warn+=	-Wmissing-field-initializers
    194  1.3  rillig CFLAGS.gcc-warn+=	-Wredundant-decls
    195  1.3  rillig CFLAGS.gcc-warn+=	-Wno-error=conversion
    196  1.3  rillig CFLAGS.gcc-warn+=	-Wno-error=sign-conversion
    197  1.3  rillig CFLAGS.gcc-warn+=	-Wno-error=unused-macros
    198  1.3  rillig CFLAGS.gcc-warn+=	-Wno-error=unused-parameter
    199  1.3  rillig CFLAGS.gcc-warn+=	-Wno-error=duplicated-branches
    200  1.1  rillig 
    201  1.1  rillig .for shell in /usr/pkg/bin/bash /usr/pkg/bin/dash
    202  1.1  rillig .  if exists(${shell})
    203  1.9  rillig TESTS+=			${shell:T}
    204  1.1  rillig CPPFLAGS.${shell:T}=	-DDEFSHELL_CUSTOM="\"${shell}\""
    205  1.9  rillig 
    206  1.9  rillig .    for name in ${shell:T}-sanitize
    207  1.9  rillig TESTS+=			${name}
    208  1.9  rillig ENV.${name}=		MKSANITIZER=yes LIMIT_RESOURCES=:
    209  1.9  rillig CPPFLAGS.${name}=	-DDEFSHELL_CUSTOM="\"${shell}\"" -DCLEANUP
    210  1.9  rillig CFLAGS.${name}=		-ggdb -O0
    211  1.9  rillig .    endfor
    212  1.1  rillig .  endif
    213  1.1  rillig .endfor
    214  1.1  rillig 
    215  1.1  rillig 
    216  1.1  rillig .MAKEFLAGS: -k
    217  1.1  rillig .MAKE.DEPENDFILE=	nonexistent
    218  1.1  rillig 
    219  1.1  rillig .PHONY: usage list all ${TESTS}
    220  1.1  rillig 
    221  1.1  rillig all: ${TESTS:${TESTS:@t@${SKIP.$t:Myes:%=N$t}@:ts:}}
    222  1.1  rillig 
    223  1.1  rillig SLOW_TESTS=	dotwait sh-flags
    224  1.1  rillig 
    225  1.1  rillig .for test in ${TESTS}
    226  1.1  rillig _ENV.${test}=	PATH="$$PATH"
    227  1.1  rillig _ENV.${test}+=	USETOOLS="no"
    228  1.1  rillig _ENV.${test}+=	MALLOC_OPTIONS="JA"		# for jemalloc 1.0.0
    229  1.1  rillig _ENV.${test}+=	MALLOC_CONF="junk:true"		# for jemalloc 5.1.0
    230  1.1  rillig _ENV.${test}+=	_MKMSG_COMPILE=":"
    231  1.1  rillig _ENV.${test}+=	_MKMSG_CREATE=":"
    232  1.1  rillig _ENV.${test}+=	_MKMSG_FORMAT=":"
    233  1.1  rillig _ENV.${test}+=	_MKMSG_TEST=":"
    234  1.1  rillig _ENV.${test}+=	${ENV.${test}}
    235  1.1  rillig _ENV.${test}+=	USER_CPPFLAGS=${CPPFLAGS.${.TARGET}:Q}
    236  1.1  rillig _ENV.${test}+=	USER_CFLAGS=${CFLAGS.${.TARGET}:Q}
    237  1.1  rillig _ENV.${test}+=	BROKEN_TESTS=${${SLOW_TESTS} ${SKIP_TESTS.${.TARGET}}:L:Q}
    238  1.1  rillig .endfor
    239  1.1  rillig 
    240  1.1  rillig ${TESTS}: run-test
    241  1.1  rillig run-test: .USE
    242  1.1  rillig 	@echo "===> Running ${.TARGET}"
    243  1.1  rillig 	@echo "env: "${ENV.${.TARGET}:U"(none)"}
    244  1.1  rillig 	@echo "cflags: "${CFLAGS.${.TARGET}:U(none):Q}
    245  1.1  rillig 	@echo "cppflags: "${CPPFLAGS.${.TARGET}:U(none):Q}
    246  1.1  rillig 
    247  1.1  rillig 	@env -i ${_ENV.${.TARGET}} sh -ce "ma""ke -s cleandir"
    248  1.1  rillig 	@env -i ${_ENV.${.TARGET}} sh -ce "ma""ke -ks -j6 dependall"
    249  1.1  rillig 	@size *.o make
    250  1.1  rillig 	@env -i ${_ENV.${.TARGET}} sh -ce "ma""ke -s test"
    251  1.1  rillig 
    252  1.1  rillig list:
    253  1.1  rillig 	@printf '%s%s\n' ${TESTS:O:@t@$t '${SKIP.$t:Myes:%= (skipped)}'@}
    254