VirtualBox

source: kBuild/trunk/src/gmakenew/read.c@ 936

Last change on this file since 936 was 922, checked in by bird, 18 years ago

working on the maybe (+|) part.

  • Property svn:eol-style set to native
File size: 96.3 KB
Line 
1/* Reading and parsing of makefiles for GNU Make.
2Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
31998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software
4Foundation, Inc.
5This file is part of GNU Make.
6
7GNU Make is free software; you can redistribute it and/or modify it under the
8terms of the GNU General Public License as published by the Free Software
9Foundation; either version 2, or (at your option) any later version.
10
11GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
13A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License along with
16GNU Make; see the file COPYING. If not, write to the Free Software
17Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */
18
19#include "make.h"
20
21#include <assert.h>
22
23#include <glob.h>
24
25#include "dep.h"
26#include "filedef.h"
27#include "job.h"
28#include "commands.h"
29#include "variable.h"
30#include "rule.h"
31#include "debug.h"
32#include "hash.h"
33#ifdef KMK
34# include "kbuild.h"
35#endif
36
37
38#ifndef WINDOWS32
39#ifndef _AMIGA
40#ifndef VMS
41#include <pwd.h>
42#else
43struct passwd *getpwnam (char *name);
44#endif
45#endif
46#endif /* !WINDOWS32 */
47
48/* A 'struct ebuffer' controls the origin of the makefile we are currently
49 eval'ing.
50*/
51
52struct ebuffer
53 {
54 char *buffer; /* Start of the current line in the buffer. */
55 char *bufnext; /* Start of the next line in the buffer. */
56 char *bufstart; /* Start of the entire buffer. */
57 unsigned int size; /* Malloc'd size of buffer. */
58 FILE *fp; /* File, or NULL if this is an internal buffer. */
59 struct floc floc; /* Info on the file in fp (if any). */
60 };
61
62/* Types of "words" that can be read in a makefile. */
63enum make_word_type
64 {
65 w_bogus, w_eol, w_static, w_variable, w_colon, w_dcolon, w_semicolon,
66 w_varassign
67 };
68
69
70/* A `struct conditionals' contains the information describing
71 all the active conditionals in a makefile.
72
73 The global variable `conditionals' contains the conditionals
74 information for the current makefile. It is initialized from
75 the static structure `toplevel_conditionals' and is later changed
76 to new structures for included makefiles. */
77
78struct conditionals
79 {
80 unsigned int if_cmds; /* Depth of conditional nesting. */
81 unsigned int allocated; /* Elts allocated in following arrays. */
82 char *ignoring; /* Are we ignoring or interpreting?
83 0=interpreting, 1=not yet interpreted,
84 2=already interpreted */
85 char *seen_else; /* Have we already seen an `else'? */
86 };
87
88static struct conditionals toplevel_conditionals;
89static struct conditionals *conditionals = &toplevel_conditionals;
90
91
92/* Default directories to search for include files in */
93
94static const char *default_include_directories[] =
95 {
96#ifndef KMK
97#if defined(WINDOWS32) && !defined(INCLUDEDIR)
98/* This completely up to the user when they install MSVC or other packages.
99 This is defined as a placeholder. */
100# define INCLUDEDIR "."
101#endif
102# ifdef INCLUDEDIR /* bird */
103 INCLUDEDIR,
104# else /* bird */
105 ".", /* bird */
106# endif /* bird */
107#ifndef _AMIGA
108 "/usr/gnu/include",
109 "/usr/local/include",
110 "/usr/include",
111#endif
112#endif /* !KMK */
113 0
114 };
115
116/* List of directories to search for include files in */
117
118static const char **include_directories;
119
120/* Maximum length of an element of the above. */
121
122static unsigned int max_incl_len;
123
124/* The filename and pointer to line number of the
125 makefile currently being read in. */
126
127const struct floc *reading_file = 0;
128
129/* The chain of makefiles read by read_makefile. */
130
131static struct dep *read_makefiles = 0;
132
133static int eval_makefile (const char *filename, int flags);
134static int eval (struct ebuffer *buffer, int flags);
135
136static long readline (struct ebuffer *ebuf);
137static void do_define (char *name, unsigned int namelen,
138 enum variable_origin origin, struct ebuffer *ebuf);
139static int conditional_line (char *line, int len, const struct floc *flocp);
140static void record_files (struct nameseq *filenames, const char *pattern,
141 const char *pattern_percent, struct dep *deps,
142 unsigned int cmds_started, char *commands,
143 unsigned int commands_idx, int two_colon,
144 const struct floc *flocp);
145static void record_target_var (struct nameseq *filenames, char *defn,
146 enum variable_origin origin, int enabled,
147 const struct floc *flocp);
148static enum make_word_type get_next_mword (char *buffer, char *delim,
149 char **startp, unsigned int *length);
150static void remove_comments (char *line);
151static char *find_char_unquote (char *string, int stop1, int stop2,
152 int blank, int ignorevars);
153
154
155/* Read in all the makefiles and return the chain of their names. */
156
157struct dep *
158read_all_makefiles (const char **makefiles)
159{
160 unsigned int num_makefiles = 0;
161
162 /* Create *_LIST variables, to hold the makefiles, targets, and variables
163 we will be reading. */
164
165 define_variable ("MAKEFILE_LIST", sizeof ("MAKEFILE_LIST")-1, "", o_file, 0);
166
167 DB (DB_BASIC, (_("Reading makefiles...\n")));
168
169 /* If there's a non-null variable MAKEFILES, its value is a list of
170 files to read first thing. But don't let it prevent reading the
171 default makefiles and don't let the default goal come from there. */
172
173 {
174 char *value;
175 char *name, *p;
176 unsigned int length;
177
178 {
179 /* Turn off --warn-undefined-variables while we expand MAKEFILES. */
180 int save = warn_undefined_variables_flag;
181 warn_undefined_variables_flag = 0;
182
183 value = allocated_variable_expand ("$(MAKEFILES)");
184
185 warn_undefined_variables_flag = save;
186 }
187
188 /* Set NAME to the start of next token and LENGTH to its length.
189 MAKEFILES is updated for finding remaining tokens. */
190 p = value;
191
192 while ((name = find_next_token ((const char **)&p, &length)) != 0)
193 {
194 if (*p != '\0')
195 *p++ = '\0';
196 eval_makefile (name, RM_NO_DEFAULT_GOAL|RM_INCLUDED|RM_DONTCARE);
197 }
198
199 free (value);
200 }
201
202 /* Read makefiles specified with -f switches. */
203
204 if (makefiles != 0)
205 while (*makefiles != 0)
206 {
207 struct dep *tail = read_makefiles;
208 register struct dep *d;
209
210 if (! eval_makefile (*makefiles, 0))
211 perror_with_name ("", *makefiles);
212
213 /* Find the right element of read_makefiles. */
214 d = read_makefiles;
215 while (d->next != tail)
216 d = d->next;
217
218 /* Use the storage read_makefile allocates. */
219 *makefiles = dep_name (d);
220 ++num_makefiles;
221 ++makefiles;
222 }
223
224 /* If there were no -f switches, try the default names. */
225
226 if (num_makefiles == 0)
227 {
228 static char *default_makefiles[] =
229#ifdef VMS
230 /* all lower case since readdir() (the vms version) 'lowercasifies' */
231# ifdef KMK
232 { "makefile.kmk", "makefile.vms", "gnumakefile.", "makefile.", 0 };
233# else
234 { "makefile.vms", "gnumakefile.", "makefile.", 0 };
235# endif
236#else
237#ifdef _AMIGA
238 /* what's the deal here? no dots? */
239# ifdef KMK
240 { "Makefile.kmk", "makefile.kmk", "GNUmakefile", "Makefile", "SMakefile", 0 };
241# else
242 { "GNUmakefile", "Makefile", "SMakefile", 0 };
243# endif
244#else /* !Amiga && !VMS */
245# ifdef KMK
246 { "Makefile.kmk", "makefile.kmk", "GNUmakefile", "makefile", "Makefile", 0 };
247# else
248 { "GNUmakefile", "makefile", "Makefile", 0 };
249# endif
250#endif /* AMIGA */
251#endif /* VMS */
252 register char **p = default_makefiles;
253 while (*p != 0 && !file_exists_p (*p))
254 ++p;
255
256 if (*p != 0)
257 {
258 if (! eval_makefile (*p, 0))
259 perror_with_name ("", *p);
260 }
261 else
262 {
263 /* No default makefile was found. Add the default makefiles to the
264 `read_makefiles' chain so they will be updated if possible. */
265 struct dep *tail = read_makefiles;
266 /* Add them to the tail, after any MAKEFILES variable makefiles. */
267 while (tail != 0 && tail->next != 0)
268 tail = tail->next;
269 for (p = default_makefiles; *p != 0; ++p)
270 {
271 struct dep *d = alloc_dep ();
272 d->file = enter_file (strcache_add (*p));
273 d->file->dontcare = 1;
274 /* Tell update_goal_chain to bail out as soon as this file is
275 made, and main not to die if we can't make this file. */
276 d->changed = RM_DONTCARE;
277 if (tail == 0)
278 read_makefiles = d;
279 else
280 tail->next = d;
281 tail = d;
282 }
283 if (tail != 0)
284 tail->next = 0;
285 }
286 }
287
288 return read_makefiles;
289}
290
291
292/* Install a new conditional and return the previous one. */
293
294static struct conditionals *
295install_conditionals (struct conditionals *new)
296{
297 struct conditionals *save = conditionals;
298
299 memset (new, '\0', sizeof (*new));
300 conditionals = new;
301
302 return save;
303}
304
305/* Free the current conditionals and reinstate a saved one. */
306
307static void
308restore_conditionals (struct conditionals *saved)
309{
310 /* Free any space allocated by conditional_line. */
311 if (conditionals->ignoring)
312 free (conditionals->ignoring);
313 if (conditionals->seen_else)
314 free (conditionals->seen_else);
315
316 /* Restore state. */
317 conditionals = saved;
318}
319
320
321static int
322eval_makefile (const char *filename, int flags)
323{
324 struct dep *deps;
325 struct ebuffer ebuf;
326 const struct floc *curfile;
327 char *expanded = 0;
328 int makefile_errno;
329 int r;
330
331 filename = strcache_add (filename);
332 ebuf.floc.filenm = filename;
333 ebuf.floc.lineno = 1;
334
335 if (ISDB (DB_VERBOSE))
336 {
337 printf (_("Reading makefile `%s'"), filename);
338 if (flags & RM_NO_DEFAULT_GOAL)
339 printf (_(" (no default goal)"));
340 if (flags & RM_INCLUDED)
341 printf (_(" (search path)"));
342 if (flags & RM_DONTCARE)
343 printf (_(" (don't care)"));
344 if (flags & RM_NO_TILDE)
345 printf (_(" (no ~ expansion)"));
346 puts ("...");
347 }
348
349 /* First, get a stream to read. */
350
351 /* Expand ~ in FILENAME unless it came from `include',
352 in which case it was already done. */
353 if (!(flags & RM_NO_TILDE) && filename[0] == '~')
354 {
355 expanded = tilde_expand (filename);
356 if (expanded != 0)
357 filename = expanded;
358 }
359
360 ebuf.fp = fopen (filename, "r");
361 /* Save the error code so we print the right message later. */
362 makefile_errno = errno;
363
364 /* If the makefile wasn't found and it's either a makefile from
365 the `MAKEFILES' variable or an included makefile,
366 search the included makefile search path for this makefile. */
367 if (ebuf.fp == 0 && (flags & RM_INCLUDED) && *filename != '/')
368 {
369 unsigned int i;
370 for (i = 0; include_directories[i] != 0; ++i)
371 {
372 const char *included = concat (include_directories[i], "/", filename);
373 ebuf.fp = fopen (included, "r");
374 if (ebuf.fp)
375 {
376 filename = strcache_add (included);
377 break;
378 }
379 }
380 }
381
382 /* Add FILENAME to the chain of read makefiles. */
383 deps = alloc_dep ();
384 deps->next = read_makefiles;
385 read_makefiles = deps;
386 deps->file = lookup_file (filename);
387 if (deps->file == 0)
388 deps->file = enter_file (filename);
389 filename = deps->file->name;
390 deps->changed = flags;
391 if (flags & RM_DONTCARE)
392 deps->file->dontcare = 1;
393
394 if (expanded)
395 free (expanded);
396
397 /* If the makefile can't be found at all, give up entirely. */
398
399 if (ebuf.fp == 0)
400 {
401 /* If we did some searching, errno has the error from the last
402 attempt, rather from FILENAME itself. Restore it in case the
403 caller wants to use it in a message. */
404 errno = makefile_errno;
405 return 0;
406 }
407
408 /* Add this makefile to the list. */
409 do_variable_definition (&ebuf.floc, "MAKEFILE_LIST", filename, o_file,
410 f_append, 0);
411
412 /* Evaluate the makefile */
413
414 ebuf.size = 200;
415 ebuf.buffer = ebuf.bufnext = ebuf.bufstart = xmalloc (ebuf.size);
416
417 curfile = reading_file;
418 reading_file = &ebuf.floc;
419
420 r = eval (&ebuf, !(flags & RM_NO_DEFAULT_GOAL));
421
422 reading_file = curfile;
423
424 fclose (ebuf.fp);
425
426 free (ebuf.bufstart);
427 alloca (0);
428 return r;
429}
430
431int
432eval_buffer (char *buffer)
433{
434 struct ebuffer ebuf;
435 struct conditionals *saved;
436 struct conditionals new;
437 const struct floc *curfile;
438 int r;
439
440 /* Evaluate the buffer */
441
442 ebuf.size = strlen (buffer);
443 ebuf.buffer = ebuf.bufnext = ebuf.bufstart = buffer;
444 ebuf.fp = NULL;
445
446 ebuf.floc = *reading_file;
447
448 curfile = reading_file;
449 reading_file = &ebuf.floc;
450
451 saved = install_conditionals (&new);
452
453 r = eval (&ebuf, 1);
454
455 restore_conditionals (saved);
456
457 reading_file = curfile;
458
459 alloca (0);
460 return r;
461}
462
463#ifdef CONFIG_WITH_INCLUDEDEP
464/* no nonsense dependency file including. */
465void
466eval_include_dep (const char *name, struct floc *f)
467{
468 FILE *fp;
469 long max_size;
470 long size;
471 char *buf;
472 unsigned int saved_var_len;
473 char *saved_var_buf;
474
475 /* ignore non-existing dependency files. */
476 if (!file_exists_p (name))
477 return;
478
479 /* open it and determin the size. */
480 errno = 0;
481 fp = fopen (name, "r");
482 if (!fp)
483 {
484 error (f, "%s: %s", name, strerror (errno));
485 return;
486 }
487
488 if (fseek (fp, 0, SEEK_END))
489 fatal (f, "%s: fseek failed - %s", name, strerror (errno));
490 max_size = ftell (fp);
491 if (max_size < 0)
492 fatal (f, "%s: ftell failed - %s", name, strerror (errno));
493 if (fseek (fp, 0, SEEK_SET))
494 fatal (f, "%s: fseek failed - %s", name, strerror (errno));
495
496 /* ignore empty files. */
497 if (max_size == 0)
498 {
499 fclose (fp);
500 return;
501 }
502
503 /* allocate a buffer and read the file. \r\n -> \n conversion
504 make this intersting ... */
505 buf = xmalloc (max_size + 1);
506 size = fread (buf, 1, max_size, fp); /* FIXME: EINTR? incomplete reads? */
507 if ( size == -1
508 || (ferror (fp) && !feof (fp)))
509 fatal (f, "%s: fread failed - %s", name, strerror (errno));
510 if (size < max_size / 2)
511 fatal (f, "%s: fread failed - %s", name, strerror (errno));
512 buf[size] = '\0';
513
514 /* evaluate the buffer and cleanup. */
515 install_variable_buffer (&saved_var_buf, &saved_var_len);
516 eval_buffer (buf);
517 restore_variable_buffer (saved_var_buf, saved_var_len);
518
519 free (buf);
520 fclose (fp);
521}
522#endif /* CONFIG_WITH_INCLUDEDEP */
523
524
525
526/* Read file FILENAME as a makefile and add its contents to the data base.
527
528 SET_DEFAULT is true if we are allowed to set the default goal. */
529
530
531static int
532eval (struct ebuffer *ebuf, int set_default)
533{
534 char *collapsed = 0;
535 unsigned int collapsed_length = 0;
536 unsigned int commands_len = 200;
537 char *commands;
538 unsigned int commands_idx = 0;
539 unsigned int cmds_started, tgts_started;
540 int ignoring = 0, in_ignored_define = 0;
541 int no_targets = 0; /* Set when reading a rule without targets. */
542 struct nameseq *filenames = 0;
543 struct dep *deps = 0;
544 long nlines = 0;
545 int two_colon = 0;
546 const char *pattern = 0;
547 const char *pattern_percent;
548 struct floc *fstart;
549 struct floc fi;
550
551#define record_waiting_files() \
552 do \
553 { \
554 if (filenames != 0) \
555 { \
556 fi.lineno = tgts_started; \
557 record_files (filenames, pattern, pattern_percent, deps, \
558 cmds_started, commands, commands_idx, two_colon, \
559 &fi); \
560 } \
561 filenames = 0; \
562 commands_idx = 0; \
563 no_targets = 0; \
564 pattern = 0; \
565 } while (0)
566
567 pattern_percent = 0;
568 cmds_started = tgts_started = 1;
569
570 fstart = &ebuf->floc;
571 fi.filenm = ebuf->floc.filenm;
572
573 /* Loop over lines in the file.
574 The strategy is to accumulate target names in FILENAMES, dependencies
575 in DEPS and commands in COMMANDS. These are used to define a rule
576 when the start of the next rule (or eof) is encountered.
577
578 When you see a "continue" in the loop below, that means we are moving on
579 to the next line _without_ ending any rule that we happen to be working
580 with at the moment. If you see a "goto rule_complete", then the
581 statement we just parsed also finishes the previous rule. */
582
583 commands = xmalloc (200);
584
585 while (1)
586 {
587 unsigned int linelen;
588 char *line;
589 unsigned int wlen;
590 char *p;
591 char *p2;
592
593 /* Grab the next line to be evaluated */
594 ebuf->floc.lineno += nlines;
595 nlines = readline (ebuf);
596
597 /* If there is nothing left to eval, we're done. */
598 if (nlines < 0)
599 break;
600
601 /* If this line is empty, skip it. */
602 line = ebuf->buffer;
603 if (line[0] == '\0')
604 continue;
605
606 linelen = strlen (line);
607
608 /* Check for a shell command line first.
609 If it is not one, we can stop treating tab specially. */
610 if (line[0] == cmd_prefix)
611 {
612 if (no_targets)
613 /* Ignore the commands in a rule with no targets. */
614 continue;
615
616 /* If there is no preceding rule line, don't treat this line
617 as a command, even though it begins with a tab character.
618 SunOS 4 make appears to behave this way. */
619
620 if (filenames != 0)
621 {
622 if (ignoring)
623 /* Yep, this is a shell command, and we don't care. */
624 continue;
625
626 /* Append this command line to the line being accumulated. */
627 if (commands_idx == 0)
628 cmds_started = ebuf->floc.lineno;
629
630 if (linelen + 1 + commands_idx > commands_len)
631 {
632 commands_len = (linelen + 1 + commands_idx) * 2;
633 commands = xrealloc (commands, commands_len);
634 }
635 memcpy (&commands[commands_idx], line, linelen);
636 commands_idx += linelen;
637 commands[commands_idx++] = '\n';
638
639 continue;
640 }
641 }
642
643 /* This line is not a shell command line. Don't worry about tabs.
644 Get more space if we need it; we don't need to preserve the current
645 contents of the buffer. */
646
647 if (collapsed_length < linelen+1)
648 {
649 collapsed_length = linelen+1;
650 if (collapsed)
651 free (collapsed);
652 collapsed = xmalloc (collapsed_length);
653 }
654 strcpy (collapsed, line);
655 /* Collapse continuation lines. */
656 collapse_continuations (collapsed);
657 remove_comments (collapsed);
658
659 /* Compare a word, both length and contents. */
660#define word1eq(s) (wlen == sizeof(s)-1 && strneq (s, p, sizeof(s)-1))
661 p = collapsed;
662 while (isspace ((unsigned char)*p))
663 ++p;
664
665 if (*p == '\0')
666 /* This line is completely empty--ignore it. */
667 continue;
668
669 /* Find the end of the first token. Note we don't need to worry about
670 * ":" here since we compare tokens by length (so "export" will never
671 * be equal to "export:").
672 */
673 for (p2 = p+1; *p2 != '\0' && !isspace ((unsigned char)*p2); ++p2)
674 ;
675 wlen = p2 - p;
676
677 /* Find the start of the second token. If it looks like a target or
678 variable definition it can't be a preprocessor token so skip
679 them--this allows variables/targets named `ifdef', `export', etc. */
680 while (isspace ((unsigned char)*p2))
681 ++p2;
682
683 if ((p2[0] == ':' || p2[0] == '+' || p2[0] == '=') && p2[1] == '\0')
684 {
685 /* It can't be a preprocessor token so skip it if we're ignoring */
686 if (ignoring)
687 continue;
688
689 goto skip_conditionals;
690 }
691
692 /* We must first check for conditional and `define' directives before
693 ignoring anything, since they control what we will do with
694 following lines. */
695
696 if (!in_ignored_define)
697 {
698 int i = conditional_line (p, wlen, fstart);
699 if (i != -2)
700 {
701 if (i == -1)
702 fatal (fstart, _("invalid syntax in conditional"));
703
704 ignoring = i;
705 continue;
706 }
707 }
708
709 if (word1eq ("endef"))
710 {
711 if (!in_ignored_define)
712 fatal (fstart, _("extraneous `endef'"));
713 in_ignored_define = 0;
714 continue;
715 }
716
717 if (word1eq ("define"))
718 {
719 if (ignoring)
720 in_ignored_define = 1;
721 else
722 {
723 if (*p2 == '\0')
724 fatal (fstart, _("empty variable name"));
725
726 /* Let the variable name be the whole rest of the line,
727 with trailing blanks stripped (comments have already been
728 removed), so it could be a complex variable/function
729 reference that might contain blanks. */
730 p = strchr (p2, '\0');
731 while (isblank ((unsigned char)p[-1]))
732 --p;
733 do_define (p2, p - p2, o_file, ebuf);
734 }
735 continue;
736 }
737
738 if (word1eq ("override"))
739 {
740 if (*p2 == '\0')
741 error (fstart, _("empty `override' directive"));
742
743 if (strneq (p2, "define", 6)
744 && (isblank ((unsigned char)p2[6]) || p2[6] == '\0'))
745 {
746 if (ignoring)
747 in_ignored_define = 1;
748 else
749 {
750 p2 = next_token (p2 + 6);
751 if (*p2 == '\0')
752 fatal (fstart, _("empty variable name"));
753
754 /* Let the variable name be the whole rest of the line,
755 with trailing blanks stripped (comments have already been
756 removed), so it could be a complex variable/function
757 reference that might contain blanks. */
758 p = strchr (p2, '\0');
759 while (isblank ((unsigned char)p[-1]))
760 --p;
761 do_define (p2, p - p2, o_override, ebuf);
762 }
763 }
764 else if (!ignoring
765 && !try_variable_definition (fstart, p2, o_override, 0))
766 error (fstart, _("invalid `override' directive"));
767
768 continue;
769 }
770
771 if (ignoring)
772 /* Ignore the line. We continue here so conditionals
773 can appear in the middle of a rule. */
774 continue;
775
776 if (word1eq ("export"))
777 {
778 /* 'export' by itself causes everything to be exported. */
779 if (*p2 == '\0')
780 export_all_variables = 1;
781 else
782 {
783 struct variable *v;
784
785 v = try_variable_definition (fstart, p2, o_file, 0);
786 if (v != 0)
787 v->export = v_export;
788 else
789 {
790 unsigned int l;
791 const char *cp;
792 char *ap;
793
794 /* Expand the line so we can use indirect and constructed
795 variable names in an export command. */
796 cp = ap = allocated_variable_expand (p2);
797
798 for (p = find_next_token (&cp, &l); p != 0;
799 p = find_next_token (&cp, &l))
800 {
801 v = lookup_variable (p, l);
802 if (v == 0)
803 v = define_variable_loc (p, l, "", o_file, 0, fstart);
804 v->export = v_export;
805 }
806
807 free (ap);
808 }
809 }
810 goto rule_complete;
811 }
812
813 if (word1eq ("unexport"))
814 {
815 if (*p2 == '\0')
816 export_all_variables = 0;
817 else
818 {
819 unsigned int l;
820 struct variable *v;
821 const char *cp;
822 char *ap;
823
824 /* Expand the line so we can use indirect and constructed
825 variable names in an unexport command. */
826 cp = ap = allocated_variable_expand (p2);
827
828 for (p = find_next_token (&cp, &l); p != 0;
829 p = find_next_token (&cp, &l))
830 {
831 v = lookup_variable (p, l);
832 if (v == 0)
833 v = define_variable_loc (p, l, "", o_file, 0, fstart);
834
835 v->export = v_noexport;
836 }
837
838 free (ap);
839 }
840 goto rule_complete;
841 }
842
843 skip_conditionals:
844 if (word1eq ("vpath"))
845 {
846 const char *cp;
847 char *vpat;
848 unsigned int l;
849 cp = variable_expand (p2);
850 p = find_next_token (&cp, &l);
851 if (p != 0)
852 {
853 vpat = savestring (p, l);
854 p = find_next_token (&cp, &l);
855 /* No searchpath means remove all previous
856 selective VPATH's with the same pattern. */
857 }
858 else
859 /* No pattern means remove all previous selective VPATH's. */
860 vpat = 0;
861 construct_vpath_list (vpat, p);
862 if (vpat != 0)
863 free (vpat);
864
865 goto rule_complete;
866 }
867
868#ifdef CONFIG_WITH_INCLUDEDEP
869 if (word1eq ("includedep"))
870 {
871 /* We have found an `includedep' line specifying a single nested
872 makefile to be read at this point. This include variation
873 does not globbing and doesn't support multiple names. It's
874 trying to save time by being dead simple. */
875 char *name = p2;
876 char *end = strchr(name, '\0');
877 char saved;
878
879 while (end > name && isspace ((unsigned char)end[-1]))
880 --end;
881
882 saved = *end; /* not sure if this is required... */
883 *end = '\0';
884 eval_include_dep (name, fstart);
885 *end = saved;
886
887 goto rule_complete;
888 }
889#endif /* CONFIG_WITH_INCLUDEDEP */
890
891 if (word1eq ("include") || word1eq ("-include") || word1eq ("sinclude"))
892 {
893 /* We have found an `include' line specifying a nested
894 makefile to be read at this point. */
895 struct conditionals *save;
896 struct conditionals new_conditionals;
897 struct nameseq *files;
898 /* "-include" (vs "include") says no error if the file does not
899 exist. "sinclude" is an alias for this from SGI. */
900 int noerror = (p[0] != 'i');
901
902 p = allocated_variable_expand (p2);
903
904 /* If no filenames, it's a no-op. */
905 if (*p == '\0')
906 {
907 free (p);
908 continue;
909 }
910
911 /* Parse the list of file names. */
912 p2 = p;
913 files = multi_glob (parse_file_seq (&p2, '\0',
914 sizeof (struct nameseq),
915 1),
916 sizeof (struct nameseq));
917 free (p);
918
919 /* Save the state of conditionals and start
920 the included makefile with a clean slate. */
921 save = install_conditionals (&new_conditionals);
922
923 /* Record the rules that are waiting so they will determine
924 the default goal before those in the included makefile. */
925 record_waiting_files ();
926
927 /* Read each included makefile. */
928 while (files != 0)
929 {
930 struct nameseq *next = files->next;
931 const char *name = files->name;
932 int r;
933
934 free (files);
935 files = next;
936
937 r = eval_makefile (name, (RM_INCLUDED | RM_NO_TILDE
938 | (noerror ? RM_DONTCARE : 0)));
939 if (!r && !noerror)
940 error (fstart, "%s: %s", name, strerror (errno));
941 }
942
943 /* Restore conditional state. */
944 restore_conditionals (save);
945
946 goto rule_complete;
947 }
948
949 if (try_variable_definition (fstart, p, o_file, 0))
950 /* This line has been dealt with. */
951 goto rule_complete;
952
953 /* This line starts with a tab but was not caught above because there
954 was no preceding target, and the line might have been usable as a
955 variable definition. But now we know it is definitely lossage. */
956 if (line[0] == cmd_prefix)
957 fatal(fstart, _("commands commence before first target"));
958
959 /* This line describes some target files. This is complicated by
960 the existence of target-specific variables, because we can't
961 expand the entire line until we know if we have one or not. So
962 we expand the line word by word until we find the first `:',
963 then check to see if it's a target-specific variable.
964
965 In this algorithm, `lb_next' will point to the beginning of the
966 unexpanded parts of the input buffer, while `p2' points to the
967 parts of the expanded buffer we haven't searched yet. */
968
969 {
970 enum make_word_type wtype;
971 enum variable_origin v_origin;
972 int exported;
973 char *cmdleft, *semip, *lb_next;
974 unsigned int plen = 0;
975 char *colonp;
976 const char *end, *beg; /* Helpers for whitespace stripping. */
977
978 /* Record the previous rule. */
979
980 record_waiting_files ();
981 tgts_started = fstart->lineno;
982
983 /* Search the line for an unquoted ; that is not after an
984 unquoted #. */
985 cmdleft = find_char_unquote (line, ';', '#', 0, 1);
986 if (cmdleft != 0 && *cmdleft == '#')
987 {
988 /* We found a comment before a semicolon. */
989 *cmdleft = '\0';
990 cmdleft = 0;
991 }
992 else if (cmdleft != 0)
993 /* Found one. Cut the line short there before expanding it. */
994 *(cmdleft++) = '\0';
995 semip = cmdleft;
996
997 collapse_continuations (line);
998
999 /* We can't expand the entire line, since if it's a per-target
1000 variable we don't want to expand it. So, walk from the
1001 beginning, expanding as we go, and looking for "interesting"
1002 chars. The first word is always expandable. */
1003 wtype = get_next_mword(line, NULL, &lb_next, &wlen);
1004 switch (wtype)
1005 {
1006 case w_eol:
1007 if (cmdleft != 0)
1008 fatal(fstart, _("missing rule before commands"));
1009 /* This line contained something but turned out to be nothing
1010 but whitespace (a comment?). */
1011 continue;
1012
1013 case w_colon:
1014 case w_dcolon:
1015 /* We accept and ignore rules without targets for
1016 compatibility with SunOS 4 make. */
1017 no_targets = 1;
1018 continue;
1019
1020 default:
1021 break;
1022 }
1023
1024 p2 = variable_expand_string(NULL, lb_next, wlen);
1025
1026 while (1)
1027 {
1028 lb_next += wlen;
1029 if (cmdleft == 0)
1030 {
1031 /* Look for a semicolon in the expanded line. */
1032 cmdleft = find_char_unquote (p2, ';', 0, 0, 0);
1033
1034 if (cmdleft != 0)
1035 {
1036 unsigned long p2_off = p2 - variable_buffer;
1037 unsigned long cmd_off = cmdleft - variable_buffer;
1038 char *pend = p2 + strlen(p2);
1039
1040 /* Append any remnants of lb, then cut the line short
1041 at the semicolon. */
1042 *cmdleft = '\0';
1043
1044 /* One school of thought says that you shouldn't expand
1045 here, but merely copy, since now you're beyond a ";"
1046 and into a command script. However, the old parser
1047 expanded the whole line, so we continue that for
1048 backwards-compatiblity. Also, it wouldn't be
1049 entirely consistent, since we do an unconditional
1050 expand below once we know we don't have a
1051 target-specific variable. */
1052 (void)variable_expand_string(pend, lb_next, (long)-1);
1053 lb_next += strlen(lb_next);
1054 p2 = variable_buffer + p2_off;
1055 cmdleft = variable_buffer + cmd_off + 1;
1056 }
1057 }
1058
1059 colonp = find_char_unquote(p2, ':', 0, 0, 0);
1060#ifdef HAVE_DOS_PATHS
1061 /* The drive spec brain-damage strikes again... */
1062 /* Note that the only separators of targets in this context
1063 are whitespace and a left paren. If others are possible,
1064 they should be added to the string in the call to index. */
1065 while (colonp && (colonp[1] == '/' || colonp[1] == '\\') &&
1066 colonp > p2 && isalpha ((unsigned char)colonp[-1]) &&
1067 (colonp == p2 + 1 || strchr (" \t(", colonp[-2]) != 0))
1068 colonp = find_char_unquote(colonp + 1, ':', 0, 0, 0);
1069#endif
1070 if (colonp != 0)
1071 break;
1072
1073 wtype = get_next_mword(lb_next, NULL, &lb_next, &wlen);
1074 if (wtype == w_eol)
1075 break;
1076
1077 p2 += strlen(p2);
1078 *(p2++) = ' ';
1079 p2 = variable_expand_string(p2, lb_next, wlen);
1080 /* We don't need to worry about cmdleft here, because if it was
1081 found in the variable_buffer the entire buffer has already
1082 been expanded... we'll never get here. */
1083 }
1084
1085 p2 = next_token (variable_buffer);
1086
1087 /* If the word we're looking at is EOL, see if there's _anything_
1088 on the line. If not, a variable expanded to nothing, so ignore
1089 it. If so, we can't parse this line so punt. */
1090 if (wtype == w_eol)
1091 {
1092 if (*p2 != '\0')
1093 /* There's no need to be ivory-tower about this: check for
1094 one of the most common bugs found in makefiles... */
1095 fatal (fstart, _("missing separator%s"),
1096 !strneq(line, " ", 8) ? ""
1097 : _(" (did you mean TAB instead of 8 spaces?)"));
1098 continue;
1099 }
1100
1101 /* Make the colon the end-of-string so we know where to stop
1102 looking for targets. */
1103 *colonp = '\0';
1104 filenames = multi_glob (parse_file_seq (&p2, '\0',
1105 sizeof (struct nameseq),
1106 1),
1107 sizeof (struct nameseq));
1108 *p2 = ':';
1109
1110 if (!filenames)
1111 {
1112 /* We accept and ignore rules without targets for
1113 compatibility with SunOS 4 make. */
1114 no_targets = 1;
1115 continue;
1116 }
1117 /* This should never be possible; we handled it above. */
1118 assert (*p2 != '\0');
1119 ++p2;
1120
1121 /* Is this a one-colon or two-colon entry? */
1122 two_colon = *p2 == ':';
1123 if (two_colon)
1124 p2++;
1125
1126 /* Test to see if it's a target-specific variable. Copy the rest
1127 of the buffer over, possibly temporarily (we'll expand it later
1128 if it's not a target-specific variable). PLEN saves the length
1129 of the unparsed section of p2, for later. */
1130 if (*lb_next != '\0')
1131 {
1132 unsigned int l = p2 - variable_buffer;
1133 plen = strlen (p2);
1134 variable_buffer_output (p2+plen, lb_next, strlen (lb_next)+1);
1135 p2 = variable_buffer + l;
1136 }
1137
1138 /* See if it's an "override" or "export" keyword; if so see if what
1139 comes after it looks like a variable definition. */
1140
1141 wtype = get_next_mword (p2, NULL, &p, &wlen);
1142
1143 v_origin = o_file;
1144 exported = 0;
1145 if (wtype == w_static)
1146 {
1147 if (word1eq ("override"))
1148 {
1149 v_origin = o_override;
1150 wtype = get_next_mword (p+wlen, NULL, &p, &wlen);
1151 }
1152 else if (word1eq ("export"))
1153 {
1154 exported = 1;
1155 wtype = get_next_mword (p+wlen, NULL, &p, &wlen);
1156 }
1157 }
1158
1159 if (wtype != w_eol)
1160 wtype = get_next_mword (p+wlen, NULL, NULL, NULL);
1161
1162 if (wtype == w_varassign)
1163 {
1164 /* If there was a semicolon found, add it back, plus anything
1165 after it. */
1166 if (semip)
1167 {
1168 unsigned int l = p - variable_buffer;
1169 *(--semip) = ';';
1170 variable_buffer_output (p2 + strlen (p2),
1171 semip, strlen (semip)+1);
1172 p = variable_buffer + l;
1173 }
1174 record_target_var (filenames, p, v_origin, exported, fstart);
1175 filenames = 0;
1176 continue;
1177 }
1178
1179 /* This is a normal target, _not_ a target-specific variable.
1180 Unquote any = in the dependency list. */
1181 find_char_unquote (lb_next, '=', 0, 0, 0);
1182
1183 /* We have some targets, so don't ignore the following commands. */
1184 no_targets = 0;
1185
1186 /* Expand the dependencies, etc. */
1187 if (*lb_next != '\0')
1188 {
1189 unsigned int l = p2 - variable_buffer;
1190 (void) variable_expand_string (p2 + plen, lb_next, (long)-1);
1191 p2 = variable_buffer + l;
1192
1193 /* Look for a semicolon in the expanded line. */
1194 if (cmdleft == 0)
1195 {
1196 cmdleft = find_char_unquote (p2, ';', 0, 0, 0);
1197 if (cmdleft != 0)
1198 *(cmdleft++) = '\0';
1199 }
1200 }
1201
1202 /* Is this a static pattern rule: `target: %targ: %dep; ...'? */
1203 p = strchr (p2, ':');
1204 while (p != 0 && p[-1] == '\\')
1205 {
1206 register char *q = &p[-1];
1207 register int backslash = 0;
1208 while (*q-- == '\\')
1209 backslash = !backslash;
1210 if (backslash)
1211 p = strchr (p + 1, ':');
1212 else
1213 break;
1214 }
1215#ifdef _AMIGA
1216 /* Here, the situation is quite complicated. Let's have a look
1217 at a couple of targets:
1218
1219 install: dev:make
1220
1221 dev:make: make
1222
1223 dev:make:: xyz
1224
1225 The rule is that it's only a target, if there are TWO :'s
1226 OR a space around the :.
1227 */
1228 if (p && !(isspace ((unsigned char)p[1]) || !p[1]
1229 || isspace ((unsigned char)p[-1])))
1230 p = 0;
1231#endif
1232#ifdef HAVE_DOS_PATHS
1233 {
1234 int check_again;
1235 do {
1236 check_again = 0;
1237 /* For DOS-style paths, skip a "C:\..." or a "C:/..." */
1238 if (p != 0 && (p[1] == '\\' || p[1] == '/') &&
1239 isalpha ((unsigned char)p[-1]) &&
1240 (p == p2 + 1 || strchr (" \t:(", p[-2]) != 0)) {
1241 p = strchr (p + 1, ':');
1242 check_again = 1;
1243 }
1244 } while (check_again);
1245 }
1246#endif
1247 if (p != 0)
1248 {
1249 struct nameseq *target;
1250 target = parse_file_seq (&p2, ':', sizeof (struct nameseq), 1);
1251 ++p2;
1252 if (target == 0)
1253 fatal (fstart, _("missing target pattern"));
1254 else if (target->next != 0)
1255 fatal (fstart, _("multiple target patterns (target `%s')"), target->name); /* bird */
1256 pattern_percent = find_percent_cached (&target->name);
1257 pattern = target->name;
1258 if (pattern_percent == 0)
1259 fatal (fstart, _("target pattern contains no `%%' (target `%s')"), target->name); /* bird */
1260 free (target);
1261 }
1262 else
1263 pattern = 0;
1264
1265 /* Strip leading and trailing whitespaces. */
1266 beg = p2;
1267 end = beg + strlen (beg) - 1;
1268 strip_whitespace (&beg, &end);
1269
1270 if (beg <= end && *beg != '\0')
1271 {
1272 /* Put all the prerequisites here; they'll be parsed later. */
1273 deps = alloc_dep ();
1274 deps->name = strcache_add_len (beg, end - beg + 1);
1275 }
1276 else
1277 deps = 0;
1278
1279 commands_idx = 0;
1280 if (cmdleft != 0)
1281 {
1282 /* Semicolon means rest of line is a command. */
1283 unsigned int l = strlen (cmdleft);
1284
1285 cmds_started = fstart->lineno;
1286
1287 /* Add this command line to the buffer. */
1288 if (l + 2 > commands_len)
1289 {
1290 commands_len = (l + 2) * 2;
1291 commands = xrealloc (commands, commands_len);
1292 }
1293 memcpy (commands, cmdleft, l);
1294 commands_idx += l;
1295 commands[commands_idx++] = '\n';
1296 }
1297
1298 /* Determine if this target should be made default. We used to do
1299 this in record_files() but because of the delayed target recording
1300 and because preprocessor directives are legal in target's commands
1301 it is too late. Consider this fragment for example:
1302
1303 foo:
1304
1305 ifeq ($(.DEFAULT_GOAL),foo)
1306 ...
1307 endif
1308
1309 Because the target is not recorded until after ifeq directive is
1310 evaluated the .DEFAULT_GOAL does not contain foo yet as one
1311 would expect. Because of this we have to move some of the logic
1312 here. */
1313
1314 if (**default_goal_name == '\0' && set_default)
1315 {
1316 const char *name;
1317 struct dep *d;
1318 struct nameseq *t = filenames;
1319
1320 for (; t != 0; t = t->next)
1321 {
1322 int reject = 0;
1323 name = t->name;
1324
1325 /* We have nothing to do if this is an implicit rule. */
1326 if (strchr (name, '%') != 0)
1327 break;
1328
1329 /* See if this target's name does not start with a `.',
1330 unless it contains a slash. */
1331 if (*name == '.' && strchr (name, '/') == 0
1332#ifdef HAVE_DOS_PATHS
1333 && strchr (name, '\\') == 0
1334#endif
1335 )
1336 continue;
1337
1338
1339 /* If this file is a suffix, don't let it be
1340 the default goal file. */
1341 for (d = suffix_file->deps; d != 0; d = d->next)
1342 {
1343 register struct dep *d2;
1344 if (*dep_name (d) != '.' && streq (name, dep_name (d)))
1345 {
1346 reject = 1;
1347 break;
1348 }
1349 for (d2 = suffix_file->deps; d2 != 0; d2 = d2->next)
1350 {
1351 unsigned int l = strlen (dep_name (d2));
1352 if (!strneq (name, dep_name (d2), l))
1353 continue;
1354 if (streq (name + l, dep_name (d)))
1355 {
1356 reject = 1;
1357 break;
1358 }
1359 }
1360
1361 if (reject)
1362 break;
1363 }
1364
1365 if (!reject)
1366 {
1367 define_variable_global (".DEFAULT_GOAL", 13, t->name,
1368 o_file, 0, NILF);
1369 break;
1370 }
1371 }
1372 }
1373
1374 continue;
1375 }
1376
1377 /* We get here except in the case that we just read a rule line.
1378 Record now the last rule we read, so following spurious
1379 commands are properly diagnosed. */
1380 rule_complete:
1381 record_waiting_files ();
1382 }
1383
1384#undef word1eq
1385
1386 if (conditionals->if_cmds)
1387 fatal (fstart, _("missing `endif'"));
1388
1389 /* At eof, record the last rule. */
1390 record_waiting_files ();
1391
1392 if (collapsed)
1393 free (collapsed);
1394 free (commands);
1395
1396 return 1;
1397}
1398
1399
1400
1401/* Remove comments from LINE.
1402 This is done by copying the text at LINE onto itself. */
1403
1404static void
1405remove_comments (char *line)
1406{
1407 char *comment;
1408
1409 comment = find_char_unquote (line, '#', 0, 0, 0);
1410
1411 if (comment != 0)
1412 /* Cut off the line at the #. */
1413 *comment = '\0';
1414}
1415
1416/* Execute a `define' directive.
1417 The first line has already been read, and NAME is the name of
1418 the variable to be defined. The following lines remain to be read. */
1419
1420static void
1421do_define (char *name, unsigned int namelen,
1422 enum variable_origin origin, struct ebuffer *ebuf)
1423{
1424 struct floc defstart;
1425 long nlines = 0;
1426 int nlevels = 1;
1427 unsigned int length = 100;
1428 char *definition = xmalloc (length);
1429 unsigned int idx = 0;
1430 char *p;
1431
1432 /* Expand the variable name. */
1433 char *var = alloca (namelen + 1);
1434 memcpy (var, name, namelen);
1435 var[namelen] = '\0';
1436 var = variable_expand (var);
1437
1438 defstart = ebuf->floc;
1439
1440 while (1)
1441 {
1442 unsigned int len;
1443 char *line;
1444
1445 nlines = readline (ebuf);
1446 ebuf->floc.lineno += nlines;
1447
1448 /* If there is nothing left to eval, we're done. */
1449 if (nlines < 0)
1450 break;
1451
1452 line = ebuf->buffer;
1453
1454 collapse_continuations (line);
1455
1456 /* If the line doesn't begin with a tab, test to see if it introduces
1457 another define, or ends one. */
1458
1459 /* Stop if we find an 'endef' */
1460 if (line[0] != cmd_prefix)
1461 {
1462 p = next_token (line);
1463 len = strlen (p);
1464
1465 /* If this is another 'define', increment the level count. */
1466 if ((len == 6 || (len > 6 && isblank ((unsigned char)p[6])))
1467 && strneq (p, "define", 6))
1468 ++nlevels;
1469
1470 /* If this is an 'endef', decrement the count. If it's now 0,
1471 we've found the last one. */
1472 else if ((len == 5 || (len > 5 && isblank ((unsigned char)p[5])))
1473 && strneq (p, "endef", 5))
1474 {
1475 p += 5;
1476 remove_comments (p);
1477 if (*next_token (p) != '\0')
1478 error (&ebuf->floc,
1479 _("Extraneous text after `endef' directive"));
1480
1481 if (--nlevels == 0)
1482 {
1483 /* Define the variable. */
1484 if (idx == 0)
1485 definition[0] = '\0';
1486 else
1487 definition[idx - 1] = '\0';
1488
1489 /* Always define these variables in the global set. */
1490 define_variable_global (var, strlen (var), definition,
1491 origin, 1, &defstart);
1492 free (definition);
1493 return;
1494 }
1495 }
1496 }
1497
1498 /* Otherwise add this line to the variable definition. */
1499 len = strlen (line);
1500 if (idx + len + 1 > length)
1501 {
1502 length = (idx + len) * 2;
1503 definition = xrealloc (definition, length + 1);
1504 }
1505
1506 memcpy (&definition[idx], line, len);
1507 idx += len;
1508 /* Separate lines with a newline. */
1509 definition[idx++] = '\n';
1510 }
1511
1512 /* No `endef'!! */
1513 fatal (&defstart, _("missing `endef', unterminated `define'"));
1514
1515 /* NOTREACHED */
1516 return;
1517}
1518
1519
1520/* Interpret conditional commands "ifdef", "ifndef", "ifeq",
1521 "ifneq", "else" and "endif".
1522 LINE is the input line, with the command as its first word.
1523
1524 FILENAME and LINENO are the filename and line number in the
1525 current makefile. They are used for error messages.
1526
1527 Value is -2 if the line is not a conditional at all,
1528 -1 if the line is an invalid conditional,
1529 0 if following text should be interpreted,
1530 1 if following text should be ignored. */
1531
1532static int
1533conditional_line (char *line, int len, const struct floc *flocp)
1534{
1535 char *cmdname;
1536 enum { c_ifdef, c_ifndef, c_ifeq, c_ifneq, c_else, c_endif } cmdtype;
1537 unsigned int i;
1538 unsigned int o;
1539
1540 /* Compare a word, both length and contents. */
1541#define word1eq(s) (len == sizeof(s)-1 && strneq (s, line, sizeof(s)-1))
1542#define chkword(s, t) if (word1eq (s)) { cmdtype = (t); cmdname = (s); }
1543
1544 /* Make sure this line is a conditional. */
1545 chkword ("ifdef", c_ifdef)
1546 else chkword ("ifndef", c_ifndef)
1547 else chkword ("ifeq", c_ifeq)
1548 else chkword ("ifneq", c_ifneq)
1549 else chkword ("else", c_else)
1550 else chkword ("endif", c_endif)
1551 else
1552 return -2;
1553
1554 /* Found one: skip past it and any whitespace after it. */
1555 line = next_token (line + len);
1556
1557#define EXTRANEOUS() error (flocp, _("Extraneous text after `%s' directive"), cmdname)
1558
1559 /* An 'endif' cannot contain extra text, and reduces the if-depth by 1 */
1560 if (cmdtype == c_endif)
1561 {
1562 if (*line != '\0')
1563 EXTRANEOUS ();
1564
1565 if (!conditionals->if_cmds)
1566 fatal (flocp, _("extraneous `%s'"), cmdname);
1567
1568 --conditionals->if_cmds;
1569
1570 goto DONE;
1571 }
1572
1573 /* An 'else' statement can either be simple, or it can have another
1574 conditional after it. */
1575 if (cmdtype == c_else)
1576 {
1577 const char *p;
1578
1579 if (!conditionals->if_cmds)
1580 fatal (flocp, _("extraneous `%s'"), cmdname);
1581
1582 o = conditionals->if_cmds - 1;
1583
1584 if (conditionals->seen_else[o])
1585 fatal (flocp, _("only one `else' per conditional"));
1586
1587 /* Change the state of ignorance. */
1588 switch (conditionals->ignoring[o])
1589 {
1590 case 0:
1591 /* We've just been interpreting. Never do it again. */
1592 conditionals->ignoring[o] = 2;
1593 break;
1594 case 1:
1595 /* We've never interpreted yet. Maybe this time! */
1596 conditionals->ignoring[o] = 0;
1597 break;
1598 }
1599
1600 /* It's a simple 'else'. */
1601 if (*line == '\0')
1602 {
1603 conditionals->seen_else[o] = 1;
1604 goto DONE;
1605 }
1606
1607 /* The 'else' has extra text. That text must be another conditional
1608 and cannot be an 'else' or 'endif'. */
1609
1610 /* Find the length of the next word. */
1611 for (p = line+1; *p != '\0' && !isspace ((unsigned char)*p); ++p)
1612 ;
1613 len = p - line;
1614
1615 /* If it's 'else' or 'endif' or an illegal conditional, fail. */
1616 if (word1eq("else") || word1eq("endif")
1617 || conditional_line (line, len, flocp) < 0)
1618 EXTRANEOUS ();
1619 else
1620 {
1621 /* conditional_line() created a new level of conditional.
1622 Raise it back to this level. */
1623 if (conditionals->ignoring[o] < 2)
1624 conditionals->ignoring[o] = conditionals->ignoring[o+1];
1625 --conditionals->if_cmds;
1626 }
1627
1628 goto DONE;
1629 }
1630
1631 if (conditionals->allocated == 0)
1632 {
1633 conditionals->allocated = 5;
1634 conditionals->ignoring = xmalloc (conditionals->allocated);
1635 conditionals->seen_else = xmalloc (conditionals->allocated);
1636 }
1637
1638 o = conditionals->if_cmds++;
1639 if (conditionals->if_cmds > conditionals->allocated)
1640 {
1641 conditionals->allocated += 5;
1642 conditionals->ignoring = xrealloc (conditionals->ignoring,
1643 conditionals->allocated);
1644 conditionals->seen_else = xrealloc (conditionals->seen_else,
1645 conditionals->allocated);
1646 }
1647
1648 /* Record that we have seen an `if...' but no `else' so far. */
1649 conditionals->seen_else[o] = 0;
1650
1651 /* Search through the stack to see if we're already ignoring. */
1652 for (i = 0; i < o; ++i)
1653 if (conditionals->ignoring[i])
1654 {
1655 /* We are already ignoring, so just push a level to match the next
1656 "else" or "endif", and keep ignoring. We don't want to expand
1657 variables in the condition. */
1658 conditionals->ignoring[o] = 1;
1659 return 1;
1660 }
1661
1662 if (cmdtype == c_ifdef || cmdtype == c_ifndef)
1663 {
1664 char *var;
1665 struct variable *v;
1666 char *p;
1667
1668 /* Expand the thing we're looking up, so we can use indirect and
1669 constructed variable names. */
1670 var = allocated_variable_expand (line);
1671
1672 /* Make sure there's only one variable name to test. */
1673 p = end_of_token (var);
1674 i = p - var;
1675 p = next_token (p);
1676 if (*p != '\0')
1677 return -1;
1678
1679 var[i] = '\0';
1680 v = lookup_variable (var, i);
1681
1682 conditionals->ignoring[o] =
1683 ((v != 0 && *v->value != '\0') == (cmdtype == c_ifndef));
1684
1685 free (var);
1686 }
1687 else
1688 {
1689 /* "ifeq" or "ifneq". */
1690 char *s1, *s2;
1691 unsigned int l;
1692 char termin = *line == '(' ? ',' : *line;
1693
1694 if (termin != ',' && termin != '"' && termin != '\'')
1695 return -1;
1696
1697 s1 = ++line;
1698 /* Find the end of the first string. */
1699 if (termin == ',')
1700 {
1701 int count = 0;
1702 for (; *line != '\0'; ++line)
1703 if (*line == '(')
1704 ++count;
1705 else if (*line == ')')
1706 --count;
1707 else if (*line == ',' && count <= 0)
1708 break;
1709 }
1710 else
1711 while (*line != '\0' && *line != termin)
1712 ++line;
1713
1714 if (*line == '\0')
1715 return -1;
1716
1717 if (termin == ',')
1718 {
1719 /* Strip blanks after the first string. */
1720 char *p = line++;
1721 while (isblank ((unsigned char)p[-1]))
1722 --p;
1723 *p = '\0';
1724 }
1725 else
1726 *line++ = '\0';
1727
1728 s2 = variable_expand (s1);
1729 /* We must allocate a new copy of the expanded string because
1730 variable_expand re-uses the same buffer. */
1731 l = strlen (s2);
1732 s1 = alloca (l + 1);
1733 memcpy (s1, s2, l + 1);
1734
1735 if (termin != ',')
1736 /* Find the start of the second string. */
1737 line = next_token (line);
1738
1739 termin = termin == ',' ? ')' : *line;
1740 if (termin != ')' && termin != '"' && termin != '\'')
1741 return -1;
1742
1743 /* Find the end of the second string. */
1744 if (termin == ')')
1745 {
1746 int count = 0;
1747 s2 = next_token (line);
1748 for (line = s2; *line != '\0'; ++line)
1749 {
1750 if (*line == '(')
1751 ++count;
1752 else if (*line == ')')
1753 {
1754 if (count <= 0)
1755 break;
1756 else
1757 --count;
1758 }
1759 }
1760 }
1761 else
1762 {
1763 ++line;
1764 s2 = line;
1765 while (*line != '\0' && *line != termin)
1766 ++line;
1767 }
1768
1769 if (*line == '\0')
1770 return -1;
1771
1772 *line = '\0';
1773 line = next_token (++line);
1774 if (*line != '\0')
1775 EXTRANEOUS ();
1776
1777 s2 = variable_expand (s2);
1778 conditionals->ignoring[o] = (streq (s1, s2) == (cmdtype == c_ifneq));
1779 }
1780
1781 DONE:
1782 /* Search through the stack to see if we're ignoring. */
1783 for (i = 0; i < conditionals->if_cmds; ++i)
1784 if (conditionals->ignoring[i])
1785 return 1;
1786 return 0;
1787}
1788
1789
1790/* Remove duplicate dependencies in CHAIN. */
1791
1792static unsigned long
1793dep_hash_1 (const void *key)
1794{
1795 return_STRING_HASH_1 (dep_name ((struct dep const *) key));
1796}
1797
1798static unsigned long
1799dep_hash_2 (const void *key)
1800{
1801 return_STRING_HASH_2 (dep_name ((struct dep const *) key));
1802}
1803
1804static int
1805dep_hash_cmp (const void *x, const void *y)
1806{
1807 struct dep *dx = (struct dep *) x;
1808 struct dep *dy = (struct dep *) y;
1809 int cmp = strcmp (dep_name (dx), dep_name (dy));
1810
1811 /* If the names are the same but ignore_mtimes are not equal, one of these
1812 is an order-only prerequisite and one isn't. That means that we should
1813 remove the one that isn't and keep the one that is. */
1814
1815 if (!cmp && dx->ignore_mtime != dy->ignore_mtime)
1816 dx->ignore_mtime = dy->ignore_mtime = 0;
1817
1818 return cmp;
1819}
1820
1821
1822void
1823uniquize_deps (struct dep *chain)
1824{
1825 struct hash_table deps;
1826 register struct dep **depp;
1827
1828 hash_init (&deps, 500, dep_hash_1, dep_hash_2, dep_hash_cmp);
1829
1830 /* Make sure that no dependencies are repeated. This does not
1831 really matter for the purpose of updating targets, but it
1832 might make some names be listed twice for $^ and $?. */
1833
1834 depp = &chain;
1835 while (*depp)
1836 {
1837 struct dep *dep = *depp;
1838 struct dep **dep_slot = (struct dep **) hash_find_slot (&deps, dep);
1839 if (HASH_VACANT (*dep_slot))
1840 {
1841 hash_insert_at (&deps, dep, dep_slot);
1842 depp = &dep->next;
1843 }
1844 else
1845 {
1846 /* Don't bother freeing duplicates.
1847 It's dangerous and little benefit accrues. */
1848 *depp = dep->next;
1849 }
1850 }
1851
1852 hash_free (&deps, 0);
1853}
1854
1855
1856/* Record target-specific variable values for files FILENAMES.
1857 TWO_COLON is nonzero if a double colon was used.
1858
1859 The links of FILENAMES are freed, and so are any names in it
1860 that are not incorporated into other data structures.
1861
1862 If the target is a pattern, add the variable to the pattern-specific
1863 variable value list. */
1864
1865static void
1866record_target_var (struct nameseq *filenames, char *defn,
1867 enum variable_origin origin, int exported,
1868 const struct floc *flocp)
1869{
1870 struct nameseq *nextf;
1871 struct variable_set_list *global;
1872
1873 global = current_variable_set_list;
1874
1875 /* If the variable is an append version, store that but treat it as a
1876 normal recursive variable. */
1877
1878 for (; filenames != 0; filenames = nextf)
1879 {
1880 struct variable *v;
1881 const char *name = filenames->name;
1882 const char *fname;
1883 const char *percent;
1884 struct pattern_var *p;
1885
1886 nextf = filenames->next;
1887 free (filenames);
1888
1889 /* If it's a pattern target, then add it to the pattern-specific
1890 variable list. */
1891 percent = find_percent_cached (&name);
1892 if (percent)
1893 {
1894 /* Get a reference for this pattern-specific variable struct. */
1895 p = create_pattern_var (name, percent);
1896 p->variable.fileinfo = *flocp;
1897 /* I don't think this can fail since we already determined it was a
1898 variable definition. */
1899 v = parse_variable_definition (&p->variable, defn);
1900 assert (v != 0);
1901
1902 if (v->flavor == f_simple)
1903 v->value = allocated_variable_expand (v->value);
1904 else
1905 v->value = xstrdup (v->value);
1906
1907 fname = p->target;
1908 }
1909 else
1910 {
1911 struct file *f;
1912
1913 /* Get a file reference for this file, and initialize it.
1914 We don't want to just call enter_file() because that allocates a
1915 new entry if the file is a double-colon, which we don't want in
1916 this situation. */
1917 f = lookup_file (name);
1918 if (!f)
1919 f = enter_file (strcache_add (name));
1920 else if (f->double_colon)
1921 f = f->double_colon;
1922
1923 initialize_file_variables (f, 1);
1924 fname = f->name;
1925
1926 current_variable_set_list = f->variables;
1927 v = try_variable_definition (flocp, defn, origin, 1);
1928 if (!v)
1929 error (flocp, _("Malformed target-specific variable definition"));
1930 current_variable_set_list = global;
1931 }
1932
1933 /* Set up the variable to be *-specific. */
1934 v->origin = origin;
1935 v->per_target = 1;
1936 v->export = exported ? v_export : v_default;
1937
1938 /* If it's not an override, check to see if there was a command-line
1939 setting. If so, reset the value. */
1940 if (origin != o_override)
1941 {
1942 struct variable *gv;
1943 int len = strlen(v->name);
1944
1945 gv = lookup_variable (v->name, len);
1946 if (gv && (gv->origin == o_env_override || gv->origin == o_command))
1947 {
1948 if (v->value != 0)
1949 free (v->value);
1950 v->value = xstrdup (gv->value);
1951 v->origin = gv->origin;
1952 v->recursive = gv->recursive;
1953 v->append = 0;
1954 }
1955 }
1956 }
1957}
1958
1959
1960/* Record a description line for files FILENAMES,
1961 with dependencies DEPS, commands to execute described
1962 by COMMANDS and COMMANDS_IDX, coming from FILENAME:COMMANDS_STARTED.
1963 TWO_COLON is nonzero if a double colon was used.
1964 If not nil, PATTERN is the `%' pattern to make this
1965 a static pattern rule, and PATTERN_PERCENT is a pointer
1966 to the `%' within it.
1967
1968 The links of FILENAMES are freed, and so are any names in it
1969 that are not incorporated into other data structures. */
1970
1971static void
1972record_files (struct nameseq *filenames, const char *pattern,
1973 const char *pattern_percent, struct dep *deps,
1974 unsigned int cmds_started, char *commands,
1975 unsigned int commands_idx, int two_colon,
1976 const struct floc *flocp)
1977{
1978 struct nameseq *nextf;
1979 int implicit = 0;
1980 unsigned int max_targets = 0, target_idx = 0;
1981 const char **targets = 0, **target_percents = 0;
1982 struct commands *cmds;
1983#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
1984 struct file *prev_file = 0;
1985 enum multitarget_mode { m_unsettled, m_no, m_yes, m_yes_maybe }
1986 multi_mode = !two_colon && !pattern ? m_unsettled : m_no;
1987#endif
1988
1989 /* If we've already snapped deps, that means we're in an eval being
1990 resolved after the makefiles have been read in. We can't add more rules
1991 at this time, since they won't get snapped and we'll get core dumps.
1992 See Savannah bug # 12124. */
1993 if (snapped_deps)
1994 fatal (flocp, _("prerequisites cannot be defined in command scripts"));
1995
1996 if (commands_idx > 0)
1997 {
1998 cmds = xmalloc (sizeof (struct commands));
1999 cmds->fileinfo.filenm = flocp->filenm;
2000 cmds->fileinfo.lineno = cmds_started;
2001 cmds->commands = savestring (commands, commands_idx);
2002 cmds->command_lines = 0;
2003 }
2004 else
2005 cmds = 0;
2006
2007 for (; filenames != 0; filenames = nextf)
2008 {
2009 const char *name = filenames->name;
2010 struct file *f;
2011 struct dep *this = 0;
2012 const char *implicit_percent;
2013
2014 nextf = filenames->next;
2015 free (filenames);
2016
2017 /* Check for special targets. Do it here instead of, say, snap_deps()
2018 so that we can immediately use the value. */
2019
2020 if (streq (name, ".POSIX"))
2021 posix_pedantic = 1;
2022 else if (streq (name, ".SECONDEXPANSION"))
2023 second_expansion = 1;
2024
2025 implicit_percent = find_percent_cached (&name);
2026 implicit |= implicit_percent != 0;
2027
2028 if (implicit)
2029 {
2030 if (pattern != 0)
2031 fatal (flocp, _("mixed implicit and static pattern rules"));
2032
2033 if (implicit_percent == 0)
2034 fatal (flocp, _("mixed implicit and normal rules"));
2035
2036 if (targets == 0)
2037 {
2038 max_targets = 5;
2039 targets = xmalloc (5 * sizeof (char *));
2040 target_percents = xmalloc (5 * sizeof (char *));
2041 target_idx = 0;
2042 }
2043 else if (target_idx == max_targets - 1)
2044 {
2045 max_targets += 5;
2046 targets = xrealloc (targets, max_targets * sizeof (char *));
2047 target_percents = xrealloc (target_percents,
2048 max_targets * sizeof (char *));
2049 }
2050 targets[target_idx] = name;
2051 target_percents[target_idx] = implicit_percent;
2052 ++target_idx;
2053 continue;
2054 }
2055
2056#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
2057 /* Check for the explicit multitarget mode operators. For this to be
2058 identified as an excplicit multiple target rule, the first + or +|
2059 operator *must* appear between the first two files. If not found as
2060 the 2nd file or if found as the 1st file, the rule will be rejected
2061 as a potential multiple first target rule. For the subsequent files
2062 the operator is only required to switch between maybe and non-maybe
2063 mode:
2064 `primary + 2nd 3rd +| 4th-maybe + 5th-for-sure: deps; cmds'
2065
2066 The whole idea of the maybe-updated files is this:
2067 timestamp +| maybe.h: src1.c src2.c
2068 grep goes-into-maybe.h $* > timestamp
2069 cmp timestamp maybe.h || cp -f timestamp maybe.h
2070
2071 This is handled below by adding replacing the prereqs of the
2072 maybe-updated by an order only dependency on the primary target
2073 (see below). This saves messing up remake.c. */
2074 if (multi_mode != m_no && name[0] == '+'
2075 && (name[1] == '\0' || (name[1] == '|' && name[2] == '\0')))
2076 {
2077 if (!prev_file)
2078 multi_mode = m_no; /* first */
2079 else
2080 {
2081 if (multi_mode == m_unsettled)
2082 prev_file->multi_head = prev_file;
2083 multi_mode = name[1] == '\0' ? m_yes : m_yes_maybe;
2084 continue;
2085 }
2086 }
2087 else if (multi_mode == m_unsettled && prev_file)
2088 multi_mode = m_no;
2089#endif
2090
2091 /* If this is a static pattern rule:
2092 `targets: target%pattern: dep%pattern; cmds',
2093 make sure the pattern matches this target name. */
2094 if (pattern && !pattern_matches (pattern, pattern_percent, name))
2095 error (flocp, _("target `%s' doesn't match the target pattern"), name);
2096 else if (deps)
2097 {
2098 /* If there are multiple filenames, copy the chain DEPS for all but
2099 the last one. It is not safe for the same deps to go in more
2100 than one place in the database. */
2101 this = nextf != 0 ? copy_dep_chain (deps) : deps;
2102 this->need_2nd_expansion = (second_expansion
2103 && strchr (this->name, '$'));
2104 }
2105
2106 if (!two_colon)
2107 {
2108 /* Single-colon. Combine these dependencies
2109 with others in file's existing record, if any. */
2110 f = enter_file (strcache_add (name));
2111
2112 if (f->double_colon)
2113 fatal (flocp,
2114 _("target file `%s' has both : and :: entries"), f->name);
2115
2116 /* If CMDS == F->CMDS, this target was listed in this rule
2117 more than once. Just give a warning since this is harmless. */
2118 if (cmds != 0 && cmds == f->cmds)
2119 error (flocp,
2120 _("target `%s' given more than once in the same rule."),
2121 f->name);
2122
2123 /* Check for two single-colon entries both with commands.
2124 Check is_target so that we don't lose on files such as .c.o
2125 whose commands were preinitialized. */
2126 else if (cmds != 0 && f->cmds != 0 && f->is_target)
2127 {
2128 error (&cmds->fileinfo,
2129 _("warning: overriding commands for target `%s'"),
2130 f->name);
2131 error (&f->cmds->fileinfo,
2132 _("warning: ignoring old commands for target `%s'"),
2133 f->name);
2134 }
2135
2136 f->is_target = 1;
2137
2138 /* Defining .DEFAULT with no deps or cmds clears it. */
2139 if (f == default_file && this == 0 && cmds == 0)
2140 f->cmds = 0;
2141 if (cmds != 0)
2142 f->cmds = cmds;
2143
2144#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
2145 /* If this is an explicit multi target rule, add it to the
2146 target chain and set the multi_maybe flag according to
2147 the current mode. This is also where we do the dependency
2148 tricks for the 'maybe' targets (see above). */
2149
2150 if (multi_mode >= m_yes)
2151 {
2152 f->multi_maybe = multi_mode == m_yes_maybe;
2153 if (f->multi_maybe)
2154 {
2155 /* expand_deps needs the "| " bit.
2156 XXX leaking memory here? */
2157 size_t len = strlen (prev_file->multi_head->name) + 1;
2158 char *maybe_dep = xmalloc (len + 2);
2159 memcpy (maybe_dep, "| ", 2);
2160 memcpy (maybe_dep + 2, prev_file->multi_head->name, len);
2161
2162 free_dep_chain (this);
2163 this = alloc_dep ();
2164 this->name = maybe_dep;
2165 this->ignore_mtime = 1;
2166 }
2167 prev_file->multi_next = f;
2168 assert (prev_file->multi_head != 0);
2169 f->multi_head = prev_file->multi_head;
2170
2171 if (f == suffix_file)
2172 error (flocp,
2173 _(".SUFFIXES encountered in an explicit multi target rule"));
2174 }
2175 prev_file = f;
2176#endif
2177
2178 /* Defining .SUFFIXES with no dependencies clears out the list of
2179 suffixes. */
2180 if (f == suffix_file && this == 0)
2181 {
2182 free_dep_chain (f->deps);
2183 f->deps = 0;
2184 }
2185 else if (this != 0)
2186 {
2187 /* Add the file's old deps and the new ones in THIS together. */
2188
2189 if (f->deps != 0)
2190 {
2191 struct dep **d_ptr = &f->deps;
2192
2193 while ((*d_ptr)->next != 0)
2194 d_ptr = &(*d_ptr)->next;
2195
2196 if (cmds != 0)
2197 /* This is the rule with commands, so put its deps
2198 last. The rationale behind this is that $< expands to
2199 the first dep in the chain, and commands use $<
2200 expecting to get the dep that rule specifies. However
2201 the second expansion algorithm reverses the order thus
2202 we need to make it last here. */
2203 (*d_ptr)->next = this;
2204 else
2205 {
2206 /* This is the rule without commands. Put its
2207 dependencies at the end but before dependencies from
2208 the rule with commands (if any). This way everything
2209 appears in makefile order. */
2210
2211 if (f->cmds != 0)
2212 {
2213 this->next = *d_ptr;
2214 *d_ptr = this;
2215 }
2216 else
2217 (*d_ptr)->next = this;
2218 }
2219 }
2220 else
2221 f->deps = this;
2222
2223 /* This is a hack. I need a way to communicate to snap_deps()
2224 that the last dependency line in this file came with commands
2225 (so that logic in snap_deps() can put it in front and all
2226 this $< -logic works). I cannot simply rely on file->cmds
2227 being not 0 because of the cases like the following:
2228
2229 foo: bar
2230 foo:
2231 ...
2232
2233 I am going to temporarily "borrow" UPDATING member in
2234 `struct file' for this. */
2235
2236 if (cmds != 0)
2237 f->updating = 1;
2238 }
2239 }
2240 else
2241 {
2242 /* Double-colon. Make a new record even if there already is one. */
2243 f = lookup_file (name);
2244
2245 /* Check for both : and :: rules. Check is_target so
2246 we don't lose on default suffix rules or makefiles. */
2247 if (f != 0 && f->is_target && !f->double_colon)
2248 fatal (flocp,
2249 _("target file `%s' has both : and :: entries"), f->name);
2250 f = enter_file (strcache_add (name));
2251 /* If there was an existing entry and it was a double-colon entry,
2252 enter_file will have returned a new one, making it the prev
2253 pointer of the old one, and setting its double_colon pointer to
2254 the first one. */
2255 if (f->double_colon == 0)
2256 /* This is the first entry for this name, so we must set its
2257 double_colon pointer to itself. */
2258 f->double_colon = f;
2259 f->is_target = 1;
2260 f->deps = this;
2261 f->cmds = cmds;
2262 }
2263
2264 /* If this is a static pattern rule, set the stem to the part of its
2265 name that matched the `%' in the pattern, so you can use $* in the
2266 commands. */
2267 if (pattern)
2268 {
2269 static const char *percent = "%";
2270 char *buffer = variable_expand ("");
2271 const size_t buffer_offset = buffer - variable_buffer; /* bird */
2272 char *o = patsubst_expand_pat (buffer, name, pattern, percent,
2273 pattern_percent+1, percent+1);
2274 buffer = variable_buffer + buffer_offset; /* bird - variable_buffer may have been reallocated. */
2275 f->stem = strcache_add_len (buffer, o - buffer);
2276 if (this)
2277 {
2278 this->staticpattern = 1;
2279 this->stem = f->stem;
2280 }
2281 }
2282
2283 name = f->name;
2284
2285 /* If this target is a default target, update DEFAULT_GOAL_FILE. */
2286 if (streq (*default_goal_name, name)
2287 && (default_goal_file == 0
2288 || ! streq (default_goal_file->name, name)))
2289 default_goal_file = f;
2290 }
2291
2292 if (implicit)
2293 {
2294 if (deps)
2295 deps->need_2nd_expansion = second_expansion;
2296 create_pattern_rule (targets, target_percents, target_idx,
2297 two_colon, deps, cmds, 1);
2298 }
2299}
2300
2301
2302/* Search STRING for an unquoted STOPCHAR or blank (if BLANK is nonzero).
2303 Backslashes quote STOPCHAR, blanks if BLANK is nonzero, and backslash.
2304 Quoting backslashes are removed from STRING by compacting it into
2305 itself. Returns a pointer to the first unquoted STOPCHAR if there is
2306 one, or nil if there are none. STOPCHARs inside variable references are
2307 ignored if IGNOREVARS is true.
2308
2309 STOPCHAR _cannot_ be '$' if IGNOREVARS is true. */
2310
2311static char *
2312find_char_unquote (char *string, int stop1, int stop2, int blank,
2313 int ignorevars)
2314{
2315 unsigned int string_len = 0;
2316 char *p = string;
2317 register int ch; /* bird: 'optimiziations' */
2318
2319 if (ignorevars)
2320 ignorevars = '$';
2321
2322 while (1)
2323 {
2324 if (stop2 && blank)
2325 while ((ch = *p) != '\0' && ch != ignorevars && ch != stop1 && ch != stop2
2326 && ! isblank ((unsigned char) ch))
2327 ++p;
2328 else if (stop2)
2329 while ((ch = *p) != '\0' && ch != ignorevars && ch != stop1 && ch != stop2)
2330 ++p;
2331 else if (blank)
2332 while ((ch = *p) != '\0' && ch != ignorevars && ch != stop1
2333 && ! isblank ((unsigned char) ch))
2334 ++p;
2335 else
2336 while ((ch = *p) != '\0' && ch != ignorevars && ch != stop1)
2337 ++p;
2338
2339 if (ch == '\0')
2340 break;
2341
2342 /* If we stopped due to a variable reference, skip over its contents. */
2343 if (ch == ignorevars)
2344 {
2345 char openparen = p[1];
2346
2347 p += 2;
2348
2349 /* Skip the contents of a non-quoted, multi-char variable ref. */
2350 if (openparen == '(' || openparen == '{')
2351 {
2352 unsigned int pcount = 1;
2353 char closeparen = (openparen == '(' ? ')' : '}');
2354
2355 while ((ch = *p))
2356 {
2357 if (ch == openparen)
2358 ++pcount;
2359 else if (ch == closeparen)
2360 if (--pcount == 0)
2361 {
2362 ++p;
2363 break;
2364 }
2365 ++p;
2366 }
2367 }
2368
2369 /* Skipped the variable reference: look for STOPCHARS again. */
2370 continue;
2371 }
2372
2373 if (p > string && p[-1] == '\\')
2374 {
2375 /* Search for more backslashes. */
2376 int i = -2;
2377 while (&p[i] >= string && p[i] == '\\')
2378 --i;
2379 ++i;
2380 /* Only compute the length if really needed. */
2381 if (string_len == 0)
2382 string_len = strlen (string);
2383 /* The number of backslashes is now -I.
2384 Copy P over itself to swallow half of them. */
2385 memmove (&p[i], &p[i/2], (string_len - (p - string)) - (i/2) + 1);
2386 p += i/2;
2387 if (i % 2 == 0)
2388 /* All the backslashes quoted each other; the STOPCHAR was
2389 unquoted. */
2390 return p;
2391
2392 /* The STOPCHAR was quoted by a backslash. Look for another. */
2393 }
2394 else
2395 /* No backslash in sight. */
2396 return p;
2397 }
2398
2399 /* Never hit a STOPCHAR or blank (with BLANK nonzero). */
2400 return 0;
2401}
2402
2403/* Search PATTERN for an unquoted % and handle quoting. */
2404
2405char *
2406find_percent (char *pattern)
2407{
2408 return find_char_unquote (pattern, '%', 0, 0, 0);
2409}
2410
2411/* Search STRING for an unquoted % and handle quoting. Returns a pointer to
2412 the % or NULL if no % was found.
2413 This version is used with strings in the string cache: if there's a need to
2414 modify the string a new version will be added to the string cache and
2415 *STRING will be set to that. */
2416
2417const char *
2418find_percent_cached (const char **string)
2419{
2420 const char *p = *string;
2421 char *new = 0;
2422 int slen;
2423
2424 /* If the first char is a % return now. This lets us avoid extra tests
2425 inside the loop. */
2426 if (*p == '%')
2427 return p;
2428
2429 while (1)
2430 {
2431 while (*p != '\0' && *p != '%')
2432 ++p;
2433
2434 if (*p == '\0')
2435 break;
2436
2437 /* See if this % is escaped with a backslash; if not we're done. */
2438 if (p[-1] != '\\')
2439 break;
2440
2441 {
2442 /* Search for more backslashes. */
2443 char *pv;
2444 int i = -2;
2445
2446 while (&p[i] >= *string && p[i] == '\\')
2447 --i;
2448 ++i;
2449
2450 /* At this point we know we'll need to allocate a new string.
2451 Make a copy if we haven't yet done so. */
2452 if (! new)
2453 {
2454 slen = strlen (*string);
2455 new = alloca (slen + 1);
2456 memcpy (new, *string, slen + 1);
2457 p = new + (p - *string);
2458 *string = new;
2459 }
2460
2461 /* At this point *string, p, and new all point into the same string.
2462 Get a non-const version of p so we can modify new. */
2463 pv = new + (p - *string);
2464
2465 /* The number of backslashes is now -I.
2466 Copy P over itself to swallow half of them. */
2467 memmove (&pv[i], &pv[i/2], (slen - (pv - new)) - (i/2) + 1);
2468 p += i/2;
2469
2470 /* If the backslashes quoted each other; the % was unquoted. */
2471 if (i % 2 == 0)
2472 break;
2473 }
2474 }
2475
2476 /* If we had to change STRING, add it to the strcache. */
2477 if (new)
2478 {
2479 *string = strcache_add (*string);
2480 p = *string + (p - new);
2481 }
2482
2483 /* If we didn't find a %, return NULL. Otherwise return a ptr to it. */
2484 return (*p == '\0') ? NULL : p;
2485}
2486
2487
2488/* Parse a string into a sequence of filenames represented as a
2489 chain of struct nameseq's in reverse order and return that chain.
2490
2491 The string is passed as STRINGP, the address of a string pointer.
2492 The string pointer is updated to point at the first character
2493 not parsed, which either is a null char or equals STOPCHAR.
2494
2495 SIZE is how big to construct chain elements.
2496 This is useful if we want them actually to be other structures
2497 that have room for additional info.
2498
2499 If STRIP is nonzero, strip `./'s off the beginning. */
2500
2501struct nameseq *
2502parse_file_seq (char **stringp, int stopchar, unsigned int size, int strip)
2503{
2504 struct nameseq *new = 0;
2505 struct nameseq *new1;
2506#ifndef NO_ARCHIVES /* bird: MSC warning */
2507 struct nameseq *lastnew1;
2508#endif
2509 char *p = *stringp;
2510
2511#ifdef VMS
2512# define VMS_COMMA ','
2513#else
2514# define VMS_COMMA 0
2515#endif
2516
2517 while (1)
2518 {
2519 const char *name;
2520 char *q;
2521
2522 /* Skip whitespace; see if any more names are left. */
2523 p = next_token (p);
2524 if (*p == '\0')
2525 break;
2526 if (*p == stopchar)
2527 break;
2528
2529 /* There are, so find the end of the next name. */
2530 q = p;
2531 p = find_char_unquote (q, stopchar, VMS_COMMA, 1, 0);
2532#ifdef VMS
2533 /* convert comma separated list to space separated */
2534 if (p && *p == ',')
2535 *p =' ';
2536#endif
2537#ifdef _AMIGA
2538 if (stopchar == ':' && p && *p == ':'
2539 && !(isspace ((unsigned char)p[1]) || !p[1]
2540 || isspace ((unsigned char)p[-1])))
2541 p = find_char_unquote (p+1, stopchar, VMS_COMMA, 1, 0);
2542#endif
2543#ifdef HAVE_DOS_PATHS
2544 /* For DOS paths, skip a "C:\..." or a "C:/..." until we find the
2545 first colon which isn't followed by a slash or a backslash.
2546 Note that tokens separated by spaces should be treated as separate
2547 tokens since make doesn't allow path names with spaces */
2548 if (stopchar == ':')
2549 while (p != 0 && !isspace ((unsigned char)*p) &&
2550 (p[1] == '\\' || p[1] == '/') && isalpha ((unsigned char)p[-1]))
2551 p = find_char_unquote (p + 1, stopchar, VMS_COMMA, 1, 0);
2552#endif
2553 if (p == 0)
2554 p = q + strlen (q);
2555
2556 if (strip)
2557#ifdef VMS
2558 /* Skip leading `[]'s. */
2559 while (p - q > 2 && q[0] == '[' && q[1] == ']')
2560#else
2561 /* Skip leading `./'s. */
2562 while (p - q > 2 && q[0] == '.' && q[1] == '/')
2563#endif
2564 {
2565 q += 2; /* Skip "./". */
2566 while (q < p && *q == '/')
2567 /* Skip following slashes: ".//foo" is "foo", not "/foo". */
2568 ++q;
2569 }
2570
2571 /* Extract the filename just found, and skip it. */
2572
2573 if (q == p)
2574 /* ".///" was stripped to "". */
2575#if defined(VMS)
2576 continue;
2577#elif defined(_AMIGA)
2578 name = "";
2579#else
2580 name = "./";
2581#endif
2582 else
2583#ifdef VMS
2584/* VMS filenames can have a ':' in them but they have to be '\'ed but we need
2585 * to remove this '\' before we can use the filename.
2586 * Savestring called because q may be read-only string constant.
2587 */
2588 {
2589 char *qbase = xstrdup (q);
2590 char *pbase = qbase + (p-q);
2591 char *q1 = qbase;
2592 char *q2 = q1;
2593 char *p1 = pbase;
2594
2595 while (q1 != pbase)
2596 {
2597 if (*q1 == '\\' && *(q1+1) == ':')
2598 {
2599 q1++;
2600 p1--;
2601 }
2602 *q2++ = *q1++;
2603 }
2604 name = strcache_add_len (qbase, p1 - qbase);
2605 free (qbase);
2606 }
2607#else
2608 name = strcache_add_len (q, p - q);
2609#endif
2610
2611 /* Add it to the front of the chain. */
2612 new1 = xmalloc (size);
2613 new1->name = name;
2614 new1->next = new;
2615 new = new1;
2616 }
2617
2618#ifndef NO_ARCHIVES
2619
2620 /* Look for multi-word archive references.
2621 They are indicated by a elt ending with an unmatched `)' and
2622 an elt further down the chain (i.e., previous in the file list)
2623 with an unmatched `(' (e.g., "lib(mem"). */
2624
2625 new1 = new;
2626 lastnew1 = 0;
2627 while (new1 != 0)
2628 if (new1->name[0] != '(' /* Don't catch "(%)" and suchlike. */
2629 && new1->name[strlen (new1->name) - 1] == ')'
2630 && strchr (new1->name, '(') == 0)
2631 {
2632 /* NEW1 ends with a `)' but does not contain a `('.
2633 Look back for an elt with an opening `(' but no closing `)'. */
2634
2635 struct nameseq *n = new1->next, *lastn = new1;
2636 char *paren = 0;
2637 while (n != 0 && (paren = strchr (n->name, '(')) == 0)
2638 {
2639 lastn = n;
2640 n = n->next;
2641 }
2642 if (n != 0
2643 /* Ignore something starting with `(', as that cannot actually
2644 be an archive-member reference (and treating it as such
2645 results in an empty file name, which causes much lossage). */
2646 && n->name[0] != '(')
2647 {
2648 /* N is the first element in the archive group.
2649 Its name looks like "lib(mem" (with no closing `)'). */
2650
2651 char *libname;
2652
2653 /* Copy "lib(" into LIBNAME. */
2654 ++paren;
2655 libname = alloca (paren - n->name + 1);
2656 memcpy (libname, n->name, paren - n->name);
2657 libname[paren - n->name] = '\0';
2658
2659 if (*paren == '\0')
2660 {
2661 /* N was just "lib(", part of something like "lib( a b)".
2662 Edit it out of the chain and free its storage. */
2663 lastn->next = n->next;
2664 free (n);
2665 /* LASTN->next is the new stopping elt for the loop below. */
2666 n = lastn->next;
2667 }
2668 else
2669 {
2670 /* Replace N's name with the full archive reference. */
2671 n->name = strcache_add (concat (libname, paren, ")"));
2672 }
2673
2674 if (new1->name[1] == '\0')
2675 {
2676 /* NEW1 is just ")", part of something like "lib(a b )".
2677 Omit it from the chain and free its storage. */
2678 if (lastnew1 == 0)
2679 new = new1->next;
2680 else
2681 lastnew1->next = new1->next;
2682 lastn = new1;
2683 new1 = new1->next;
2684 free (lastn);
2685 }
2686 else
2687 {
2688 /* Replace also NEW1->name, which already has closing `)'. */
2689 new1->name = strcache_add (concat (libname, new1->name, ""));
2690 new1 = new1->next;
2691 }
2692
2693 /* Trace back from NEW1 (the end of the list) until N
2694 (the beginning of the list), rewriting each name
2695 with the full archive reference. */
2696
2697 while (new1 != n)
2698 {
2699 new1->name = strcache_add (concat (libname, new1->name, ")"));
2700 lastnew1 = new1;
2701 new1 = new1->next;
2702 }
2703 }
2704 else
2705 {
2706 /* No frobnication happening. Just step down the list. */
2707 lastnew1 = new1;
2708 new1 = new1->next;
2709 }
2710 }
2711 else
2712 {
2713 lastnew1 = new1;
2714 new1 = new1->next;
2715 }
2716
2717#endif
2718
2719 *stringp = p;
2720 return new;
2721}
2722
2723
2724/* Find the next line of text in an eval buffer, combining continuation lines
2725 into one line.
2726 Return the number of actual lines read (> 1 if continuation lines).
2727 Returns -1 if there's nothing left in the buffer.
2728
2729 After this function, ebuf->buffer points to the first character of the
2730 line we just found.
2731 */
2732
2733/* Read a line of text from a STRING.
2734 Since we aren't really reading from a file, don't bother with linenumbers.
2735 */
2736
2737static unsigned long
2738readstring (struct ebuffer *ebuf)
2739{
2740 char *eol;
2741
2742 /* If there is nothing left in this buffer, return 0. */
2743 if (ebuf->bufnext >= ebuf->bufstart + ebuf->size)
2744 return -1;
2745
2746 /* Set up a new starting point for the buffer, and find the end of the
2747 next logical line (taking into account backslash/newline pairs). */
2748
2749 eol = ebuf->buffer = ebuf->bufnext;
2750
2751 while (1)
2752 {
2753 int backslash = 0;
2754 char *bol = eol;
2755 char *p;
2756
2757 /* Find the next newline. At EOS, stop. */
2758 eol = p = strchr (eol , '\n');
2759 if (!eol)
2760 {
2761 ebuf->bufnext = ebuf->bufstart + ebuf->size + 1;
2762 return 0;
2763 }
2764
2765 /* Found a newline; if it's escaped continue; else we're done. */
2766 while (p > bol && *(--p) == '\\')
2767 backslash = !backslash;
2768 if (!backslash)
2769 break;
2770 ++eol;
2771 }
2772
2773 /* Overwrite the newline char. */
2774 *eol = '\0';
2775 ebuf->bufnext = eol+1;
2776
2777 return 0;
2778}
2779
2780static long
2781readline (struct ebuffer *ebuf)
2782{
2783 char *p;
2784 char *end;
2785 char *start;
2786 long nlines = 0;
2787
2788 /* The behaviors between string and stream buffers are different enough to
2789 warrant different functions. Do the Right Thing. */
2790
2791 if (!ebuf->fp)
2792 return readstring (ebuf);
2793
2794 /* When reading from a file, we always start over at the beginning of the
2795 buffer for each new line. */
2796
2797 p = start = ebuf->bufstart;
2798 end = p + ebuf->size;
2799 *p = '\0';
2800
2801 while (fgets (p, end - p, ebuf->fp) != 0)
2802 {
2803 char *p2;
2804 unsigned long len;
2805 int backslash;
2806
2807 len = strlen (p);
2808 if (len == 0)
2809 {
2810 /* This only happens when the first thing on the line is a '\0'.
2811 It is a pretty hopeless case, but (wonder of wonders) Athena
2812 lossage strikes again! (xmkmf puts NULs in its makefiles.)
2813 There is nothing really to be done; we synthesize a newline so
2814 the following line doesn't appear to be part of this line. */
2815 error (&ebuf->floc,
2816 _("warning: NUL character seen; rest of line ignored"));
2817 p[0] = '\n';
2818 len = 1;
2819 }
2820
2821 /* Jump past the text we just read. */
2822 p += len;
2823
2824 /* If the last char isn't a newline, the whole line didn't fit into the
2825 buffer. Get some more buffer and try again. */
2826 if (p[-1] != '\n')
2827 goto more_buffer;
2828
2829 /* We got a newline, so add one to the count of lines. */
2830 ++nlines;
2831
2832#if !defined(WINDOWS32) && !defined(__MSDOS__) && !defined(__EMX__)
2833 /* Check to see if the line was really ended with CRLF; if so ignore
2834 the CR. */
2835 if ((p - start) > 1 && p[-2] == '\r')
2836 {
2837 --p;
2838 p[-1] = '\n';
2839 }
2840#endif
2841
2842 backslash = 0;
2843 for (p2 = p - 2; p2 >= start; --p2)
2844 {
2845 if (*p2 != '\\')
2846 break;
2847 backslash = !backslash;
2848 }
2849
2850 if (!backslash)
2851 {
2852 p[-1] = '\0';
2853 break;
2854 }
2855
2856 /* It was a backslash/newline combo. If we have more space, read
2857 another line. */
2858 if (end - p >= 80)
2859 continue;
2860
2861 /* We need more space at the end of our buffer, so realloc it.
2862 Make sure to preserve the current offset of p. */
2863 more_buffer:
2864 {
2865 unsigned long off = p - start;
2866 ebuf->size *= 2;
2867 start = ebuf->buffer = ebuf->bufstart = xrealloc (start, ebuf->size);
2868 p = start + off;
2869 end = start + ebuf->size;
2870 *p = '\0';
2871 }
2872 }
2873
2874 if (ferror (ebuf->fp))
2875 pfatal_with_name (ebuf->floc.filenm);
2876
2877 /* If we found some lines, return how many.
2878 If we didn't, but we did find _something_, that indicates we read the last
2879 line of a file with no final newline; return 1.
2880 If we read nothing, we're at EOF; return -1. */
2881
2882 return nlines ? nlines : p == ebuf->bufstart ? -1 : 1;
2883}
2884
2885
2886/* Parse the next "makefile word" from the input buffer, and return info
2887 about it.
2888
2889 A "makefile word" is one of:
2890
2891 w_bogus Should never happen
2892 w_eol End of input
2893 w_static A static word; cannot be expanded
2894 w_variable A word containing one or more variables/functions
2895 w_colon A colon
2896 w_dcolon A double-colon
2897 w_semicolon A semicolon
2898 w_varassign A variable assignment operator (=, :=, +=, or ?=)
2899
2900 Note that this function is only used when reading certain parts of the
2901 makefile. Don't use it where special rules hold sway (RHS of a variable,
2902 in a command list, etc.) */
2903
2904static enum make_word_type
2905get_next_mword (char *buffer, char *delim, char **startp, unsigned int *length)
2906{
2907 enum make_word_type wtype = w_bogus;
2908 char *p = buffer, *beg;
2909 char c;
2910
2911 /* Skip any leading whitespace. */
2912 while (isblank ((unsigned char)*p))
2913 ++p;
2914
2915 beg = p;
2916 c = *(p++);
2917 switch (c)
2918 {
2919 case '\0':
2920 wtype = w_eol;
2921 break;
2922
2923 case ';':
2924 wtype = w_semicolon;
2925 break;
2926
2927 case '=':
2928 wtype = w_varassign;
2929 break;
2930
2931 case ':':
2932 wtype = w_colon;
2933 switch (*p)
2934 {
2935 case ':':
2936 ++p;
2937 wtype = w_dcolon;
2938 break;
2939
2940 case '=':
2941 ++p;
2942 wtype = w_varassign;
2943 break;
2944 }
2945 break;
2946
2947 case '+':
2948 case '?':
2949 if (*p == '=')
2950 {
2951 ++p;
2952 wtype = w_varassign;
2953 break;
2954 }
2955
2956 default:
2957 if (delim && strchr (delim, c))
2958 wtype = w_static;
2959 break;
2960 }
2961
2962 /* Did we find something? If so, return now. */
2963 if (wtype != w_bogus)
2964 goto done;
2965
2966 /* This is some non-operator word. A word consists of the longest
2967 string of characters that doesn't contain whitespace, one of [:=#],
2968 or [?+]=, or one of the chars in the DELIM string. */
2969
2970 /* We start out assuming a static word; if we see a variable we'll
2971 adjust our assumptions then. */
2972 wtype = w_static;
2973
2974 /* We already found the first value of "c", above. */
2975 while (1)
2976 {
2977 char closeparen;
2978 int count;
2979
2980 switch (c)
2981 {
2982 case '\0':
2983 case ' ':
2984 case '\t':
2985 case '=':
2986 goto done_word;
2987
2988 case ':':
2989#ifdef HAVE_DOS_PATHS
2990 /* A word CAN include a colon in its drive spec. The drive
2991 spec is allowed either at the beginning of a word, or as part
2992 of the archive member name, like in "libfoo.a(d:/foo/bar.o)". */
2993 if (!(p - beg >= 2
2994 && (*p == '/' || *p == '\\') && isalpha ((unsigned char)p[-2])
2995 && (p - beg == 2 || p[-3] == '(')))
2996#endif
2997 goto done_word;
2998
2999 case '$':
3000 c = *(p++);
3001 if (c == '$')
3002 break;
3003
3004 /* This is a variable reference, so note that it's expandable.
3005 Then read it to the matching close paren. */
3006 wtype = w_variable;
3007
3008 if (c == '(')
3009 closeparen = ')';
3010 else if (c == '{')
3011 closeparen = '}';
3012 else
3013 /* This is a single-letter variable reference. */
3014 break;
3015
3016 for (count=0; *p != '\0'; ++p)
3017 {
3018 if (*p == c)
3019 ++count;
3020 else if (*p == closeparen && --count < 0)
3021 {
3022 ++p;
3023 break;
3024 }
3025 }
3026 break;
3027
3028 case '?':
3029 case '+':
3030 if (*p == '=')
3031 goto done_word;
3032 break;
3033
3034 case '\\':
3035 switch (*p)
3036 {
3037 case ':':
3038 case ';':
3039 case '=':
3040 case '\\':
3041 ++p;
3042 break;
3043 }
3044 break;
3045
3046 default:
3047 if (delim && strchr (delim, c))
3048 goto done_word;
3049 break;
3050 }
3051
3052 c = *(p++);
3053 }
3054 done_word:
3055 --p;
3056
3057 done:
3058 if (startp)
3059 *startp = beg;
3060 if (length)
3061 *length = p - beg;
3062 return wtype;
3063}
3064
3065
3066/* Construct the list of include directories
3067 from the arguments and the default list. */
3068
3069void
3070construct_include_path (const char **arg_dirs)
3071{
3072#ifdef VAXC /* just don't ask ... */
3073 stat_t stbuf;
3074#else
3075 struct stat stbuf;
3076#endif
3077 const char **dirs;
3078 const char **cpp;
3079 unsigned int idx;
3080
3081 /* Compute the number of pointers we need in the table. */
3082 idx = sizeof (default_include_directories) / sizeof (const char *);
3083 if (arg_dirs)
3084 for (cpp = arg_dirs; *cpp != 0; ++cpp)
3085 ++idx;
3086
3087#ifdef __MSDOS__
3088 /* Add one for $DJDIR. */
3089 ++idx;
3090#endif
3091#ifdef KMK
3092 /* Add one for the kBuild directory. */
3093 ++idx;
3094#endif
3095
3096 dirs = xmalloc (idx * sizeof (const char *));
3097
3098 idx = 0;
3099 max_incl_len = 0;
3100
3101 /* First consider any dirs specified with -I switches.
3102 Ignore any that don't exist. Remember the maximum string length. */
3103
3104 if (arg_dirs)
3105 while (*arg_dirs != 0)
3106 {
3107 const char *dir = *(arg_dirs++);
3108 char *expanded = 0;
3109 int e;
3110
3111 if (dir[0] == '~')
3112 {
3113 expanded = tilde_expand (dir);
3114 if (expanded != 0)
3115 dir = expanded;
3116 }
3117
3118 EINTRLOOP (e, stat (dir, &stbuf));
3119 if (e == 0 && S_ISDIR (stbuf.st_mode))
3120 {
3121 unsigned int len = strlen (dir);
3122 /* If dir name is written with trailing slashes, discard them. */
3123 while (len > 1 && dir[len - 1] == '/')
3124 --len;
3125 if (len > max_incl_len)
3126 max_incl_len = len;
3127 dirs[idx++] = strcache_add_len (dir, len);
3128 }
3129
3130 if (expanded)
3131 free (expanded);
3132 }
3133
3134 /* Now add the standard default dirs at the end. */
3135
3136#ifdef __MSDOS__
3137 {
3138 /* The environment variable $DJDIR holds the root of the DJGPP directory
3139 tree; add ${DJDIR}/include. */
3140 struct variable *djdir = lookup_variable ("DJDIR", 5);
3141
3142 if (djdir)
3143 {
3144 unsigned int len = strlen (djdir->value) + 8;
3145 char *defdir = alloca (len + 1);
3146
3147 strcat (strcpy (defdir, djdir->value), "/include");
3148 dirs[idx++] = strcache_add (defdir);
3149
3150 if (len > max_incl_len)
3151 max_incl_len = len;
3152 }
3153 }
3154#endif
3155#ifdef KMK
3156 /* Add $(PATH_KBUILD). */
3157 {
3158 size_t len = strlen (get_path_kbuild ());
3159 dirs[idx++] = strcache_add_len (get_path_kbuild (), len);
3160 if (len > max_incl_len)
3161 max_incl_len = len;
3162 }
3163#endif
3164
3165 for (cpp = default_include_directories; *cpp != 0; ++cpp)
3166 {
3167 int e;
3168
3169 EINTRLOOP (e, stat (*cpp, &stbuf));
3170 if (e == 0 && S_ISDIR (stbuf.st_mode))
3171 {
3172 unsigned int len = strlen (*cpp);
3173 /* If dir name is written with trailing slashes, discard them. */
3174 while (len > 1 && (*cpp)[len - 1] == '/')
3175 --len;
3176 if (len > max_incl_len)
3177 max_incl_len = len;
3178 dirs[idx++] = strcache_add_len (*cpp, len - 1);
3179 }
3180 }
3181
3182 dirs[idx] = 0;
3183
3184 /* Now add each dir to the .INCLUDE_DIRS variable. */
3185
3186 for (cpp = dirs; *cpp != 0; ++cpp)
3187 do_variable_definition (NILF, ".INCLUDE_DIRS", *cpp,
3188 o_default, f_append, 0);
3189
3190 include_directories = dirs;
3191}
3192
3193
3194/* Expand ~ or ~USER at the beginning of NAME.
3195 Return a newly malloc'd string or 0. */
3196
3197char *
3198tilde_expand (const char *name)
3199{
3200#ifndef VMS
3201 if (name[1] == '/' || name[1] == '\0')
3202 {
3203 extern char *getenv ();
3204 char *home_dir;
3205 int is_variable;
3206
3207 {
3208 /* Turn off --warn-undefined-variables while we expand HOME. */
3209 int save = warn_undefined_variables_flag;
3210 warn_undefined_variables_flag = 0;
3211
3212 home_dir = allocated_variable_expand ("$(HOME)");
3213
3214 warn_undefined_variables_flag = save;
3215 }
3216
3217 is_variable = home_dir[0] != '\0';
3218 if (!is_variable)
3219 {
3220 free (home_dir);
3221 home_dir = getenv ("HOME");
3222 }
3223# if !defined(_AMIGA) && !defined(WINDOWS32)
3224 if (home_dir == 0 || home_dir[0] == '\0')
3225 {
3226 extern char *getlogin ();
3227 char *logname = getlogin ();
3228 home_dir = 0;
3229 if (logname != 0)
3230 {
3231 struct passwd *p = getpwnam (logname);
3232 if (p != 0)
3233 home_dir = p->pw_dir;
3234 }
3235 }
3236# endif /* !AMIGA && !WINDOWS32 */
3237 if (home_dir != 0)
3238 {
3239 char *new = xstrdup (concat (home_dir, "", name + 1));
3240 if (is_variable)
3241 free (home_dir);
3242 return new;
3243 }
3244 }
3245# if !defined(_AMIGA) && !defined(WINDOWS32)
3246 else
3247 {
3248 struct passwd *pwent;
3249 char *userend = strchr (name + 1, '/');
3250 if (userend != 0)
3251 *userend = '\0';
3252 pwent = getpwnam (name + 1);
3253 if (pwent != 0)
3254 {
3255 if (userend == 0)
3256 return xstrdup (pwent->pw_dir);
3257 else
3258 return xstrdup (concat (pwent->pw_dir, "/", userend + 1));
3259 }
3260 else if (userend != 0)
3261 *userend = '/';
3262 }
3263# endif /* !AMIGA && !WINDOWS32 */
3264#endif /* !VMS */
3265 return 0;
3266}
3267
3268/* Given a chain of struct nameseq's describing a sequence of filenames,
3269 in reverse of the intended order, return a new chain describing the
3270 result of globbing the filenames. The new chain is in forward order.
3271 The links of the old chain are freed or used in the new chain.
3272 Likewise for the names in the old chain.
3273
3274 SIZE is how big to construct chain elements.
3275 This is useful if we want them actually to be other structures
3276 that have room for additional info. */
3277
3278struct nameseq *
3279multi_glob (struct nameseq *chain, unsigned int size)
3280{
3281 void dir_setup_glob (glob_t *);
3282 struct nameseq *new = 0;
3283 struct nameseq *old;
3284 struct nameseq *nexto;
3285 glob_t gl;
3286#if defined(KMK) || defined(__EMX__) /* speed optimization */
3287 int rc;
3288#endif
3289
3290 dir_setup_glob (&gl);
3291
3292 for (old = chain; old != 0; old = nexto)
3293 {
3294 const char *gname;
3295#ifndef NO_ARCHIVES
3296 char *arname = 0;
3297 char *memname = 0;
3298#endif
3299 nexto = old->next;
3300 gname = old->name;
3301
3302 if (gname[0] == '~')
3303 {
3304 char *newname = tilde_expand (old->name);
3305 if (newname != 0)
3306 gname = newname;
3307 }
3308
3309#ifndef NO_ARCHIVES
3310 if (ar_name (gname))
3311 {
3312 /* OLD->name is an archive member reference. Replace it with the
3313 archive file name, and save the member name in MEMNAME. We will
3314 glob on the archive name and then reattach MEMNAME later. */
3315 ar_parse_name (gname, &arname, &memname);
3316 gname = arname;
3317 }
3318#endif /* !NO_ARCHIVES */
3319
3320#if defined(KMK) || defined(__EMX__) /* speed optimization */
3321 if (!strpbrk(gname, "*?["))
3322 {
3323 gl.gl_pathc = 1;
3324 gl.gl_pathv = (char **)&gname;
3325 rc = 0;
3326 }
3327 else
3328 rc = glob (gname, GLOB_NOCHECK|GLOB_ALTDIRFUNC, NULL, &gl);
3329 switch (rc)
3330#else
3331 switch (glob (gname, GLOB_NOCHECK|GLOB_ALTDIRFUNC, NULL, &gl))
3332#endif
3333 {
3334 case 0: /* Success. */
3335 {
3336 int i = gl.gl_pathc;
3337 while (i-- > 0)
3338 {
3339#ifndef NO_ARCHIVES
3340 if (memname != 0)
3341 {
3342 /* Try to glob on MEMNAME within the archive. */
3343 struct nameseq *found
3344 = ar_glob (gl.gl_pathv[i], memname, size);
3345 if (! found)
3346 {
3347 /* No matches. Use MEMNAME as-is. */
3348 unsigned int alen = strlen (gl.gl_pathv[i]);
3349 unsigned int mlen = strlen (memname);
3350 char *name;
3351 struct nameseq *elt = xmalloc (size);
3352 memset (elt, '\0', size);
3353
3354 name = alloca (alen + 1 + mlen + 2);
3355 memcpy (name, gl.gl_pathv[i], alen);
3356 name[alen] = '(';
3357 memcpy (name+alen+1, memname, mlen);
3358 name[alen + 1 + mlen] = ')';
3359 name[alen + 1 + mlen + 1] = '\0';
3360 elt->name = strcache_add (name);
3361 elt->next = new;
3362 new = elt;
3363 }
3364 else
3365 {
3366 /* Find the end of the FOUND chain. */
3367 struct nameseq *f = found;
3368 while (f->next != 0)
3369 f = f->next;
3370
3371 /* Attach the chain being built to the end of the FOUND
3372 chain, and make FOUND the new NEW chain. */
3373 f->next = new;
3374 new = found;
3375 }
3376 }
3377 else
3378#endif /* !NO_ARCHIVES */
3379 {
3380 struct nameseq *elt = xmalloc (size);
3381 memset (elt, '\0', size);
3382 elt->name = strcache_add (gl.gl_pathv[i]);
3383 elt->next = new;
3384 new = elt;
3385 }
3386 }
3387#if defined(KMK) || defined(__EMX__) /* speed optimization */
3388 if (gl.gl_pathv != &gname)
3389#endif
3390 globfree (&gl);
3391 free (old);
3392 break;
3393 }
3394
3395 case GLOB_NOSPACE:
3396 fatal (NILF, _("virtual memory exhausted"));
3397 break;
3398
3399 default:
3400 old->next = new;
3401 new = old;
3402 break;
3403 }
3404
3405#ifndef NO_ARCHIVES
3406 if (arname)
3407 free (arname);
3408#endif
3409 }
3410
3411 return new;
3412}
Note: See TracBrowser for help on using the repository browser.

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