xref: /freebsd/contrib/bmake/unit-tests/deptgt-posix.mk (revision 954401e68e797868ab04a0147b94849feefbb199)
1*954401e6SSimon J. Gerraty# $NetBSD: deptgt-posix.mk,v 1.4 2022/05/07 21:24:52 rillig Exp $
22f2a5ecdSSimon J. Gerraty#
32f2a5ecdSSimon J. Gerraty# Tests for the special target '.POSIX', which enables POSIX mode.
42f2a5ecdSSimon J. Gerraty#
5*954401e6SSimon J. Gerraty# As of 2022-04-18, when parsing the dependency line '.POSIX', the variable
6*954401e6SSimon J. Gerraty# '%POSIX' is defined and <posix.mk> is included, if it exists.  Other than
7*954401e6SSimon J. Gerraty# that, POSIX support is still incomplete, the exact set of supported features
8*954401e6SSimon J. Gerraty# needs to be cross-checked with the POSIX specification.
92f2a5ecdSSimon J. Gerraty#
10*954401e6SSimon J. Gerraty# At the point of '.POSIX:', <sys.mk> has been loaded already, unless the
11*954401e6SSimon J. Gerraty# option '-r' was given.  This means that an implementation of <posix.mk> must
12*954401e6SSimon J. Gerraty# work both with and without the system rules from <sys.mk> being in effect.
13*954401e6SSimon J. Gerraty#
14*954401e6SSimon J. Gerraty# Implementation note: this test needs to run isolated from the usual tests
15*954401e6SSimon J. Gerraty# directory to prevent unit-tests/posix.mk from interfering with the posix.mk
16*954401e6SSimon J. Gerraty# from the system directory that this test uses; since at least 1997, the
17*954401e6SSimon J. Gerraty# directive '.include <file>' has been looking in the current directory first
18*954401e6SSimon J. Gerraty# before searching the file in the system search path, as described in
19*954401e6SSimon J. Gerraty# https://gnats.netbsd.org/15163.
202f2a5ecdSSimon J. Gerraty#
212f2a5ecdSSimon J. Gerraty# See also:
222f2a5ecdSSimon J. Gerraty#	https://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html
232f2a5ecdSSimon J. Gerraty
242f2a5ecdSSimon J. GerratyTESTTMP=	${TMPDIR:U/tmp}/make.test.deptgt-posix
252f2a5ecdSSimon J. GerratySYSDIR=		${TESTTMP}/sysdir
262f2a5ecdSSimon J. GerratyMAIN_MK=	${TESTTMP}/main.mk
272f2a5ecdSSimon J. GerratyINCLUDED_MK=	${TESTTMP}/included.mk
282f2a5ecdSSimon J. Gerraty
292f2a5ecdSSimon J. Gerratyall: .PHONY
302f2a5ecdSSimon J. Gerraty.SILENT:
312f2a5ecdSSimon J. Gerraty
322f2a5ecdSSimon J. Gerratyset-up-sysdir: .USEBEFORE
332f2a5ecdSSimon J. Gerraty	mkdir -p ${SYSDIR}
342f2a5ecdSSimon J. Gerraty	printf '%s\n' > ${SYSDIR}/sys.mk \
352f2a5ecdSSimon J. Gerraty	    'CC=sys-cc' \
362f2a5ecdSSimon J. Gerraty	    'SEEN_SYS_MK=yes'
372f2a5ecdSSimon J. Gerraty	printf '%s\n' > ${SYSDIR}/posix.mk \
382f2a5ecdSSimon J. Gerraty	    'CC=posix-cc'
392f2a5ecdSSimon J. Gerraty
402f2a5ecdSSimon J. Gerratycheck-is-posix: .USE
412f2a5ecdSSimon J. Gerraty	printf '%s\n' >> ${MAIN_MK} \
422f2a5ecdSSimon J. Gerraty		'.if $${CC} != "posix-cc"' \
432f2a5ecdSSimon J. Gerraty		'.  error' \
442f2a5ecdSSimon J. Gerraty		'.endif' \
452f2a5ecdSSimon J. Gerraty		'.if $${%POSIX} != "1003.2"' \
462f2a5ecdSSimon J. Gerraty		'.  error' \
472f2a5ecdSSimon J. Gerraty		'.endif' \
482f2a5ecdSSimon J. Gerraty		'all: .PHONY'
492f2a5ecdSSimon J. Gerraty
502f2a5ecdSSimon J. Gerratycheck-not-posix: .USE
512f2a5ecdSSimon J. Gerraty	printf '%s\n' >> ${MAIN_MK} \
522f2a5ecdSSimon J. Gerraty		'.if $${CC} != "sys-cc"' \
532f2a5ecdSSimon J. Gerraty		'.  error' \
542f2a5ecdSSimon J. Gerraty		'.endif' \
552f2a5ecdSSimon J. Gerraty		'.if defined(%POSIX)' \
562f2a5ecdSSimon J. Gerraty		'.  error' \
572f2a5ecdSSimon J. Gerraty		'.endif' \
582f2a5ecdSSimon J. Gerraty		'all: .PHONY'
592f2a5ecdSSimon J. Gerraty
602f2a5ecdSSimon J. Gerratycheck-not-seen-sys-mk: .USE
612f2a5ecdSSimon J. Gerraty	printf '%s\n' >> ${MAIN_MK} \
622f2a5ecdSSimon J. Gerraty	    '.if defined(SEEN_SYS_MK)' \
632f2a5ecdSSimon J. Gerraty	    '.  error' \
642f2a5ecdSSimon J. Gerraty	    '.endif'
652f2a5ecdSSimon J. Gerraty
662f2a5ecdSSimon J. Gerratyrun: .USE
672f2a5ecdSSimon J. Gerraty	(cd "${TESTTMP}" && MAKEFLAGS=${MAKEFLAGS.${.TARGET}:Q} ${MAKE} \
682f2a5ecdSSimon J. Gerraty	    -m "${SYSDIR}" -f ${MAIN_MK:T})
692f2a5ecdSSimon J. Gerraty	rm -rf ${TESTTMP}
702f2a5ecdSSimon J. Gerraty
712f2a5ecdSSimon J. Gerraty# If the main makefile has a '.for' loop as its first non-comment line, a
722f2a5ecdSSimon J. Gerraty# strict reading of POSIX 2018 makes the makefile non-conforming.
732f2a5ecdSSimon J. Gerratyall: after-for
742f2a5ecdSSimon J. Gerratyafter-for: .PHONY set-up-sysdir check-not-posix run
752f2a5ecdSSimon J. Gerraty	printf '%s\n' > ${MAIN_MK} \
762f2a5ecdSSimon J. Gerraty	    '# comment' \
772f2a5ecdSSimon J. Gerraty	    '' \
782f2a5ecdSSimon J. Gerraty	    '.for i in once' \
792f2a5ecdSSimon J. Gerraty	    '.POSIX:' \
802f2a5ecdSSimon J. Gerraty	    '.endfor'
812f2a5ecdSSimon J. Gerraty
822f2a5ecdSSimon J. Gerraty# If the main makefile has an '.if' conditional as its first non-comment line,
832f2a5ecdSSimon J. Gerraty# a strict reading of POSIX 2018 makes the makefile non-conforming.
842f2a5ecdSSimon J. Gerratyall: after-if
852f2a5ecdSSimon J. Gerratyafter-if: .PHONY set-up-sysdir check-not-posix run
862f2a5ecdSSimon J. Gerraty	printf '%s\n' > ${MAIN_MK} \
872f2a5ecdSSimon J. Gerraty	    '# comment' \
882f2a5ecdSSimon J. Gerraty	    '' \
892f2a5ecdSSimon J. Gerraty	    '.if 1' \
902f2a5ecdSSimon J. Gerraty	    '.POSIX:' \
912f2a5ecdSSimon J. Gerraty	    '.endif'
922f2a5ecdSSimon J. Gerraty
932f2a5ecdSSimon J. Gerraty# If the main makefile first includes another makefile and that included
942f2a5ecdSSimon J. Gerraty# makefile tries to switch to POSIX mode, that's too late.
952f2a5ecdSSimon J. Gerratyall: in-included-file
962f2a5ecdSSimon J. Gerratyin-included-file: .PHONY set-up-sysdir check-not-posix run
972f2a5ecdSSimon J. Gerraty	printf 'include included.mk\n' > ${MAIN_MK}
982f2a5ecdSSimon J. Gerraty	printf '.POSIX:\n' > ${INCLUDED_MK}
992f2a5ecdSSimon J. Gerraty
1002f2a5ecdSSimon J. Gerraty# If the main makefile switches to POSIX mode in its very first line, before
1012f2a5ecdSSimon J. Gerraty# and comment lines or empty lines, that works.
1022f2a5ecdSSimon J. Gerratyall: in-first-line
1032f2a5ecdSSimon J. Gerratyin-first-line: .PHONY set-up-sysdir check-is-posix run
1042f2a5ecdSSimon J. Gerraty	printf '%s\n' > ${MAIN_MK} \
1052f2a5ecdSSimon J. Gerraty	    '.POSIX:'
1062f2a5ecdSSimon J. Gerraty
1072f2a5ecdSSimon J. Gerraty# The only allowed lines before switching to POSIX mode are comment lines.
108*954401e6SSimon J. Gerraty# POSIX defines comment lines as "blank lines, empty lines, and lines with
109*954401e6SSimon J. Gerraty# <number-sign> ('#') as the first character".
1102f2a5ecdSSimon J. Gerratyall: after-comment-lines
1112f2a5ecdSSimon J. Gerratyafter-comment-lines: .PHONY set-up-sysdir check-is-posix run
1122f2a5ecdSSimon J. Gerraty	printf '%s\n' > ${MAIN_MK} \
1132f2a5ecdSSimon J. Gerraty	    '# comment' \
1142f2a5ecdSSimon J. Gerraty	    '' \
1152f2a5ecdSSimon J. Gerraty	    '.POSIX:'
1162f2a5ecdSSimon J. Gerraty
1172f2a5ecdSSimon J. Gerraty# Running make with the option '-r' skips the builtin rules from <sys.mk>.
1182f2a5ecdSSimon J. Gerraty# In that mode, '.POSIX:' just loads <posix.mk>, which works as well.
1192f2a5ecdSSimon J. GerratyMAKEFLAGS.no-builtins=	-r
1202f2a5ecdSSimon J. Gerratyall: no-builtins
1212f2a5ecdSSimon J. Gerratyno-builtins: .PHONY set-up-sysdir check-is-posix check-not-seen-sys-mk run
1222f2a5ecdSSimon J. Gerraty	printf '%s\n' > ${MAIN_MK} \
1232f2a5ecdSSimon J. Gerraty	    '.POSIX:'
124