diff options
| author | Ron Yorston <rmy@pobox.com> | 2025-01-21 09:25:46 +0000 |
|---|---|---|
| committer | Ron Yorston <rmy@pobox.com> | 2025-01-21 09:25:46 +0000 |
| commit | 89b641cbb52bdc29e7e078c7f1ebcfbe7364ba18 (patch) | |
| tree | 6e761dd6d6e8dd193536bd6acb57b0d383406847 | |
| parent | 73ca192b94f06c24d9638aebf271eaf2a6bd92d5 (diff) | |
| download | busybox-w32-89b641cbb52bdc29e7e078c7f1ebcfbe7364ba18.tar.gz busybox-w32-89b641cbb52bdc29e7e078c7f1ebcfbe7364ba18.tar.bz2 busybox-w32-89b641cbb52bdc29e7e078c7f1ebcfbe7364ba18.zip | |
make: fix single-suffix inference rule regression
Commit 85bbce87d (make: support GNU/BSD suffixes and inference
rules) added code to handle inference rules with arbitrary
suffixes. Unfortunately it failed to check for a single-suffix
rule in the case where no known suffix was found. Add the
necessary code and a test which would have caught the problem.
Adds 48 bytes.
(pdpmake GitHub issue 72)
| -rw-r--r-- | miscutils/make.c | 17 | ||||
| -rwxr-xr-x | testsuite/make.tests | 10 |
2 files changed, 24 insertions, 3 deletions
diff --git a/miscutils/make.c b/miscutils/make.c index ceac1d91d..39c0081ab 100644 --- a/miscutils/make.c +++ b/miscutils/make.c | |||
| @@ -1100,22 +1100,34 @@ dyndep(struct name *np, struct rule *infrule, const char **ptsuff) | |||
| 1100 | // targets of the form lib.a(member.o). | 1100 | // targets of the form lib.a(member.o). |
| 1101 | if (!posix && member == NULL) { | 1101 | if (!posix && member == NULL) { |
| 1102 | struct name *xp = newname(".SUFFIXES"); | 1102 | struct name *xp = newname(".SUFFIXES"); |
| 1103 | int found_suffix = FALSE; | ||
| 1104 | |||
| 1103 | for (struct rule *rp = xp->n_rule; rp; rp = rp->r_next) { | 1105 | for (struct rule *rp = xp->n_rule; rp; rp = rp->r_next) { |
| 1104 | for (struct depend *dp = rp->r_dep; dp; dp = dp->d_next) { | 1106 | for (struct depend *dp = rp->r_dep; dp; dp = dp->d_next) { |
| 1105 | tsuff = dp->d_name->n_name; | 1107 | tsuff = dp->d_name->n_name; |
| 1106 | base = has_suffix(name, tsuff); | 1108 | base = has_suffix(name, tsuff); |
| 1107 | if (base) { | 1109 | if (base) { |
| 1110 | found_suffix = TRUE; | ||
| 1108 | pp = dyndep0(base, tsuff, infrule); | 1111 | pp = dyndep0(base, tsuff, infrule); |
| 1109 | free(base); | 1112 | free(base); |
| 1110 | if (pp) { | 1113 | if (pp) { |
| 1111 | if (ptsuff) | ||
| 1112 | *ptsuff = tsuff; | ||
| 1113 | goto done; | 1114 | goto done; |
| 1114 | } | 1115 | } |
| 1115 | } | 1116 | } |
| 1116 | } | 1117 | } |
| 1117 | } | 1118 | } |
| 1118 | 1119 | ||
| 1120 | if (!found_suffix) { | ||
| 1121 | // The name didn't have a known suffix. Try single-suffix rule. | ||
| 1122 | tsuff = ""; | ||
| 1123 | pp = dyndep0(name, tsuff, infrule); | ||
| 1124 | if (pp) { | ||
| 1125 | done: | ||
| 1126 | if (ptsuff) { | ||
| 1127 | *ptsuff = tsuff; | ||
| 1128 | } | ||
| 1129 | } | ||
| 1130 | } | ||
| 1119 | } else { | 1131 | } else { |
| 1120 | tsuff = xstrdup(suffix(name)); | 1132 | tsuff = xstrdup(suffix(name)); |
| 1121 | base = member ? member : name; | 1133 | base = member ? member : name; |
| @@ -1124,7 +1136,6 @@ dyndep(struct name *np, struct rule *infrule, const char **ptsuff) | |||
| 1124 | pp = dyndep0(base, tsuff, infrule); | 1136 | pp = dyndep0(base, tsuff, infrule); |
| 1125 | free((void *)tsuff); | 1137 | free((void *)tsuff); |
| 1126 | } | 1138 | } |
| 1127 | done: | ||
| 1128 | free(name); | 1139 | free(name); |
| 1129 | 1140 | ||
| 1130 | return pp; | 1141 | return pp; |
diff --git a/testsuite/make.tests b/testsuite/make.tests index e3103c514..fabdbe45c 100755 --- a/testsuite/make.tests +++ b/testsuite/make.tests | |||
| @@ -86,6 +86,16 @@ test.k: | |||
| 86 | ' | 86 | ' |
| 87 | cd .. || exit 1; rm -rf make.tempdir 2>/dev/null | 87 | cd .. || exit 1; rm -rf make.tempdir 2>/dev/null |
| 88 | 88 | ||
| 89 | # Check that single-suffix inference rules work. | ||
| 90 | mkdir make.tempdir && cd make.tempdir || exit 1 | ||
| 91 | touch test.sh | ||
| 92 | testing "make single-suffix inference rule works" \ | ||
| 93 | "make -f - -s; echo $?" \ | ||
| 94 | "0\n" "" ' | ||
| 95 | test: | ||
| 96 | ' | ||
| 97 | cd .. || exit 1; rm -rf make.tempdir 2>/dev/null | ||
| 98 | |||
| 89 | # There was a bug where the failure of a build command didn't result | 99 | # There was a bug where the failure of a build command didn't result |
| 90 | # in make returning a non-zero exit status. | 100 | # in make returning a non-zero exit status. |
| 91 | testing "make return error if command fails" \ | 101 | testing "make return error if command fails" \ |
