handle Build Prefix
authorroot <devnull@localhost>
Tue, 9 Jul 1996 22:28:22 +0000 (22:28 +0000)
committerroot <devnull@localhost>
Tue, 9 Jul 1996 22:28:22 +0000 (22:28 +0000)
CVS patchset: 750
CVS date: 1996/07/09 22:28:22

build/build.c
build/spec.c
build/spec.h
build/specP.h

index 0750948..bc6fa62 100644 (file)
@@ -76,6 +76,12 @@ struct Script *openScript(Spec spec, int builddir, char *name)
     } else {
        fprintf(script->file, "RPM_ROOT_DIR=\"\"\n");
     }
+    if (getVar(RPMVAR_BUILDPREFIX)) {
+       fprintf(script->file, "RPM_BUILD_PREFIX=\"%s\"\n",
+               getVar(RPMVAR_BUILDPREFIX));
+    } else {
+       fprintf(script->file, "RPM_BUILD_PREFIX=\"\"\n");
+    }
 
     fprintf(script->file, "RPM_PACKAGE_NAME=\"%s\"\n", spec->name);
     getEntry(main_package->header, RPMTAG_VERSION, &foo, (void **)&s, &foo);
index 1613aed..e710bd1 100644 (file)
@@ -373,6 +373,7 @@ void freeSpec(Spec s)
     FREE(s->noSource);
     FREE(s->noPatch);
     FREE(s->prefix);
+    FREE(s->buildprefix);
     freeSources(s);
     freeStringBuf(s->prep);
     freeStringBuf(s->build);
@@ -646,6 +647,7 @@ struct preamble_line {
     {RPMTAG_REQUIREFLAGS,  0, "requires"},
     {RPMTAG_CONFLICTFLAGS, 0, "conflicts"},
     {RPMTAG_DEFAULTPREFIX, 0, "prefix"},
+    {RPMTAG_BUILDPREFIX,   0, "buildprefix"},
     {0, 0, 0}
 };
 
@@ -766,7 +768,7 @@ static void parseForDocFiles(struct PackageRec *package, char *line)
 /*                                                                    */
 /**********************************************************************/
 
-Spec parseSpec(FILE *f, char *specfile)
+Spec parseSpec(FILE *f, char *specfile, char *prefixOverride)
 {
     char buf[LINE_BUF_SIZE]; /* read buffer          */
     char buf2[LINE_BUF_SIZE];
@@ -778,6 +780,8 @@ Spec parseSpec(FILE *f, char *specfile)
     StringBuf sb;
     char *s = NULL;
     char *s1, *s2;
+    int gotBuildPrefix = 0;
+    int gotRoot = 0;
 
     struct PackageRec *cur_package = NULL;
     Spec spec = (struct SpecRec *) malloc(sizeof(struct SpecRec));
@@ -998,6 +1002,10 @@ Spec parseSpec(FILE *f, char *specfile)
                  case RPMTAG_URL:
                    addEntry(cur_package->header, tag, STRING_TYPE, s, 1);
                    break;
+                 case RPMTAG_BUILDPREFIX:
+                   gotBuildPrefix = 1;
+                   spec->buildprefix = strdup(s);
+                   break;
                  case RPMTAG_DEFAULTPREFIX:
                    spec->prefix = strdup(s);
                    addEntry(cur_package->header, tag, STRING_TYPE, s, 1);
@@ -1024,10 +1032,11 @@ Spec parseSpec(FILE *f, char *specfile)
                             STRING_TYPE, getStringBuf(sb), 1);
                    break;
                  case RPMTAG_ROOT:
-                     /* special case */
-                     message(MESS_DEBUG, "Got root: %s\n", s);
-                     setVar(RPMVAR_ROOT, s);
-                     break;
+                   /* special case */
+                   gotRoot = 1;
+                   message(MESS_DEBUG, "Got root: %s\n", s);
+                   setVar(RPMVAR_ROOT, s);
+                   break;
                  case RPMTAG_ICON:
                      cur_package->icon = strdup(s);
                      break;
@@ -1111,6 +1120,36 @@ Spec parseSpec(FILE *f, char *specfile)
        return NULL;
     }
 
+    if (gotRoot && gotBuildPrefix) {
+       freeSpec(spec);
+       error(RPMERR_BADSPEC,
+             "Spec file can not have both Root: and Buildprefix:");
+       return NULL;
+    }
+    if (spec->buildprefix) {
+       /* This package can do build prefixes */
+       if (prefixOverride) {
+           setVar(RPMVAR_ROOT, prefixOverride);
+           setVar(RPMVAR_BUILDPREFIX, prefixOverride);
+       } else {
+           if ((s = getVar(RPMVAR_BUILDPREFIX))) {
+               /* Take build prefix from rpmrc */
+               setVar(RPMVAR_ROOT, s);
+           } else {
+               /* Use default */
+               setVar(RPMVAR_ROOT, spec->buildprefix);
+               setVar(RPMVAR_BUILDPREFIX, spec->buildprefix);
+           }
+       }
+    } else {
+       /* Package can not do build prefixes */
+       if (prefixOverride) {
+           freeSpec(spec);
+           error(RPMERR_BADARG, "Package can not do build prefixes");
+           return NULL;
+       }
+    }
+
     generateNamesAndDocScript(spec);
     return spec;
 }
index ad5f4e4..1ab57ba 100644 (file)
@@ -10,7 +10,7 @@
 
 typedef struct SpecRec *Spec;
 
-Spec parseSpec(FILE *f, char *specfile);
+Spec parseSpec(FILE *f, char *specfile, char *prefixOverride);
 void freeSpec(Spec s);
 
 void dumpSpec(Spec s, FILE *f);
index 91bccc6..c5ec51a 100644 (file)
@@ -40,6 +40,7 @@ struct SpecRec {
     StringBuf clean;
 
     char *prefix;
+    char *buildprefix;
     
     struct PackageRec *packages;
     /* The first package record is the "main" package and contains