mirror of
https://github.com/mirror/make.git
synced 2025-02-05 17:20:15 +08:00
Fixed Savannah bug #12320.
This commit is contained in:
parent
d584d0c1c6
commit
4923580e3a
@ -1,3 +1,12 @@
|
|||||||
|
2005-03-15 Boris Kolpackov <boris@kolpackov.net>
|
||||||
|
|
||||||
|
* file.c (expand_deps): Factor out the second expansion and
|
||||||
|
prerequisite line parsing logic from snap_deps().
|
||||||
|
|
||||||
|
* file.c (snap_deps): Use expand_deps(). Expand and parse
|
||||||
|
prerequisites of the .SUFFIXES special target first. Fixes
|
||||||
|
Savannah bug #12320.
|
||||||
|
|
||||||
2005-03-10 Boris Kolpackov <boris@kolpackov.net>
|
2005-03-10 Boris Kolpackov <boris@kolpackov.net>
|
||||||
|
|
||||||
* implicit.c (pattern_search): Mark an intermediate target as
|
* implicit.c (pattern_search): Mark an intermediate target as
|
||||||
|
86
file.c
86
file.c
@ -414,43 +414,21 @@ set_intermediate (const void *item)
|
|||||||
f->intermediate = 1;
|
f->intermediate = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For each dependency of each file, make the `struct dep' point
|
/* Expand and parse each dependency line. */
|
||||||
at the appropriate `struct file' (which may have to be created).
|
static void
|
||||||
|
expand_deps (struct file *f)
|
||||||
Also mark the files depended on by .PRECIOUS, .PHONY, .SILENT,
|
|
||||||
and various other special targets. */
|
|
||||||
|
|
||||||
void
|
|
||||||
snap_deps (void)
|
|
||||||
{
|
{
|
||||||
register struct file *f;
|
|
||||||
register struct file *f2;
|
|
||||||
register struct dep *d, *d1;
|
register struct dep *d, *d1;
|
||||||
register struct file **file_slot_0;
|
|
||||||
register struct file **file_slot;
|
|
||||||
register struct file **file_end;
|
|
||||||
|
|
||||||
/* Perform second expansion and enter each dependency
|
|
||||||
name as a file. */
|
|
||||||
|
|
||||||
/* We must use hash_dump (), because within this loop
|
|
||||||
we might add new files to the table, possibly causing
|
|
||||||
an in-situ table expansion. */
|
|
||||||
file_slot_0 = (struct file **) hash_dump (&files, 0, 0);
|
|
||||||
file_end = file_slot_0 + files.ht_fill;
|
|
||||||
for (file_slot = file_slot_0; file_slot < file_end; file_slot++)
|
|
||||||
for (f2 = *file_slot; f2 != 0; f2 = f2->prev)
|
|
||||||
{
|
|
||||||
struct dep *new = 0;
|
struct dep *new = 0;
|
||||||
struct dep *old = f2->deps;
|
struct dep *old = f->deps;
|
||||||
unsigned int last_dep_has_cmds = f2->updating;
|
unsigned int last_dep_has_cmds = f->updating;
|
||||||
|
|
||||||
f2->updating = 0;
|
f->updating = 0;
|
||||||
f2->deps = 0;
|
f->deps = 0;
|
||||||
|
|
||||||
/* We are going to do second expansion so initialize file
|
/* We are going to do second expansion so initialize file
|
||||||
variables for the file. */
|
variables for the file. */
|
||||||
initialize_file_variables (f2, 0);
|
initialize_file_variables (f, 0);
|
||||||
|
|
||||||
for (d = old; d != 0; d = d->next)
|
for (d = old; d != 0; d = d->next)
|
||||||
{
|
{
|
||||||
@ -459,9 +437,9 @@ snap_deps (void)
|
|||||||
char *p;
|
char *p;
|
||||||
struct dep **d_ptr;
|
struct dep **d_ptr;
|
||||||
|
|
||||||
set_file_variables (f2);
|
set_file_variables (f);
|
||||||
|
|
||||||
p = variable_expand_for_file (d->name, f2);
|
p = variable_expand_for_file (d->name, f);
|
||||||
|
|
||||||
/* Parse the dependencies. */
|
/* Parse the dependencies. */
|
||||||
new = (struct dep *)
|
new = (struct dep *)
|
||||||
@ -500,7 +478,7 @@ snap_deps (void)
|
|||||||
d1->name = 0;
|
d1->name = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add newly parsed deps to f2->deps. If this is the last
|
/* Add newly parsed deps to f->deps. If this is the last
|
||||||
dependency line and this target has commands then put
|
dependency line and this target has commands then put
|
||||||
it in front so the last dependency line (the one with
|
it in front so the last dependency line (the one with
|
||||||
commands) ends up being the first. This is important
|
commands) ends up being the first. This is important
|
||||||
@ -517,12 +495,12 @@ snap_deps (void)
|
|||||||
for (d_ptr = &new; *d_ptr; d_ptr = &(*d_ptr)->next)
|
for (d_ptr = &new; *d_ptr; d_ptr = &(*d_ptr)->next)
|
||||||
;
|
;
|
||||||
|
|
||||||
*d_ptr = f2->deps;
|
*d_ptr = f->deps;
|
||||||
f2->deps = new;
|
f->deps = new;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (d_ptr = &(f2->deps); *d_ptr; d_ptr = &(*d_ptr)->next)
|
for (d_ptr = &(f->deps); *d_ptr; d_ptr = &(*d_ptr)->next)
|
||||||
;
|
;
|
||||||
|
|
||||||
*d_ptr = new;
|
*d_ptr = new;
|
||||||
@ -533,6 +511,42 @@ snap_deps (void)
|
|||||||
|
|
||||||
free_ns_chain ((struct nameseq*)old);
|
free_ns_chain ((struct nameseq*)old);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* For each dependency of each file, make the `struct dep' point
|
||||||
|
at the appropriate `struct file' (which may have to be created).
|
||||||
|
|
||||||
|
Also mark the files depended on by .PRECIOUS, .PHONY, .SILENT,
|
||||||
|
and various other special targets. */
|
||||||
|
|
||||||
|
void
|
||||||
|
snap_deps (void)
|
||||||
|
{
|
||||||
|
register struct file *f;
|
||||||
|
register struct file *f2;
|
||||||
|
register struct dep *d;
|
||||||
|
register struct file **file_slot_0;
|
||||||
|
register struct file **file_slot;
|
||||||
|
register struct file **file_end;
|
||||||
|
|
||||||
|
/* Perform second expansion and enter each dependency
|
||||||
|
name as a file. */
|
||||||
|
|
||||||
|
/* Expand .SUFFIXES first; it's dependencies are used for
|
||||||
|
$$* calculation. */
|
||||||
|
for (f = lookup_file (".SUFFIXES"); f != 0; f = f->prev)
|
||||||
|
expand_deps (f);
|
||||||
|
|
||||||
|
/* We must use hash_dump (), because within this loop
|
||||||
|
we might add new files to the table, possibly causing
|
||||||
|
an in-situ table expansion. */
|
||||||
|
file_slot_0 = (struct file **) hash_dump (&files, 0, 0);
|
||||||
|
file_end = file_slot_0 + files.ht_fill;
|
||||||
|
for (file_slot = file_slot_0; file_slot < file_end; file_slot++)
|
||||||
|
for (f = *file_slot; f != 0; f = f->prev)
|
||||||
|
{
|
||||||
|
if (strcmp (f->name, ".SUFFIXES") != 0)
|
||||||
|
expand_deps (f);
|
||||||
|
}
|
||||||
free (file_slot_0);
|
free (file_slot_0);
|
||||||
|
|
||||||
for (f = lookup_file (".PRECIOUS"); f != 0; f = f->prev)
|
for (f = lookup_file (".PRECIOUS"); f != 0; f = f->prev)
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
2005-03-15 Boris Kolpackov <boris@kolpackov.net>
|
||||||
|
|
||||||
|
* scripts/variables/automatic: Add a test for Savannah bug #12320.
|
||||||
|
|
||||||
2005-03-10 Boris Kolpackov <boris@kolpackov.net>
|
2005-03-10 Boris Kolpackov <boris@kolpackov.net>
|
||||||
|
|
||||||
* scripts/features/patternrules: Add a test for Savannah bug #12267.
|
* scripts/features/patternrules: Add a test for Savannah bug #12267.
|
||||||
|
@ -78,4 +78,19 @@ $answer = ".x\n$dir/x.z.x\nx\n\$@.x\n$dir.x\nx.z.x\n.y\n$dir/y.z.y\n\y\n\$@.y\n$
|
|||||||
$answer = "$dir/biz.x\n$dir.x\nbiz.x\n";
|
$answer = "$dir/biz.x\n$dir.x\nbiz.x\n";
|
||||||
&compare_output($answer, &get_logfile(1));
|
&compare_output($answer, &get_logfile(1));
|
||||||
|
|
||||||
|
# TEST #3 -- test for Savannah bug #12320.
|
||||||
|
#
|
||||||
|
run_make_test('
|
||||||
|
.SUFFIXES: .b .src
|
||||||
|
|
||||||
|
mbr.b: mbr.src
|
||||||
|
@echo $*
|
||||||
|
|
||||||
|
mbr.src: ; @:
|
||||||
|
|
||||||
|
',
|
||||||
|
'',
|
||||||
|
'mbr
|
||||||
|
');
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
Loading…
Reference in New Issue
Block a user