1 1.5 rillig # $NetBSD: dep-colon-bug-cross-file.mk,v 1.5 2023/06/01 20:56:35 rillig Exp $ 2 1.4 rillig # 3 1.4 rillig # Until 2020-09-25, the very last dependency group of a top-level makefile 4 1.4 rillig # was not finished properly. This made it possible to add further commands 5 1.4 rillig # to that target. 6 1.4 rillig # 7 1.4 rillig # In pass 1, there is a dependency group at the bottom of the file. 8 1.4 rillig # This dependency group is not finished properly. Finishing the dependency 9 1.4 rillig # group would add the OP_HAS_COMMANDS flag to the "all" target, thereby 10 1.4 rillig # preventing any commands from being added later. 11 1.4 rillig # 12 1.4 rillig # After the file has been parsed completely, it is parsed again in pass 2. 13 1.4 rillig # In this pass, another command is added to the "current dependency group", 14 1.4 rillig # which was still the one from pass 1, which means it was possible to later 15 1.4 rillig # add commands to an existing target, even across file boundaries. 16 1.4 rillig # 17 1.4 rillig # Oops, even worse. Running this test in a make from 2020-09-25 or earlier 18 1.4 rillig # on NetBSD 8.0 x86_64 with MALLOC_OPTIONS=JA produces this or a similar 19 1.4 rillig # output: 20 1.4 rillig # 21 1.4 rillig # make: cannot open ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ. 22 1.4 rillig # 23 1.4 rillig # The 'Z' means access to already freed memory; see jemalloc(3). The cause 24 1.4 rillig # for this is that in MainParseArgs, the command line arguments were not 25 1.4 rillig # properly copied before storing them in global variables. 26 1.4 rillig 27 1.4 rillig PASS?= 1 28 1.4 rillig 29 1.4 rillig .if ${PASS} == 2 30 1.4 rillig all: 31 1.5 rillig # expect+1: warning: duplicate script for target "all" ignored 32 1.4 rillig : pass 2 33 1.4 rillig .endif 34 1.4 rillig 35 1.4 rillig .if ${PASS} == 1 36 1.4 rillig 37 1.4 rillig PASS= 2 38 1.4 rillig .MAKEFLAGS: -f ${.PARSEDIR:q}/${.PARSEFILE:q} 39 1.4 rillig 40 1.4 rillig all: 41 1.5 rillig # expect+1: warning: using previous script for "all" defined here 42 1.4 rillig : pass 1 43 1.4 rillig .endif 44