mirror of
https://salsa.debian.org/srivasta/make-dfsg.git
synced 2024-12-27 06:27:57 +00:00
(quote_as_word): Renamed from shell_quote.
Take new arg; if nonzero, also double $s. (main): Define MAKEOVERRIDES from command_variables here. (define_makeflags): Don't use command_variables here; instead write a reference $(MAKEOVERRIDES) in MAKEFLAGS. Make vars recursive.
This commit is contained in:
parent
b13a443fa7
commit
f40918e005
1 changed files with 66 additions and 52 deletions
118
main.c
118
main.c
|
@ -46,6 +46,7 @@ static void log_working_directory ();
|
|||
static void print_data_base (), print_version ();
|
||||
static void decode_switches (), decode_env_switches ();
|
||||
static void define_makeflags ();
|
||||
static char *quote_as_word ();
|
||||
|
||||
/* The structure that describes an accepted command switch. */
|
||||
|
||||
|
@ -563,6 +564,42 @@ main (argc, argv, envp)
|
|||
(void) define_variable ("MAKE_COMMAND", 12, argv[0], o_default, 0);
|
||||
(void) define_variable ("MAKE", 4, "$(MAKE_COMMAND)", o_default, 1);
|
||||
|
||||
if (command_variables != 0)
|
||||
{
|
||||
struct command_variable *cv;
|
||||
struct variable *v;
|
||||
unsigned int len = 0;
|
||||
char *value, *p;
|
||||
|
||||
/* Figure out how much space will be taken up by the command-line
|
||||
variable definitions. */
|
||||
for (cv = command_variables; cv != 0; cv = cv->next)
|
||||
{
|
||||
v = cv->variable;
|
||||
len += 2 * strlen (v->name);
|
||||
if (! v->recursive)
|
||||
++len;
|
||||
++len;
|
||||
len += 2 * strlen (v->value);
|
||||
}
|
||||
|
||||
/* Now allocate a buffer big enough and fill it. */
|
||||
p = value = alloca (len);
|
||||
for (cv = command_variables; cv != 0; cv = cv->next)
|
||||
{
|
||||
v = cv->variable;
|
||||
p = quote_as_word (p, v->name, 0);
|
||||
if (! v->recursive)
|
||||
*p++ = ':';
|
||||
*p++ = '=';
|
||||
p = quote_as_word (p, v->value, 0);
|
||||
*p++ = ' ';
|
||||
}
|
||||
p[-1] = '\0'; /* Kill the final space and terminate. */
|
||||
|
||||
/* Define the variable; this will not override any user definition. */
|
||||
(void) define_variable ("MAKEOVERRIDES", 13, value, o_env, 0);
|
||||
}
|
||||
|
||||
/* If there were -C flags, move ourselves about. */
|
||||
if (directories != 0)
|
||||
|
@ -1503,22 +1540,23 @@ decode_env_switches (envar, len)
|
|||
}
|
||||
|
||||
/* Quote the string IN so that it will be interpreted as a single word with
|
||||
no magic by the shell. Write the result into OUT, returning the address
|
||||
of the next character to be written. Allocating space for OUT twice the
|
||||
length of IN is always sufficient. */
|
||||
no magic by the shell; if DOUBLE_DOLLARS is nonzero, also double dollar
|
||||
signs to avoid variable expansion in make itself. Write the result into
|
||||
OUT, returning the address of the next character to be written.
|
||||
Allocating space for OUT twice the length of IN (thrice if
|
||||
DOUBLE_DOLLARS is nonzero) is always sufficient. */
|
||||
|
||||
static
|
||||
#ifdef __GNUC__
|
||||
__inline__
|
||||
#endif
|
||||
char *
|
||||
shell_quote (out, in)
|
||||
static char *
|
||||
quote_as_word (out, in, double_dollars)
|
||||
char *out, *in;
|
||||
int double_dollars;
|
||||
{
|
||||
while (*in != '\0')
|
||||
{
|
||||
if (index ("^;'\"*?[]$<>(){}|&~`\\ \t\r\n\f\v", *in) != 0)
|
||||
*out++ = '\\';
|
||||
if (*in == '$')
|
||||
*out++ = '$';
|
||||
*out++ = *in++;
|
||||
}
|
||||
|
||||
|
@ -1533,12 +1571,12 @@ static void
|
|||
define_makeflags (all, makefile)
|
||||
int all, makefile;
|
||||
{
|
||||
static const char ref[] = "$(MAKEOVERRIDES)";
|
||||
register const struct command_switch *cs;
|
||||
char *flagstring;
|
||||
register char *p;
|
||||
unsigned int words;
|
||||
struct variable *v;
|
||||
struct command_variable *cv;
|
||||
|
||||
/* We will construct a linked list of `struct flag's describing
|
||||
all the flags which need to go in MAKEFLAGS. Then, once we
|
||||
|
@ -1550,7 +1588,6 @@ define_makeflags (all, makefile)
|
|||
struct flag *next;
|
||||
const struct command_switch *cs;
|
||||
char *arg;
|
||||
unsigned int arglen;
|
||||
};
|
||||
struct flag *flags = 0;
|
||||
unsigned int flagslen = 0;
|
||||
|
@ -1559,13 +1596,12 @@ define_makeflags (all, makefile)
|
|||
struct flag *new = (struct flag *) alloca (sizeof (struct flag)); \
|
||||
new->cs = cs; \
|
||||
new->arg = (ARG); \
|
||||
new->arglen = (LEN); \
|
||||
new->next = flags; \
|
||||
flags = new; \
|
||||
if (new->arg == 0) \
|
||||
++flagslen; /* Just a single flag letter. */ \
|
||||
else \
|
||||
flagslen += 1 + 1 + 1 + 1 + 2 * new->arglen; /* " -x foo" */ \
|
||||
flagslen += 1 + 1 + 1 + 1 + 3 * (LEN); /* " -x foo" */ \
|
||||
if (!isalnum (cs->c)) \
|
||||
/* This switch has no single-letter version, so we use the long. */ \
|
||||
flagslen += 2 + strlen (cs->long_name); \
|
||||
|
@ -1649,23 +1685,9 @@ define_makeflags (all, makefile)
|
|||
break;
|
||||
}
|
||||
|
||||
#undef ADD_FLAG
|
||||
flagslen += 4 + sizeof ref; /* Four more for the possible " -- ". */
|
||||
|
||||
if (all && command_variables != 0)
|
||||
{
|
||||
/* Now figure out how much space will be taken up
|
||||
by the command-line variable definitions. */
|
||||
flagslen += 4; /* For the possible " -- ". */
|
||||
for (cv = command_variables; cv != 0; cv = cv->next)
|
||||
{
|
||||
v = cv->variable;
|
||||
flagslen += 2 * strlen (v->name);
|
||||
if (! v->recursive)
|
||||
++flagslen;
|
||||
++flagslen;
|
||||
flagslen += 2 * strlen (v->value);
|
||||
}
|
||||
}
|
||||
#undef ADD_FLAG
|
||||
|
||||
/* Construct the value in FLAGSTRING.
|
||||
We allocate enough space for a preceding dash and trailing null. */
|
||||
|
@ -1686,16 +1708,15 @@ define_makeflags (all, makefile)
|
|||
*p++ = flags->cs->c;
|
||||
if (flags->arg != 0)
|
||||
{
|
||||
/* A flag that takes an optional argument which in this case
|
||||
is omitted is specified by ARG being "" and ARGLEN being 0.
|
||||
We must distinguish because a following flag appended without
|
||||
an intervening " -" is considered the arg for the first. */
|
||||
if (flags->arglen > 0)
|
||||
/* A flag that takes an optional argument which in this case is
|
||||
omitted is specified by ARG being "". We must distinguish
|
||||
because a following flag appended without an intervening " -"
|
||||
is considered the arg for the first. */
|
||||
if (flags->arg[0] != '\0')
|
||||
{
|
||||
/* Add its argument too. */
|
||||
*p++ = !isalnum (flags->cs->c) ? '=' : ' ';
|
||||
bcopy (flags->arg, p, flags->arglen);
|
||||
p += flags->arglen;
|
||||
p = quote_as_word (p, flags->arg, 1);
|
||||
}
|
||||
++words;
|
||||
/* Write a following space and dash, for the next flag. */
|
||||
|
@ -1715,7 +1736,9 @@ define_makeflags (all, makefile)
|
|||
|
||||
if (all && command_variables != 0)
|
||||
{
|
||||
/* Now write all the command-line variable definitions. */
|
||||
/* Now write a reference to $(MAKEOVERRIDES), which contains all the
|
||||
command-line variable definitions. */
|
||||
|
||||
if (p == &flagstring[1])
|
||||
/* No flags written, so elide the leading dash already written. */
|
||||
p = flagstring;
|
||||
|
@ -1732,23 +1755,14 @@ define_makeflags (all, makefile)
|
|||
*p++ = '-';
|
||||
*p++ = ' ';
|
||||
}
|
||||
for (cv = command_variables; cv != 0; cv = cv->next)
|
||||
{
|
||||
v = cv->variable;
|
||||
p = shell_quote (p, v->name);
|
||||
if (! v->recursive)
|
||||
*p++ = ':';
|
||||
*p++ = '=';
|
||||
p = shell_quote (p, v->value);
|
||||
*p++ = ' ';
|
||||
++words;
|
||||
}
|
||||
--p; /* Kill the final space. */
|
||||
|
||||
/* Copy in the string. */
|
||||
bcopy (ref, p, sizeof ref - 1);
|
||||
p += sizeof ref - 1;
|
||||
}
|
||||
else if (p[-1] == '-')
|
||||
/* Kill the final space and dash. */
|
||||
p -= 2;
|
||||
|
||||
/* Terminate the string. */
|
||||
*p = '\0';
|
||||
|
||||
|
@ -1765,7 +1779,7 @@ define_makeflags (all, makefile)
|
|||
to redefine its value with the full set of
|
||||
switches. Of course, an override or command
|
||||
definition will still take precedence. */
|
||||
o_file, 0);
|
||||
o_file, 1);
|
||||
if (! all)
|
||||
/* The first time we are called, set MAKEFLAGS to always be exported.
|
||||
We should not do this again on the second call, because that is
|
||||
|
@ -1773,7 +1787,7 @@ define_makeflags (all, makefile)
|
|||
v->export = v_export;
|
||||
/* Since MFLAGS is not parsed for flags, there is no reason to
|
||||
override any makefile redefinition. */
|
||||
(void) define_variable ("MFLAGS", 6, flagstring, o_env, 0);
|
||||
(void) define_variable ("MFLAGS", 6, flagstring, o_env, 1);
|
||||
}
|
||||
|
||||
/* Print version information. */
|
||||
|
|
Loading…
Reference in a new issue