Browse code

Added support in build system to recognize/install specific build time required packages which are required only when check is enabled.

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: I99730ce5853cf48a46e8fb2d52f4666cf8473807
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/3265
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Anish Swaminathan <anishs@vmware.com>

dthaluru authored on 2017/07/15 03:49:55
Showing 5 changed files
... ...
@@ -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=""
... ...
@@ -41,6 +42,7 @@ class SerializableSpecObjectsUtils(object):
41 41
             specObj.name=specName
42 42
             specObj.buildRequirePackages=spec.getBuildRequiresAllPackages()
43 43
             specObj.installRequiresAllPackages=spec.getRequiresAllPackages()
44
+            specObj.checkBuildRequirePackages=spec.getCheckBuildRequiresAllPackages()
44 45
             specObj.listPackages=spec.getPackageNames()
45 46
             specObj.specFile=specFile
46 47
             specObj.version=spec.getVersion()
... ...
@@ -87,6 +89,10 @@ class SerializableSpecObjectsUtils(object):
87 87
             return self.mapSerializableSpecObjects[specName].installRequiresPackages[package]
88 88
         return None
89 89
 
90
+    def getCheckBuildRequiresForPackage(self, package):
91
+        specName=self.getSpecName(package)
92
+        return self.mapSerializableSpecObjects[specName].checkBuildRequirePackages
93
+
90 94
     def addMacro(self, macroName, macroValue):
91 95
         if macroName == "":
92 96
             self.logger.error("Given invalid macro: name:"+macroName+" value:"+macroValue)
... ...
@@ -13,6 +13,7 @@ class SpecParser(object):
13 13
         self.packages={}
14 14
         self.specAdditionalContent=""
15 15
         self.globalSecurityHardening=""
16
+        self.conditionalCheckMacroEnabled = False
16 17
 
17 18
 
18 19
     def readPkgNameFromPackageMacro(self,data,basePkgName=None):
... ...
@@ -71,6 +72,10 @@ class SpecParser(object):
71 71
                 self.readSecurityHardening(line)
72 72
             elif self.isChecksum(line):
73 73
                 self.readChecksum(line, self.packages[currentPkg])
74
+            elif self.isConditionalCheckMacro(line):
75
+                self.conditionalCheckMacroEnabled = True
76
+            elif self.conditionalCheckMacroEnabled and self.isConditionalMacroCompleted(line):
77
+                self.conditionalCheckMacroEnabled = False
74 78
             else:
75 79
                 self.specAdditionalContent+=line+"\n"
76 80
             i=i+1
... ...
@@ -307,7 +312,10 @@ class SpecParser(object):
307 307
             if headerName == 'conflicts':
308 308
                 pkg.conflicts.extend(dpkg)
309 309
             if headerName == 'buildrequires':
310
-                pkg.buildrequires.extend(dpkg)
310
+                if self.conditionalCheckMacroEnabled:
311
+                    pkg.checkbuildrequires.extend(dpkg)
312
+                else:
313
+                    pkg.buildrequires.extend(dpkg)
311 314
             if headerName == 'buildprovides':
312 315
                 pkg.buildprovides.extend(dpkg)
313 316
 
... ...
@@ -353,3 +361,23 @@ class SpecParser(object):
353 353
             return False
354 354
         pkg.checksums[sourceName] = value[1]
355 355
         return True;
356
+
357
+    def isConditionalCheckMacro(self,line):
358
+        data = line.strip()
359
+        words = data.split()
360
+        nrWords = len(words)
361
+        if(nrWords != 2):
362
+            return False
363
+        if(words[0] != "%if" or words[1] != "%{with_check}"):
364
+            return False
365
+        return True
366
+
367
+    def isConditionalMacroCompleted(self,line):
368
+        data = line.strip()
369
+        words = data.split()
370
+        nrWords = len(words)
371
+        if(nrWords != 1):
372
+            return False
373
+        if(words[0] != "%endif"):
374
+            return False
375
+        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')
... ...
@@ -354,3 +354,6 @@ class constants(object):
354 354
         if kernelsubrelease:
355 355
             kernelsubrelease = "."+kernelsubrelease
356 356
             constants.specData.addMacro("kernelsubrelease",kernelsubrelease) 
357
+
358
+        #adding check rpm macro
359
+        constants.specData.addMacro("with_check","0")