summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDmitry Goncharov <dgoncharov@users.sf.net>2022-12-18 14:43:41 -0500
committerPaul Smith <psmith@gnu.org>2022-12-18 20:06:38 -0500
commit8e805c7ba66b731cdd8284940f1a807ccd0d5cd4 (patch)
tree38a18615d425aa5801af9023126f1450803c7c0c /src
parent132528b266eae090458ee35d37ce63246932a1a7 (diff)
downloadmake-git-8e805c7ba66b731cdd8284940f1a807ccd0d5cd4.tar.gz
[SV 63537] Pass enabled-by-default switches to submake
Certain switches, such as -S or --no-silent, turn on behavior that is enabled by default. When a switch is specified via the command line, makefile, or env, ensure the switch is added to MAKEFLAGS. * src/main.c (struct command_switch): Add bit "specified". (switches): Initialize command_switch->specified. (decode_switches): Set command_switch->specified. (define_makeflags): Check command_switch->specified.
Diffstat (limited to 'src')
-rw-r--r--src/main.c94
1 files changed, 50 insertions, 44 deletions
diff --git a/src/main.c b/src/main.c
index a5600391..cae35033 100644
--- a/src/main.c
+++ b/src/main.c
@@ -426,7 +426,10 @@ struct command_switch
unsigned int env:1; /* Can come from MAKEFLAGS. */
unsigned int toenv:1; /* Should be put in MAKEFLAGS. */
- unsigned int no_makefile:1; /* Don't propagate when remaking makefiles. */
+ unsigned int no_makefile:1; /* Don't propagate when remaking makefiles. */
+ unsigned int specified:1; /* Set if the switch was specified somewhere.
+ Allows switches that are ON by default to
+ appear in MAKEFLAGS when set explicitly. */
const void *noarg_value; /* Pointer to value used if no arg given. */
const void *default_value; /* Pointer to default value. */
@@ -441,64 +444,64 @@ struct command_switch
#define TEMP_STDIN_OPT (CHAR_MAX+10)
-static const struct command_switch switches[] =
+static struct command_switch switches[] =
{
- { 'b', ignore, 0, 0, 0, 0, 0, 0, 0, 0 },
- { 'B', flag, &always_make_set, 1, 1, 0, 0, 0, "always-make", 0 },
- { 'd', flag, &debug_flag, 1, 1, 0, 0, 0, 0, 0 },
- { 'e', flag, &env_overrides, 1, 1, 0, 0, 0, "environment-overrides", 0 },
- { 'E', strlist, &eval_strings, 1, 0, 0, 0, 0, "eval", 0 },
- { 'h', flag, &print_usage_flag, 0, 0, 0, 0, 0, "help", 0 },
- { 'i', flag, &ignore_errors_flag, 1, 1, 0, 0, 0, "ignore-errors", 0 },
- { 'k', flag, &keep_going_flag, 1, 1, 0, 0, &default_keep_going_flag,
+ { 'b', ignore, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 'B', flag, &always_make_set, 1, 1, 0, 0, 0, 0, "always-make", 0 },
+ { 'd', flag, &debug_flag, 1, 1, 0, 0, 0, 0, 0, 0 },
+ { 'e', flag, &env_overrides, 1, 1, 0, 0, 0, 0, "environment-overrides", 0 },
+ { 'E', strlist, &eval_strings, 1, 0, 0, 0, 0, 0, "eval", 0 },
+ { 'h', flag, &print_usage_flag, 0, 0, 0, 0, 0, 0, "help", 0 },
+ { 'i', flag, &ignore_errors_flag, 1, 1, 0, 0, 0, 0, "ignore-errors", 0 },
+ { 'k', flag, &keep_going_flag, 1, 1, 0, 0, 0, &default_keep_going_flag,
"keep-going", &keep_going_origin },
- { 'L', flag, &check_symlink_flag, 1, 1, 0, 0, 0, "check-symlink-times", 0 },
- { 'm', ignore, 0, 0, 0, 0, 0, 0, 0, 0 },
- { 'n', flag, &just_print_flag, 1, 1, 1, 0, 0, "just-print", 0 },
- { 'p', flag, &print_data_base_flag, 1, 1, 0, 0, 0, "print-data-base", 0 },
- { 'q', flag, &question_flag, 1, 1, 1, 0, 0, "question", 0 },
- { 'r', flag, &no_builtin_rules_flag, 1, 1, 0, 0, 0, "no-builtin-rules", 0 },
- { 'R', flag, &no_builtin_variables_flag, 1, 1, 0, 0, 0,
+ { 'L', flag, &check_symlink_flag, 1, 1, 0, 0, 0, 0, "check-symlink-times", 0 },
+ { 'm', ignore, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 'n', flag, &just_print_flag, 1, 1, 1, 0, 0, 0, "just-print", 0 },
+ { 'p', flag, &print_data_base_flag, 1, 1, 0, 0, 0, 0, "print-data-base", 0 },
+ { 'q', flag, &question_flag, 1, 1, 1, 0, 0, 0, "question", 0 },
+ { 'r', flag, &no_builtin_rules_flag, 1, 1, 0, 0, 0, 0, "no-builtin-rules", 0 },
+ { 'R', flag, &no_builtin_variables_flag, 1, 1, 0, 0, 0, 0,
"no-builtin-variables", 0 },
- { 's', flag, &silent_flag, 1, 1, 0, 0, &default_silent_flag, "silent",
+ { 's', flag, &silent_flag, 1, 1, 0, 0, 0, &default_silent_flag, "silent",
&silent_origin },
- { 'S', flag_off, &keep_going_flag, 1, 1, 0, 0, &default_keep_going_flag,
+ { 'S', flag_off, &keep_going_flag, 1, 1, 0, 0, 0, &default_keep_going_flag,
"no-keep-going", &keep_going_origin },
- { 't', flag, &touch_flag, 1, 1, 1, 0, 0, "touch", 0 },
- { 'v', flag, &print_version_flag, 1, 0, 0, 0, 0, "version", 0 },
- { 'w', flag, &print_directory_flag, 1, 1, 0, 0,
+ { 't', flag, &touch_flag, 1, 1, 1, 0, 0, 0, "touch", 0 },
+ { 'v', flag, &print_version_flag, 1, 0, 0, 0, 0, 0, "version", 0 },
+ { 'w', flag, &print_directory_flag, 1, 1, 0, 0, 0,
&default_print_directory_flag, "print-directory", &print_directory_origin },
/* These options take arguments. */
- { 'C', filename, &directories, 0, 0, 0, 0, 0, "directory", 0 },
- { 'f', filename, &makefiles, 0, 0, 0, 0, 0, "file", 0 },
- { 'I', filename, &include_dirs, 1, 1, 0, 0, 0,
+ { 'C', filename, &directories, 0, 0, 0, 0, 0, 0, "directory", 0 },
+ { 'f', filename, &makefiles, 0, 0, 0, 0, 0, 0, "file", 0 },
+ { 'I', filename, &include_dirs, 1, 1, 0, 0, 0, 0,
"include-dir", 0 },
- { 'j', positive_int, &arg_job_slots, 1, 1, 0, &inf_jobs, &default_job_slots,
+ { 'j', positive_int, &arg_job_slots, 1, 1, 0, 0, &inf_jobs, &default_job_slots,
"jobs", 0 },
- { 'l', floating, &max_load_average, 1, 1, 0, &default_load_average,
+ { 'l', floating, &max_load_average, 1, 1, 0, 0, &default_load_average,
&default_load_average, "load-average", 0 },
- { 'o', filename, &old_files, 0, 0, 0, 0, 0, "old-file", 0 },
- { 'O', string, &output_sync_option, 1, 1, 0, "target", 0, "output-sync", 0 },
- { 'W', filename, &new_files, 0, 0, 0, 0, 0, "what-if", 0 },
+ { 'o', filename, &old_files, 0, 0, 0, 0, 0, 0, "old-file", 0 },
+ { 'O', string, &output_sync_option, 1, 1, 0, 0, "target", 0, "output-sync", 0 },
+ { 'W', filename, &new_files, 0, 0, 0, 0, 0, 0, "what-if", 0 },
/* These are long-style options. */
- { CHAR_MAX+1, strlist, &db_flags, 1, 1, 0, "basic", 0, "debug", 0 },
- { CHAR_MAX+2, string, &jobserver_auth, 1, 1, 0, 0, 0, JOBSERVER_AUTH_OPT, 0 },
- { CHAR_MAX+3, flag, &trace_flag, 1, 1, 0, 0, 0, "trace", 0 },
- { CHAR_MAX+4, flag_off, &print_directory_flag, 1, 1, 0, 0,
+ { CHAR_MAX+1, strlist, &db_flags, 1, 1, 0, 0, "basic", 0, "debug", 0 },
+ { CHAR_MAX+2, string, &jobserver_auth, 1, 1, 0, 0, 0, 0, JOBSERVER_AUTH_OPT, 0 },
+ { CHAR_MAX+3, flag, &trace_flag, 1, 1, 0, 0, 0, 0, "trace", 0 },
+ { CHAR_MAX+4, flag_off, &print_directory_flag, 1, 1, 0, 0, 0,
&default_print_directory_flag, "no-print-directory", &print_directory_origin },
- { CHAR_MAX+5, flag, &warn_undefined_variables_flag, 1, 1, 0, 0, 0,
+ { CHAR_MAX+5, flag, &warn_undefined_variables_flag, 1, 1, 0, 0, 0, 0,
"warn-undefined-variables", 0 },
- { CHAR_MAX+7, string, &sync_mutex, 1, 1, 0, 0, 0, "sync-mutex", 0 },
- { CHAR_MAX+8, flag_off, &silent_flag, 1, 1, 0, 0, &default_silent_flag,
+ { CHAR_MAX+7, string, &sync_mutex, 1, 1, 0, 0, 0, 0, "sync-mutex", 0 },
+ { CHAR_MAX+8, flag_off, &silent_flag, 1, 1, 0, 0, 0, &default_silent_flag,
"no-silent", &silent_origin },
- { CHAR_MAX+9, string, &jobserver_auth, 1, 0, 0, 0, 0, "jobserver-fds", 0 },
+ { CHAR_MAX+9, string, &jobserver_auth, 1, 0, 0, 0, 0, 0, "jobserver-fds", 0 },
/* There is special-case handling for this in decode_switches() as well. */
- { TEMP_STDIN_OPT, filename, &makefiles, 0, 0, 0, 0, 0, "temp-stdin", 0 },
- { CHAR_MAX+11, string, &shuffle_mode, 1, 1, 0, "random", 0, "shuffle", 0 },
- { CHAR_MAX+12, string, &jobserver_style, 1, 0, 0, 0, 0, "jobserver-style", 0 },
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+ { TEMP_STDIN_OPT, filename, &makefiles, 0, 0, 0, 0, 0, 0, "temp-stdin", 0 },
+ { CHAR_MAX+11, string, &shuffle_mode, 1, 1, 0, 0, "random", 0, "shuffle", 0 },
+ { CHAR_MAX+12, string, &jobserver_style, 1, 0, 0, 0, 0, 0, "jobserver-style", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
/* Secondary long names for options. */
@@ -3112,7 +3115,7 @@ static void
decode_switches (int argc, const char **argv, enum variable_origin origin)
{
int bad = 0;
- const struct command_switch *cs;
+ struct command_switch *cs;
struct stringlist *sl;
int c;
@@ -3157,6 +3160,9 @@ decode_switches (int argc, const char **argv, enum variable_origin origin)
|| (cs->env &&
(cs->origin == NULL || origin >= *cs->origin)));
+ if (doit)
+ cs->specified = 1;
+
switch (cs->type)
{
default:
@@ -3502,7 +3508,7 @@ define_makeflags (int makefile)
case flag:
case flag_off:
if ((!*(int *) cs->value_ptr) == (cs->type == flag_off)
- && (cs->default_value == 0
+ && (cs->default_value == NULL || cs->specified
|| *(int *) cs->value_ptr != *(int *) cs->default_value))
ADD_FLAG (0, 0);
break;