bug-make
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[RFC PATCH v4 3/3] Tests for .ONESHELL with a prerequisite


From: Britton Leo Kerin
Subject: [RFC PATCH v4 3/3] Tests for .ONESHELL with a prerequisite
Date: Mon, 23 Dec 2024 15:56:48 -0900

---
 src/job.c                      |  22 -
 tests/scripts/targets/ONESHELL | 848 +++++++++++++++++++++++++++++++++
 2 files changed, 848 insertions(+), 22 deletions(-)

diff --git a/src/job.c b/src/job.c
index f0a7f6cb..cd24d290 100644
--- a/src/job.c
+++ b/src/job.c
@@ -1135,28 +1135,6 @@ free_child (struct child *child)
       unsigned short ncommand_lines;
       if ( child->file->oneshell ) {
         ncommand_lines = child->file->cmds->oneshell_ncommand_lines;
-        // FIXME: WORK POINT: well this checkpoint hits with a built-in
-        // implicit rule but how do we test this from a test, since the
-        // built-in rules are all one line?  Just add a comment to the test
-        // script indicating that it's been tried, and that things have been
-        // arranged that way to avoid changing code paths for the built-in
-        // suffix and implicit rules?  Same issue when built-in suffix rules
-        // are triggered (though for all I know they essentially compile
-        // to the corresponding implicit rule with which they shave a cmds
-        // structure (I sort of think they don't but I'd need to check)
-        //
-        // Other things that I've tried that still need tests written:
-        //   * match-anything implicit terminal rules (::)
-        //   * match-anything implicit non-terminal rules (not ::)
-        //   * implicit rules
-        //   * .DEFAULT rules
-        //   * double-suffix rules
-        //   * single-suffic rules
-        //
-        // Things that haven't been tried yet:
-        //   * That all the line flags (no output, no errors, recurse, and
-        //     recurse due to $(MAKE)) var ref work as documented
-        //
         mCP ();
       }
       else {
diff --git a/tests/scripts/targets/ONESHELL b/tests/scripts/targets/ONESHELL
index 0ae9b5b7..0f3fad01 100644
--- a/tests/scripts/targets/ONESHELL
+++ b/tests/scripts/targets/ONESHELL
@@ -40,6 +40,7 @@ all:
 ');
 }
 
+# FIXME: test if we actually expect a POSIX-style shell before running this?
 # Again, but this time with inner prefix chars
 
 run_make_test(q!
@@ -63,6 +64,7 @@ all:
               '', '');
 
 
+# FIXME: test if we actually expect a POSIX-style shell before running this?
 # This time with outer and inner prefix chars
 
 run_make_test(q!
@@ -76,6 +78,7 @@ all:
 
 # Now try using a different interpreter
 # This doesn't work on Windows right now
+
 if ($port_type ne 'W32') {
     run_make_test(q!
 .RECIPEPREFIX = >
@@ -135,6 +138,851 @@ all:; @print "it works: $$foo\n"
 !, '', 'it works: bar');
 }
 
+# .ONESHELL with a prerequisite
+
+run_make_test(q!
+.ONESHELL: oneshell_target
+normal_target:
+       a=$$$$
+       [ 0"$$a" -ne "$$$$" ] || echo fail
+oneshell_target:
+       a=$$$$
+       [ 0"$$a" -eq "$$$$" ] || echo fail
+!,
+              'oneshell_target', 'a=$$
+[ 0"$a" -eq "$$" ] || echo fail
+');
+
+# Another target when there exists a .ONESHELL with a prerequisite
+
+run_make_test(q!
+.ONESHELL: oneshell_target
+normal_target:
+       a=$$$$
+       [ 0"$$a" -ne "$$$$" ] || echo fail
+oneshell_target:
+       a=$$$$
+       [ 0"$$a" -eq "$$$$" ] || echo fail
+!,
+              'normal_target', 'a=$$
+[ 0"$a" -ne "$$" ] || echo fail
+');
+
+# .ONESHELL with a prerequisite that doesn't have a recipe
+
+run_make_test(q!
+.ONESHELL: oneshell_target
+oneshell_target:
+!,
+              'oneshell_target', "#MAKE#: Nothing to be done for 
'oneshell_target'.");
+
+# .ONESHELL with a prerequisite with multi-word SHELLFLAGS
+
+if ($multi_ok) {
+    run_make_test(q!
+.ONESHELL: oneshell_target
+.SHELLFLAGS = -e -c
+oneshell_target:
+       a=$$$$
+       [ 0"$$a" -eq "$$$$" ] || echo fail
+!,
+              'oneshell_target', 'a=$$
+[ 0"$a" -eq "$$" ] || echo fail
+');
+}
+
+# FIXME: test if we actually expect a POSIX-style shell before running this?
+# .ONESHELL with a prerequisite with inner prefix chars
+
+run_make_test(q!
+.ONESHELL: oneshell_target
+oneshell_target:
+       a=$$$$
+       @-+    [ 0"$$a" -eq "$$$$" ] || echo fail
+!,
+              'oneshell_target', 'a=$$
+[ 0"$a" -eq "$$" ] || echo fail
+');
+
+# .ONESHELL with a prerequisite with outer prefix chars
+
+run_make_test(q!
+.ONESHELL: oneshell_target
+oneshell_target:
+       @a=$$$$
+        [ 0"$$a" -eq "$$$$" ] || echo fail
+!,
+              'oneshell_target', '');
+
+# FIXME: test if we actually expect a POSIX-style shell before running this?
+# .ONESHELL with a prerequisite with outer and inner prefix chars
+
+run_make_test(q!
+.ONESHELL: oneshell_target
+oneshell_target:
+       @a=$$$$
+        -@     +[ 0"$$a" -eq "$$$$" ] || echo fail
+!,
+              'oneshell_target', '');
+
+
+# .ONESHELL with a prerequisite using a different interpreter
+# This doesn't work on Windows right now
+
+if ($port_type ne 'W32') {
+    run_make_test(q!
+.RECIPEPREFIX = >
+.ONESHELL: oneshell_target
+SHELL = #PERL#
+.SHELLFLAGS = -e
+oneshell_target:
+>         @$$a=5
+>          +7;
+>      @y=qw(a b c);
+>print "a = $$a, y = (@y)\n";
+!,
+                  'oneshell_target', "a = 12, y = (a b c)\n");
+
+    # Simple .SHELLFLAGS, no quotes.
+    # sv 61805.
+    run_make_test(q!
+.ONESHELL:
+SHELL = #PERL#
+.SHELLFLAGS = -e
+oneshell_target:; @print "it works\n"
+!, 'oneshell_target', 'it works');
+
+    # Pass a quoted string with spaces to oneshell.
+    # sv 61805.
+    run_make_test(q!
+.ONESHELL: oneshell_target
+SHELL = #PERL#
+.SHELLFLAGS = -w -E 'use warnings FATAL => "all";' -E
+oneshell_target:; @print "it works\n"
+!, 'oneshell_target', 'it works');
+
+    # Empty .SHELLFLAGS.
+    # sv 61805.
+    run_make_test(q!
+.ONESHELL: oneshell_target
+SHELL = #PERL#
+.SHELLFLAGS =
+oneshell_target:; @print "it works"
+!, 'oneshell_target', "Can't open perl script \"print \"it works\"\": 
$ERR_no_such_file\n#MAKE#: *** [#MAKEFILE#:5: oneshell_target] Error 
$ERR_no_such_file_code", 512);
+
+    # No .SHELLFLAGS.
+    # sv 61805.
+    run_make_test(q!
+.ONESHELL: oneshell_target
+SHELL = #PERL#
+oneshell_target:; @print "it works"
+!, 'oneshell_target', "Can't open perl script \"print \"it works\"\": 
$ERR_no_such_file\n#MAKE#: *** [#MAKEFILE#:4: oneshell_target] Error 
$ERR_no_such_file_code", 512);
+
+    # Pass a quoted string with spaces to oneshell.
+    # sv 61805.
+    run_make_test(q!
+.ONESHELL: oneshell_target
+SHELL = #PERL#
+.SHELLFLAGS = -w -E 'use warnings FATAL => "all";' -E 'my $$foo = "bar";' -E
+oneshell_target:; @print "it works: $$foo\n"
+!, 'oneshell_target', 'it works: bar');
+}
+
+# .ONESHELL with a prerequisite covered by a static pattern rule
+
+create_file('oneshell_target.foo');
+run_make_test(q!
+.ONESHELL: oneshell_target.bar
+oneshell_target.bar: %.bar: %.foo
+       a=$$$$
+       [ 0"$$a" -eq "$$$$" ] || echo fail
+!,
+              'oneshell_target.bar', 'a=$$
+[ 0"$a" -eq "$$" ] || echo fail
+');
+rmfiles('oneshell_target.foo');
+
+# .ONESHELL with a prerequisite covered by an implicit rule
+
+create_file('oneshell_target.foo');
+run_make_test(q!
+.ONESHELL: oneshell_target.bar
+%.bar: %.foo
+       a=$$$$
+       [ 0"$$a" -eq "$$$$" ] || echo fail
+!,
+              'oneshell_target.bar', 'a=$$
+[ 0"$a" -eq "$$" ] || echo fail
+');
+rmfiles('oneshell_target.foo');
+
+# .ONESHELL with a prerequisite covered by a match-anything implicit terminal
+# rule
+
+run_make_test(q!
+.ONESHELL: oneshell_target
+%::
+       a=$$$$
+       [ 0"$$a" -eq "$$$$" ] || echo fail
+!,
+              'oneshell_target', 'a=$$
+[ 0"$a" -eq "$$" ] || echo fail
+');
+
+# .ONESHELL with a prerequisite covered by a match-anything implicit
+# non-terminal rule
+
+run_make_test(q!
+.ONESHELL: oneshell_target
+%:
+       a=$$$$
+       [ 0"$$a" -eq "$$$$" ] || echo fail
+!,
+              'oneshell_target', 'a=$$
+[ 0"$a" -eq "$$" ] || echo fail
+');
+
+# .ONESHELL with a prerequisite covered by a .DEFAULT: rule
+
+run_make_test(q!
+.ONESHELL: oneshell_target
+.DEFAULT:
+       a=$$$$
+       [ 0"$$a" -eq "$$$$" ] || echo fail
+!,
+              'oneshell_target', 'a=$$
+[ 0"$a" -eq "$$" ] || echo fail
+');
+
+# .ONESHELL with a prerequisite covered by a double-suffix rule
+
+create_file('oneshell_target.foo');
+run_make_test(q!
+.ONESHELL: oneshell_target.bar
+.SUFFIXES: .foo .bar
+.foo.bar:
+       a=$$$$
+       [ 0"$$a" -eq "$$$$" ] || echo fail
+!,
+              'oneshell_target.bar', 'a=$$
+[ 0"$a" -eq "$$" ] || echo fail
+');
+rmfiles('oneshell_target.foo');
+
+# .ONESHELL with a prerequisite covered by a single-suffix rule
+
+create_file('oneshell_target.foo');
+run_make_test(q!
+.ONESHELL: oneshell_target
+.SUFFIXES: .foo
+.foo:
+       a=$$$$
+       [ 0"$$a" -eq "$$$$" ] || echo fail
+!,
+              'oneshell_target', 'a=$$
+[ 0"$a" -eq "$$" ] || echo fail
+');
+rmfiles('oneshell_target.foo');
+
+# FIXME: I think for static pattern rules it should be a hard error for part
+# of the covered set to be oneshell and part not.  It's always perilous
+# to guess what users have in mind, but it's seems like a pretty safe bet
+# they don't really intend the same chunk of code from the same rule to be
+# sometimes evaluated as oneshell and sometimes not.  For static pattern rules
+# this seems even more certain: a big part of the attraction of static pattern
+# rules is that they avoid a lot of the oddities and potential confusion of
+# implicit rules, and a variable holding the covered set probably already
+# exists, so also using it in the .ONESHELL: prerequisites list is low-effort.
+# IMO this and similar tests should be changed to confirm this error.
+
+# .ONESHELL with a prerequisite covered by a static pattern rule does not cause
+# other targets matched by the rule to be oneshell
+
+create_file('non_oneshell_target.foo');
+run_make_test(q!
+.ONESHELL: oneshell_target.bar
+oneshell_target.bar non_oneshell_target.bar: %.bar: %.foo
+       a=$$$$
+       [ 0"$$a" -ne "$$$$" ] || echo fail
+!,
+              'non_oneshell_target.bar', 'a=$$
+[ 0"$a" -ne "$$" ] || echo fail
+');
+rmfiles('non_oneshell_target.foo');
+
+# FIXME: I think for all types of implicit rules, .DEFAULT: rules, and
+# suffix rules at least a warning should be produced if the same recipe is
+# sometimes evaluated under oneshell and sometimes not.  See the comments
+# in the above fixme about the same issue with static pattern rules for
+# more details.  If it was decided to always make this situation an error
+# the implementation could be simplified (there would be no need to maintain
+# both normal and oneshell_* fields in struct commands).  This and similar
+# tests should be changed to verify that this warning or error is produced.
+
+# .ONESHELL with a prerequisite covered by an implicit rule does not cause
+# other targets matched by the rule to be oneshell
+
+create_file('non_oneshell_target.foo');
+run_make_test(q!
+.ONESHELL: oneshell_target.bar
+%.bar: %.foo
+       a=$$$$
+       [ 0"$$a" -ne "$$$$" ] || echo fail
+!,
+              'non_oneshell_target.bar', 'a=$$
+[ 0"$a" -ne "$$" ] || echo fail
+');
+rmfiles('non_oneshell_target.foo');
+
+# .ONESHELL with a prerequisite covered by a match-anything implicit terminal
+# rule does not cause other targets matched by the rule to be oneshell
+
+run_make_test(q!
+.ONESHELL: oneshell_target
+%::
+       a=$$$$
+       [ 0"$$a" -ne "$$$$" ] || echo fail
+!,
+              'non_oneshell_target', 'a=$$
+[ 0"$a" -ne "$$" ] || echo fail
+');
+
+
+# .ONESHELL with a prerequisite covered by a match-anything implicit
+# non-terminal rule does not cause other targets matched by the rule to be
+# oneshell
+
+run_make_test(q!
+.ONESHELL: oneshell_target
+%:
+       a=$$$$
+       [ 0"$$a" -ne "$$$$" ] || echo fail
+!,
+              'non_oneshell_target', 'a=$$
+[ 0"$a" -ne "$$" ] || echo fail
+');
+
+# .ONESHELL with a prerequisite covered by a .DEFAULT: rule does not cause
+# other targets matched by the rule to be oneshell
+
+run_make_test(q!
+.ONESHELL: oneshell_target
+.DEFAULT:
+       a=$$$$
+       [ 0"$$a" -ne "$$$$" ] || echo fail
+!,
+              'non_oneshell_target', 'a=$$
+[ 0"$a" -ne "$$" ] || echo fail
+');
+
+
+# .ONESHELL with a prerequisite covered by a double-suffix rule does not cause
+# other targets matched by the rule to be oneshell
+
+create_file('non_oneshell_target.foo');
+run_make_test(q!
+.ONESHELL: oneshell_target.bar
+.SUFFIXES: .foo .bar
+.foo.bar:
+       a=$$$$
+       [ 0"$$a" -ne "$$$$" ] || echo fail
+!,
+              'non_oneshell_target.bar', 'a=$$
+[ 0"$a" -ne "$$" ] || echo fail
+');
+rmfiles('non_oneshell_target.foo');
+
+# .ONESHELL with a prerequisite covered by a single-suffix rule does not cause
+# other targets matched by the rule to be oneshell
+
+create_file('non_oneshell_target.foo');
+run_make_test(q!
+.ONESHELL: oneshell_target
+.SUFFIXES: .foo
+.foo:
+       a=$$$$
+       [ 0"$$a" -ne "$$$$" ] || echo fail
+!,
+              'non_oneshell_target', 'a=$$
+[ 0"$a" -ne "$$" ] || echo fail
+');
+rmfiles('non_oneshell_target.foo');
+
+# FIXME: some other groups of tests could be organized and described in this
+# same slightly hierarchical way.  Alternately, if it's considered better
+# to keep everything flat and just have redundant comments, all tests in
+# this group could be changed to be like the other new tests.
+
+# Interactions between per-target .ONESHELL and special prefix characters.
+# These test are perhaps slightly over-effusive with respect to the
+# implementation.
+{
+    # There are seven types of rules: static pattern, implicit, match-anything
+    # terminal, match-anything non-terminal, .DEFAULT, double-suffix, and
+    # single-suffix.
+    #
+    # There are four behaviors of interest: .ONESHELL and non-.ONESHELL
+    # targets (which share a recipe with a .ONESHELL target) with 1st
+    # line prefix and with "internal" prefix.
+    #
+    # Test all combinations, taking the '@' prefix as representative:
+
+    # .ONESHELL target with 1st line prefix X static pattern
+# {{{1
+# .ONESHELL with a prerequisite covered by a static pattern rule causes
+# modified interpretation of prefix characters on the first recipe line
+
+    create_file('oneshell_target.foo');
+    run_make_test(q!
+.ONESHELL: oneshell_target.bar
+oneshell_target.bar: %.bar: %.foo
+       @true
+       true
+!,
+                'oneshell_target.bar', '');
+    rmfiles('oneshell_target.foo');
+# }}}1
+    # .ONESHELL target with 1st line prefix X implicit
+# {{{1
+# .ONESHELL with a prerequisite covered by an implicit rule causes
+# modified interpretation of prefix characters on the first recipe line
+
+    create_file('oneshell_target.foo');
+    run_make_test(q!
+.ONESHELL: oneshell_target.bar
+%.bar: %.foo
+       @true
+       true
+!,
+                'oneshell_target.bar', '');
+    rmfiles('oneshell_target.foo');
+# }}}1
+    # .ONESHELL target with 1st line prefix X match-anything terminal
+# {{{1
+
+# .ONESHELL with a prerequisite covered by a match-anything implicit terminal
+# rule causes modified interpretation of prefix characters on the first recipe
+# line
+
+    run_make_test(q!
+.ONESHELL: oneshell_target
+%::
+       @true
+       true
+!,
+                  'oneshell_target', '');
+# }}}1
+    # .ONESHELL target with 1st line prefix X match-anything non-terminal
+# {{{1
+
+# .ONESHELL with a prerequisite covered by an match-anything implicit
+# non-terminal rule causes modified interpretation of prefix characters on the
+# first recipe line
+
+    run_make_test(q!
+.ONESHELL: oneshell_target
+%:
+       @true
+       true
+!,
+                  'oneshell_target', '');
+    rmfiles('oneshell_target');
+# }}}1
+    # .ONESHELL target with 1st line prefix X .DEFAULT
+# {{{1
+
+# .ONESHELL with a prerequisite covered by an match-anything implicit
+# non-terminal rule causes modified interpretation of prefix characters on the
+# first recipe line
+
+    run_make_test(q!
+.ONESHELL: oneshell_target
+.DEFAULT:
+       @true
+       true
+!,
+                  'oneshell_target', '');
+    rmfiles('oneshell_target');
+# }}}1
+    # .ONESHELL target with 1st line prefix X double-suffix
+# {{{1
+# .ONESHELL with a prerequisite covered by a double-suffix rule causes modified
+# interpretation of prefix characters on the first recipe line
+
+    create_file('oneshell_target.foo');
+    run_make_test(q!
+.ONESHELL: oneshell_target.bar
+.SUFFIXES: .foo .bar
+.foo.bar:
+       @true
+       true
+!,
+                'oneshell_target.bar', '');
+    rmfiles('oneshell_target.foo');
+# }}}1
+    # .ONESHELL target with 1st line prefix X single-suffix
+# {{{1
+# .ONESHELL with a prerequisite covered by a single-suffix rule causes modified
+# interpretation of prefix characters on the first recipe line
+
+    create_file('oneshell_target.foo');
+    run_make_test(q!
+.ONESHELL: oneshell_target
+.SUFFIXES: .foo
+.foo:
+       @true
+       true
+!,
+                'oneshell_target', '');
+    rmfiles('non_oneshell_target.foo');
+# }}}1
+
+    # FIXME: these need test for "POSIX-style" shell:
+    # .ONESHELL target with 1st line prefix X static pattern
+# {{{1
+# .ONESHELL with a prerequisite covered by a static pattern rule causes special
+# prefix characters on "internal" recipe lines to be ignored and removed
+
+    create_file('oneshell_target.foo');
+    run_make_test(q!
+.ONESHELL: oneshell_target.bar
+oneshell_target.bar: %.bar: %.foo
+       true
+       @true
+!,
+                'oneshell_target.bar', 'true
+true');
+    rmfiles('oneshell_target.foo');
+# }}}1
+    # .ONESHELL target with "internal" prefix X implicit
+# {{{1
+# .ONESHELL with a prerequisite covered by an implicit rule causes special
+# prefix characters on "internal" recipe lines to be ignored and removed
+
+    create_file('oneshell_target.foo');
+    run_make_test(q!
+.ONESHELL: oneshell_target.bar
+%.bar: %.foo
+       true
+       @true
+!,
+                'oneshell_target.bar', 'true
+true');
+    rmfiles('oneshell_target.foo');
+# }}}1
+    # .ONESHELL target with "internal" prefix X match-anything terminal
+# {{{1
+# .ONESHELL with a prerequisite covered by a match-anything implicit terminal
+# rule causes prefix characters on "internal" recipe lines to be ignored and
+# removed
+
+    run_make_test(q!
+.ONESHELL: oneshell_target
+%::
+       true
+       @true
+!,
+                  'oneshell_target', 'true
+true');
+# }}}1
+    # .ONESHELL target with "internal" prefix X match-anything non-terminal
+# {{{1
+# .ONESHELL with a prerequisite covered by a match-anything implicit terminal
+# rule causes prefix characters on "internal" recipe lines to be ignored and
+# removed
+
+    run_make_test(q!
+.ONESHELL: oneshell_target
+%:
+       true
+       @true
+!,
+                  'oneshell_target', 'true
+true');
+# }}}1
+    # .ONESHELL target with "internal" prefix X .DEFAULT
+# {{{1
+# .ONESHELL with a prerequisite covered by a match-anything implicit terminal
+# rule causes prefix characters on "internal" recipe lines to be ignored and
+# removed
+
+    run_make_test(q!
+.ONESHELL: oneshell_target
+.DEFAULT:
+       true
+       @true
+!,
+                  'oneshell_target', 'true
+true');
+# }}}1
+    # .ONESHELL target with "internal" prefix X double-suffix
+# {{{1
+# .ONESHELL with a prerequisite covered by a double-suffix rule causes special
+# prefix characters on "internal" recipe lines to be ignored and removed
+
+    create_file('oneshell_target.foo');
+    run_make_test(q!
+.ONESHELL: oneshell_target.bar
+.SUFFIXES: .foo .bar
+.foo.bar:
+       true
+       @true
+!,
+                  'oneshell_target.bar', 'true
+true');
+    rmfiles('oneshell_target.foo');
+# }}}1
+    # .ONESHELL target with "internal" prefix X single-suffix
+# {{{1
+# .ONESHELL with a prerequisite covered by a single-suffix rule causes special
+# prefix characters on "internal" recipe lines to be ignored and removed
+
+    create_file('oneshell_target.foo');
+    run_make_test(q!
+.ONESHELL: oneshell_target
+.SUFFIXES: .foo
+.foo:
+       true
+       @true
+!,
+                'oneshell_target', 'true
+true');
+    rmfiles('oneshell_target.foo');
+# }}}1
+
+    # non-.ONESHELL target with 1st line special X static pattern
+# {{{1
+# .ONESHELL with a prerequisite covered by a static pattern rule does not cause
+# other targets matched by the rule to have the interpretation of internal
+# prefix characters in the recipe changed
+
+    create_file('non_oneshell_target.foo');
+    run_make_test(q!
+.ONESHELL: oneshell_target.bar
+oneshell_target.bar non_oneshell_target.bar: %.bar: %.foo
+       true
+       @true
+!,
+                'non_oneshell_target.bar', 'true');
+    rmfiles('non_oneshell_target.foo');
+# }}}1
+    # non-.ONESHELL target with 1st line special X implicit
+# {{{1
+# .ONESHELL with a prerequisite covered by an implicit rule does not cause
+# other targets matched by the rule to have the interpretation of internal
+# prefix characters in the recipe changed
+
+    create_file('non_oneshell_target.foo');
+    run_make_test(q!
+.ONESHELL: oneshell_target.bar
+%.bar: %.foo
+       true
+       @true
+!,
+                  'non_oneshell_target.bar', 'true');
+    rmfiles('non_oneshell_target.foo');
+# }}}1
+    # non-.ONESHELL target with 1st line special X match-anything terminal
+# {{{1
+# .ONESHELL with a prerequisite covered by a match-anything implicit terminal
+# rule does not cause other targets matched by the rule to have the
+# interpretation of internal prefix characters in the recipe changed
+
+    run_make_test(q!
+.ONESHELL: oneshell_target
+%::
+       true
+       @true
+!,
+                  'non_oneshell_target', 'true');
+# }}}1
+    # non-.ONESHELL target with 1st line special X match-anything non-terminal
+# {{{1
+# .ONESHELL with a prerequisite covered by a match-anything implicit
+# non-terminal rule does not cause other targets matched by the rule to have
+# the interpretation of internal prefix characters in the recipe changed
+
+    run_make_test(q!
+.ONESHELL: oneshell_target
+%:
+       true
+       @true
+!,
+                  'non_oneshell_target', 'true');
+# }}}1
+    # non-.ONESHELL target with 1st line special X .DEFAULT
+# {{{1
+# .ONESHELL with a prerequisite covered by a .DEFAULT: rule does not cause
+# other targets matched by the rule to have the interpretation of internal
+# prefix characters in the recipe changed
+
+    run_make_test(q!
+.ONESHELL: oneshell_target
+.DEFAULT:
+       true
+       @true
+!,
+                  'non_oneshell_target', 'true');
+# }}}1
+    # non-.ONESHELL target with 1st line special X double-suffix
+# {{{1
+# .ONESHELL with a prerequisite covered by a double-suffix rule does not cause
+# other targets matched by the rule to have the interpretation of internal
+# prefix characters in the recipe changed
+
+    create_file('non_oneshell_target.foo');
+    run_make_test(q!
+.ONESHELL: oneshell_target.bar
+.SUFFIXES: .foo .bar
+.foo.bar:
+       true
+       @true
+!,
+                'non_oneshell_target.bar', 'true');
+    rmfiles('non_oneshell_target.foo');
+# }}}1
+    # non-.ONESHELL target with 1st line special X single-suffix
+# {{{1
+# .ONESHELL with a prerequisite covered by a single-suffix rule does not cause
+# other targets matched by the rule to have the interpretation of internal
+# prefix characters in the recipe changed
+
+    create_file('non_oneshell_target.foo');
+    run_make_test(q!
+.ONESHELL: oneshell_target
+.SUFFIXES: .foo
+.foo:
+       true
+       @true
+!,
+                'non_oneshell_target', 'true');
+    rmfiles('non_oneshell_target.foo');
+# }}}1
+
+    # non-.ONESHELL target with "internal" prefix X static pattern
+# {{{1
+# .ONESHELL with a prerequisite covered by an implicit rule does not cause
+# other targets matched by the rule to have the interpretation of "internal"
+# prefix characters in the recipe changed
+
+    create_file('non_oneshell_target.foo');
+    run_make_test(q!
+.ONESHELL: oneshell_target.bar
+oneshell_target.bar non_oneshell_target.bar: %.bar: %.foo
+       true
+       @true
+!,
+                'non_oneshell_target.bar', 'true');
+    rmfiles('non_oneshell_target.foo');
+# }}}1
+    # non-.ONESHELL target with "internal" prefix X implicit
+# {{{1
+# .ONESHELL with a prerequisite covered by an implicit rule does not cause
+# other targets matched by the rule to have the interpretation of "internal"
+# prefix characters in the recipe changed
+
+    create_file('non_oneshell_target.foo');
+    run_make_test(q!
+.ONESHELL: oneshell_target.bar
+%.bar: %.foo
+       true
+       @true
+!,
+                'non_oneshell_target.bar', 'true');
+    rmfiles('non_oneshell_target.foo');
+# }}}1
+    # non-.ONESHELL target with "internal" prefix X match-anything terminal
+# {{{1
+# .ONESHELL with a prerequisite covered by a match-anything implicit terminal
+# rule does not cause other targets matched by the rule to have the
+# interpretation of "internal" prefix characters in the recipe changed
+
+    run_make_test(q!
+.ONESHELL: oneshell_target
+%::
+       true
+       @true
+!,
+                  'non_oneshell_target', 'true');
+# }}}1
+    # non-.ONESHELL target with "internal" prefix X match-anything non-terminal
+# {{{1
+# .ONESHELL with a prerequisite covered by a match-anything implicit
+# non-terminal rule does not cause other targets matched by the rule to have
+# the interpretation of "internal" prefix characters in the recipe
+# changed
+
+    run_make_test(q!
+.ONESHELL: oneshell_target
+%:
+       true
+       @true
+!,
+                  'non_oneshell_target', 'true');
+# }}}1
+    # non-.ONESHELL target with "internal" prefix X .DEFAULT
+# {{{1
+# .ONESHELL with a prerequisite covered by a .DEFAULT: rule does not cause
+# other targets matched by the rule to have the interpretation of "internal"
+# prefix characters in the recipe changed
+
+    run_make_test(q!
+.ONESHELL: oneshell_target
+.DEFAULT:
+       true
+       @true
+!,
+                  'non_oneshell_target', 'true');
+# }}}1
+    # non-.ONESHELL target with "internal" prefix X double-suffix
+# {{{1
+# .ONESHELL with a prerequisite covered by a double-suffix rule does not cause
+# other targets matched by the rule to have the interpretation of internal
+# prefix characters in the recipe changed
+
+    create_file('non_oneshell_target.foo');
+    run_make_test(q!
+.ONESHELL: oneshell_target.bar
+.SUFFIXES: .foo .bar
+.foo.bar:
+       true
+       @true
+!,
+                  'non_oneshell_target.bar', 'true');
+    rmfiles('non_oneshell_target.foo');
+# }}}1
+    # non-.ONESHELL target with "internal" prefix X double-suffix
+# {{{1
+# .ONESHELL with a prerequisite covered by a single-suffix rule does not cause
+# other targets matched by the rule to have the interpretation of internal
+# prefix characters in the recipe changed
+
+    create_file('non_oneshell_target.foo');
+    run_make_test(q!
+.ONESHELL: oneshell_target
+.SUFFIXES: .foo
+.foo:
+       true
+       @true
+!,
+                  'non_oneshell_target', 'true');
+    rmfiles('non_oneshell_target.foo');
+# }}}1
+
+};
+
+# FIXME: the docs don't specify whether identification of MAKE references
+# in recipes in oneshell targets triggers special handling of -t, -n, and
+# -q flags
+
+# FIXME: the effect of $(MAKE) references in oneshell targets should be tested
+
+# FIXME: I checked manually that the code path for built-in implicit rules
+# doesn't change when they aren't explicit .ONESHELL prerequisites, but it's
+# hard to verify this with a test since all such rules consist of a single
+# line (I think they're theoretically identical anyway for this reason,
+# but it seem imprudent to change their code path) so no such tests exist yet.
+
 # This tells the test driver that the perl test script executed properly.
 1;
 
-- 
2.43.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]