Change make license
[platform/upstream/make.git] / src / variable.c
1 /* Internals of variables for GNU Make.
2 Copyright (C) 1988-2020 Free Software Foundation, Inc.
3 This file is part of GNU Make.
4
5 GNU Make is free software; you can redistribute it and/or modify it under the
6 terms of the GNU General Public License as published by the Free Software
7 Foundation; either version 3 of the License, or (at your option) any later
8 version.
9
10 GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
11 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12 A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License along with
15 this program.  If not, see <http://www.gnu.org/licenses/>.  */
16
17 #include "makeint.h"
18
19 #include <assert.h>
20
21 #include "filedef.h"
22 #include "dep.h"
23 #include "job.h"
24 #include "commands.h"
25 #include "variable.h"
26 #include "rule.h"
27 #ifdef WINDOWS32
28 #include "pathstuff.h"
29 #endif
30 #include "hash.h"
31
32 /* Incremented every time we add or remove a global variable.  */
33 static unsigned long variable_changenum;
34
35 /* Chain of all pattern-specific variables.  */
36
37 static struct pattern_var *pattern_vars;
38
39 /* Pointer to the last struct in the pack of a specific size, from 1 to 255.*/
40
41 static struct pattern_var *last_pattern_vars[256];
42
43 /* Create a new pattern-specific variable struct. The new variable is
44    inserted into the PATTERN_VARS list in the shortest patterns first
45    order to support the shortest stem matching (the variables are
46    matched in the reverse order so the ones with the longest pattern
47    will be considered first). Variables with the same pattern length
48    are inserted in the definition order. */
49
50 struct pattern_var *
51 create_pattern_var (const char *target, const char *suffix)
52 {
53   size_t len = strlen (target);
54   struct pattern_var *p = xcalloc (sizeof (struct pattern_var));
55
56   if (pattern_vars != 0)
57     {
58       if (len < 256 && last_pattern_vars[len] != 0)
59         {
60           p->next = last_pattern_vars[len]->next;
61           last_pattern_vars[len]->next = p;
62         }
63       else
64         {
65           /* Find the position where we can insert this variable. */
66           struct pattern_var **v;
67
68           for (v = &pattern_vars; ; v = &(*v)->next)
69             {
70               /* Insert at the end of the pack so that patterns with the
71                  same length appear in the order they were defined .*/
72
73               if (*v == 0 || (*v)->len > len)
74                 {
75                   p->next = *v;
76                   *v = p;
77                   break;
78                 }
79             }
80         }
81     }
82   else
83     {
84       pattern_vars = p;
85       p->next = 0;
86     }
87
88   p->target = target;
89   p->len = len;
90   p->suffix = suffix + 1;
91
92   if (len < 256)
93     last_pattern_vars[len] = p;
94
95   return p;
96 }
97
98 /* Look up a target in the pattern-specific variable list.  */
99
100 static struct pattern_var *
101 lookup_pattern_var (struct pattern_var *start, const char *target)
102 {
103   struct pattern_var *p;
104   size_t targlen = strlen (target);
105
106   for (p = start ? start->next : pattern_vars; p != 0; p = p->next)
107     {
108       const char *stem;
109       size_t stemlen;
110
111       if (p->len > targlen)
112         /* It can't possibly match.  */
113         continue;
114
115       /* From the lengths of the filename and the pattern parts,
116          find the stem: the part of the filename that matches the %.  */
117       stem = target + (p->suffix - p->target - 1);
118       stemlen = targlen - p->len + 1;
119
120       /* Compare the text in the pattern before the stem, if any.  */
121       if (stem > target && !strneq (p->target, target, stem - target))
122         continue;
123
124       /* Compare the text in the pattern after the stem, if any.
125          We could test simply using streq, but this way we compare the
126          first two characters immediately.  This saves time in the very
127          common case where the first character matches because it is a
128          period.  */
129       if (*p->suffix == stem[stemlen]
130           && (*p->suffix == '\0' || streq (&p->suffix[1], &stem[stemlen+1])))
131         break;
132     }
133
134   return p;
135 }
136 \f
137 /* Hash table of all global variable definitions.  */
138
139 static unsigned long
140 variable_hash_1 (const void *keyv)
141 {
142   struct variable const *key = (struct variable const *) keyv;
143   return_STRING_N_HASH_1 (key->name, key->length);
144 }
145
146 static unsigned long
147 variable_hash_2 (const void *keyv)
148 {
149   struct variable const *key = (struct variable const *) keyv;
150   return_STRING_N_HASH_2 (key->name, key->length);
151 }
152
153 static int
154 variable_hash_cmp (const void *xv, const void *yv)
155 {
156   struct variable const *x = (struct variable const *) xv;
157   struct variable const *y = (struct variable const *) yv;
158   int result = x->length - y->length;
159   if (result)
160     return result;
161   return_STRING_N_COMPARE (x->name, y->name, x->length);
162 }
163
164 #ifndef VARIABLE_BUCKETS
165 #define VARIABLE_BUCKETS                523
166 #endif
167 #ifndef PERFILE_VARIABLE_BUCKETS
168 #define PERFILE_VARIABLE_BUCKETS        23
169 #endif
170 #ifndef SMALL_SCOPE_VARIABLE_BUCKETS
171 #define SMALL_SCOPE_VARIABLE_BUCKETS    13
172 #endif
173
174 static struct variable_set global_variable_set;
175 static struct variable_set_list global_setlist
176   = { 0, &global_variable_set, 0 };
177 struct variable_set_list *current_variable_set_list = &global_setlist;
178 \f
179 /* Implement variables.  */
180
181 void
182 init_hash_global_variable_set (void)
183 {
184   hash_init (&global_variable_set.table, VARIABLE_BUCKETS,
185              variable_hash_1, variable_hash_2, variable_hash_cmp);
186 }
187
188 /* Define variable named NAME with value VALUE in SET.  VALUE is copied.
189    LENGTH is the length of NAME, which does not need to be null-terminated.
190    ORIGIN specifies the origin of the variable (makefile, command line
191    or environment).
192    If RECURSIVE is nonzero a flag is set in the variable saying
193    that it should be recursively re-expanded.  */
194
195 struct variable *
196 define_variable_in_set (const char *name, size_t length,
197                         const char *value, enum variable_origin origin,
198                         int recursive, struct variable_set *set,
199                         const floc *flocp)
200 {
201   struct variable *v;
202   struct variable **var_slot;
203   struct variable var_key;
204
205   if (set == NULL)
206     set = &global_variable_set;
207
208   var_key.name = (char *) name;
209   var_key.length = (unsigned int) length;
210   var_slot = (struct variable **) hash_find_slot (&set->table, &var_key);
211   v = *var_slot;
212
213 #ifdef VMS
214   /* VMS does not populate envp[] with DCL symbols and logical names which
215      historically are mapped to environent variables.
216      If the variable is not yet defined, then we need to check if getenv()
217      can find it.  Do not do this for origin == o_env to avoid infinte
218      recursion */
219   if (HASH_VACANT (v) && (origin != o_env))
220     {
221       struct variable * vms_variable;
222       char * vname = alloca (length + 1);
223       char * vvalue;
224
225       strncpy (vname, name, length);
226       vvalue = getenv(vname);
227
228       /* Values starting with '$' are probably foreign commands.
229          We want to treat them as Shell aliases and not look them up here */
230       if ((vvalue != NULL) && (vvalue[0] != '$'))
231         {
232           vms_variable =  lookup_variable(name, length);
233           /* Refresh the slot */
234           var_slot = (struct variable **) hash_find_slot (&set->table,
235                                                           &var_key);
236           v = *var_slot;
237         }
238     }
239 #endif
240
241   if (env_overrides && origin == o_env)
242     origin = o_env_override;
243
244   if (! HASH_VACANT (v))
245     {
246       if (env_overrides && v->origin == o_env)
247         /* V came from in the environment.  Since it was defined
248            before the switches were parsed, it wasn't affected by -e.  */
249         v->origin = o_env_override;
250
251       /* A variable of this name is already defined.
252          If the old definition is from a stronger source
253          than this one, don't redefine it.  */
254       if ((int) origin >= (int) v->origin)
255         {
256           free (v->value);
257           v->value = xstrdup (value);
258           if (flocp != 0)
259             v->fileinfo = *flocp;
260           else
261             v->fileinfo.filenm = 0;
262           v->origin = origin;
263           v->recursive = recursive;
264         }
265       return v;
266     }
267
268   /* Create a new variable definition and add it to the hash table.  */
269
270   v = xcalloc (sizeof (struct variable));
271   v->name = xstrndup (name, length);
272   v->length = (unsigned int) length;
273   hash_insert_at (&set->table, v, var_slot);
274   if (set == &global_variable_set)
275     ++variable_changenum;
276
277   v->value = xstrdup (value);
278   if (flocp != 0)
279     v->fileinfo = *flocp;
280   v->origin = origin;
281   v->recursive = recursive;
282
283   v->export = v_default;
284   v->exportable = 1;
285   if (*name != '_' && (*name < 'A' || *name > 'Z')
286       && (*name < 'a' || *name > 'z'))
287     v->exportable = 0;
288   else
289     {
290       for (++name; *name != '\0'; ++name)
291         if (*name != '_' && (*name < 'a' || *name > 'z')
292             && (*name < 'A' || *name > 'Z') && !ISDIGIT(*name))
293           break;
294
295       if (*name != '\0')
296         v->exportable = 0;
297     }
298
299   return v;
300 }
301 \f
302
303 /* Undefine variable named NAME in SET. LENGTH is the length of NAME, which
304    does not need to be null-terminated. ORIGIN specifies the origin of the
305    variable (makefile, command line or environment). */
306
307 static void
308 free_variable_name_and_value (const void *item)
309 {
310   struct variable *v = (struct variable *) item;
311   free (v->name);
312   free (v->value);
313 }
314
315 void
316 free_variable_set (struct variable_set_list *list)
317 {
318   hash_map (&list->set->table, free_variable_name_and_value);
319   hash_free (&list->set->table, 1);
320   free (list->set);
321   free (list);
322 }
323
324 void
325 undefine_variable_in_set (const char *name, size_t length,
326                           enum variable_origin origin,
327                           struct variable_set *set)
328 {
329   struct variable *v;
330   struct variable **var_slot;
331   struct variable var_key;
332
333   if (set == NULL)
334     set = &global_variable_set;
335
336   var_key.name = (char *) name;
337   var_key.length = (unsigned int) length;
338   var_slot = (struct variable **) hash_find_slot (&set->table, &var_key);
339
340   if (env_overrides && origin == o_env)
341     origin = o_env_override;
342
343   v = *var_slot;
344   if (! HASH_VACANT (v))
345     {
346       if (env_overrides && v->origin == o_env)
347         /* V came from in the environment.  Since it was defined
348            before the switches were parsed, it wasn't affected by -e.  */
349         v->origin = o_env_override;
350
351       /* Undefine only if this undefinition is from an equal or stronger
352          source than the variable definition.  */
353       if ((int) origin >= (int) v->origin)
354         {
355           hash_delete_at (&set->table, var_slot);
356           free_variable_name_and_value (v);
357           free (v);
358           if (set == &global_variable_set)
359             ++variable_changenum;
360         }
361     }
362 }
363
364 /* If the variable passed in is "special", handle its special nature.
365    Currently there are two such variables, both used for introspection:
366    .VARIABLES expands to a list of all the variables defined in this instance
367    of make.
368    .TARGETS expands to a list of all the targets defined in this
369    instance of make.
370    Returns the variable reference passed in.  */
371
372 #define EXPANSION_INCREMENT(_l)  ((((_l) / 500) + 1) * 500)
373
374 static struct variable *
375 lookup_special_var (struct variable *var)
376 {
377   static unsigned long last_changenum = 0;
378
379
380   /* This one actually turns out to be very hard, due to the way the parser
381      records targets.  The way it works is that target information is collected
382      internally until make knows the target is completely specified.  It unitl
383      it sees that some new construct (a new target or variable) is defined that
384      it knows the previous one is done.  In short, this means that if you do
385      this:
386
387        all:
388
389        TARGS := $(.TARGETS)
390
391      then $(TARGS) won't contain "all", because it's not until after the
392      variable is created that the previous target is completed.
393
394      Changing this would be a major pain.  I think a less complex way to do it
395      would be to pre-define the target files as soon as the first line is
396      parsed, then come back and do the rest of the definition as now.  That
397      would allow $(.TARGETS) to be correct without a major change to the way
398      the parser works.
399
400   if (streq (var->name, ".TARGETS"))
401     var->value = build_target_list (var->value);
402   else
403   */
404
405   if (variable_changenum != last_changenum && streq (var->name, ".VARIABLES"))
406     {
407       size_t max = EXPANSION_INCREMENT (strlen (var->value));
408       size_t len;
409       char *p;
410       struct variable **vp = (struct variable **) global_variable_set.table.ht_vec;
411       struct variable **end = &vp[global_variable_set.table.ht_size];
412
413       /* Make sure we have at least MAX bytes in the allocated buffer.  */
414       var->value = xrealloc (var->value, max);
415
416       /* Walk through the hash of variables, constructing a list of names.  */
417       p = var->value;
418       len = 0;
419       for (; vp < end; ++vp)
420         if (!HASH_VACANT (*vp))
421           {
422             struct variable *v = *vp;
423             int l = v->length;
424
425             len += l + 1;
426             if (len > max)
427               {
428                 size_t off = p - var->value;
429
430                 max += EXPANSION_INCREMENT (l + 1);
431                 var->value = xrealloc (var->value, max);
432                 p = &var->value[off];
433               }
434
435             memcpy (p, v->name, l);
436             p += l;
437             *(p++) = ' ';
438           }
439       *(p-1) = '\0';
440
441       /* Remember the current variable change number.  */
442       last_changenum = variable_changenum;
443     }
444
445   return var;
446 }
447
448 \f
449 /* Lookup a variable whose name is a string starting at NAME
450    and with LENGTH chars.  NAME need not be null-terminated.
451    Returns address of the 'struct variable' containing all info
452    on the variable, or nil if no such variable is defined.  */
453
454 struct variable *
455 lookup_variable (const char *name, size_t length)
456 {
457   const struct variable_set_list *setlist;
458   struct variable var_key;
459   int is_parent = 0;
460
461   var_key.name = (char *) name;
462   var_key.length = (unsigned int) length;
463
464   for (setlist = current_variable_set_list;
465        setlist != 0; setlist = setlist->next)
466     {
467       const struct variable_set *set = setlist->set;
468       struct variable *v;
469
470       v = (struct variable *) hash_find_item ((struct hash_table *) &set->table, &var_key);
471       if (v && (!is_parent || !v->private_var))
472         return v->special ? lookup_special_var (v) : v;
473
474       is_parent |= setlist->next_is_parent;
475     }
476
477 #ifdef VMS
478   /* VMS does not populate envp[] with DCL symbols and logical names which
479      historically are mapped to enviroment varables and returned by getenv() */
480   {
481     char *vname = alloca (length + 1);
482     char *value;
483     strncpy (vname, name, length);
484     vname[length] = 0;
485     value = getenv (vname);
486     if (value != 0)
487       {
488         char *sptr;
489         int scnt;
490
491         sptr = value;
492         scnt = 0;
493
494         while ((sptr = strchr (sptr, '$')))
495           {
496             scnt++;
497             sptr++;
498           }
499
500         if (scnt > 0)
501           {
502             char *nvalue;
503             char *nptr;
504
505             nvalue = alloca (strlen (value) + scnt + 1);
506             sptr = value;
507             nptr = nvalue;
508
509             while (*sptr)
510               {
511                 if (*sptr == '$')
512                   {
513                     *nptr++ = '$';
514                     *nptr++ = '$';
515                   }
516                 else
517                   {
518                     *nptr++ = *sptr;
519                   }
520                 sptr++;
521               }
522
523             *nptr = '\0';
524             return define_variable (vname, length, nvalue, o_env, 1);
525
526           }
527
528         return define_variable (vname, length, value, o_env, 1);
529       }
530   }
531 #endif /* VMS */
532
533   return 0;
534 }
535 \f
536 /* Lookup a variable whose name is a string starting at NAME
537    and with LENGTH chars in set SET.  NAME need not be null-terminated.
538    Returns address of the 'struct variable' containing all info
539    on the variable, or nil if no such variable is defined.  */
540
541 struct variable *
542 lookup_variable_in_set (const char *name, size_t length,
543                         const struct variable_set *set)
544 {
545   struct variable var_key;
546
547   var_key.name = (char *) name;
548   var_key.length = (unsigned int) length;
549
550   return (struct variable *) hash_find_item ((struct hash_table *) &set->table, &var_key);
551 }
552 \f
553 /* Initialize FILE's variable set list.  If FILE already has a variable set
554    list, the topmost variable set is left intact, but the the rest of the
555    chain is replaced with FILE->parent's setlist.  If FILE is a double-colon
556    rule, then we will use the "root" double-colon target's variable set as the
557    parent of FILE's variable set.
558
559    If we're READING a makefile, don't do the pattern variable search now,
560    since the pattern variable might not have been defined yet.  */
561
562 void
563 initialize_file_variables (struct file *file, int reading)
564 {
565   struct variable_set_list *l = file->variables;
566
567   if (l == 0)
568     {
569       l = (struct variable_set_list *)
570         xmalloc (sizeof (struct variable_set_list));
571       l->set = xmalloc (sizeof (struct variable_set));
572       hash_init (&l->set->table, PERFILE_VARIABLE_BUCKETS,
573                  variable_hash_1, variable_hash_2, variable_hash_cmp);
574       file->variables = l;
575     }
576
577   /* If this is a double-colon, then our "parent" is the "root" target for
578      this double-colon rule.  Since that rule has the same name, parent,
579      etc. we can just use its variables as the "next" for ours.  */
580
581   if (file->double_colon && file->double_colon != file)
582     {
583       initialize_file_variables (file->double_colon, reading);
584       l->next = file->double_colon->variables;
585       l->next_is_parent = 0;
586       return;
587     }
588
589   if (file->parent == 0)
590     l->next = &global_setlist;
591   else
592     {
593       initialize_file_variables (file->parent, reading);
594       l->next = file->parent->variables;
595     }
596   l->next_is_parent = 1;
597
598   /* If we're not reading makefiles and we haven't looked yet, see if
599      we can find pattern variables for this target.  */
600
601   if (!reading && !file->pat_searched)
602     {
603       struct pattern_var *p;
604
605       p = lookup_pattern_var (0, file->name);
606       if (p != 0)
607         {
608           struct variable_set_list *global = current_variable_set_list;
609
610           /* We found at least one.  Set up a new variable set to accumulate
611              all the pattern variables that match this target.  */
612
613           file->pat_variables = create_new_variable_set ();
614           current_variable_set_list = file->pat_variables;
615
616           do
617             {
618               /* We found one, so insert it into the set.  */
619
620               struct variable *v;
621
622               if (p->variable.flavor == f_simple)
623                 {
624                   v = define_variable_loc (
625                     p->variable.name, strlen (p->variable.name),
626                     p->variable.value, p->variable.origin,
627                     0, &p->variable.fileinfo);
628
629                   v->flavor = f_simple;
630                 }
631               else
632                 {
633                   v = do_variable_definition (
634                     &p->variable.fileinfo, p->variable.name,
635                     p->variable.value, p->variable.origin,
636                     p->variable.flavor, 1);
637                 }
638
639               /* Also mark it as a per-target and copy export status. */
640               v->per_target = p->variable.per_target;
641               v->export = p->variable.export;
642               v->private_var = p->variable.private_var;
643             }
644           while ((p = lookup_pattern_var (p, file->name)) != 0);
645
646           current_variable_set_list = global;
647         }
648       file->pat_searched = 1;
649     }
650
651   /* If we have a pattern variable match, set it up.  */
652
653   if (file->pat_variables != 0)
654     {
655       file->pat_variables->next = l->next;
656       file->pat_variables->next_is_parent = l->next_is_parent;
657       l->next = file->pat_variables;
658       l->next_is_parent = 0;
659     }
660 }
661 \f
662 /* Pop the top set off the current variable set list,
663    and free all its storage.  */
664
665 struct variable_set_list *
666 create_new_variable_set (void)
667 {
668   struct variable_set_list *setlist;
669   struct variable_set *set;
670
671   set = xmalloc (sizeof (struct variable_set));
672   hash_init (&set->table, SMALL_SCOPE_VARIABLE_BUCKETS,
673              variable_hash_1, variable_hash_2, variable_hash_cmp);
674
675   setlist = (struct variable_set_list *)
676     xmalloc (sizeof (struct variable_set_list));
677   setlist->set = set;
678   setlist->next = current_variable_set_list;
679   setlist->next_is_parent = 0;
680
681   return setlist;
682 }
683
684 /* Create a new variable set and push it on the current setlist.
685    If we're pushing a global scope (that is, the current scope is the global
686    scope) then we need to "push" it the other way: file variable sets point
687    directly to the global_setlist so we need to replace that with the new one.
688  */
689
690 struct variable_set_list *
691 push_new_variable_scope (void)
692 {
693   current_variable_set_list = create_new_variable_set ();
694   if (current_variable_set_list->next == &global_setlist)
695     {
696       /* It was the global, so instead of new -> &global we want to replace
697          &global with the new one and have &global -> new, with current still
698          pointing to &global  */
699       struct variable_set *set = current_variable_set_list->set;
700       current_variable_set_list->set = global_setlist.set;
701       global_setlist.set = set;
702       current_variable_set_list->next = global_setlist.next;
703       global_setlist.next = current_variable_set_list;
704       current_variable_set_list = &global_setlist;
705     }
706   return (current_variable_set_list);
707 }
708
709 void
710 pop_variable_scope (void)
711 {
712   struct variable_set_list *setlist;
713   struct variable_set *set;
714
715   /* Can't call this if there's no scope to pop!  */
716   assert (current_variable_set_list->next != NULL);
717
718   if (current_variable_set_list != &global_setlist)
719     {
720       /* We're not pointing to the global setlist, so pop this one.  */
721       setlist = current_variable_set_list;
722       set = setlist->set;
723       current_variable_set_list = setlist->next;
724     }
725   else
726     {
727       /* This set is the one in the global_setlist, but there is another global
728          set beyond that.  We want to copy that set to global_setlist, then
729          delete what used to be in global_setlist.  */
730       setlist = global_setlist.next;
731       set = global_setlist.set;
732       global_setlist.set = setlist->set;
733       global_setlist.next = setlist->next;
734       global_setlist.next_is_parent = setlist->next_is_parent;
735     }
736
737   /* Free the one we no longer need.  */
738   free (setlist);
739   hash_map (&set->table, free_variable_name_and_value);
740   hash_free (&set->table, 1);
741   free (set);
742 }
743 \f
744 /* Merge FROM_SET into TO_SET, freeing unused storage in FROM_SET.  */
745
746 static void
747 merge_variable_sets (struct variable_set *to_set,
748                      struct variable_set *from_set)
749 {
750   struct variable **from_var_slot = (struct variable **) from_set->table.ht_vec;
751   struct variable **from_var_end = from_var_slot + from_set->table.ht_size;
752
753   int inc = to_set == &global_variable_set ? 1 : 0;
754
755   for ( ; from_var_slot < from_var_end; from_var_slot++)
756     if (! HASH_VACANT (*from_var_slot))
757       {
758         struct variable *from_var = *from_var_slot;
759         struct variable **to_var_slot
760           = (struct variable **) hash_find_slot (&to_set->table, *from_var_slot);
761         if (HASH_VACANT (*to_var_slot))
762           {
763             hash_insert_at (&to_set->table, from_var, to_var_slot);
764             variable_changenum += inc;
765           }
766         else
767           {
768             /* GKM FIXME: delete in from_set->table */
769             free (from_var->value);
770             free (from_var);
771           }
772       }
773 }
774
775 /* Merge SETLIST1 into SETLIST0, freeing unused storage in SETLIST1.  */
776
777 void
778 merge_variable_set_lists (struct variable_set_list **setlist0,
779                           struct variable_set_list *setlist1)
780 {
781   struct variable_set_list *to = *setlist0;
782   struct variable_set_list *last0 = 0;
783
784   /* If there's nothing to merge, stop now.  */
785   if (!setlist1 || setlist1 == &global_setlist)
786     return;
787
788   if (to)
789     {
790       /* These loops rely on the fact that all setlists terminate with the
791          global setlist (before NULL).  If not, arguably we SHOULD die.  */
792
793       /* Make sure that setlist1 is not already a subset of setlist0.  */
794       while (to != &global_setlist)
795         {
796           if (to == setlist1)
797             return;
798           to = to->next;
799         }
800
801       to = *setlist0;
802       while (setlist1 != &global_setlist && to != &global_setlist)
803         {
804           struct variable_set_list *from = setlist1;
805           setlist1 = setlist1->next;
806
807           merge_variable_sets (to->set, from->set);
808
809           last0 = to;
810           to = to->next;
811         }
812     }
813
814   if (setlist1 != &global_setlist)
815     {
816       if (last0 == 0)
817         *setlist0 = setlist1;
818       else
819         last0->next = setlist1;
820     }
821 }
822 \f
823 /* Define the automatic variables, and record the addresses
824    of their structures so we can change their values quickly.  */
825
826 void
827 define_automatic_variables (void)
828 {
829   struct variable *v;
830   char buf[200];
831
832   sprintf (buf, "%u", makelevel);
833   define_variable_cname (MAKELEVEL_NAME, buf, o_env, 0);
834
835   sprintf (buf, "%s%s%s",
836            version_string,
837            (remote_description == 0 || remote_description[0] == '\0')
838            ? "" : "-",
839            (remote_description == 0 || remote_description[0] == '\0')
840            ? "" : remote_description);
841   define_variable_cname ("MAKE_VERSION", buf, o_default, 0);
842   define_variable_cname ("MAKE_HOST", make_host, o_default, 0);
843
844 #ifdef  __MSDOS__
845   /* Allow to specify a special shell just for Make,
846      and use $COMSPEC as the default $SHELL when appropriate.  */
847   {
848     static char shell_str[] = "SHELL";
849     const int shlen = sizeof (shell_str) - 1;
850     struct variable *mshp = lookup_variable ("MAKESHELL", 9);
851     struct variable *comp = lookup_variable ("COMSPEC", 7);
852
853     /* $(MAKESHELL) overrides $(SHELL) even if -e is in effect.  */
854     if (mshp)
855       (void) define_variable (shell_str, shlen,
856                               mshp->value, o_env_override, 0);
857     else if (comp)
858       {
859         /* $(COMSPEC) shouldn't override $(SHELL).  */
860         struct variable *shp = lookup_variable (shell_str, shlen);
861
862         if (!shp)
863           (void) define_variable (shell_str, shlen, comp->value, o_env, 0);
864       }
865   }
866 #elif defined(__EMX__)
867   {
868     static char shell_str[] = "SHELL";
869     const int shlen = sizeof (shell_str) - 1;
870     struct variable *shell = lookup_variable (shell_str, shlen);
871     struct variable *replace = lookup_variable ("MAKESHELL", 9);
872
873     /* if $MAKESHELL is defined in the environment assume o_env_override */
874     if (replace && *replace->value && replace->origin == o_env)
875       replace->origin = o_env_override;
876
877     /* if $MAKESHELL is not defined use $SHELL but only if the variable
878        did not come from the environment */
879     if (!replace || !*replace->value)
880       if (shell && *shell->value && (shell->origin == o_env
881           || shell->origin == o_env_override))
882         {
883           /* overwrite whatever we got from the environment */
884           free (shell->value);
885           shell->value = xstrdup (default_shell);
886           shell->origin = o_default;
887         }
888
889     /* Some people do not like cmd to be used as the default
890        if $SHELL is not defined in the Makefile.
891        With -DNO_CMD_DEFAULT you can turn off this behaviour */
892 # ifndef NO_CMD_DEFAULT
893     /* otherwise use $COMSPEC */
894     if (!replace || !*replace->value)
895       replace = lookup_variable ("COMSPEC", 7);
896
897     /* otherwise use $OS2_SHELL */
898     if (!replace || !*replace->value)
899       replace = lookup_variable ("OS2_SHELL", 9);
900 # else
901 #   warning NO_CMD_DEFAULT: GNU make will not use CMD.EXE as default shell
902 # endif
903
904     if (replace && *replace->value)
905       /* overwrite $SHELL */
906       (void) define_variable (shell_str, shlen, replace->value,
907                               replace->origin, 0);
908     else
909       /* provide a definition if there is none */
910       (void) define_variable (shell_str, shlen, default_shell,
911                               o_default, 0);
912   }
913
914 #endif
915
916   /* This won't override any definition, but it will provide one if there
917      isn't one there.  */
918   v = define_variable_cname ("SHELL", default_shell, o_default, 0);
919 #ifdef __MSDOS__
920   v->export = v_export;  /*  Export always SHELL.  */
921 #endif
922
923   /* On MSDOS we do use SHELL from environment, since it isn't a standard
924      environment variable on MSDOS, so whoever sets it, does that on purpose.
925      On OS/2 we do not use SHELL from environment but we have already handled
926      that problem above. */
927 #if !defined(__MSDOS__) && !defined(__EMX__)
928   /* Don't let SHELL come from the environment.  */
929   if (*v->value == '\0' || v->origin == o_env || v->origin == o_env_override)
930     {
931       free (v->value);
932       v->origin = o_file;
933       v->value = xstrdup (default_shell);
934     }
935 #endif
936
937   /* Make sure MAKEFILES gets exported if it is set.  */
938   v = define_variable_cname ("MAKEFILES", "", o_default, 0);
939   v->export = v_ifset;
940
941   /* Define the magic D and F variables in terms of
942      the automatic variables they are variations of.  */
943
944 #if defined(__MSDOS__) || defined(WINDOWS32)
945   /* For consistency, remove the trailing backslash as well as slash.  */
946   define_variable_cname ("@D", "$(patsubst %/,%,$(patsubst %\\,%,$(dir $@)))",
947                          o_automatic, 1);
948   define_variable_cname ("%D", "$(patsubst %/,%,$(patsubst %\\,%,$(dir $%)))",
949                          o_automatic, 1);
950   define_variable_cname ("*D", "$(patsubst %/,%,$(patsubst %\\,%,$(dir $*)))",
951                          o_automatic, 1);
952   define_variable_cname ("<D", "$(patsubst %/,%,$(patsubst %\\,%,$(dir $<)))",
953                          o_automatic, 1);
954   define_variable_cname ("?D", "$(patsubst %/,%,$(patsubst %\\,%,$(dir $?)))",
955                          o_automatic, 1);
956   define_variable_cname ("^D", "$(patsubst %/,%,$(patsubst %\\,%,$(dir $^)))",
957                          o_automatic, 1);
958   define_variable_cname ("+D", "$(patsubst %/,%,$(patsubst %\\,%,$(dir $+)))",
959                          o_automatic, 1);
960 #else  /* not __MSDOS__, not WINDOWS32 */
961   define_variable_cname ("@D", "$(patsubst %/,%,$(dir $@))", o_automatic, 1);
962   define_variable_cname ("%D", "$(patsubst %/,%,$(dir $%))", o_automatic, 1);
963   define_variable_cname ("*D", "$(patsubst %/,%,$(dir $*))", o_automatic, 1);
964   define_variable_cname ("<D", "$(patsubst %/,%,$(dir $<))", o_automatic, 1);
965   define_variable_cname ("?D", "$(patsubst %/,%,$(dir $?))", o_automatic, 1);
966   define_variable_cname ("^D", "$(patsubst %/,%,$(dir $^))", o_automatic, 1);
967   define_variable_cname ("+D", "$(patsubst %/,%,$(dir $+))", o_automatic, 1);
968 #endif
969   define_variable_cname ("@F", "$(notdir $@)", o_automatic, 1);
970   define_variable_cname ("%F", "$(notdir $%)", o_automatic, 1);
971   define_variable_cname ("*F", "$(notdir $*)", o_automatic, 1);
972   define_variable_cname ("<F", "$(notdir $<)", o_automatic, 1);
973   define_variable_cname ("?F", "$(notdir $?)", o_automatic, 1);
974   define_variable_cname ("^F", "$(notdir $^)", o_automatic, 1);
975   define_variable_cname ("+F", "$(notdir $+)", o_automatic, 1);
976 }
977 \f
978 int export_all_variables;
979
980 /* Create a new environment for FILE's commands.
981    If FILE is nil, this is for the 'shell' function.
982    The child's MAKELEVEL variable is incremented.  */
983
984 char **
985 target_environment (struct file *file)
986 {
987   struct variable_set_list *set_list;
988   struct variable_set_list *s;
989   struct hash_table table;
990   struct variable **v_slot;
991   struct variable **v_end;
992   struct variable makelevel_key;
993   char **result_0;
994   char **result;
995
996   if (file == 0)
997     set_list = current_variable_set_list;
998   else
999     set_list = file->variables;
1000
1001   hash_init (&table, VARIABLE_BUCKETS,
1002              variable_hash_1, variable_hash_2, variable_hash_cmp);
1003
1004   /* Run through all the variable sets in the list,
1005      accumulating variables in TABLE.  */
1006   for (s = set_list; s != 0; s = s->next)
1007     {
1008       struct variable_set *set = s->set;
1009       v_slot = (struct variable **) set->table.ht_vec;
1010       v_end = v_slot + set->table.ht_size;
1011       for ( ; v_slot < v_end; v_slot++)
1012         if (! HASH_VACANT (*v_slot))
1013           {
1014             struct variable **new_slot;
1015             struct variable *v = *v_slot;
1016
1017             /* If this is a per-target variable and it hasn't been touched
1018                already then look up the global version and take its export
1019                value.  */
1020             if (v->per_target && v->export == v_default)
1021               {
1022                 struct variable *gv;
1023
1024                 gv = lookup_variable_in_set (v->name, strlen (v->name),
1025                                              &global_variable_set);
1026                 if (gv)
1027                   v->export = gv->export;
1028               }
1029
1030             switch (v->export)
1031               {
1032               case v_default:
1033                 if (v->origin == o_default || v->origin == o_automatic)
1034                   /* Only export default variables by explicit request.  */
1035                   continue;
1036
1037                 /* The variable doesn't have a name that can be exported.  */
1038                 if (! v->exportable)
1039                   continue;
1040
1041                 if (! export_all_variables
1042                     && v->origin != o_command
1043                     && v->origin != o_env && v->origin != o_env_override)
1044                   continue;
1045                 break;
1046
1047               case v_export:
1048                 break;
1049
1050               case v_noexport:
1051                 {
1052                   /* If this is the SHELL variable and it's not exported,
1053                      then add the value from our original environment, if
1054                      the original environment defined a value for SHELL.  */
1055                   if (streq (v->name, "SHELL") && shell_var.value)
1056                     {
1057                       v = &shell_var;
1058                       break;
1059                     }
1060                   continue;
1061                 }
1062
1063               case v_ifset:
1064                 if (v->origin == o_default)
1065                   continue;
1066                 break;
1067               }
1068
1069             new_slot = (struct variable **) hash_find_slot (&table, v);
1070             if (HASH_VACANT (*new_slot))
1071               hash_insert_at (&table, v, new_slot);
1072           }
1073     }
1074
1075   makelevel_key.name = (char *)MAKELEVEL_NAME;
1076   makelevel_key.length = MAKELEVEL_LENGTH;
1077   hash_delete (&table, &makelevel_key);
1078
1079   result = result_0 = xmalloc ((table.ht_fill + 2) * sizeof (char *));
1080
1081   v_slot = (struct variable **) table.ht_vec;
1082   v_end = v_slot + table.ht_size;
1083   for ( ; v_slot < v_end; v_slot++)
1084     if (! HASH_VACANT (*v_slot))
1085       {
1086         struct variable *v = *v_slot;
1087
1088         /* If V is recursively expanded and didn't come from the environment,
1089            expand its value.  If it came from the environment, it should
1090            go back into the environment unchanged.  */
1091         if (v->recursive
1092             && v->origin != o_env && v->origin != o_env_override)
1093           {
1094             char *value = recursively_expand_for_file (v, file);
1095 #ifdef WINDOWS32
1096             if (strcmp (v->name, "Path") == 0 ||
1097                 strcmp (v->name, "PATH") == 0)
1098               convert_Path_to_windows32 (value, ';');
1099 #endif
1100             *result++ = xstrdup (concat (3, v->name, "=", value));
1101             free (value);
1102           }
1103         else
1104           {
1105 #ifdef WINDOWS32
1106             if (strcmp (v->name, "Path") == 0 ||
1107                 strcmp (v->name, "PATH") == 0)
1108               convert_Path_to_windows32 (v->value, ';');
1109 #endif
1110             *result++ = xstrdup (concat (3, v->name, "=", v->value));
1111           }
1112       }
1113
1114   *result = xmalloc (100);
1115   sprintf (*result, "%s=%u", MAKELEVEL_NAME, makelevel + 1);
1116   *++result = 0;
1117
1118   hash_free (&table, 0);
1119
1120   return result_0;
1121 }
1122 \f
1123 static struct variable *
1124 set_special_var (struct variable *var)
1125 {
1126   if (streq (var->name, RECIPEPREFIX_NAME))
1127     {
1128       /* The user is resetting the command introduction prefix.  This has to
1129          happen immediately, so that subsequent rules are interpreted
1130          properly.  */
1131       cmd_prefix = var->value[0]=='\0' ? RECIPEPREFIX_DEFAULT : var->value[0];
1132     }
1133
1134   return var;
1135 }
1136 \f
1137 /* Given a string, shell-execute it and return a malloc'ed string of the
1138  * result. This removes only ONE newline (if any) at the end, for maximum
1139  * compatibility with the *BSD makes.  If it fails, returns NULL. */
1140
1141 static char *
1142 shell_result (const char *p)
1143 {
1144   char *buf;
1145   size_t len;
1146   char *args[2];
1147   char *result;
1148
1149   install_variable_buffer (&buf, &len);
1150
1151   args[0] = (char *) p;
1152   args[1] = NULL;
1153   variable_buffer_output (func_shell_base (variable_buffer, args, 0), "\0", 1);
1154   result = strdup (variable_buffer);
1155
1156   restore_variable_buffer (buf, len);
1157   return result;
1158 }
1159 \f
1160 /* Given a variable, a value, and a flavor, define the variable.
1161    See the try_variable_definition() function for details on the parameters. */
1162
1163 struct variable *
1164 do_variable_definition (const floc *flocp, const char *varname,
1165                         const char *value, enum variable_origin origin,
1166                         enum variable_flavor flavor, int target_var)
1167 {
1168   const char *p;
1169   char *alloc_value = NULL;
1170   struct variable *v;
1171   int append = 0;
1172   int conditional = 0;
1173
1174   /* Calculate the variable's new value in VALUE.  */
1175
1176   switch (flavor)
1177     {
1178     default:
1179     case f_bogus:
1180       /* Should not be possible.  */
1181       abort ();
1182     case f_simple:
1183       /* A simple variable definition "var := value".  Expand the value.
1184          We have to allocate memory since otherwise it'll clobber the
1185          variable buffer, and we may still need that if we're looking at a
1186          target-specific variable.  */
1187       p = alloc_value = allocated_variable_expand (value);
1188       break;
1189     case f_shell:
1190       {
1191         /* A shell definition "var != value".  Expand value, pass it to
1192            the shell, and store the result in recursively-expanded var. */
1193         char *q = allocated_variable_expand (value);
1194         p = alloc_value = shell_result (q);
1195         free (q);
1196         flavor = f_recursive;
1197         break;
1198       }
1199     case f_conditional:
1200       /* A conditional variable definition "var ?= value".
1201          The value is set IFF the variable is not defined yet. */
1202       v = lookup_variable (varname, strlen (varname));
1203       if (v)
1204         goto done;
1205
1206       conditional = 1;
1207       flavor = f_recursive;
1208       /* FALLTHROUGH */
1209     case f_recursive:
1210       /* A recursive variable definition "var = value".
1211          The value is used verbatim.  */
1212       p = value;
1213       break;
1214     case f_append:
1215     case f_append_value:
1216       {
1217         /* If we have += but we're in a target variable context, we want to
1218            append only with other variables in the context of this target.  */
1219         if (target_var)
1220           {
1221             append = 1;
1222             v = lookup_variable_in_set (varname, strlen (varname),
1223                                         current_variable_set_list->set);
1224
1225             /* Don't append from the global set if a previous non-appending
1226                target-specific variable definition exists. */
1227             if (v && !v->append)
1228               append = 0;
1229           }
1230         else
1231           v = lookup_variable (varname, strlen (varname));
1232
1233         if (v == 0)
1234           {
1235             /* There was no old value.
1236                This becomes a normal recursive definition.  */
1237             p = value;
1238             flavor = f_recursive;
1239           }
1240         else
1241           {
1242             /* Paste the old and new values together in VALUE.  */
1243
1244             size_t oldlen, vallen;
1245             const char *val;
1246             char *tp = NULL;
1247
1248             val = value;
1249             if (v->recursive)
1250               /* The previous definition of the variable was recursive.
1251                  The new value is the unexpanded old and new values.  */
1252               flavor = f_recursive;
1253             else if (flavor != f_append_value)
1254               /* The previous definition of the variable was simple.
1255                  The new value comes from the old value, which was expanded
1256                  when it was set; and from the expanded new value.  Allocate
1257                  memory for the expansion as we may still need the rest of the
1258                  buffer if we're looking at a target-specific variable.  */
1259               val = tp = allocated_variable_expand (val);
1260
1261             /* If the new value is empty, nothing to do.  */
1262             vallen = strlen (val);
1263             if (!vallen)
1264               {
1265                 alloc_value = tp;
1266                 goto done;
1267               }
1268
1269             oldlen = strlen (v->value);
1270             p = alloc_value = xmalloc (oldlen + 1 + vallen + 1);
1271
1272             if (oldlen)
1273               {
1274                 memcpy (alloc_value, v->value, oldlen);
1275                 alloc_value[oldlen] = ' ';
1276                 ++oldlen;
1277               }
1278
1279             memcpy (&alloc_value[oldlen], val, vallen + 1);
1280
1281             free (tp);
1282           }
1283         break;
1284       }
1285     }
1286
1287 #ifdef __MSDOS__
1288   /* Many Unix Makefiles include a line saying "SHELL=/bin/sh", but
1289      non-Unix systems don't conform to this default configuration (in
1290      fact, most of them don't even have '/bin').  On the other hand,
1291      $SHELL in the environment, if set, points to the real pathname of
1292      the shell.
1293      Therefore, we generally won't let lines like "SHELL=/bin/sh" from
1294      the Makefile override $SHELL from the environment.  But first, we
1295      look for the basename of the shell in the directory where SHELL=
1296      points, and along the $PATH; if it is found in any of these places,
1297      we define $SHELL to be the actual pathname of the shell.  Thus, if
1298      you have bash.exe installed as d:/unix/bash.exe, and d:/unix is on
1299      your $PATH, then SHELL=/usr/local/bin/bash will have the effect of
1300      defining SHELL to be "d:/unix/bash.exe".  */
1301   if ((origin == o_file || origin == o_override)
1302       && strcmp (varname, "SHELL") == 0)
1303     {
1304       PATH_VAR (shellpath);
1305       extern char * __dosexec_find_on_path (const char *, char *[], char *);
1306
1307       /* See if we can find "/bin/sh.exe", "/bin/sh.com", etc.  */
1308       if (__dosexec_find_on_path (p, NULL, shellpath))
1309         {
1310           char *tp;
1311
1312           for (tp = shellpath; *tp; tp++)
1313             if (*tp == '\\')
1314               *tp = '/';
1315
1316           v = define_variable_loc (varname, strlen (varname),
1317                                    shellpath, origin, flavor == f_recursive,
1318                                    flocp);
1319         }
1320       else
1321         {
1322           const char *shellbase, *bslash;
1323           struct variable *pathv = lookup_variable ("PATH", 4);
1324           char *path_string;
1325           char *fake_env[2];
1326           size_t pathlen = 0;
1327
1328           shellbase = strrchr (p, '/');
1329           bslash = strrchr (p, '\\');
1330           if (!shellbase || bslash > shellbase)
1331             shellbase = bslash;
1332           if (!shellbase && p[1] == ':')
1333             shellbase = p + 1;
1334           if (shellbase)
1335             shellbase++;
1336           else
1337             shellbase = p;
1338
1339           /* Search for the basename of the shell (with standard
1340              executable extensions) along the $PATH.  */
1341           if (pathv)
1342             pathlen = strlen (pathv->value);
1343           path_string = xmalloc (5 + pathlen + 2 + 1);
1344           /* On MSDOS, current directory is considered as part of $PATH.  */
1345           sprintf (path_string, "PATH=.;%s", pathv ? pathv->value : "");
1346           fake_env[0] = path_string;
1347           fake_env[1] = 0;
1348           if (__dosexec_find_on_path (shellbase, fake_env, shellpath))
1349             {
1350               char *tp;
1351
1352               for (tp = shellpath; *tp; tp++)
1353                 if (*tp == '\\')
1354                   *tp = '/';
1355
1356               v = define_variable_loc (varname, strlen (varname),
1357                                        shellpath, origin,
1358                                        flavor == f_recursive, flocp);
1359             }
1360           else
1361             v = lookup_variable (varname, strlen (varname));
1362
1363           free (path_string);
1364         }
1365     }
1366   else
1367 #endif /* __MSDOS__ */
1368 #ifdef WINDOWS32
1369   if ((origin == o_file || origin == o_override || origin == o_command)
1370       && streq (varname, "SHELL"))
1371     {
1372       extern const char *default_shell;
1373
1374       /* Call shell locator function. If it returns TRUE, then
1375          set no_default_sh_exe to indicate sh was found and
1376          set new value for SHELL variable.  */
1377
1378       if (find_and_set_default_shell (p))
1379         {
1380           v = define_variable_in_set (varname, strlen (varname), default_shell,
1381                                       origin, flavor == f_recursive,
1382                                       (target_var
1383                                        ? current_variable_set_list->set
1384                                        : NULL),
1385                                       flocp);
1386           no_default_sh_exe = 0;
1387         }
1388       else
1389         {
1390           char *tp = alloc_value;
1391
1392           alloc_value = allocated_variable_expand (p);
1393
1394           if (find_and_set_default_shell (alloc_value))
1395             {
1396               v = define_variable_in_set (varname, strlen (varname), p,
1397                                           origin, flavor == f_recursive,
1398                                           (target_var
1399                                            ? current_variable_set_list->set
1400                                            : NULL),
1401                                           flocp);
1402               no_default_sh_exe = 0;
1403             }
1404           else
1405             v = lookup_variable (varname, strlen (varname));
1406
1407           free (tp);
1408         }
1409     }
1410   else
1411     v = NULL;
1412
1413   /* If not $SHELL, or if $SHELL points to a program we didn't find,
1414      just process this variable "as usual".  */
1415   if (!v)
1416 #endif
1417
1418   /* If we are defining variables inside an $(eval ...), we might have a
1419      different variable context pushed, not the global context (maybe we're
1420      inside a $(call ...) or something.  Since this function is only ever
1421      invoked in places where we want to define globally visible variables,
1422      make sure we define this variable in the global set.  */
1423
1424   v = define_variable_in_set (varname, strlen (varname), p,
1425                               origin, flavor == f_recursive,
1426                               (target_var
1427                                ? current_variable_set_list->set : NULL),
1428                               flocp);
1429   v->append = append;
1430   v->conditional = conditional;
1431
1432  done:
1433   free (alloc_value);
1434   return v->special ? set_special_var (v) : v;
1435 }
1436 \f
1437 /* Parse P (a null-terminated string) as a variable definition.
1438
1439    If it is not a variable definition, return NULL and the contents of *VAR
1440    are undefined, except NAME is set to the first non-space character or NIL.
1441
1442    If it is a variable definition, return a pointer to the char after the
1443    assignment token and set the following fields (only) of *VAR:
1444     name   : name of the variable (ALWAYS SET) (NOT NUL-TERMINATED!)
1445     length : length of the variable name
1446     value  : value of the variable (nul-terminated)
1447     flavor : flavor of the variable
1448    Other values in *VAR are unchanged.
1449   */
1450
1451 char *
1452 parse_variable_definition (const char *p, struct variable *var)
1453 {
1454   int wspace = 0;
1455   const char *e = NULL;
1456
1457   NEXT_TOKEN (p);
1458   var->name = (char *)p;
1459   var->length = 0;
1460
1461   while (1)
1462     {
1463       int c = *p++;
1464
1465       /* If we find a comment or EOS, it's not a variable definition.  */
1466       if (STOP_SET (c, MAP_COMMENT|MAP_NUL))
1467         return NULL;
1468
1469       if (c == '$')
1470         {
1471           /* This begins a variable expansion reference.  Make sure we don't
1472              treat chars inside the reference as assignment tokens.  */
1473           char closeparen;
1474           unsigned int count;
1475
1476           c = *p++;
1477           if (c == '(')
1478             closeparen = ')';
1479           else if (c == '{')
1480             closeparen = '}';
1481           else if (c == '\0')
1482             return NULL;
1483           else
1484             /* '$$' or '$X'.  Either way, nothing special to do here.  */
1485             continue;
1486
1487           /* P now points past the opening paren or brace.
1488              Count parens or braces until it is matched.  */
1489           for (count = 1; *p != '\0'; ++p)
1490             {
1491               if (*p == closeparen && --count == 0)
1492                 {
1493                   ++p;
1494                   break;
1495                 }
1496               if (*p == c)
1497                 ++count;
1498             }
1499           continue;
1500         }
1501
1502       /* If we find whitespace skip it, and remember we found it.  */
1503       if (ISBLANK (c))
1504         {
1505           wspace = 1;
1506           e = p - 1;
1507           NEXT_TOKEN (p);
1508           c = *p;
1509           if (c == '\0')
1510             return NULL;
1511           ++p;
1512         }
1513
1514
1515       if (c == '=')
1516         {
1517           var->flavor = f_recursive;
1518           if (! e)
1519             e = p - 1;
1520           break;
1521         }
1522
1523       /* Match assignment variants (:=, +=, ?=, !=)  */
1524       if (*p == '=')
1525         {
1526           switch (c)
1527             {
1528               case ':':
1529                 var->flavor = f_simple;
1530                 break;
1531               case '+':
1532                 var->flavor = f_append;
1533                 break;
1534               case '?':
1535                 var->flavor = f_conditional;
1536                 break;
1537               case '!':
1538                 var->flavor = f_shell;
1539                 break;
1540               default:
1541                 /* If we skipped whitespace, non-assignments means no var.  */
1542                 if (wspace)
1543                   return NULL;
1544
1545                 /* Might be assignment, or might be $= or #=.  Check.  */
1546                 continue;
1547             }
1548           if (! e)
1549             e = p - 1;
1550           ++p;
1551           break;
1552         }
1553
1554       /* Check for POSIX ::= syntax  */
1555       if (c == ':')
1556         {
1557           /* A colon other than :=/::= is not a variable defn.  */
1558           if (*p != ':' || p[1] != '=')
1559             return NULL;
1560
1561           /* POSIX allows ::= to be the same as GNU make's := */
1562           var->flavor = f_simple;
1563           if (! e)
1564             e = p - 1;
1565           p += 2;
1566           break;
1567         }
1568
1569       /* If we skipped whitespace, non-assignments means no var.  */
1570       if (wspace)
1571         return NULL;
1572     }
1573
1574   var->length = (unsigned int) (e - var->name);
1575   var->value = next_token (p);
1576   return (char *)p;
1577 }
1578 \f
1579 /* Try to interpret LINE (a null-terminated string) as a variable definition.
1580
1581    If LINE was recognized as a variable definition, a pointer to its 'struct
1582    variable' is returned.  If LINE is not a variable definition, NULL is
1583    returned.  */
1584
1585 struct variable *
1586 assign_variable_definition (struct variable *v, const char *line)
1587 {
1588   char *name;
1589
1590   if (!parse_variable_definition (line, v))
1591     return NULL;
1592
1593   /* Expand the name, so "$(foo)bar = baz" works.  */
1594   name = alloca (v->length + 1);
1595   memcpy (name, v->name, v->length);
1596   name[v->length] = '\0';
1597   v->name = allocated_variable_expand (name);
1598
1599   if (v->name[0] == '\0')
1600     O (fatal, &v->fileinfo, _("empty variable name"));
1601
1602   return v;
1603 }
1604 \f
1605 /* Try to interpret LINE (a null-terminated string) as a variable definition.
1606
1607    ORIGIN may be o_file, o_override, o_env, o_env_override,
1608    or o_command specifying that the variable definition comes
1609    from a makefile, an override directive, the environment with
1610    or without the -e switch, or the command line.
1611
1612    See the comments for assign_variable_definition().
1613
1614    If LINE was recognized as a variable definition, a pointer to its 'struct
1615    variable' is returned.  If LINE is not a variable definition, NULL is
1616    returned.  */
1617
1618 struct variable *
1619 try_variable_definition (const floc *flocp, const char *line,
1620                          enum variable_origin origin, int target_var)
1621 {
1622   struct variable v;
1623   struct variable *vp;
1624
1625   if (flocp != 0)
1626     v.fileinfo = *flocp;
1627   else
1628     v.fileinfo.filenm = 0;
1629
1630   if (!assign_variable_definition (&v, line))
1631     return 0;
1632
1633   vp = do_variable_definition (flocp, v.name, v.value,
1634                                origin, v.flavor, target_var);
1635
1636   free (v.name);
1637
1638   return vp;
1639 }
1640 \f
1641 /* Print information for variable V, prefixing it with PREFIX.  */
1642
1643 static void
1644 print_variable (const void *item, void *arg)
1645 {
1646   const struct variable *v = item;
1647   const char *prefix = arg;
1648   const char *origin;
1649
1650   switch (v->origin)
1651     {
1652     case o_automatic:
1653       origin = _("automatic");
1654       break;
1655     case o_default:
1656       origin = _("default");
1657       break;
1658     case o_env:
1659       origin = _("environment");
1660       break;
1661     case o_file:
1662       origin = _("makefile");
1663       break;
1664     case o_env_override:
1665       origin = _("environment under -e");
1666       break;
1667     case o_command:
1668       origin = _("command line");
1669       break;
1670     case o_override:
1671       origin = _("'override' directive");
1672       break;
1673     case o_invalid:
1674     default:
1675       abort ();
1676     }
1677   fputs ("# ", stdout);
1678   fputs (origin, stdout);
1679   if (v->private_var)
1680     fputs (" private", stdout);
1681   if (v->fileinfo.filenm)
1682     printf (_(" (from '%s', line %lu)"),
1683             v->fileinfo.filenm, v->fileinfo.lineno + v->fileinfo.offset);
1684   putchar ('\n');
1685   fputs (prefix, stdout);
1686
1687   /* Is this a 'define'?  */
1688   if (v->recursive && strchr (v->value, '\n') != 0)
1689     printf ("define %s\n%s\nendef\n", v->name, v->value);
1690   else
1691     {
1692       char *p;
1693
1694       printf ("%s %s= ", v->name, v->recursive ? v->append ? "+" : "" : ":");
1695
1696       /* Check if the value is just whitespace.  */
1697       p = next_token (v->value);
1698       if (p != v->value && *p == '\0')
1699         /* All whitespace.  */
1700         printf ("$(subst ,,%s)", v->value);
1701       else if (v->recursive)
1702         fputs (v->value, stdout);
1703       else
1704         /* Double up dollar signs.  */
1705         for (p = v->value; *p != '\0'; ++p)
1706           {
1707             if (*p == '$')
1708               putchar ('$');
1709             putchar (*p);
1710           }
1711       putchar ('\n');
1712     }
1713 }
1714
1715
1716 static void
1717 print_auto_variable (const void *item, void *arg)
1718 {
1719   const struct variable *v = item;
1720
1721   if (v->origin == o_automatic)
1722     print_variable (item, arg);
1723 }
1724
1725
1726 static void
1727 print_noauto_variable (const void *item, void *arg)
1728 {
1729   const struct variable *v = item;
1730
1731   if (v->origin != o_automatic)
1732     print_variable (item, arg);
1733 }
1734
1735
1736 /* Print all the variables in SET.  PREFIX is printed before
1737    the actual variable definitions (everything else is comments).  */
1738
1739 static void
1740 print_variable_set (struct variable_set *set, const char *prefix, int pauto)
1741 {
1742   hash_map_arg (&set->table, (pauto ? print_auto_variable : print_variable),
1743                 (void *)prefix);
1744
1745   fputs (_("# variable set hash-table stats:\n"), stdout);
1746   fputs ("# ", stdout);
1747   hash_print_stats (&set->table, stdout);
1748   putc ('\n', stdout);
1749 }
1750
1751 /* Print the data base of variables.  */
1752
1753 void
1754 print_variable_data_base (void)
1755 {
1756   puts (_("\n# Variables\n"));
1757
1758   print_variable_set (&global_variable_set, "", 0);
1759
1760   puts (_("\n# Pattern-specific Variable Values"));
1761
1762   {
1763     struct pattern_var *p;
1764     unsigned int rules = 0;
1765
1766     for (p = pattern_vars; p != 0; p = p->next)
1767       {
1768         ++rules;
1769         printf ("\n%s :\n", p->target);
1770         print_variable (&p->variable, (void *)"# ");
1771       }
1772
1773     if (rules == 0)
1774       puts (_("\n# No pattern-specific variable values."));
1775     else
1776       printf (_("\n# %u pattern-specific variable values"), rules);
1777   }
1778 }
1779
1780
1781 /* Print all the local variables of FILE.  */
1782
1783 void
1784 print_file_variables (const struct file *file)
1785 {
1786   if (file->variables != 0)
1787     print_variable_set (file->variables->set, "# ", 1);
1788 }
1789
1790 void
1791 print_target_variables (const struct file *file)
1792 {
1793   if (file->variables != 0)
1794     {
1795       size_t l = strlen (file->name);
1796       char *t = alloca (l + 3);
1797
1798       strcpy (t, file->name);
1799       t[l] = ':';
1800       t[l+1] = ' ';
1801       t[l+2] = '\0';
1802
1803       hash_map_arg (&file->variables->set->table, print_noauto_variable, t);
1804     }
1805 }
1806
1807 #ifdef WINDOWS32
1808 void
1809 sync_Path_environment (void)
1810 {
1811   char *path = allocated_variable_expand ("$(PATH)");
1812   static char *environ_path = NULL;
1813
1814   if (!path)
1815     return;
1816
1817   /* If done this before, free the previous entry before allocating new one.  */
1818   free (environ_path);
1819
1820   /* Create something WINDOWS32 world can grok.  */
1821   convert_Path_to_windows32 (path, ';');
1822   environ_path = xstrdup (concat (3, "PATH", "=", path));
1823   putenv (environ_path);
1824   free (path);
1825 }
1826 #endif