From a275f4e9ab14a2ff827b67b46dd3bc746cdba328 Mon Sep 17 00:00:00 2001
From: Paul Smith <psmith@gnu.org>
Date: Sun, 8 Jan 2023 16:40:55 -0500
Subject: [PATCH] [SV 61218] Ensure MAKEFLAGS is expanded even with -e

If -e was given we weren't expanding MAKEFLAGS before passing it
through the environment to jobs: we don't expand variables we
receive from the environment and when -e is given we set the
origin of MAKEFLAGS to "environment override".  Check for MAKEFLAGS
specifically, which seems like a hack but I don't have a better
idea offhand.

* src/main.c (main): Drive-by: use o_default for MAKEOVERRIDES.
* src/variable.c (target_environment): Always expand MAKEFLAGS
regardless of the origin type.
* tests/scripts/options/dash-e: Create a test.
---
 src/main.c                   |  2 +-
 src/variable.c               |  5 +++--
 tests/scripts/options/dash-e | 15 ++++++++++++---
 3 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/src/main.c b/src/main.c
index 433f5826..cf2324d1 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1920,7 +1920,7 @@ main (int argc, char **argv, char **envp)
          allow the user's setting of MAKEOVERRIDES to affect MAKEFLAGS, so
          a reference to this hidden variable is written instead. */
       define_variable_cname ("MAKEOVERRIDES", "${-*-command-variables-*-}",
-                             o_env, 1);
+                             o_default, 1);
 #ifdef VMS
       vms_export_dcl_symbol ("MAKEOVERRIDES", "${-*-command-variables-*-}");
 #endif
diff --git a/src/variable.c b/src/variable.c
index 009ee540..7b625aee 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -1114,8 +1114,9 @@ target_environment (struct file *file, int recursive)
 
         /* If V is recursively expanded and didn't come from the environment,
            expand its value.  If it came from the environment, it should
-           go back into the environment unchanged.  */
-        if (v->recursive && v->origin != o_env && v->origin != o_env_override)
+           go back into the environment unchanged... except MAKEFLAGS.  */
+        if (v->recursive && ((v->origin != o_env && v->origin != o_env_override)
+                             || streq (v->name, MAKEFLAGS_NAME)))
           value = cp = recursively_expand_for_file (v, file);
 
         /* If this is the SHELL variable remember we already added it.  */
diff --git a/tests/scripts/options/dash-e b/tests/scripts/options/dash-e
index 944c39df..e4659fb2 100644
--- a/tests/scripts/options/dash-e
+++ b/tests/scripts/options/dash-e
@@ -1,8 +1,6 @@
 #                                                                    -*-perl-*-
 
-$description = "The following test creates a makefile to ...";
-
-$details = "";
+$description = "Test the -e (environment overrides) option";
 
 $ENV{GOOGLE} = 'boggle';
 
@@ -12,4 +10,15 @@ all:; @echo "$(GOOGLE)"
 !,
               '-e', "boggle\n");
 
+# Ensure variables set on the command line have the origin correct
+# See SV 61218
+
+run_make_test(q!
+$(info FOO [$(origin FOO)]: $(value FOO))
+all: ;
+recurse: ; @$(MAKE) -f #MAKEFILE#
+!,
+              '-e --no-print-directory FOO=1 recurse',
+              "FOO [command line]: 1\nFOO [command line]: 1\n#MAKE#[1]: 'all' is up to date.");
+
 1;