diff --git a/build/parseSpec.c b/build/parseSpec.c index 2fd29e178c..ea5a26f7c5 100644 --- a/build/parseSpec.c +++ b/build/parseSpec.c @@ -204,7 +204,7 @@ int specExpand(rpmSpec spec, int lineno, const char *sbuf, snprintf(lnobuf, sizeof(lnobuf), "%d", lineno); rpmPushMacroFlags(spec->macros, "__file_lineno", NULL, lnobuf, RMIL_SPEC, RPMMACRO_LITERAL); - rc = (rpmExpandMacros(spec->macros, sbuf, obuf, 0) < 0); + rc = (rpmExpandMacros(spec->macros, sbuf, obuf, RPMMACRO_WUNDEF) < 0); rpmPopMacro(spec->macros, "__file_lineno"); diff --git a/rpmbuild.c b/rpmbuild.c index 1e0dc22534..a2ac58445a 100644 --- a/rpmbuild.c +++ b/rpmbuild.c @@ -421,6 +421,7 @@ static int buildForTarget(rpmts ts, const char * arg, BTA_t ba) int buildAmount = ba->buildAmount; char * buildRootURL = NULL; char * specFile = NULL; + char *buildtree = NULL; rpmSpec spec = NULL; int rc = 1; /* assume failure */ rpmSpecFlags specFlags = spec_flags; @@ -436,8 +437,12 @@ static int buildForTarget(rpmts ts, const char * arg, BTA_t ba) buildRootURL = rpmGenPath(NULL, ba->buildRootOverride, NULL); /* Create build tree if necessary */ - const char * buildtree = "%{_topdir}:%{_specdir}:%{_sourcedir}:%{_builddir}:%{_rpmdir}:%{_srcrpmdir}:%{_buildrootdir}"; + const char * buildpath = "%{_topdir}:%{_specdir}:%{_sourcedir}:%{_builddir}:%{_rpmdir}:%{_srcrpmdir}:%{_buildrootdir}"; const char * rootdir = rpmtsRootDir(ts); + + if (rpmExpandMacros(NULL, buildpath, &buildtree, RPMMACRO_WUNDEF) < 0) + goto exit; + if (rpmMkdirs(!rstreq(rootdir, "/") ? rootdir : NULL , buildtree)) { goto exit; } @@ -520,6 +525,7 @@ static int buildForTarget(rpmts ts, const char * arg, BTA_t ba) free(specFile); rpmSpecFree(spec); free(buildRootURL); + free(buildtree); return rc; } diff --git a/rpmio/macro.c b/rpmio/macro.c index 4d3697fd7e..451213e7c9 100644 --- a/rpmio/macro.c +++ b/rpmio/macro.c @@ -308,8 +308,7 @@ matchchar(const char * p, char pl, char pr) return (const char *)NULL; } -static void mbErr(MacroBuf mb, int error, const char *fmt, ...) -{ +static void mbErr(MacroBuf mb, int error, const char *fmt, ...) { char *emsg = NULL; int n; va_list ap; @@ -1394,6 +1393,7 @@ expandMacro(MacroBuf mb, const char *src, size_t slen) } while (mb->error == 0 && (c = *s) != '\0') { + int brace = 0; const struct builtins_s* builtin = NULL; s++; /* Copy text until next macro */ @@ -1445,6 +1445,7 @@ expandMacro(MacroBuf mb, const char *src, size_t slen) s = se; continue; case '{': /* %{...}/%{...:...} substitution */ + brace = 1; f = s+1; /* skip { */ f = setNegateAndCheck(f, &negate, &chkexist); for (fe = f; (c = *fe) && !strchr(" :}", c);) @@ -1536,6 +1537,10 @@ expandMacro(MacroBuf mb, const char *src, size_t slen) /* XXX hack to permit non-overloaded %foo to be passed */ c = '%'; /* XXX only need to save % */ mbAppend(mb, c); + if (brace && mb->flags & RPMMACRO_WUNDEF) { + mbErr(mb, 0, _("undefined macro %.*s in %.*s\n"), + (int)fn, f, (int)slen, src); + } continue; } diff --git a/rpmio/rpmmacro.h b/rpmio/rpmmacro.h index 005ff88ca6..c65f68a0f4 100644 --- a/rpmio/rpmmacro.h +++ b/rpmio/rpmmacro.h @@ -65,6 +65,8 @@ typedef enum rpmMacroFlags_e { void rpmDumpMacroTable (rpmMacroContext mc, FILE * fp); +#define RPMMACRO_WUNDEF (1 << 0) + /** \ingroup rpmmacro * Expand macro into buffer. * @param mc macro context (NULL uses global context). diff --git a/tests/data/SPECS/configtest.spec b/tests/data/SPECS/configtest.spec index 17dd7c901e..79f6d6305b 100644 --- a/tests/data/SPECS/configtest.spec +++ b/tests/data/SPECS/configtest.spec @@ -2,6 +2,7 @@ %define _sysconfdir /etc %{!?filetype: %global filetype file} +%{!?filedata: %global filedata somestuff} Name: configtest%{?sub:-%{sub}} Version: %{ver} diff --git a/tests/data/SPECS/replacetest.spec b/tests/data/SPECS/replacetest.spec index d5a1729d3a..1140dc1fe6 100644 --- a/tests/data/SPECS/replacetest.spec +++ b/tests/data/SPECS/replacetest.spec @@ -1,4 +1,5 @@ %{!?filetype: %global filetype file} +%{!?filedata: %global filedata somestuff} %{?fixit: %global havepretrans 1} %{!?user: %global user root} %{!?grp: %global grp root}