diff options
author | Paul Smith <psmith@gnu.org> | 2005-12-11 15:41:17 +0000 |
---|---|---|
committer | Paul Smith <psmith@gnu.org> | 2005-12-11 15:41:17 +0000 |
commit | 3bcb608bdab1d3d24251548aac8bc33fc2fdad66 (patch) | |
tree | 9f5d9e31c96991d14c9774976873c32d2b467a72 /implicit.c | |
parent | 0e6c4f5b0ed4183bbdb8cdce168dcbd1bc9cf182 (diff) | |
download | gunmake-3bcb608bdab1d3d24251548aac8bc33fc2fdad66.tar.gz |
Extend .SECONDEXPANSION to implicit rules. Final fix for bug #13781.
Diffstat (limited to 'implicit.c')
-rw-r--r-- | implicit.c | 78 |
1 files changed, 54 insertions, 24 deletions
@@ -502,41 +502,71 @@ pattern_search (struct file *file, int archive, if (p == 0) break; /* No more words */ - /* If the dependency name has %, substitute the stem. - Watch out, we are going to do something tricky here. If - we just replace % with the stem value, later, when we do - the second expansion, we will re-expand this stem value - once again. This is not good especially if you have - certain characters in your stem (like $). - - Instead, we will replace % with $* and allow the second - expansion to take care of it for us. This way (since $* - is a simple variable) there won't be additional - re-expansion of the stem. */ + /* Is there a pattern in this prerequisite? */ for (p2 = p; p2 < p + len && *p2 != '%'; ++p2) ; - if (p2 < p + len) + if (dep->need_2nd_expansion) { - register unsigned int i = p2 - p; - bcopy (p, depname, i); - bcopy ("$*", depname + i, 2); - bcopy (p2 + 1, depname + i + 2, len - i - 1); - depname[len + 2 - 1] = '\0'; + /* If the dependency name has %, substitute the stem. - if (check_lastslash) - add_dir = 1; + Watch out, we are going to do something tricky + here. If we just replace % with the stem value, + later, when we do the second expansion, we will + re-expand this stem value once again. This is not + good especially if you have certain characters in + your stem (like $). - had_stem = 1; + Instead, we will replace % with $* and allow the + second expansion to take care of it for us. This way + (since $* is a simple variable) there won't be + additional re-expansion of the stem. */ + + if (p2 < p + len) + { + register unsigned int i = p2 - p; + bcopy (p, depname, i); + bcopy ("$*", depname + i, 2); + bcopy (p2 + 1, depname + i + 2, len - i - 1); + depname[len + 2 - 1] = '\0'; + + if (check_lastslash) + add_dir = 1; + + had_stem = 1; + } + else + { + bcopy (p, depname, len); + depname[len] = '\0'; + } + + p2 = variable_expand_for_file (depname, file); } else { - bcopy (p, depname, len); - depname[len] = '\0'; - } + if (p2 < p + len) + { + register unsigned int i = p2 - p; + bcopy (p, depname, i); + bcopy (stem_str, depname + i, stemlen); + bcopy (p2 + 1, depname + i + stemlen, len - i - 1); + depname[len + stemlen - 1] = '\0'; + + if (check_lastslash) + add_dir = 1; + + had_stem = 1; + } + else + { + bcopy (p, depname, len); + depname[len] = '\0'; + } - p2 = variable_expand_for_file (depname, file); + p2 = depname; + } /* Parse the dependencies. */ |