VirtualBox

source: kBuild/trunk/src/gmake/variable.c@ 281

Last change on this file since 281 was 225, checked in by bird, 20 years ago

kMk builtin command basics. KMK_VERSION variable.

  • Property svn:eol-style set to native
File size: 41.0 KB
Line 
1/* Internals of variables for GNU Make.
2Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997,
32002 Free Software Foundation, Inc.
4This file is part of GNU Make.
5
6GNU Make is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11GNU Make is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Make; see the file COPYING. If not, write to
18the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA. */
20
21#include "make.h"
22#include "dep.h"
23#include "filedef.h"
24#include "job.h"
25#include "commands.h"
26#include "variable.h"
27#include "rule.h"
28#ifdef WINDOWS32
29#include "pathstuff.h"
30#endif
31#include "hash.h"
32
33/* Chain of all pattern-specific variables. */
34
35static struct pattern_var *pattern_vars;
36
37/* Pointer to last struct in the chain, so we can add onto the end. */
38
39static struct pattern_var *last_pattern_var;
40
41/* Create a new pattern-specific variable struct. */
42
43struct pattern_var *
44create_pattern_var (char *target, char *suffix)
45{
46 register struct pattern_var *p
47 = (struct pattern_var *) xmalloc (sizeof (struct pattern_var));
48
49 if (last_pattern_var != 0)
50 last_pattern_var->next = p;
51 else
52 pattern_vars = p;
53 last_pattern_var = p;
54 p->next = 0;
55
56 p->target = target;
57 p->len = strlen (target);
58 p->suffix = suffix + 1;
59
60 return p;
61}
62
63/* Look up a target in the pattern-specific variable list. */
64
65static struct pattern_var *
66lookup_pattern_var (struct pattern_var *start, char *target)
67{
68 struct pattern_var *p;
69 unsigned int targlen = strlen(target);
70
71 for (p = start ? start->next : pattern_vars; p != 0; p = p->next)
72 {
73 char *stem;
74 unsigned int stemlen;
75
76 if (p->len > targlen)
77 /* It can't possibly match. */
78 continue;
79
80 /* From the lengths of the filename and the pattern parts,
81 find the stem: the part of the filename that matches the %. */
82 stem = target + (p->suffix - p->target - 1);
83 stemlen = targlen - p->len + 1;
84
85 /* Compare the text in the pattern before the stem, if any. */
86 if (stem > target && !strneq (p->target, target, stem - target))
87 continue;
88
89 /* Compare the text in the pattern after the stem, if any.
90 We could test simply using streq, but this way we compare the
91 first two characters immediately. This saves time in the very
92 common case where the first character matches because it is a
93 period. */
94 if (*p->suffix == stem[stemlen]
95 && (*p->suffix == '\0' || streq (&p->suffix[1], &stem[stemlen+1])))
96 break;
97 }
98
99 return p;
100}
101
102
103/* Hash table of all global variable definitions. */
104
105static unsigned long
106variable_hash_1 (const void *keyv)
107{
108 struct variable const *key = (struct variable const *) keyv;
109 return_STRING_N_HASH_1 (key->name, key->length);
110}
111
112static unsigned long
113variable_hash_2 (const void *keyv)
114{
115 struct variable const *key = (struct variable const *) keyv;
116 return_STRING_N_HASH_2 (key->name, key->length);
117}
118
119static int
120variable_hash_cmp (const void *xv, const void *yv)
121{
122 struct variable const *x = (struct variable const *) xv;
123 struct variable const *y = (struct variable const *) yv;
124 int result = x->length - y->length;
125 if (result)
126 return result;
127 return_STRING_N_COMPARE (x->name, y->name, x->length);
128}
129
130#ifndef VARIABLE_BUCKETS
131#define VARIABLE_BUCKETS 523
132#endif
133#ifndef PERFILE_VARIABLE_BUCKETS
134#define PERFILE_VARIABLE_BUCKETS 23
135#endif
136#ifndef SMALL_SCOPE_VARIABLE_BUCKETS
137#define SMALL_SCOPE_VARIABLE_BUCKETS 13
138#endif
139
140static struct variable_set global_variable_set;
141static struct variable_set_list global_setlist
142 = { 0, &global_variable_set };
143struct variable_set_list *current_variable_set_list = &global_setlist;
144
145
146/* Implement variables. */
147
148void
149init_hash_global_variable_set (void)
150{
151 hash_init (&global_variable_set.table, VARIABLE_BUCKETS,
152 variable_hash_1, variable_hash_2, variable_hash_cmp);
153}
154
155/* Define variable named NAME with value VALUE in SET. VALUE is copied.
156 LENGTH is the length of NAME, which does not need to be null-terminated.
157 ORIGIN specifies the origin of the variable (makefile, command line
158 or environment).
159 If RECURSIVE is nonzero a flag is set in the variable saying
160 that it should be recursively re-expanded. */
161
162struct variable *
163define_variable_in_set (const char *name, unsigned int length,
164 char *value, enum variable_origin origin,
165 int recursive, struct variable_set *set,
166 const struct floc *flocp)
167{
168 struct variable *v;
169 struct variable **var_slot;
170 struct variable var_key;
171
172 if (set == NULL)
173 set = &global_variable_set;
174
175 var_key.name = (char *) name;
176 var_key.length = length;
177 var_slot = (struct variable **) hash_find_slot (&set->table, &var_key);
178
179 if (env_overrides && origin == o_env)
180 origin = o_env_override;
181
182 v = *var_slot;
183 if (! HASH_VACANT (v))
184 {
185 if (env_overrides && v->origin == o_env)
186 /* V came from in the environment. Since it was defined
187 before the switches were parsed, it wasn't affected by -e. */
188 v->origin = o_env_override;
189
190 /* A variable of this name is already defined.
191 If the old definition is from a stronger source
192 than this one, don't redefine it. */
193 if ((int) origin >= (int) v->origin)
194 {
195 if (v->value != 0)
196 free (v->value);
197 v->value = xstrdup (value);
198 if (flocp != 0)
199 v->fileinfo = *flocp;
200 else
201 v->fileinfo.filenm = 0;
202 v->origin = origin;
203 v->recursive = recursive;
204 }
205 return v;
206 }
207
208 /* Create a new variable definition and add it to the hash table. */
209
210 v = (struct variable *) xmalloc (sizeof (struct variable));
211 v->name = savestring (name, length);
212 v->length = length;
213 hash_insert_at (&set->table, v, var_slot);
214 v->value = xstrdup (value);
215 if (flocp != 0)
216 v->fileinfo = *flocp;
217 else
218 v->fileinfo.filenm = 0;
219 v->origin = origin;
220 v->recursive = recursive;
221 v->special = 0;
222 v->expanding = 0;
223 v->exp_count = 0;
224 v->per_target = 0;
225 v->append = 0;
226 v->export = v_default;
227
228 v->exportable = 1;
229 if (*name != '_' && (*name < 'A' || *name > 'Z')
230 && (*name < 'a' || *name > 'z'))
231 v->exportable = 0;
232 else
233 {
234 for (++name; *name != '\0'; ++name)
235 if (*name != '_' && (*name < 'a' || *name > 'z')
236 && (*name < 'A' || *name > 'Z') && !ISDIGIT(*name))
237 break;
238
239 if (*name != '\0')
240 v->exportable = 0;
241 }
242
243 return v;
244}
245
246
247/* If the variable passed in is "special", handle its special nature.
248 Currently there are two such variables, both used for introspection:
249 .VARIABLES expands to a list of all the variables defined in this instance
250 of make.
251 .TARGETS expands to a list of all the targets defined in this
252 instance of make.
253 Returns the variable reference passed in. */
254
255#define EXPANSION_INCREMENT(_l) ((((_l) / 500) + 1) * 500)
256
257static struct variable *
258handle_special_var (struct variable *var)
259{
260 static unsigned long last_var_count = 0;
261
262
263 /* This one actually turns out to be very hard, due to the way the parser
264 records targets. The way it works is that target information is collected
265 internally until make knows the target is completely specified. It unitl
266 it sees that some new construct (a new target or variable) is defined that
267 it knows the previous one is done. In short, this means that if you do
268 this:
269
270 all:
271
272 TARGS := $(.TARGETS)
273
274 then $(TARGS) won't contain "all", because it's not until after the
275 variable is created that the previous target is completed.
276
277 Changing this would be a major pain. I think a less complex way to do it
278 would be to pre-define the target files as soon as the first line is
279 parsed, then come back and do the rest of the definition as now. That
280 would allow $(.TARGETS) to be correct without a major change to the way
281 the parser works.
282
283 if (streq (var->name, ".TARGETS"))
284 var->value = build_target_list (var->value);
285 else
286 */
287
288 if (streq (var->name, ".VARIABLES")
289 && global_variable_set.table.ht_fill != last_var_count)
290 {
291 unsigned long max = EXPANSION_INCREMENT (strlen (var->value));
292 unsigned long len;
293 char *p;
294 struct variable **vp = (struct variable **) global_variable_set.table.ht_vec;
295 struct variable **end = &vp[global_variable_set.table.ht_size];
296
297 /* Make sure we have at least MAX bytes in the allocated buffer. */
298 var->value = xrealloc (var->value, max);
299
300 /* Walk through the hash of variables, constructing a list of names. */
301 p = var->value;
302 len = 0;
303 for (; vp < end; ++vp)
304 if (!HASH_VACANT (*vp))
305 {
306 struct variable *v = *vp;
307 int l = v->length;
308
309 len += l + 1;
310 if (len > max)
311 {
312 unsigned long off = p - var->value;
313
314 max += EXPANSION_INCREMENT (l + 1);
315 var->value = xrealloc (var->value, max);
316 p = &var->value[off];
317 }
318
319 bcopy (v->name, p, l);
320 p += l;
321 *(p++) = ' ';
322 }
323 *(p-1) = '\0';
324
325 /* Remember how many variables are in our current count. Since we never
326 remove variables from the list, this is a reliable way to know whether
327 the list is up to date or needs to be recomputed. */
328
329 last_var_count = global_variable_set.table.ht_fill;
330 }
331
332 return var;
333}
334
335
336
337/* Lookup a variable whose name is a string starting at NAME
338 and with LENGTH chars. NAME need not be null-terminated.
339 Returns address of the `struct variable' containing all info
340 on the variable, or nil if no such variable is defined. */
341
342struct variable *
343lookup_variable (const char *name, unsigned int length)
344{
345 const struct variable_set_list *setlist;
346 struct variable var_key;
347
348 var_key.name = (char *) name;
349 var_key.length = length;
350
351 for (setlist = current_variable_set_list;
352 setlist != 0; setlist = setlist->next)
353 {
354 const struct variable_set *set = setlist->set;
355 struct variable *v;
356
357 v = (struct variable *) hash_find_item ((struct hash_table *) &set->table, &var_key);
358 if (v)
359 return v->special ? handle_special_var (v) : v;
360 }
361
362#ifdef VMS
363 /* since we don't read envp[] on startup, try to get the
364 variable via getenv() here. */
365 {
366 char *vname = alloca (length + 1);
367 char *value;
368 strncpy (vname, name, length);
369 vname[length] = 0;
370 value = getenv (vname);
371 if (value != 0)
372 {
373 char *sptr;
374 int scnt;
375
376 sptr = value;
377 scnt = 0;
378
379 while ((sptr = strchr (sptr, '$')))
380 {
381 scnt++;
382 sptr++;
383 }
384
385 if (scnt > 0)
386 {
387 char *nvalue;
388 char *nptr;
389
390 nvalue = alloca (strlen (value) + scnt + 1);
391 sptr = value;
392 nptr = nvalue;
393
394 while (*sptr)
395 {
396 if (*sptr == '$')
397 {
398 *nptr++ = '$';
399 *nptr++ = '$';
400 }
401 else
402 {
403 *nptr++ = *sptr;
404 }
405 sptr++;
406 }
407
408 *nptr = '\0';
409 return define_variable (vname, length, nvalue, o_env, 1);
410
411 }
412
413 return define_variable (vname, length, value, o_env, 1);
414 }
415 }
416#endif /* VMS */
417
418 return 0;
419}
420
421
422/* Lookup a variable whose name is a string starting at NAME
423 and with LENGTH chars in set SET. NAME need not be null-terminated.
424 Returns address of the `struct variable' containing all info
425 on the variable, or nil if no such variable is defined. */
426
427struct variable *
428lookup_variable_in_set (const char *name, unsigned int length,
429 const struct variable_set *set)
430{
431 struct variable var_key;
432
433 var_key.name = (char *) name;
434 var_key.length = length;
435
436 return (struct variable *) hash_find_item ((struct hash_table *) &set->table, &var_key);
437}
438
439
440/* Initialize FILE's variable set list. If FILE already has a variable set
441 list, the topmost variable set is left intact, but the the rest of the
442 chain is replaced with FILE->parent's setlist. If FILE is a double-colon
443 rule, then we will use the "root" double-colon target's variable set as the
444 parent of FILE's variable set.
445
446 If we're READing a makefile, don't do the pattern variable search now,
447 since the pattern variable might not have been defined yet. */
448
449void
450initialize_file_variables (struct file *file, int reading)
451{
452 register struct variable_set_list *l = file->variables;
453
454 if (l == 0)
455 {
456 l = (struct variable_set_list *)
457 xmalloc (sizeof (struct variable_set_list));
458 l->set = (struct variable_set *) xmalloc (sizeof (struct variable_set));
459 hash_init (&l->set->table, PERFILE_VARIABLE_BUCKETS,
460 variable_hash_1, variable_hash_2, variable_hash_cmp);
461 file->variables = l;
462 }
463
464 /* If this is a double-colon, then our "parent" is the "root" target for
465 this double-colon rule. Since that rule has the same name, parent,
466 etc. we can just use its variables as the "next" for ours. */
467
468 if (file->double_colon && file->double_colon != file)
469 {
470 initialize_file_variables (file->double_colon, reading);
471 l->next = file->double_colon->variables;
472 return;
473 }
474
475 if (file->parent == 0)
476 l->next = &global_setlist;
477 else
478 {
479 initialize_file_variables (file->parent, reading);
480 l->next = file->parent->variables;
481 }
482
483 /* If we're not reading makefiles and we haven't looked yet, see if
484 we can find pattern variables for this target. */
485
486 if (!reading && !file->pat_searched)
487 {
488 struct pattern_var *p;
489
490 p = lookup_pattern_var (0, file->name);
491 if (p != 0)
492 {
493 struct variable_set_list *global = current_variable_set_list;
494
495 /* We found at least one. Set up a new variable set to accumulate
496 all the pattern variables that match this target. */
497
498 file->pat_variables = create_new_variable_set ();
499 current_variable_set_list = file->pat_variables;
500
501 do
502 /* We found one, so insert it into the set. */
503 do_variable_definition (&p->variable.fileinfo, p->variable.name,
504 p->variable.value, p->variable.origin,
505 p->variable.flavor, 1);
506 while ((p = lookup_pattern_var (p, file->name)) != 0);
507
508 current_variable_set_list = global;
509 }
510 file->pat_searched = 1;
511 }
512
513 /* If we have a pattern variable match, set it up. */
514
515 if (file->pat_variables != 0)
516 {
517 file->pat_variables->next = l->next;
518 l->next = file->pat_variables;
519 }
520}
521
522
523/* Pop the top set off the current variable set list,
524 and free all its storage. */
525
526static void
527free_variable_name_and_value (const void *item)
528{
529 struct variable *v = (struct variable *) item;
530 free (v->name);
531 free (v->value);
532}
533
534void
535pop_variable_scope (void)
536{
537 struct variable_set_list *setlist = current_variable_set_list;
538 struct variable_set *set = setlist->set;
539
540 current_variable_set_list = setlist->next;
541 free ((char *) setlist);
542
543 hash_map (&set->table, free_variable_name_and_value);
544 hash_free (&set->table, 1);
545
546 free ((char *) set);
547}
548
549struct variable_set_list *
550create_new_variable_set (void)
551{
552 register struct variable_set_list *setlist;
553 register struct variable_set *set;
554
555 set = (struct variable_set *) xmalloc (sizeof (struct variable_set));
556 hash_init (&set->table, SMALL_SCOPE_VARIABLE_BUCKETS,
557 variable_hash_1, variable_hash_2, variable_hash_cmp);
558
559 setlist = (struct variable_set_list *)
560 xmalloc (sizeof (struct variable_set_list));
561 setlist->set = set;
562 setlist->next = current_variable_set_list;
563
564 return setlist;
565}
566
567/* Create a new variable set and push it on the current setlist. */
568
569struct variable_set_list *
570push_new_variable_scope (void)
571{
572 return (current_variable_set_list = create_new_variable_set());
573}
574
575
576/* Merge FROM_SET into TO_SET, freeing unused storage in FROM_SET. */
577
578static void
579merge_variable_sets (struct variable_set *to_set,
580 struct variable_set *from_set)
581{
582 struct variable **from_var_slot = (struct variable **) from_set->table.ht_vec;
583 struct variable **from_var_end = from_var_slot + from_set->table.ht_size;
584
585 for ( ; from_var_slot < from_var_end; from_var_slot++)
586 if (! HASH_VACANT (*from_var_slot))
587 {
588 struct variable *from_var = *from_var_slot;
589 struct variable **to_var_slot
590 = (struct variable **) hash_find_slot (&to_set->table, *from_var_slot);
591 if (HASH_VACANT (*to_var_slot))
592 hash_insert_at (&to_set->table, from_var, to_var_slot);
593 else
594 {
595 /* GKM FIXME: delete in from_set->table */
596 free (from_var->value);
597 free (from_var);
598 }
599 }
600}
601
602/* Merge SETLIST1 into SETLIST0, freeing unused storage in SETLIST1. */
603
604void
605merge_variable_set_lists (struct variable_set_list **setlist0,
606 struct variable_set_list *setlist1)
607{
608 register struct variable_set_list *list0 = *setlist0;
609 struct variable_set_list *last0 = 0;
610
611 while (setlist1 != 0 && list0 != 0)
612 {
613 struct variable_set_list *next = setlist1;
614 setlist1 = setlist1->next;
615
616 merge_variable_sets (list0->set, next->set);
617
618 last0 = list0;
619 list0 = list0->next;
620 }
621
622 if (setlist1 != 0)
623 {
624 if (last0 == 0)
625 *setlist0 = setlist1;
626 else
627 last0->next = setlist1;
628 }
629}
630
631
632/* Define the automatic variables, and record the addresses
633 of their structures so we can change their values quickly. */
634
635void
636define_automatic_variables (void)
637{
638#if defined(WINDOWS32) || defined(__EMX__)
639 extern char* default_shell;
640#else
641 extern char default_shell[];
642#endif
643 register struct variable *v;
644 char buf[200];
645
646 sprintf (buf, "%u", makelevel);
647 (void) define_variable (MAKELEVEL_NAME, MAKELEVEL_LENGTH, buf, o_env, 0);
648
649 sprintf (buf, "%s%s%s",
650 version_string,
651 (remote_description == 0 || remote_description[0] == '\0')
652 ? "" : "-",
653 (remote_description == 0 || remote_description[0] == '\0')
654 ? "" : remote_description);
655 (void) define_variable ("MAKE_VERSION", 12, buf, o_default, 0);
656
657 /* Define KMK_VERSION to indicate kMk. */
658 (void) define_variable ("KMK_VERSION", 11, buf, o_default, 0);
659
660#ifdef CONFIG_WITH_KMK_BUILTIN
661 /* The kMk Builtin Level. */
662 (void) define_variable ("KMK_BUILTIN", 11, "1", o_default, 0);
663#endif
664
665#ifdef __MSDOS__
666 /* Allow to specify a special shell just for Make,
667 and use $COMSPEC as the default $SHELL when appropriate. */
668 {
669 static char shell_str[] = "SHELL";
670 const int shlen = sizeof (shell_str) - 1;
671 struct variable *mshp = lookup_variable ("MAKESHELL", 9);
672 struct variable *comp = lookup_variable ("COMSPEC", 7);
673
674 /* Make $MAKESHELL override $SHELL even if -e is in effect. */
675 if (mshp)
676 (void) define_variable (shell_str, shlen,
677 mshp->value, o_env_override, 0);
678 else if (comp)
679 {
680 /* $COMSPEC shouldn't override $SHELL. */
681 struct variable *shp = lookup_variable (shell_str, shlen);
682
683 if (!shp)
684 (void) define_variable (shell_str, shlen, comp->value, o_env, 0);
685 }
686 }
687#elif defined(__EMX__)
688 {
689 static char shell_str[] = "SHELL";
690 const int shlen = sizeof (shell_str) - 1;
691 struct variable *shell = lookup_variable (shell_str, shlen);
692 struct variable *replace = lookup_variable ("MAKESHELL", 9);
693
694 /* if $MAKESHELL is defined in the environment assume o_env_override */
695 if (replace && *replace->value && replace->origin == o_env)
696 replace->origin = o_env_override;
697
698 /* if $MAKESHELL is not defined use $SHELL but only if the variable
699 did not come from the environment */
700 if (!replace || !*replace->value)
701 if (shell && *shell->value && (shell->origin == o_env
702 || shell->origin == o_env_override))
703 {
704 /* overwrite whatever we got from the environment */
705 free(shell->value);
706 shell->value = xstrdup (default_shell);
707 shell->origin = o_default;
708 }
709
710 /* Some people do not like cmd to be used as the default
711 if $SHELL is not defined in the Makefile.
712 With -DNO_CMD_DEFAULT you can turn off this behaviour */
713# ifndef NO_CMD_DEFAULT
714 /* otherwise use $COMSPEC */
715 if (!replace || !*replace->value)
716 replace = lookup_variable ("COMSPEC", 7);
717
718 /* otherwise use $OS2_SHELL */
719 if (!replace || !*replace->value)
720 replace = lookup_variable ("OS2_SHELL", 9);
721# else
722# warning NO_CMD_DEFAULT: GNU make will not use CMD.EXE as default shell
723# endif
724
725 if (replace && *replace->value)
726 /* overwrite $SHELL */
727 (void) define_variable (shell_str, shlen, replace->value,
728 replace->origin, 0);
729 else
730 /* provide a definition if there is none */
731 (void) define_variable (shell_str, shlen, default_shell,
732 o_default, 0);
733 }
734
735#endif
736
737 /* This won't override any definition, but it
738 will provide one if there isn't one there. */
739 v = define_variable ("SHELL", 5, default_shell, o_default, 0);
740 v->export = v_export; /* Always export SHELL. */
741
742 /* On MSDOS we do use SHELL from environment, since
743 it isn't a standard environment variable on MSDOS,
744 so whoever sets it, does that on purpose.
745 On OS/2 we do not use SHELL from environment but
746 we have already handled that problem above. */
747#if !defined(__MSDOS__) && !defined(__EMX__)
748 /* Don't let SHELL come from the environment. */
749 if (*v->value == '\0' || v->origin == o_env || v->origin == o_env_override)
750 {
751 free (v->value);
752 v->origin = o_file;
753 v->value = xstrdup (default_shell);
754 }
755#endif
756
757 /* Make sure MAKEFILES gets exported if it is set. */
758 v = define_variable ("MAKEFILES", 9, "", o_default, 0);
759 v->export = v_ifset;
760
761 /* Define the magic D and F variables in terms of
762 the automatic variables they are variations of. */
763
764#ifdef VMS
765 define_variable ("@D", 2, "$(dir $@)", o_automatic, 1);
766 define_variable ("%D", 2, "$(dir $%)", o_automatic, 1);
767 define_variable ("*D", 2, "$(dir $*)", o_automatic, 1);
768 define_variable ("<D", 2, "$(dir $<)", o_automatic, 1);
769 define_variable ("?D", 2, "$(dir $?)", o_automatic, 1);
770 define_variable ("^D", 2, "$(dir $^)", o_automatic, 1);
771 define_variable ("+D", 2, "$(dir $+)", o_automatic, 1);
772#else
773 define_variable ("@D", 2, "$(patsubst %/,%,$(dir $@))", o_automatic, 1);
774 define_variable ("%D", 2, "$(patsubst %/,%,$(dir $%))", o_automatic, 1);
775 define_variable ("*D", 2, "$(patsubst %/,%,$(dir $*))", o_automatic, 1);
776 define_variable ("<D", 2, "$(patsubst %/,%,$(dir $<))", o_automatic, 1);
777 define_variable ("?D", 2, "$(patsubst %/,%,$(dir $?))", o_automatic, 1);
778 define_variable ("^D", 2, "$(patsubst %/,%,$(dir $^))", o_automatic, 1);
779 define_variable ("+D", 2, "$(patsubst %/,%,$(dir $+))", o_automatic, 1);
780#endif
781 define_variable ("@F", 2, "$(notdir $@)", o_automatic, 1);
782 define_variable ("%F", 2, "$(notdir $%)", o_automatic, 1);
783 define_variable ("*F", 2, "$(notdir $*)", o_automatic, 1);
784 define_variable ("<F", 2, "$(notdir $<)", o_automatic, 1);
785 define_variable ("?F", 2, "$(notdir $?)", o_automatic, 1);
786 define_variable ("^F", 2, "$(notdir $^)", o_automatic, 1);
787 define_variable ("+F", 2, "$(notdir $+)", o_automatic, 1);
788}
789
790
791int export_all_variables;
792
793/* Create a new environment for FILE's commands.
794 If FILE is nil, this is for the `shell' function.
795 The child's MAKELEVEL variable is incremented. */
796
797char **
798target_environment (struct file *file)
799{
800 struct variable_set_list *set_list;
801 register struct variable_set_list *s;
802 struct hash_table table;
803 struct variable **v_slot;
804 struct variable **v_end;
805 struct variable makelevel_key;
806 char **result_0;
807 char **result;
808
809 if (file == 0)
810 set_list = current_variable_set_list;
811 else
812 set_list = file->variables;
813
814 hash_init (&table, VARIABLE_BUCKETS,
815 variable_hash_1, variable_hash_2, variable_hash_cmp);
816
817 /* Run through all the variable sets in the list,
818 accumulating variables in TABLE. */
819 for (s = set_list; s != 0; s = s->next)
820 {
821 struct variable_set *set = s->set;
822 v_slot = (struct variable **) set->table.ht_vec;
823 v_end = v_slot + set->table.ht_size;
824 for ( ; v_slot < v_end; v_slot++)
825 if (! HASH_VACANT (*v_slot))
826 {
827 struct variable **new_slot;
828 struct variable *v = *v_slot;
829
830 /* If this is a per-target variable and it hasn't been touched
831 already then look up the global version and take its export
832 value. */
833 if (v->per_target && v->export == v_default)
834 {
835 struct variable *gv;
836
837 gv = lookup_variable_in_set (v->name, strlen(v->name),
838 &global_variable_set);
839 if (gv)
840 v->export = gv->export;
841 }
842
843 switch (v->export)
844 {
845 case v_default:
846 if (v->origin == o_default || v->origin == o_automatic)
847 /* Only export default variables by explicit request. */
848 continue;
849
850 /* The variable doesn't have a name that can be exported. */
851 if (! v->exportable)
852 continue;
853
854 if (! export_all_variables
855 && v->origin != o_command
856 && v->origin != o_env && v->origin != o_env_override)
857 continue;
858 break;
859
860 case v_export:
861 break;
862
863 case v_noexport:
864 continue;
865
866 case v_ifset:
867 if (v->origin == o_default)
868 continue;
869 break;
870 }
871
872 new_slot = (struct variable **) hash_find_slot (&table, v);
873 if (HASH_VACANT (*new_slot))
874 hash_insert_at (&table, v, new_slot);
875 }
876 }
877
878 makelevel_key.name = MAKELEVEL_NAME;
879 makelevel_key.length = MAKELEVEL_LENGTH;
880 hash_delete (&table, &makelevel_key);
881
882 result = result_0 = (char **) xmalloc ((table.ht_fill + 2) * sizeof (char *));
883
884 v_slot = (struct variable **) table.ht_vec;
885 v_end = v_slot + table.ht_size;
886 for ( ; v_slot < v_end; v_slot++)
887 if (! HASH_VACANT (*v_slot))
888 {
889 struct variable *v = *v_slot;
890
891 /* If V is recursively expanded and didn't come from the environment,
892 expand its value. If it came from the environment, it should
893 go back into the environment unchanged. */
894 if (v->recursive
895 && v->origin != o_env && v->origin != o_env_override)
896 {
897 char *value = recursively_expand_for_file (v, file);
898#ifdef WINDOWS32
899 if (strcmp(v->name, "Path") == 0 ||
900 strcmp(v->name, "PATH") == 0)
901 convert_Path_to_windows32(value, ';');
902#endif
903 *result++ = concat (v->name, "=", value);
904 free (value);
905 }
906 else
907 {
908#ifdef WINDOWS32
909 if (strcmp(v->name, "Path") == 0 ||
910 strcmp(v->name, "PATH") == 0)
911 convert_Path_to_windows32(v->value, ';');
912#endif
913 *result++ = concat (v->name, "=", v->value);
914 }
915 }
916
917 *result = (char *) xmalloc (100);
918 (void) sprintf (*result, "%s=%u", MAKELEVEL_NAME, makelevel + 1);
919 *++result = 0;
920
921 hash_free (&table, 0);
922
923 return result_0;
924}
925
926
927/* Given a variable, a value, and a flavor, define the variable.
928 See the try_variable_definition() function for details on the parameters. */
929
930struct variable *
931do_variable_definition (const struct floc *flocp, const char *varname,
932 char *value, enum variable_origin origin,
933 enum variable_flavor flavor, int target_var)
934{
935 char *p, *alloc_value = NULL;
936 struct variable *v;
937 int append = 0;
938 int conditional = 0;
939
940 /* Calculate the variable's new value in VALUE. */
941
942 switch (flavor)
943 {
944 default:
945 case f_bogus:
946 /* Should not be possible. */
947 abort ();
948 case f_simple:
949 /* A simple variable definition "var := value". Expand the value.
950 We have to allocate memory since otherwise it'll clobber the
951 variable buffer, and we may still need that if we're looking at a
952 target-specific variable. */
953 p = alloc_value = allocated_variable_expand (value);
954 break;
955 case f_conditional:
956 /* A conditional variable definition "var ?= value".
957 The value is set IFF the variable is not defined yet. */
958 v = lookup_variable (varname, strlen (varname));
959 if (v)
960 return v;
961
962 conditional = 1;
963 flavor = f_recursive;
964 /* FALLTHROUGH */
965 case f_recursive:
966 /* A recursive variable definition "var = value".
967 The value is used verbatim. */
968 p = value;
969 break;
970 case f_append:
971 {
972 /* If we have += but we're in a target variable context, we want to
973 append only with other variables in the context of this target. */
974 if (target_var)
975 {
976 append = 1;
977 v = lookup_variable_in_set (varname, strlen (varname),
978 current_variable_set_list->set);
979 }
980 else
981 v = lookup_variable (varname, strlen (varname));
982
983 if (v == 0)
984 {
985 /* There was no old value.
986 This becomes a normal recursive definition. */
987 p = value;
988 flavor = f_recursive;
989 }
990 else
991 {
992 /* Paste the old and new values together in VALUE. */
993
994 unsigned int oldlen, vallen;
995 char *val;
996
997 val = value;
998 if (v->recursive)
999 /* The previous definition of the variable was recursive.
1000 The new value is the unexpanded old and new values. */
1001 flavor = f_recursive;
1002 else
1003 /* The previous definition of the variable was simple.
1004 The new value comes from the old value, which was expanded
1005 when it was set; and from the expanded new value. Allocate
1006 memory for the expansion as we may still need the rest of the
1007 buffer if we're looking at a target-specific variable. */
1008 val = alloc_value = allocated_variable_expand (val);
1009
1010 oldlen = strlen (v->value);
1011 vallen = strlen (val);
1012 p = (char *) alloca (oldlen + 1 + vallen + 1);
1013 bcopy (v->value, p, oldlen);
1014 p[oldlen] = ' ';
1015 bcopy (val, &p[oldlen + 1], vallen + 1);
1016 }
1017 }
1018 }
1019
1020#ifdef __MSDOS__
1021 /* Many Unix Makefiles include a line saying "SHELL=/bin/sh", but
1022 non-Unix systems don't conform to this default configuration (in
1023 fact, most of them don't even have `/bin'). On the other hand,
1024 $SHELL in the environment, if set, points to the real pathname of
1025 the shell.
1026 Therefore, we generally won't let lines like "SHELL=/bin/sh" from
1027 the Makefile override $SHELL from the environment. But first, we
1028 look for the basename of the shell in the directory where SHELL=
1029 points, and along the $PATH; if it is found in any of these places,
1030 we define $SHELL to be the actual pathname of the shell. Thus, if
1031 you have bash.exe installed as d:/unix/bash.exe, and d:/unix is on
1032 your $PATH, then SHELL=/usr/local/bin/bash will have the effect of
1033 defining SHELL to be "d:/unix/bash.exe". */
1034 if ((origin == o_file || origin == o_override)
1035 && strcmp (varname, "SHELL") == 0)
1036 {
1037 char shellpath[PATH_MAX];
1038 extern char * __dosexec_find_on_path (const char *, char *[], char *);
1039
1040 /* See if we can find "/bin/sh.exe", "/bin/sh.com", etc. */
1041 if (__dosexec_find_on_path (p, (char **)0, shellpath))
1042 {
1043 char *p;
1044
1045 for (p = shellpath; *p; p++)
1046 {
1047 if (*p == '\\')
1048 *p = '/';
1049 }
1050 v = define_variable_loc (varname, strlen (varname),
1051 shellpath, origin, flavor == f_recursive,
1052 flocp);
1053 }
1054 else
1055 {
1056 char *shellbase, *bslash;
1057 struct variable *pathv = lookup_variable ("PATH", 4);
1058 char *path_string;
1059 char *fake_env[2];
1060 size_t pathlen = 0;
1061
1062 shellbase = strrchr (p, '/');
1063 bslash = strrchr (p, '\\');
1064 if (!shellbase || bslash > shellbase)
1065 shellbase = bslash;
1066 if (!shellbase && p[1] == ':')
1067 shellbase = p + 1;
1068 if (shellbase)
1069 shellbase++;
1070 else
1071 shellbase = p;
1072
1073 /* Search for the basename of the shell (with standard
1074 executable extensions) along the $PATH. */
1075 if (pathv)
1076 pathlen = strlen (pathv->value);
1077 path_string = (char *)xmalloc (5 + pathlen + 2 + 1);
1078 /* On MSDOS, current directory is considered as part of $PATH. */
1079 sprintf (path_string, "PATH=.;%s", pathv ? pathv->value : "");
1080 fake_env[0] = path_string;
1081 fake_env[1] = (char *)0;
1082 if (__dosexec_find_on_path (shellbase, fake_env, shellpath))
1083 {
1084 char *p;
1085
1086 for (p = shellpath; *p; p++)
1087 {
1088 if (*p == '\\')
1089 *p = '/';
1090 }
1091 v = define_variable_loc (varname, strlen (varname),
1092 shellpath, origin,
1093 flavor == f_recursive, flocp);
1094 }
1095 else
1096 v = lookup_variable (varname, strlen (varname));
1097
1098 free (path_string);
1099 }
1100 }
1101 else
1102#endif /* __MSDOS__ */
1103#ifdef WINDOWS32
1104 if ((origin == o_file || origin == o_override) && streq (varname, "SHELL"))
1105 {
1106 extern char *default_shell;
1107
1108 /* Call shell locator function. If it returns TRUE, then
1109 set no_default_sh_exe to indicate sh was found and
1110 set new value for SHELL variable. */
1111
1112 if (find_and_set_default_shell (p))
1113 {
1114 v = define_variable_in_set (varname, strlen (varname), default_shell,
1115 origin, flavor == f_recursive,
1116 (target_var
1117 ? current_variable_set_list->set
1118 : NULL),
1119 flocp);
1120 no_default_sh_exe = 0;
1121 }
1122 else
1123 v = lookup_variable (varname, strlen (varname));
1124 }
1125 else
1126#endif
1127
1128 /* If we are defining variables inside an $(eval ...), we might have a
1129 different variable context pushed, not the global context (maybe we're
1130 inside a $(call ...) or something. Since this function is only ever
1131 invoked in places where we want to define globally visible variables,
1132 make sure we define this variable in the global set. */
1133
1134 v = define_variable_in_set (varname, strlen (varname), p,
1135 origin, flavor == f_recursive,
1136 (target_var
1137 ? current_variable_set_list->set : NULL),
1138 flocp);
1139 v->append = append;
1140 v->conditional = conditional;
1141
1142 if (alloc_value)
1143 free (alloc_value);
1144
1145 return v;
1146}
1147
1148
1149/* Try to interpret LINE (a null-terminated string) as a variable definition.
1150
1151 ORIGIN may be o_file, o_override, o_env, o_env_override,
1152 or o_command specifying that the variable definition comes
1153 from a makefile, an override directive, the environment with
1154 or without the -e switch, or the command line.
1155
1156 See the comments for parse_variable_definition().
1157
1158 If LINE was recognized as a variable definition, a pointer to its `struct
1159 variable' is returned. If LINE is not a variable definition, NULL is
1160 returned. */
1161
1162struct variable *
1163parse_variable_definition (struct variable *v, char *line)
1164{
1165 register int c;
1166 register char *p = line;
1167 register char *beg;
1168 register char *end;
1169 enum variable_flavor flavor = f_bogus;
1170 char *name;
1171
1172 while (1)
1173 {
1174 c = *p++;
1175 if (c == '\0' || c == '#')
1176 return 0;
1177 if (c == '=')
1178 {
1179 end = p - 1;
1180 flavor = f_recursive;
1181 break;
1182 }
1183 else if (c == ':')
1184 if (*p == '=')
1185 {
1186 end = p++ - 1;
1187 flavor = f_simple;
1188 break;
1189 }
1190 else
1191 /* A colon other than := is a rule line, not a variable defn. */
1192 return 0;
1193 else if (c == '+' && *p == '=')
1194 {
1195 end = p++ - 1;
1196 flavor = f_append;
1197 break;
1198 }
1199 else if (c == '?' && *p == '=')
1200 {
1201 end = p++ - 1;
1202 flavor = f_conditional;
1203 break;
1204 }
1205 else if (c == '$')
1206 {
1207 /* This might begin a variable expansion reference. Make sure we
1208 don't misrecognize chars inside the reference as =, := or +=. */
1209 char closeparen;
1210 int count;
1211 c = *p++;
1212 if (c == '(')
1213 closeparen = ')';
1214 else if (c == '{')
1215 closeparen = '}';
1216 else
1217 continue; /* Nope. */
1218
1219 /* P now points past the opening paren or brace.
1220 Count parens or braces until it is matched. */
1221 count = 0;
1222 for (; *p != '\0'; ++p)
1223 {
1224 if (*p == c)
1225 ++count;
1226 else if (*p == closeparen && --count < 0)
1227 {
1228 ++p;
1229 break;
1230 }
1231 }
1232 }
1233 }
1234 v->flavor = flavor;
1235
1236 beg = next_token (line);
1237 while (end > beg && isblank ((unsigned char)end[-1]))
1238 --end;
1239 p = next_token (p);
1240 v->value = p;
1241
1242 /* Expand the name, so "$(foo)bar = baz" works. */
1243 name = (char *) alloca (end - beg + 1);
1244 bcopy (beg, name, end - beg);
1245 name[end - beg] = '\0';
1246 v->name = allocated_variable_expand (name);
1247
1248 if (v->name[0] == '\0')
1249 fatal (&v->fileinfo, _("empty variable name"));
1250
1251 return v;
1252}
1253
1254
1255/* Try to interpret LINE (a null-terminated string) as a variable definition.
1256
1257 ORIGIN may be o_file, o_override, o_env, o_env_override,
1258 or o_command specifying that the variable definition comes
1259 from a makefile, an override directive, the environment with
1260 or without the -e switch, or the command line.
1261
1262 See the comments for parse_variable_definition().
1263
1264 If LINE was recognized as a variable definition, a pointer to its `struct
1265 variable' is returned. If LINE is not a variable definition, NULL is
1266 returned. */
1267
1268struct variable *
1269try_variable_definition (const struct floc *flocp, char *line,
1270 enum variable_origin origin, int target_var)
1271{
1272 struct variable v;
1273 struct variable *vp;
1274
1275 if (flocp != 0)
1276 v.fileinfo = *flocp;
1277 else
1278 v.fileinfo.filenm = 0;
1279
1280 if (!parse_variable_definition (&v, line))
1281 return 0;
1282
1283 vp = do_variable_definition (flocp, v.name, v.value,
1284 origin, v.flavor, target_var);
1285
1286 free (v.name);
1287
1288 return vp;
1289}
1290
1291
1292/* Print information for variable V, prefixing it with PREFIX. */
1293
1294static void
1295print_variable (const void *item, void *arg)
1296{
1297 const struct variable *v = (struct variable *) item;
1298 const char *prefix = (char *) arg;
1299 const char *origin;
1300
1301 switch (v->origin)
1302 {
1303 case o_default:
1304 origin = _("default");
1305 break;
1306 case o_env:
1307 origin = _("environment");
1308 break;
1309 case o_file:
1310 origin = _("makefile");
1311 break;
1312 case o_env_override:
1313 origin = _("environment under -e");
1314 break;
1315 case o_command:
1316 origin = _("command line");
1317 break;
1318 case o_override:
1319 origin = _("`override' directive");
1320 break;
1321 case o_automatic:
1322 origin = _("automatic");
1323 break;
1324 case o_invalid:
1325 default:
1326 abort ();
1327 }
1328 fputs ("# ", stdout);
1329 fputs (origin, stdout);
1330 if (v->fileinfo.filenm)
1331 printf (_(" (from `%s', line %lu)"),
1332 v->fileinfo.filenm, v->fileinfo.lineno);
1333 putchar ('\n');
1334 fputs (prefix, stdout);
1335
1336 /* Is this a `define'? */
1337 if (v->recursive && strchr (v->value, '\n') != 0)
1338 printf ("define %s\n%s\nendef\n", v->name, v->value);
1339 else
1340 {
1341 register char *p;
1342
1343 printf ("%s %s= ", v->name, v->recursive ? v->append ? "+" : "" : ":");
1344
1345 /* Check if the value is just whitespace. */
1346 p = next_token (v->value);
1347 if (p != v->value && *p == '\0')
1348 /* All whitespace. */
1349 printf ("$(subst ,,%s)", v->value);
1350 else if (v->recursive)
1351 fputs (v->value, stdout);
1352 else
1353 /* Double up dollar signs. */
1354 for (p = v->value; *p != '\0'; ++p)
1355 {
1356 if (*p == '$')
1357 putchar ('$');
1358 putchar (*p);
1359 }
1360 putchar ('\n');
1361 }
1362}
1363
1364
1365/* Print all the variables in SET. PREFIX is printed before
1366 the actual variable definitions (everything else is comments). */
1367
1368void
1369print_variable_set (struct variable_set *set, char *prefix)
1370{
1371 hash_map_arg (&set->table, print_variable, prefix);
1372
1373 fputs (_("# variable set hash-table stats:\n"), stdout);
1374 fputs ("# ", stdout);
1375 hash_print_stats (&set->table, stdout);
1376 putc ('\n', stdout);
1377}
1378
1379/* Print the data base of variables. */
1380
1381void
1382print_variable_data_base (void)
1383{
1384 puts (_("\n# Variables\n"));
1385
1386 print_variable_set (&global_variable_set, "");
1387
1388 puts (_("\n# Pattern-specific Variable Values"));
1389
1390 {
1391 struct pattern_var *p;
1392 int rules = 0;
1393
1394 for (p = pattern_vars; p != 0; p = p->next)
1395 {
1396 ++rules;
1397 printf ("\n%s :\n", p->target);
1398 print_variable (&p->variable, "# ");
1399 }
1400
1401 if (rules == 0)
1402 puts (_("\n# No pattern-specific variable values."));
1403 else
1404 printf (_("\n# %u pattern-specific variable values"), rules);
1405 }
1406}
1407
1408
1409/* Print all the local variables of FILE. */
1410
1411void
1412print_file_variables (struct file *file)
1413{
1414 if (file->variables != 0)
1415 print_variable_set (file->variables->set, "# ");
1416}
1417
1418#ifdef WINDOWS32
1419void
1420sync_Path_environment (void)
1421{
1422 char *path = allocated_variable_expand ("$(Path)");
1423 static char *environ_path = NULL;
1424
1425 if (!path)
1426 return;
1427
1428 /*
1429 * If done this before, don't leak memory unnecessarily.
1430 * Free the previous entry before allocating new one.
1431 */
1432 if (environ_path)
1433 free (environ_path);
1434
1435 /*
1436 * Create something WINDOWS32 world can grok
1437 */
1438 convert_Path_to_windows32 (path, ';');
1439 environ_path = concat ("Path", "=", path);
1440 putenv (environ_path);
1441 free (path);
1442}
1443#endif
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette