/* If the load didn't fail, add the file to the .LOADED variable. */
if (r)
- do_variable_definition(flocp, ".LOADED", ldname, o_file, f_append_value, 0, 0);
+ do_variable_definition(flocp, ".LOADED", ldname, o_file, f_append_value, 0,
+ s_global);
return r;
}
}
}
#endif
- v = try_variable_definition (0, arg, origin, 0);
+ v = try_variable_definition (0, arg, origin, s_global);
if (v != 0)
{
/* It is indeed a variable definition. If we don't already have this
/* Add this makefile to the list. */
do_variable_definition (&ebuf.floc, "MAKEFILE_LIST", filename, o_file,
- f_append_value, 0, 0);
+ f_append_value, 0, s_global);
/* Evaluate the makefile */
if (vmod.define_v)
v = do_define (p, origin, ebuf);
else
- v = try_variable_definition (fstart, p, origin, 0);
+ v = try_variable_definition (fstart, p, origin, s_global);
assert (v != NULL);
else
definition[idx - 1] = '\0';
- v = do_variable_definition (&defstart, name, definition,
- origin, var.flavor, var.conditional, 0);
+ v = do_variable_definition (&defstart, name, definition, origin, var.flavor,
+ var.conditional, s_global);
free (definition);
free (n);
return (v);
initialize_file_variables (f, 1);
current_variable_set_list = f->variables;
- v = try_variable_definition (flocp, defn, origin, 1);
+ v = try_variable_definition (flocp, defn, origin, s_target);
if (!v)
O (fatal, flocp, _("malformed target-specific variable definition"));
current_variable_set_list = global;
/* Now add each dir to the .INCLUDE_DIRS variable. */
- do_variable_definition (NILF, ".INCLUDE_DIRS", "", o_default, f_simple, 0, 0);
+ do_variable_definition (NILF, ".INCLUDE_DIRS", "", o_default, f_simple, 0,
+ s_global);
for (cpp = dirs; *cpp != 0; ++cpp)
- do_variable_definition (NILF, ".INCLUDE_DIRS", *cpp,
- o_default, f_append, 0, 0);
+ do_variable_definition (NILF, ".INCLUDE_DIRS", *cpp, o_default, f_append,
+ 0, s_global);
free ((void *) include_directories);
include_directories = dirs;
else
{
v = do_variable_definition (
- &p->variable.fileinfo, p->variable.name,
- p->variable.value, p->variable.origin,
- p->variable.flavor, p->variable.conditional, 1);
+ &p->variable.fileinfo, p->variable.name, p->variable.value,
+ p->variable.origin, p->variable.flavor,
+ p->variable.conditional, s_pattern);
}
/* Also mark it as a per-target and copy export status. */
struct variable *
do_variable_definition (const floc *flocp, const char *varname, const char *value,
enum variable_origin origin, enum variable_flavor flavor,
- int conditional, int target_var)
+ int conditional, enum variable_scope scope)
{
const char *newval;
char *alloc_value = NULL;
{
/* If we have += but we're in a target variable context, we want to
append only with other variables in the context of this target. */
- if (target_var)
+ if (scope)
{
append = 1;
v = lookup_variable_in_set (varname, strlen (varname),
{
v = define_variable_in_set (varname, strlen (varname), default_shell,
origin, flavor == f_recursive,
- (target_var
+ (specificity
? current_variable_set_list->set
: NULL),
flocp);
{
v = define_variable_in_set (varname, strlen (varname), newval,
origin, flavor == f_recursive,
- (target_var
+ (specificity
? current_variable_set_list->set
: NULL),
flocp);
v = define_variable_in_set (varname, strlen (varname), newval, origin,
flavor == f_recursive || flavor == f_expand,
- (target_var
- ? current_variable_set_list->set : NULL),
+ (scope == s_global
+ ? NULL : current_variable_set_list->set),
flocp);
v->append = append;
v->conditional = conditional;
struct variable *
try_variable_definition (const floc *flocp, const char *line,
- enum variable_origin origin, int target_var)
+ enum variable_origin origin, enum variable_scope scope)
{
struct variable v;
struct variable *vp;
if (!assign_variable_definition (&v, line))
return 0;
- vp = do_variable_definition (flocp, v.name, v.value,
- origin, v.flavor, v.conditional, target_var);
+ vp = do_variable_definition (flocp, v.name, v.value, origin, v.flavor,
+ v.conditional, scope);
free (v.name);
v_ifset /* Export it if it has a non-default value. */
};
+enum variable_scope
+{
+ s_global = 0, /* Global variable. */
+ s_target, /* Target-specific variable. */
+ s_pattern /* Pattern-specific variable. */
+};
+
/* Structure that represents one variable definition.
Each bucket of the hash table is a chain of these,
chained through 'next'. */
const char *name, const char *value,
enum variable_origin origin,
enum variable_flavor flavor,
- int conditional, int target_var);
+ int conditional,
+ enum variable_scope scope);
char *parse_variable_definition (const char *line,
struct variable *v);
struct variable *assign_variable_definition (struct variable *v, const char *line);
struct variable *try_variable_definition (const floc *flocp, const char *line,
enum variable_origin origin,
- int target_var);
+ enum variable_scope scope);
void init_hash_global_variable_set (void);
void hash_init_function_table (void);
void define_new_function(const floc *flocp, const char *name,