VirtualBox

source: kBuild/trunk/src/kmk/variable.h@ 2718

Last change on this file since 2718 was 2718, checked in by bird, 11 years ago

kmk: Variable aliases.

  • Property svn:eol-style set to native
File size: 19.4 KB
Line 
1/* Definitions for using variables in GNU Make.
2Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
31998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 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 3 of the License, or (at your option) any later
10version.
11
12GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14A PARTICULAR PURPOSE. See the GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License along with
17this program. If not, see <http://www.gnu.org/licenses/>. */
18
19#include "hash.h"
20
21/* Codes in a variable definition saying where the definition came from.
22 Increasing numeric values signify less-overridable definitions. */
23enum variable_origin
24 {
25 o_default, /* Variable from the default set. */
26 o_env, /* Variable from environment. */
27 o_file, /* Variable given in a makefile. */
28 o_env_override, /* Variable from environment, if -e. */
29 o_command, /* Variable given by user. */
30 o_override, /* Variable from an `override' directive. */
31#ifdef CONFIG_WITH_LOCAL_VARIABLES
32 o_local, /* Variable from an 'local' directive. */
33#endif
34 o_automatic, /* Automatic variable -- cannot be set. */
35 o_invalid /* Core dump time. */
36 };
37
38enum variable_flavor
39 {
40 f_bogus, /* Bogus (error) */
41 f_simple, /* Simple definition (:=) */
42 f_recursive, /* Recursive definition (=) */
43 f_append, /* Appending definition (+=) */
44#ifdef CONFIG_WITH_PREPEND_ASSIGNMENT
45 f_prepend, /* Prepending definition (>=) */
46#endif
47 f_conditional /* Conditional definition (?=) */
48 };
49
50/* Structure that represents one variable definition.
51 Each bucket of the hash table is a chain of these,
52 chained through `next'. */
53
54#define EXP_COUNT_BITS 15 /* This gets all the bitfields into 32 bits */
55#define EXP_COUNT_MAX ((1<<EXP_COUNT_BITS)-1)
56#ifdef CONFIG_WITH_VALUE_LENGTH
57#define VAR_ALIGN_VALUE_ALLOC(len) ( ((len) + (unsigned int)15) & ~(unsigned int)15 )
58#endif
59
60struct variable
61 {
62#ifndef CONFIG_WITH_STRCACHE2
63 char *name; /* Variable name. */
64#else
65 const char *name; /* Variable name (in varaible_strcache). */
66#endif
67 int length; /* strlen (name) */
68#ifdef CONFIG_WITH_VALUE_LENGTH
69 unsigned int value_length; /* The length of the value. */
70 unsigned int value_alloc_len; /* The amount of memory we've actually allocated. */
71 /* FIXME: make lengths unsigned! */
72#endif
73 char *value; /* Variable value. */
74 struct floc fileinfo; /* Where the variable was defined. */
75 unsigned int recursive:1; /* Gets recursively re-evaluated. */
76 unsigned int append:1; /* Nonzero if an appending target-specific
77 variable. */
78 unsigned int conditional:1; /* Nonzero if set with a ?=. */
79 unsigned int per_target:1; /* Nonzero if a target-specific variable. */
80 unsigned int special:1; /* Nonzero if this is a special variable. */
81 unsigned int exportable:1; /* Nonzero if the variable _could_ be
82 exported. */
83 unsigned int expanding:1; /* Nonzero if currently being expanded. */
84 unsigned int private_var:1; /* Nonzero avoids inheritance of this
85 target-specific variable. */
86 unsigned int exp_count:EXP_COUNT_BITS;
87 /* If >1, allow this many self-referential
88 expansions. */
89#ifdef CONFIG_WITH_RDONLY_VARIABLE_VALUE
90 unsigned int rdonly_val:1; /* VALUE is read only (strcache/const). */
91#endif
92#ifdef KMK
93 unsigned int alias:1; /* Nonzero if alias. VALUE points to the real variable. */
94 unsigned int aliased:1; /* Nonzero if aliased. Cannot be undefined. */
95#endif
96 enum variable_flavor
97 flavor ENUM_BITFIELD (3); /* Variable flavor. */
98 enum variable_origin
99#ifdef CONFIG_WITH_LOCAL_VARIABLES
100 origin ENUM_BITFIELD (4); /* Variable origin. */
101#else
102 origin ENUM_BITFIELD (3); /* Variable origin. */
103#endif
104 enum variable_export
105 {
106 v_export, /* Export this variable. */
107 v_noexport, /* Don't export this variable. */
108 v_ifset, /* Export it if it has a non-default value. */
109 v_default /* Decide in target_environment. */
110 } export ENUM_BITFIELD (2);
111#ifdef CONFIG_WITH_MAKE_STATS
112 unsigned int changes;
113 unsigned int reallocs;
114#endif
115 };
116
117/* Structure that represents a variable set. */
118
119struct variable_set
120 {
121 struct hash_table table; /* Hash table of variables. */
122 };
123
124/* Structure that represents a list of variable sets. */
125
126struct variable_set_list
127 {
128 struct variable_set_list *next; /* Link in the chain. */
129 struct variable_set *set; /* Variable set. */
130 int next_is_parent; /* True if next is a parent target. */
131 };
132
133/* Structure used for pattern-specific variables. */
134
135struct pattern_var
136 {
137 struct pattern_var *next;
138 const char *suffix;
139 const char *target;
140 unsigned int len;
141 struct variable variable;
142 };
143
144extern char *variable_buffer;
145extern struct variable_set_list *current_variable_set_list;
146extern struct variable *default_goal_var;
147
148#ifdef KMK
149extern struct variable_set global_variable_set;
150extern struct variable_set_list global_setlist;
151extern unsigned int variable_buffer_length;
152# define VARIABLE_BUFFER_ZONE 5
153#endif
154
155/* expand.c */
156#ifndef KMK
157char *
158variable_buffer_output (char *ptr, const char *string, unsigned int length);
159#else /* KMK */
160/* Subroutine of variable_expand and friends:
161 The text to add is LENGTH chars starting at STRING to the variable_buffer.
162 The text is added to the buffer at PTR, and the updated pointer into
163 the buffer is returned as the value. Thus, the value returned by
164 each call to variable_buffer_output should be the first argument to
165 the following call. */
166
167__inline static char *
168variable_buffer_output (char *ptr, const char *string, unsigned int length)
169{
170 register unsigned int newlen = length + (ptr - variable_buffer);
171
172 if ((newlen + VARIABLE_BUFFER_ZONE) > variable_buffer_length)
173 {
174 unsigned int offset = ptr - variable_buffer;
175 variable_buffer_length = variable_buffer_length <= 1024
176 ? 2048 : variable_buffer_length * 4;
177 if (variable_buffer_length < newlen + 100)
178 variable_buffer_length = (newlen + 100 + 1023) & ~1023U;
179 variable_buffer = xrealloc (variable_buffer, variable_buffer_length);
180 ptr = variable_buffer + offset;
181 }
182
183# ifndef _MSC_VER
184 switch (length)
185 {
186 case 4: ptr[3] = string[3];
187 case 3: ptr[2] = string[2];
188 case 2: ptr[1] = string[1];
189 case 1: ptr[0] = string[0];
190 case 0:
191 break;
192 default:
193 memcpy (ptr, string, length);
194 break;
195 }
196# else
197 memcpy (ptr, string, length);
198# endif
199 return ptr + length;
200}
201
202#endif /* KMK */
203char *variable_expand (const char *line);
204char *variable_expand_for_file (const char *line, struct file *file);
205#if defined (CONFIG_WITH_VALUE_LENGTH) || defined (CONFIG_WITH_COMMANDS_FUNC)
206char *variable_expand_for_file_2 (char *o, const char *line, unsigned int lenght,
207 struct file *file, unsigned int *value_lenp);
208#endif
209char *allocated_variable_expand_for_file (const char *line, struct file *file);
210#ifndef CONFIG_WITH_VALUE_LENGTH
211#define allocated_variable_expand(line) \
212 allocated_variable_expand_for_file (line, (struct file *) 0)
213#else /* CONFIG_WITH_VALUE_LENGTH */
214# define allocated_variable_expand(line) \
215 allocated_variable_expand_2 (line, -1, NULL)
216char *allocated_variable_expand_2 (const char *line, unsigned int length, unsigned int *value_lenp);
217char *allocated_variable_expand_3 (const char *line, unsigned int length,
218 unsigned int *value_lenp, unsigned int *buffer_lengthp);
219void recycle_variable_buffer (char *buffer, unsigned int length);
220#endif /* CONFIG_WITH_VALUE_LENGTH */
221char *expand_argument (const char *str, const char *end);
222#ifndef CONFIG_WITH_VALUE_LENGTH
223char *
224variable_expand_string (char *line, const char *string, long length);
225#else /* CONFIG_WITH_VALUE_LENGTH */
226char *
227variable_expand_string_2 (char *line, const char *string, long length, char **eol);
228__inline static char *
229variable_expand_string (char *line, const char *string, long length)
230{
231 char *ignored;
232 return variable_expand_string_2 (line, string, length, &ignored);
233}
234#endif /* CONFIG_WITH_VALUE_LENGTH */
235void install_variable_buffer (char **bufp, unsigned int *lenp);
236void restore_variable_buffer (char *buf, unsigned int len);
237#ifdef CONFIG_WITH_VALUE_LENGTH
238void append_expanded_string_to_variable (struct variable *v, const char *value,
239 unsigned int value_len, int append);
240#endif
241
242/* function.c */
243#ifndef CONFIG_WITH_VALUE_LENGTH
244int handle_function (char **op, const char **stringp);
245#else
246int handle_function (char **op, const char **stringp, const char *nameend, const char *eol);
247#endif
248int pattern_matches (const char *pattern, const char *percent, const char *str);
249char *subst_expand (char *o, const char *text, const char *subst,
250 const char *replace, unsigned int slen, unsigned int rlen,
251 int by_word);
252char *patsubst_expand_pat (char *o, const char *text, const char *pattern,
253 const char *replace, const char *pattern_percent,
254 const char *replace_percent);
255char *patsubst_expand (char *o, const char *text, char *pattern, char *replace);
256#ifdef CONFIG_WITH_COMMANDS_FUNC
257char *func_commands (char *o, char **argv, const char *funcname);
258#endif
259#if defined (CONFIG_WITH_VALUE_LENGTH)
260/* Avoid calling handle_function for every variable, do the
261 basic checks in variable_expand_string_2. */
262extern char func_char_map[256];
263# define MAX_FUNCTION_LENGTH 12
264# define MIN_FUNCTION_LENGTH 2
265MY_INLINE const char *
266may_be_function_name (const char *name, const char *eos)
267{
268 unsigned char ch;
269 unsigned int len = name - eos;
270
271 /* Minimum length is MIN + whitespace. Check this directly.
272 ASSUMES: MIN_FUNCTION_LENGTH == 2 */
273
274 if (MY_PREDICT_TRUE(len < MIN_FUNCTION_LENGTH + 1
275 || !func_char_map[(int)(name[0])]
276 || !func_char_map[(int)(name[1])]))
277 return 0;
278 if (MY_PREDICT_TRUE(!func_char_map[ch = name[2]]))
279 return isspace (ch) ? name + 2 : 0;
280
281 name += 3;
282 if (len > MAX_FUNCTION_LENGTH)
283 len = MAX_FUNCTION_LENGTH - 3;
284 else if (len == 3)
285 len -= 3;
286 if (!len)
287 return 0;
288
289 /* Loop over the remaining possiblities. */
290
291 while (func_char_map[ch = *name])
292 {
293 if (!len--)
294 return 0;
295 name++;
296 }
297 if (ch == '\0' || isblank (ch))
298 return name;
299 return 0;
300}
301#endif /* CONFIG_WITH_VALUE_LENGTH */
302
303/* expand.c */
304#ifndef CONFIG_WITH_VALUE_LENGTH
305char *recursively_expand_for_file (struct variable *v, struct file *file);
306#define recursively_expand(v) recursively_expand_for_file (v, NULL)
307#else
308char *recursively_expand_for_file (struct variable *v, struct file *file,
309 unsigned int *value_lenp);
310#define recursively_expand(v) recursively_expand_for_file (v, NULL, NULL)
311#endif
312
313/* variable.c */
314struct variable_set_list *create_new_variable_set (void);
315void free_variable_set (struct variable_set_list *);
316struct variable_set_list *push_new_variable_scope (void);
317void pop_variable_scope (void);
318void define_automatic_variables (void);
319void initialize_file_variables (struct file *file, int reading);
320void print_file_variables (const struct file *file);
321void print_variable_set (struct variable_set *set, char *prefix);
322void merge_variable_set_lists (struct variable_set_list **to_list,
323 struct variable_set_list *from_list);
324#ifndef CONFIG_WITH_VALUE_LENGTH
325struct variable *do_variable_definition (const struct floc *flocp,
326 const char *name, const char *value,
327 enum variable_origin origin,
328 enum variable_flavor flavor,
329 int target_var);
330#else /* CONFIG_WITH_VALUE_LENGTH */
331# define do_variable_definition(flocp, varname, value, origin, flavor, target_var) \
332 do_variable_definition_2 ((flocp), (varname), (value), ~0U, 0, NULL, \
333 (origin), (flavor), (target_var))
334struct variable *do_variable_definition_2 (const struct floc *flocp,
335 const char *varname,
336 const char *value,
337 unsigned int value_len,
338 int simple_value, char *free_value,
339 enum variable_origin origin,
340 enum variable_flavor flavor,
341 int target_var);
342#endif /* CONFIG_WITH_VALUE_LENGTH */
343char *parse_variable_definition (const char *line,
344 enum variable_flavor *flavor);
345struct variable *assign_variable_definition (struct variable *v, char *line IF_WITH_VALUE_LENGTH_PARAM(char *eos));
346struct variable *try_variable_definition (const struct floc *flocp, char *line
347 IF_WITH_VALUE_LENGTH_PARAM(char *eos),
348 enum variable_origin origin,
349 int target_var);
350void init_hash_global_variable_set (void);
351void hash_init_function_table (void);
352struct variable *lookup_variable (const char *name, unsigned int length);
353struct variable *lookup_variable_in_set (const char *name, unsigned int length,
354 const struct variable_set *set);
355
356#ifdef CONFIG_WITH_VALUE_LENGTH
357void append_string_to_variable (struct variable *v, const char *value,
358 unsigned int value_len, int append);
359struct variable * do_variable_definition_append (const struct floc *flocp, struct variable *v,
360 const char *value, unsigned int value_len,
361 int simple_value, enum variable_origin origin,
362 int append);
363
364struct variable *define_variable_in_set (const char *name, unsigned int length,
365 const char *value,
366 unsigned int value_length,
367 int duplicate_value,
368 enum variable_origin origin,
369 int recursive,
370 struct variable_set *set,
371 const struct floc *flocp);
372
373/* Define a variable in the current variable set. */
374
375#define define_variable(n,l,v,o,r) \
376 define_variable_in_set((n),(l),(v),~0U,1,(o),(r),\
377 current_variable_set_list->set,NILF)
378
379#define define_variable_vl(n,l,v,vl,dv,o,r) \
380 define_variable_in_set((n),(l),(v),(vl),(dv),(o),(r),\
381 current_variable_set_list->set,NILF)
382
383/* Define a variable with a constant name in the current variable set. */
384
385#define define_variable_cname(n,v,o,r) \
386 define_variable_in_set((n),(sizeof (n) - 1),(v),~0U,1,(o),(r),\
387 current_variable_set_list->set,NILF)
388
389/* Define a variable with a location in the current variable set. */
390
391#define define_variable_loc(n,l,v,o,r,f) \
392 define_variable_in_set((n),(l),(v),~0U,1,(o),(r),\
393 current_variable_set_list->set,(f))
394
395/* Define a variable with a location in the global variable set. */
396
397#define define_variable_global(n,l,v,o,r,f) \
398 define_variable_in_set((n),(l),(v),~0U,1,(o),(r),NULL,(f))
399
400#define define_variable_vl_global(n,l,v,vl,dv,o,r,f) \
401 define_variable_in_set((n),(l),(v),(vl),(dv),(o),(r),NULL,(f))
402
403/* Define a variable in FILE's variable set. */
404
405#define define_variable_for_file(n,l,v,o,r,f) \
406 define_variable_in_set((n),(l),(v),~0U,1,(o),(r),(f)->variables->set,NILF)
407
408#else /* !CONFIG_WITH_VALUE_LENGTH */
409
410struct variable *define_variable_in_set (const char *name, unsigned int length,
411 const char *value,
412 enum variable_origin origin,
413 int recursive,
414 struct variable_set *set,
415 const struct floc *flocp);
416
417/* Define a variable in the current variable set. */
418
419#define define_variable(n,l,v,o,r) \
420 define_variable_in_set((n),(l),(v),(o),(r),\
421 current_variable_set_list->set,NILF) /* force merge conflict */
422
423/* Define a variable with a constant name in the current variable set. */
424
425#define define_variable_cname(n,v,o,r) \
426 define_variable_in_set((n),(sizeof (n) - 1),(v),(o),(r),\
427 current_variable_set_list->set,NILF) /* force merge conflict */
428
429/* Define a variable with a location in the current variable set. */
430
431#define define_variable_loc(n,l,v,o,r,f) \
432 define_variable_in_set((n),(l),(v),(o),(r),\
433 current_variable_set_list->set,(f)) /* force merge conflict */
434
435/* Define a variable with a location in the global variable set. */
436
437#define define_variable_global(n,l,v,o,r,f) \
438 define_variable_in_set((n),(l),(v),(o),(r),NULL,(f)) /* force merge conflict */
439
440/* Define a variable in FILE's variable set. */
441
442#define define_variable_for_file(n,l,v,o,r,f) \
443 define_variable_in_set((n),(l),(v),(o),(r),(f)->variables->set,NILF) /* force merge conflict */
444
445#endif /* !CONFIG_WITH_VALUE_LENGTH */
446
447void undefine_variable_in_set (const char *name, unsigned int length,
448 enum variable_origin origin,
449 struct variable_set *set);
450
451/* Remove variable from the current variable set. */
452
453#define undefine_variable_global(n,l,o) \
454 undefine_variable_in_set((n),(l),(o),NULL)
455
456#ifdef KMK
457struct variable *
458define_variable_alias_in_set (const char *name, unsigned int length,
459 struct variable *target, enum variable_origin origin,
460 struct variable_set *set, const struct floc *flocp);
461#endif
462
463/* Warn that NAME is an undefined variable. */
464
465#define warn_undefined(n,l) do{\
466 if (warn_undefined_variables_flag) \
467 error (reading_file, \
468 _("warning: undefined variable `%.*s'"), \
469 (int)(l), (n)); \
470 }while(0)
471
472char **target_environment (struct file *file);
473
474struct pattern_var *create_pattern_var (const char *target,
475 const char *suffix);
476
477extern int export_all_variables;
478#ifdef CONFIG_WITH_STRCACHE2
479extern struct strcache2 variable_strcache;
480#endif
481
482#ifdef KMK
483# define MAKELEVEL_NAME "KMK_LEVEL"
484#else
485#define MAKELEVEL_NAME "MAKELEVEL"
486#endif
487#define MAKELEVEL_LENGTH (sizeof (MAKELEVEL_NAME) - 1)
488
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