1 1.14 rillig # $NetBSD: deptgt.mk,v 1.14 2023/06/01 20:56:35 rillig Exp $ 2 1.1 rillig # 3 1.2 rillig # Tests for special targets like .BEGIN or .SUFFIXES in dependency 4 1.2 rillig # declarations. 5 1.1 rillig 6 1.1 rillig # TODO: Implementation 7 1.1 rillig 8 1.3 rillig # Just in case anyone tries to compile several special targets in a single 9 1.3 rillig # dependency line: That doesn't work, and make immediately rejects it. 10 1.14 rillig # expect+1: warning: Extra target '.PHONY' ignored 11 1.3 rillig .SUFFIXES .PHONY: .c.o 12 1.3 rillig 13 1.5 rillig # The following lines demonstrate how 'targets' is set and reset during 14 1.4 rillig # parsing of dependencies. To see it in action, set breakpoints in: 15 1.4 rillig # 16 1.11 rillig # ParseDependency at the beginning 17 1.6 rillig # FinishDependencyGroup at "targets = NULL" 18 1.4 rillig # Parse_File at "Lst_Free(targets)" 19 1.8 rillig # Parse_File at "targets = Lst_New()" 20 1.7 rillig # ParseLine_ShellCommand at "targets == NULL" 21 1.4 rillig # 22 1.5 rillig # Keywords: 23 1.5 rillig # parse.c:targets 24 1.5 rillig 25 1.5 rillig target1 target2: sources # targets := [target1, target2] 26 1.5 rillig : command1 # targets == [target1, target2] 27 1.5 rillig : command2 # targets == [target1, target2] 28 1.5 rillig VAR=value # targets := NULL 29 1.14 rillig # expect+1: Unassociated shell command ": command3 # parse error, since targets == NULL" 30 1.5 rillig : command3 # parse error, since targets == NULL 31 1.4 rillig 32 1.9 rillig # In a dependency declaration, the list of targets can be empty. 33 1.9 rillig # It doesn't matter whether the empty string is generated by a variable 34 1.9 rillig # expression or whether it is just omitted. 35 1.9 rillig .MAKEFLAGS: -dp 36 1.9 rillig ${:U}: empty-source 37 1.9 rillig : command for empty targets list 38 1.9 rillig : empty-source 39 1.9 rillig : command for empty targets list 40 1.9 rillig .MAKEFLAGS: -d0 41 1.9 rillig 42 1.10 rillig # Just to show that a malformed expression is only expanded once in 43 1.10 rillig # ParseDependencyTargetWord. The only way to produce an expression that 44 1.10 rillig # is well-formed on the first expansion and ill-formed on the second 45 1.10 rillig # expansion would be to use the variable modifier '::=' to modify the 46 1.10 rillig # targets. This in turn would be such an extreme and unreliable edge case 47 1.10 rillig # that nobody uses it. 48 1.14 rillig # expect+1: Unknown modifier "Z" 49 1.10 rillig $$$$$$$${:U:Z}: 50 1.10 rillig 51 1.13 rillig # expect+1: warning: Extra target 'ordinary' ignored 52 1.12 rillig .END ordinary: 53 1.12 rillig 54 1.12 rillig # expect+1: warning: Extra target (ordinary) ignored 55 1.12 rillig .PATH ordinary: 56 1.12 rillig 57 1.12 rillig # expect+1: Special and mundane targets don't mix. Mundane ones ignored 58 1.12 rillig ordinary .PATH: 59 1.12 rillig 60 1.1 rillig all: 61 1.1 rillig @:; 62