Example:
In rpm spec file, use "with_check" macro to add additional buildrequires which are required for check
%if %{with_check}
BuildRequires: python-py
BuildRequires: python-pytest
%endif
Change-Id: I035825557a81e8ebeecbfaed4906d02d322e0986
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/3248
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Alexey Makhalov <amakhalov@vmware.com>
| ... | ... |
@@ -108,8 +108,10 @@ class PackageBuilder(object): |
| 108 | 108 |
listInstalledPackages=self.findInstalledPackages(chrootID) |
| 109 | 109 |
listDependentPackages=self.findBuildTimeRequiredPackages(package) |
| 110 | 110 |
if constants.rpmCheck and package in constants.testForceRPMS: |
| 111 |
+ listDependentPackages.extend(self.findBuildTimeCheckRequiredPackages(package)) |
|
| 111 | 112 |
testPackages=set(constants.listMakeCheckRPMPkgtoInstall)-set(listInstalledPackages)-set([package]) |
| 112 | 113 |
listDependentPackages.extend(testPackages) |
| 114 |
+ listDependentPackages=list(set(listDependentPackages)) |
|
| 113 | 115 |
|
| 114 | 116 |
pkgUtils = PackageUtils(self.logName,self.logPath) |
| 115 | 117 |
if len(listDependentPackages) != 0: |
| ... | ... |
@@ -141,6 +143,10 @@ class PackageBuilder(object): |
| 141 | 141 |
listRequiredPackages=constants.specData.getBuildRequiresForPackage(package) |
| 142 | 142 |
return listRequiredPackages |
| 143 | 143 |
|
| 144 |
+ def findBuildTimeCheckRequiredPackages(self,package): |
|
| 145 |
+ listRequiredPackages=constants.specData.getCheckBuildRequiresForPackage(package) |
|
| 146 |
+ return listRequiredPackages |
|
| 147 |
+ |
|
| 144 | 148 |
def installPackage(self,pkgUtils,package,chrootID,destLogPath,listInstalledPackages): |
| 145 | 149 |
if package in listInstalledPackages: |
| 146 | 150 |
return |
| ... | ... |
@@ -11,6 +11,7 @@ class SerializableSpecObject(object): |
| 11 | 11 |
self.version="" |
| 12 | 12 |
self.release="" |
| 13 | 13 |
self.buildRequirePackages=[] |
| 14 |
+ self.checkBuildRequirePackages=[] |
|
| 14 | 15 |
self.installRequiresAllPackages=[] |
| 15 | 16 |
self.installRequiresPackages={}
|
| 16 | 17 |
self.specFile="" |
| ... | ... |
@@ -42,6 +43,7 @@ class SerializableSpecObjectsUtils(object): |
| 42 | 42 |
specObj.name=specName |
| 43 | 43 |
specObj.buildRequirePackages=spec.getBuildRequiresAllPackages() |
| 44 | 44 |
specObj.installRequiresAllPackages=spec.getRequiresAllPackages() |
| 45 |
+ specObj.checkBuildRequirePackages=spec.getCheckBuildRequiresAllPackages() |
|
| 45 | 46 |
specObj.listPackages=spec.getPackageNames() |
| 46 | 47 |
specObj.specFile=specFile |
| 47 | 48 |
specObj.version=spec.getVersion() |
| ... | ... |
@@ -90,6 +92,10 @@ class SerializableSpecObjectsUtils(object): |
| 90 | 90 |
return self.mapSerializableSpecObjects[specName].installRequiresPackages[package] |
| 91 | 91 |
return None |
| 92 | 92 |
|
| 93 |
+ def getCheckBuildRequiresForPackage(self, package): |
|
| 94 |
+ specName=self.getSpecName(package) |
|
| 95 |
+ return self.mapSerializableSpecObjects[specName].checkBuildRequirePackages |
|
| 96 |
+ |
|
| 93 | 97 |
def addMacro(self, macroName, macroValue): |
| 94 | 98 |
if macroName == "": |
| 95 | 99 |
self.logger.error("Given invalid macro: name:"+macroName+" value:"+macroValue)
|
| ... | ... |
@@ -14,6 +14,7 @@ class SpecParser(object): |
| 14 | 14 |
self.specAdditionalContent="" |
| 15 | 15 |
self.globalSecurityHardening="" |
| 16 | 16 |
self.defs={}
|
| 17 |
+ self.conditionalCheckMacroEnabled = False |
|
| 17 | 18 |
|
| 18 | 19 |
|
| 19 | 20 |
def readPkgNameFromPackageMacro(self,data,basePkgName=None): |
| ... | ... |
@@ -74,6 +75,10 @@ class SpecParser(object): |
| 74 | 74 |
self.readChecksum(line, self.packages[currentPkg]) |
| 75 | 75 |
elif self.isDefinition(line): |
| 76 | 76 |
self.readDefinition(line) |
| 77 |
+ elif self.isConditionalCheckMacro(line): |
|
| 78 |
+ self.conditionalCheckMacroEnabled = True |
|
| 79 |
+ elif self.conditionalCheckMacroEnabled and self.isConditionalMacroCompleted(line): |
|
| 80 |
+ self.conditionalCheckMacroEnabled = False |
|
| 77 | 81 |
else: |
| 78 | 82 |
self.specAdditionalContent+=line+"\n" |
| 79 | 83 |
i=i+1 |
| ... | ... |
@@ -327,7 +332,10 @@ class SpecParser(object): |
| 327 | 327 |
if headerName == 'conflicts': |
| 328 | 328 |
pkg.conflicts.extend(dpkg) |
| 329 | 329 |
if headerName == 'buildrequires': |
| 330 |
- pkg.buildrequires.extend(dpkg) |
|
| 330 |
+ if self.conditionalCheckMacroEnabled: |
|
| 331 |
+ pkg.checkbuildrequires.extend(dpkg) |
|
| 332 |
+ else: |
|
| 333 |
+ pkg.buildrequires.extend(dpkg) |
|
| 331 | 334 |
if headerName == 'buildprovides': |
| 332 | 335 |
pkg.buildprovides.extend(dpkg) |
| 333 | 336 |
|
| ... | ... |
@@ -373,3 +381,23 @@ class SpecParser(object): |
| 373 | 373 |
return False |
| 374 | 374 |
pkg.checksums[sourceName] = value[1] |
| 375 | 375 |
return True; |
| 376 |
+ |
|
| 377 |
+ def isConditionalCheckMacro(self,line): |
|
| 378 |
+ data = line.strip() |
|
| 379 |
+ words = data.split() |
|
| 380 |
+ nrWords = len(words) |
|
| 381 |
+ if(nrWords != 2): |
|
| 382 |
+ return False |
|
| 383 |
+ if(words[0] != "%if" or words[1] != "%{with_check}"):
|
|
| 384 |
+ return False |
|
| 385 |
+ return True |
|
| 386 |
+ |
|
| 387 |
+ def isConditionalMacroCompleted(self,line): |
|
| 388 |
+ data = line.strip() |
|
| 389 |
+ words = data.split() |
|
| 390 |
+ nrWords = len(words) |
|
| 391 |
+ if(nrWords != 1): |
|
| 392 |
+ return False |
|
| 393 |
+ if(words[0] != "%endif"): |
|
| 394 |
+ return False |
|
| 395 |
+ return True |
| ... | ... |
@@ -9,18 +9,18 @@ class rpmMacro(object): |
| 9 | 9 |
|
| 10 | 10 |
def setName(self,name): |
| 11 | 11 |
self.macroName=name |
| 12 |
- |
|
| 12 |
+ |
|
| 13 | 13 |
def displayMacro(self): |
| 14 | 14 |
print "Macro:\n", self.macroName, " ",self.macroFlag," ",self.position," ",self.endposition |
| 15 | 15 |
print self.content |
| 16 |
- |
|
| 16 |
+ |
|
| 17 | 17 |
class dependentPackageData(object): |
| 18 | 18 |
|
| 19 | 19 |
def __init__(self): |
| 20 | 20 |
self.package="" |
| 21 | 21 |
self.version="" |
| 22 | 22 |
self.compare="" |
| 23 |
- |
|
| 23 |
+ |
|
| 24 | 24 |
class Package(object): |
| 25 | 25 |
def __init__(self, basePkg=None): |
| 26 | 26 |
self.summary="" |
| ... | ... |
@@ -33,25 +33,26 @@ class Package(object): |
| 33 | 33 |
self.distribution="Photon" |
| 34 | 34 |
self.basePkgName="" |
| 35 | 35 |
self.URL="" |
| 36 |
- |
|
| 36 |
+ |
|
| 37 | 37 |
self.sources=[] |
| 38 | 38 |
self.checksums={}
|
| 39 | 39 |
self.patches=[] |
| 40 | 40 |
self.buildrequires=[] |
| 41 | 41 |
self.buildprovides=[] |
| 42 |
- |
|
| 43 |
- |
|
| 42 |
+ self.checkbuildrequires=[] |
|
| 43 |
+ |
|
| 44 |
+ |
|
| 44 | 45 |
self.requires=[] |
| 45 | 46 |
self.provides=[] |
| 46 | 47 |
self.obsoletes=[] |
| 47 | 48 |
self.conflicts=[] |
| 48 |
- |
|
| 49 |
+ |
|
| 49 | 50 |
self.descriptionMacro= None |
| 50 | 51 |
self.postMacro=None |
| 51 | 52 |
self.postunMacro=None |
| 52 | 53 |
self.filesMacro=None |
| 53 | 54 |
self.packageMacro=None |
| 54 |
- |
|
| 55 |
+ |
|
| 55 | 56 |
if basePkg is not None: |
| 56 | 57 |
self.basePkgName=basePkg.name |
| 57 | 58 |
self.group=basePkg.group |
| ... | ... |
@@ -60,22 +61,22 @@ class Package(object): |
| 60 | 60 |
self.buildarch=basePkg.buildarch |
| 61 | 61 |
self.release=basePkg.release |
| 62 | 62 |
self.distribution=basePkg.distribution |
| 63 |
- |
|
| 63 |
+ |
|
| 64 | 64 |
def decodeContents(self,content): |
| 65 | 65 |
if content.find("%{name}") != -1:
|
| 66 | 66 |
if self.basePkgName == "": |
| 67 | 67 |
content = content.replace('%{name}',self.name)
|
| 68 | 68 |
else: |
| 69 | 69 |
content = content.replace('%{name}',self.basePkgName)
|
| 70 |
- |
|
| 70 |
+ |
|
| 71 | 71 |
if content.find("%{release}") != -1:
|
| 72 | 72 |
content = content.replace('%{release}',self.release)
|
| 73 |
- |
|
| 73 |
+ |
|
| 74 | 74 |
if content.find("%{version}") != -1:
|
| 75 | 75 |
content = content.replace('%{version}',self.version)
|
| 76 |
- |
|
| 76 |
+ |
|
| 77 | 77 |
return content |
| 78 |
- |
|
| 78 |
+ |
|
| 79 | 79 |
def updatePackageMacro(self,macro): |
| 80 | 80 |
if macro.macroName == "%post": |
| 81 | 81 |
self.postMacro=macro |
| ... | ... |
@@ -142,31 +142,39 @@ class Specutils(object): |
| 142 | 142 |
return buildArch |
| 143 | 143 |
|
| 144 | 144 |
def getRequiresAllPackages(self): |
| 145 |
- depedentPackages=[] |
|
| 145 |
+ dependentPackages=[] |
|
| 146 | 146 |
for key in self.spec.packages.keys(): |
| 147 | 147 |
pkg = self.spec.packages.get(key) |
| 148 | 148 |
for dpkg in pkg.requires: |
| 149 |
- depedentPackages.append(dpkg.package) |
|
| 150 |
- depedentPackages=list(set(depedentPackages)) |
|
| 149 |
+ dependentPackages.append(dpkg.package) |
|
| 150 |
+ dependentPackages=list(set(dependentPackages)) |
|
| 151 | 151 |
packageNames=self.getPackageNames() |
| 152 | 152 |
for pkgName in packageNames: |
| 153 |
- if pkgName in depedentPackages: |
|
| 154 |
- depedentPackages.remove(pkgName) |
|
| 155 |
- return depedentPackages |
|
| 153 |
+ if pkgName in dependentPackages: |
|
| 154 |
+ dependentPackages.remove(pkgName) |
|
| 155 |
+ return dependentPackages |
|
| 156 | 156 |
|
| 157 | 157 |
def getBuildRequiresAllPackages(self): |
| 158 |
- depedentPackages=[] |
|
| 158 |
+ dependentPackages=[] |
|
| 159 | 159 |
for key in self.spec.packages.keys(): |
| 160 | 160 |
pkg = self.spec.packages.get(key) |
| 161 | 161 |
for dpkg in pkg.buildrequires: |
| 162 |
- depedentPackages.append(dpkg.package) |
|
| 163 |
- depedentPackages=list(set(depedentPackages)) |
|
| 162 |
+ dependentPackages.append(dpkg.package) |
|
| 163 |
+ dependentPackages=list(set(dependentPackages)) |
|
| 164 | 164 |
packageNames=self.getPackageNames() |
| 165 | 165 |
for pkgName in packageNames: |
| 166 |
- if pkgName in depedentPackages: |
|
| 167 |
- depedentPackages.remove(pkgName) |
|
| 168 |
- return depedentPackages |
|
| 166 |
+ if pkgName in dependentPackages: |
|
| 167 |
+ dependentPackages.remove(pkgName) |
|
| 168 |
+ return dependentPackages |
|
| 169 | 169 |
|
| 170 |
+ def getCheckBuildRequiresAllPackages(self): |
|
| 171 |
+ dependentPackages=[] |
|
| 172 |
+ for key in self.spec.packages.keys(): |
|
| 173 |
+ pkg = self.spec.packages.get(key) |
|
| 174 |
+ for dpkg in pkg.checkbuildrequires: |
|
| 175 |
+ dependentPackages.append(dpkg.package) |
|
| 176 |
+ dependentPackages=list(set(dependentPackages)) |
|
| 177 |
+ return dependentPackages |
|
| 170 | 178 |
|
| 171 | 179 |
def getRequires(self,pkgName): |
| 172 | 180 |
dependentPackages=[] |
| ... | ... |
@@ -186,8 +194,17 @@ class Specutils(object): |
| 186 | 186 |
dependentPackages.append(dpkg.package) |
| 187 | 187 |
return dependentPackages |
| 188 | 188 |
|
| 189 |
+ def getCheckBuildRequires(self,pkgName): |
|
| 190 |
+ dependentPackages=[] |
|
| 191 |
+ for key in self.spec.packages.keys(): |
|
| 192 |
+ pkg = self.spec.packages.get(key) |
|
| 193 |
+ if pkg.name == pkgName: |
|
| 194 |
+ for dpkg in pkg.checkbuildrequires: |
|
| 195 |
+ dependentPackages.append(dpkg.package) |
|
| 196 |
+ return dependentPackages |
|
| 197 |
+ |
|
| 189 | 198 |
def getProvides(self,packageName): |
| 190 |
- depedentPackages=[] |
|
| 199 |
+ dependentPackages=[] |
|
| 191 | 200 |
defaultPkgName=self.spec.packages['default'].name |
| 192 | 201 |
pkg = None |
| 193 | 202 |
if self.spec.packages.has_key(packageName): |
| ... | ... |
@@ -196,10 +213,10 @@ class Specutils(object): |
| 196 | 196 |
pkg=self.spec.packages['default'] |
| 197 | 197 |
if pkg is not None: |
| 198 | 198 |
for dpkg in pkg.provides: |
| 199 |
- depedentPackages.append(dpkg.package) |
|
| 199 |
+ dependentPackages.append(dpkg.package) |
|
| 200 | 200 |
else: |
| 201 | 201 |
print "package not found" |
| 202 |
- return depedentPackages |
|
| 202 |
+ return dependentPackages |
|
| 203 | 203 |
|
| 204 | 204 |
def getVersion(self): |
| 205 | 205 |
pkg = self.spec.packages.get('default')
|
| ... | ... |
@@ -325,14 +325,14 @@ class constants(object): |
| 325 | 325 |
constants.specData.readSpecsAndConvertToSerializableObjects(constants.specPath) |
| 326 | 326 |
constants.pullsourcesConfig = options.pullsourcesConfig |
| 327 | 327 |
constants.inputRPMSPath=options.inputRPMSPath |
| 328 |
- constants.updateRPMMacros() |
|
| 329 | 328 |
constants.testForceRPMS=[] |
| 330 | 329 |
constants.rpmCheck = options.rpmCheck |
| 331 | 330 |
constants.rpmCheckStopOnError = options.rpmCheckStopOnError |
| 332 |
- constants.publishBuildDependencies=options.publishBuildDependencies |
|
| 333 |
- constants.packageWeightsPath=options.packageWeightsPath |
|
| 331 |
+ constants.publishBuildDependencies=options.publishBuildDependencies |
|
| 332 |
+ constants.packageWeightsPath=options.packageWeightsPath |
|
| 334 | 333 |
if constants.rpmCheck: |
| 335 | 334 |
constants.testLogger=Logger.getLogger("MakeCheckTest",constants.logPath)
|
| 335 |
+ constants.updateRPMMacros() |
|
| 336 | 336 |
|
| 337 | 337 |
@staticmethod |
| 338 | 338 |
def updateRPMMacros(): |
| ... | ... |
@@ -367,6 +367,12 @@ class constants(object): |
| 367 | 367 |
kernelsubrelease = "."+kernelsubrelease |
| 368 | 368 |
constants.specData.addMacro("kernelsubrelease",kernelsubrelease)
|
| 369 | 369 |
|
| 370 |
+ #adding check rpm macro |
|
| 371 |
+ if constants.rpmCheck: |
|
| 372 |
+ constants.specData.addMacro("with_check","1")
|
|
| 373 |
+ else: |
|
| 374 |
+ constants.specData.addMacro("with_check","0")
|
|
| 375 |
+ |
|
| 370 | 376 |
@staticmethod |
| 371 | 377 |
def setTestForceRPMS(listsPackages): |
| 372 | 378 |
constants.testForceRPMS=listsPackages |