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