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