Home | History | Annotate | Line # | Download | only in unit-tests
deptgt-posix.mk revision 1.2
      1  1.2     sjg # $NetBSD: deptgt-posix.mk,v 1.2 2022/04/18 15:59:39 sjg Exp $
      2  1.1  rillig #
      3  1.1  rillig # Tests for the special target '.POSIX', which enables POSIX mode.
      4  1.1  rillig #
      5  1.1  rillig # As of 2022-04-18, this only means that the variable '%POSIX' is defined and
      6  1.1  rillig # that the variables and rules specified by POSIX replace the default ones.
      7  1.1  rillig # This is done by loading <posix.mk>, if available.  That file is not included
      8  1.1  rillig # in NetBSD, but only in the bmake distribution.  As of 2022-04-18, POSIX
      9  1.1  rillig # support is not complete.
     10  1.1  rillig #
     11  1.1  rillig # Implementation node: this test needs to be isolated from the usual test
     12  1.1  rillig # to prevent unit-tests/posix.mk from interfering with the posix.mk from the
     13  1.1  rillig # system directory that this test uses.
     14  1.1  rillig #
     15  1.1  rillig # See also:
     16  1.1  rillig #	https://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html
     17  1.1  rillig 
     18  1.2     sjg TESTTMP=	${TMPDIR:U/tmp}/make.test.deptgt-posix
     19  1.2     sjg SYSDIR=		${TESTTMP}/sysdir
     20  1.2     sjg MAIN_MK=	${TESTTMP}/main.mk
     21  1.2     sjg INCLUDED_MK=	${TESTTMP}/included.mk
     22  1.1  rillig 
     23  1.1  rillig all: .PHONY
     24  1.1  rillig .SILENT:
     25  1.1  rillig 
     26  1.1  rillig set-up-sysdir: .USEBEFORE
     27  1.1  rillig 	mkdir -p ${SYSDIR}
     28  1.1  rillig 	printf '%s\n' > ${SYSDIR}/sys.mk \
     29  1.1  rillig 	    'CC=sys-cc' \
     30  1.1  rillig 	    'SEEN_SYS_MK=yes'
     31  1.1  rillig 	printf '%s\n' > ${SYSDIR}/posix.mk \
     32  1.1  rillig 	    'CC=posix-cc'
     33  1.1  rillig 
     34  1.1  rillig check-is-posix: .USE
     35  1.1  rillig 	printf '%s\n' >> ${MAIN_MK} \
     36  1.1  rillig 		'.if $${CC} != "posix-cc"' \
     37  1.1  rillig 		'.  error' \
     38  1.1  rillig 		'.endif' \
     39  1.1  rillig 		'.if $${%POSIX} != "1003.2"' \
     40  1.1  rillig 		'.  error' \
     41  1.1  rillig 		'.endif' \
     42  1.1  rillig 		'all: .PHONY'
     43  1.1  rillig 
     44  1.1  rillig check-not-posix: .USE
     45  1.1  rillig 	printf '%s\n' >> ${MAIN_MK} \
     46  1.1  rillig 		'.if $${CC} != "sys-cc"' \
     47  1.1  rillig 		'.  error' \
     48  1.1  rillig 		'.endif' \
     49  1.1  rillig 		'.if defined(%POSIX)' \
     50  1.1  rillig 		'.  error' \
     51  1.1  rillig 		'.endif' \
     52  1.1  rillig 		'all: .PHONY'
     53  1.1  rillig 
     54  1.1  rillig check-not-seen-sys-mk: .USE
     55  1.1  rillig 	printf '%s\n' >> ${MAIN_MK} \
     56  1.1  rillig 	    '.if defined(SEEN_SYS_MK)' \
     57  1.1  rillig 	    '.  error' \
     58  1.1  rillig 	    '.endif'
     59  1.1  rillig 
     60  1.1  rillig run: .USE
     61  1.2     sjg 	(cd "${TESTTMP}" && MAKEFLAGS=${MAKEFLAGS.${.TARGET}:Q} ${MAKE} \
     62  1.1  rillig 	    -m "${SYSDIR}" -f ${MAIN_MK:T})
     63  1.2     sjg 	rm -rf ${TESTTMP}
     64  1.1  rillig 
     65  1.1  rillig # If the main makefile has a '.for' loop as its first non-comment line, a
     66  1.1  rillig # strict reading of POSIX 2018 makes the makefile non-conforming.
     67  1.1  rillig all: after-for
     68  1.1  rillig after-for: .PHONY set-up-sysdir check-not-posix run
     69  1.1  rillig 	printf '%s\n' > ${MAIN_MK} \
     70  1.1  rillig 	    '# comment' \
     71  1.1  rillig 	    '' \
     72  1.1  rillig 	    '.for i in once' \
     73  1.1  rillig 	    '.POSIX:' \
     74  1.1  rillig 	    '.endfor'
     75  1.1  rillig 
     76  1.1  rillig # If the main makefile has an '.if' conditional as its first non-comment line,
     77  1.1  rillig # a strict reading of POSIX 2018 makes the makefile non-conforming.
     78  1.1  rillig all: after-if
     79  1.1  rillig after-if: .PHONY set-up-sysdir check-not-posix run
     80  1.1  rillig 	printf '%s\n' > ${MAIN_MK} \
     81  1.1  rillig 	    '# comment' \
     82  1.1  rillig 	    '' \
     83  1.1  rillig 	    '.if 1' \
     84  1.1  rillig 	    '.POSIX:' \
     85  1.1  rillig 	    '.endif'
     86  1.1  rillig 
     87  1.1  rillig # If the main makefile first includes another makefile and that included
     88  1.1  rillig # makefile tries to switch to POSIX mode, that's too late.
     89  1.1  rillig all: in-included-file
     90  1.1  rillig in-included-file: .PHONY set-up-sysdir check-not-posix run
     91  1.1  rillig 	printf 'include included.mk\n' > ${MAIN_MK}
     92  1.1  rillig 	printf '.POSIX:\n' > ${INCLUDED_MK}
     93  1.1  rillig 
     94  1.1  rillig # If the main makefile switches to POSIX mode in its very first line, before
     95  1.1  rillig # and comment lines or empty lines, that works.
     96  1.1  rillig all: in-first-line
     97  1.1  rillig in-first-line: .PHONY set-up-sysdir check-is-posix run
     98  1.1  rillig 	printf '%s\n' > ${MAIN_MK} \
     99  1.1  rillig 	    '.POSIX:'
    100  1.1  rillig 
    101  1.1  rillig # The only allowed lines before switching to POSIX mode are comment lines.
    102  1.1  rillig # POSIX defines that empty and blank lines are called comment lines as well.
    103  1.1  rillig all: after-comment-lines
    104  1.1  rillig after-comment-lines: .PHONY set-up-sysdir check-is-posix run
    105  1.1  rillig 	printf '%s\n' > ${MAIN_MK} \
    106  1.1  rillig 	    '# comment' \
    107  1.1  rillig 	    '' \
    108  1.1  rillig 	    '.POSIX:'
    109  1.1  rillig 
    110  1.1  rillig # Running make with the option '-r' skips the builtin rules from <sys.mk>.
    111  1.1  rillig # In that mode, '.POSIX:' just loads <posix.mk>, which works as well.
    112  1.1  rillig MAKEFLAGS.no-builtins=	-r
    113  1.1  rillig all: no-builtins
    114  1.1  rillig no-builtins: .PHONY set-up-sysdir check-is-posix check-not-seen-sys-mk run
    115  1.1  rillig 	printf '%s\n' > ${MAIN_MK} \
    116  1.1  rillig 	    '.POSIX:'
    117