Browse code

Upgrade openssl, python-cryptography and add support for rpmbuild macros

Change-Id: Idb4939111f1ee1dc8cdfe3b2ce2fd7f1ebb3cd32
Reviewed-on: http://photon-jenkins.eng.vmware.com/619
Tested-by: jenkins-photon <wangnan2015@hotmail.com>
Reviewed-by: Divya Thaluru <dthaluru@vmware.com>

suezzelur authored on 2016/03/10 19:18:11
Showing 11 changed files
... ...
@@ -216,7 +216,8 @@ packages: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTA
216 216
                 -d $(PHOTON_DIST_TAG) \
217 217
                 -n $(PHOTON_BUILD_NUMBER) \
218 218
                 -v $(PHOTON_RELEASE_VERSION) \
219
-                -w $(PHOTON_DATA_DIR)/pkg_info.json\
219
+                -w $(PHOTON_DATA_DIR)/pkg_info.json \
220
+                -g $(PHOTON_DATA_DIR)/pkg_build_options.json \
220 221
                 $(PHOTON_RPMCHECK_OPTION) \
221 222
                 -t ${THREADS}
222 223
 
... ...
@@ -485,6 +486,7 @@ check-packer-ovf-plugin:
485 485
                               -d $(PHOTON_DIST_TAG) \
486 486
                               -n $(PHOTON_BUILD_NUMBER) \
487 487
                               -v $(PHOTON_RELEASE_VERSION) \
488
+                              -g $(PHOTON_DATA_DIR)/pkg_build_options.json \
488 489
                               $(PHOTON_RPMCHECK_OPTION) \
489 490
                               -l $(PHOTON_LOGS_DIR)
490 491
 
... ...
@@ -1,6 +1,6 @@
1 1
 Summary:	Management tools and libraries relating to cryptography
2 2
 Name:		openssl
3
-Version:	1.0.2f
3
+Version:	1.0.2g
4 4
 Release:	1%{?dist}
5 5
 License:	OpenSSL
6 6
 URL:		http://www.openssl.org
... ...
@@ -8,7 +8,7 @@ Group:		System Environment/Security
8 8
 Vendor:		VMware, Inc.
9 9
 Distribution:	Photon
10 10
 Source0:	http://www.openssl.org/source/%{name}-%{version}.tar.gz
11
-%define sha1 openssl=2047c592a6e5a42bd37970bdb4a931428110a927
11
+%define sha1 openssl=36af23887402a5ea4ebef91df8e61654906f58f2
12 12
 Patch0:		c_rehash.patch
13 13
 Patch1:     openssl-1.0.2f-ipv6apps.patch
14 14
 Requires:	bash glibc libgcc 
... ...
@@ -58,6 +58,7 @@ export CFLAGS="%{optflags}"
58 58
 	--openssldir=/%{_sysconfdir}/ssl \
59 59
 	shared \
60 60
 	zlib-dynamic \
61
+        %{?_with_fips} \
61 62
 	-Wa,--noexecstack "${CFLAGS}" "${LDFLAGS}"
62 63
 # does not support -j yet
63 64
 make
... ...
@@ -107,6 +108,8 @@ rm -rf %{buildroot}/*
107 107
 /%{_bindir}/c_rehash
108 108
 
109 109
 %changelog
110
+*   Mon Mar 07 2016 Anish Swaminathan <anishs@vmware.com> 1.0.2g-1
111
+-   Upgrade to 1.0.2g
110 112
 *   Wed Feb 03 2016 Xiaolin Li <xiaolinl@vmware.com> 1.0.2f-1
111 113
 -   Update to version 1.0.2f
112 114
 *   Mon Feb 01 2016 Anish Swaminathan <anishs@vmware.com> 1.0.2e-3
... ...
@@ -1,13 +1,12 @@
1 1
 Summary:        Python cryptography library
2 2
 Name:           python-cryptography
3
-Version:        1.2.2
3
+Version:        1.2.3
4 4
 Release:        1%{?dist}
5 5
 Url:            https://cryptography.io
6 6
 License:        ASL 2.0
7 7
 Group:          Development/Languages/Python
8 8
 Source0:        https://pypi.python.org/packages/source/c/cryptography/cryptography-%{version}.tar.gz
9
-%define sha1 cryptography=16088fb22c2ea4cd445bcfca6a6bbb99b79dc285
10
-
9
+%define sha1 cryptography=a8a8083e70875423bd72899ca99890b788189205
11 10
 BuildRequires: python2
12 11
 BuildRequires: python2-libs
13 12
 BuildRequires: python2-devel
... ...
@@ -38,7 +37,9 @@ python setup.py install --prefix=%{_prefix} --root=%{buildroot}
38 38
 %{python_sitelib}/*
39 39
 
40 40
 %changelog
41
-*	Thu Feb 26 2016 Anish Swaminathan <anishs@vmware.com> 1.2.2-1
41
+*	Mon Mar 07 2016 Anish Swaminathan <anishs@vmware.com> 1.2.3-1
42
+-	Upgrade to 1.2.3
43
+*	Fri Feb 26 2016 Anish Swaminathan <anishs@vmware.com> 1.2.2-1
42 44
 -	Upgrade version to 1.2.2
43 45
 *	Thu Jan 21 2016 Anish Swaminathan <anishs@vmware.com> 1.2.1-1
44 46
 -	Upgrade version
45 47
new file mode 100644
... ...
@@ -0,0 +1,6 @@
0
+{
1
+    "dummy_package": { 
2
+        "files": ["path_to_file1_to_be_copied","path_to_file2_to_be_copied"], 
3
+        "macros": ["macro1 value1","macro2 value2"]
4
+    }
5
+}
... ...
@@ -9,7 +9,7 @@ import shutil
9 9
 
10 10
 class PackageBuilder(object):
11 11
     
12
-    def __init__(self,mapPackageToCycles,listAvailableCyclicPackages,logName=None,logPath=None):
12
+    def __init__(self,mapPackageToCycles,listAvailableCyclicPackages,listBuildOptionPackages,pkgBuildOptionFile,logName=None,logPath=None):
13 13
         if logName is None:
14 14
             logName = "PackageBuilder"
15 15
         if logPath is None:
... ...
@@ -20,6 +20,8 @@ class PackageBuilder(object):
20 20
         self.mapPackageToCycles = mapPackageToCycles
21 21
         self.listAvailableCyclicPackages = listAvailableCyclicPackages
22 22
         self.listNodepsPackages = ["glibc","gmp","zlib","file","binutils","mpfr","mpc","gcc","ncurses","util-linux","groff","perl","texinfo","rpm","openssl","go"]
23
+        self.listBuildOptionPackages=listBuildOptionPackages
24
+        self.pkgBuildOptionFile=pkgBuildOptionFile
23 25
         
24 26
     def prepareBuildRoot(self,chrootName,isToolChainPackage=False):
25 27
         chrootID=None
... ...
@@ -100,7 +102,7 @@ class PackageBuilder(object):
100 100
                 pkgUtils.installRPMSInAOneShot(chrootID,destLogPath)
101 101
                 self.logger.info("Finished installing the build time dependent packages......")
102 102
             pkgUtils.adjustGCCSpecs(package, chrootID, destLogPath)
103
-            pkgUtils.buildRPMSForGivenPackage(package,chrootID,destLogPath)
103
+            pkgUtils.buildRPMSForGivenPackage(package,chrootID,self.listBuildOptionPackages,self.pkgBuildOptionFile,destLogPath)
104 104
             self.logger.info("Successfully built the package:"+package)
105 105
         except Exception as e:
106 106
             self.logger.error("Failed while building package:" + package)
... ...
@@ -26,6 +26,8 @@ class PackageManager(object):
26 26
         self.mapOutputThread={}
27 27
         self.mapThreadsLaunchTime={}
28 28
         self.listAvailableCyclicPackages=[]
29
+        self.listBuildOptionPackages=[]
30
+        self.pkgBuildOptionFile="" 
29 31
         
30 32
     def readPackageBuildData(self, listPackages):
31 33
         try:
... ...
@@ -87,24 +89,28 @@ class PackageManager(object):
87 87
     def buildToolChain(self):
88 88
         try:
89 89
             tUtils=ToolChainUtils()
90
-            tUtils.buildCoreToolChainPackages()
90
+            tUtils.buildCoreToolChainPackages(self.listBuildOptionPackages, self.pkgBuildOptionFile)
91 91
         except Exception as e:
92 92
             self.logger.error("Unable to build tool chain")
93 93
             self.logger.error(e)
94 94
             raise e
95 95
     
96
-    def buildToolChainPackages(self, buildThreads):
96
+    def buildToolChainPackages(self, listBuildOptionPackages, pkgBuildOptionFile, buildThreads):
97 97
         self.buildToolChain()
98 98
         self.buildGivenPackages(constants.listToolChainPackages, buildThreads)
99 99
         
100
-    def buildPackages(self,listPackages, buildThreads):
101
-        self.buildToolChainPackages(buildThreads)
100
+    def buildPackages(self,listPackages, listBuildOptionPackages, pkgBuildOptionFile, buildThreads):
101
+        self.listBuildOptionPackages = listBuildOptionPackages
102
+        self.pkgBuildOptionFile = pkgBuildOptionFile
103
+        self.buildToolChainPackages(listBuildOptionPackages, pkgBuildOptionFile, buildThreads)
102 104
         self.buildGivenPackages(listPackages, buildThreads)
103 105
     
104 106
     def initializeThreadPool(self,statusEvent):
105 107
         ThreadPool.clear()
106 108
         ThreadPool.mapPackageToCycle=self.mapPackageToCycle
107 109
         ThreadPool.listAvailableCyclicPackages=self.listAvailableCyclicPackages
110
+        ThreadPool.listBuildOptionPackages=self.listBuildOptionPackages
111
+        ThreadPool.pkgBuildOptionFile=self.pkgBuildOptionFile
108 112
         ThreadPool.logger=self.logger
109 113
         ThreadPool.statusEvent=statusEvent
110 114
         
... ...
@@ -7,6 +7,8 @@ import re
7 7
 from time import sleep
8 8
 import PullSources
9 9
 from PackageInfo import SourcePackageInfo
10
+import json
11
+import collections
10 12
 
11 13
 class PackageUtils(object):
12 14
     
... ...
@@ -132,9 +134,17 @@ class PackageUtils(object):
132 132
                 self.logger.error("Multiple sources found for source:"+source+"\n"+ ",".join(sourcePath) +"\nUnable to determine one.")
133 133
                 raise Exception("Multiple sources found")
134 134
             self.logger.info("Copying... Source path :" + source + " Source filename: " + sourcePath[0])
135
-            shutil.copy2(sourcePath[0],  destDir)
135
+            shutil.copy2(sourcePath[0], destDir)
136 136
     
137
-    def buildRPMSForGivenPackage(self,package, chrootID,destLogPath=None):
137
+    def copyAdditionalBuildFiles(self,listAdditionalFiles,destDir):
138
+        cmdUtils = CommandUtils()
139
+        index=0
140
+        for source in listAdditionalFiles:
141
+            if os.path.exists(source):
142
+                shutil.copytree(source, destDir+str(index))
143
+                index = index + 1
144
+        
145
+    def buildRPMSForGivenPackage(self,package,chrootID,listBuildOptionPackages,pkgBuildOptionFile,destLogPath=None):
138 146
         self.logger.info("Building rpm's for package:"+package)
139 147
 
140 148
         listSourcesFiles = constants.specData.getSources(package)
... ...
@@ -152,11 +162,31 @@ class PackageUtils(object):
152 152
 #        if os.geteuid()==0:
153 153
         self.copySourcesTobuildroot(listSourcesFiles,package,chrootSourcePath)
154 154
         self.copySourcesTobuildroot(listPatchFiles,package,chrootSourcePath)
155
-        
155
+
156
+        listAdditionalFiles = []
157
+        macros = []
158
+        if package in listBuildOptionPackages:
159
+            jsonData = open(pkgBuildOptionFile)
160
+            pkg_build_option_json = json.load(jsonData, object_pairs_hook=collections.OrderedDict)
161
+            jsonData.close()
162
+            pkgs_sorted = pkg_build_option_json.items()
163
+            for pkg in pkgs_sorted:
164
+                p = str(pkg[0].encode('utf-8'))
165
+                if p == package:
166
+                    filelist = pkg[1]["files"]
167
+                    for f in filelist:
168
+                        listAdditionalFiles.append(str(f.encode('utf-8')))
169
+                    macrolist = pkg[1]["macros"]
170
+                    for macro in macrolist:
171
+                        macros.append(str(macro.encode('utf-8')))
172
+            
173
+            chrootAdditionalPath=chrootID+constants.topDirPath+"/ADDITIONAL"
174
+            self.copyAdditionalBuildFiles(listAdditionalFiles,chrootAdditionalPath)
175
+
156 176
         listRPMFiles=[]
157 177
         listSRPMFiles=[]
158 178
         try:
159
-            listRPMFiles,listSRPMFiles = self.buildRPM(chrootSpecPath+"/"+specName,chrootLogsFilePath, chrootCmd)
179
+            listRPMFiles,listSRPMFiles = self.buildRPM(chrootSpecPath+"/"+specName,chrootLogsFilePath,chrootCmd,package,macros)
160 180
         except Exception as e:
161 181
             self.logger.error("Failed while building rpm:"+package)
162 182
             raise e
... ...
@@ -176,11 +206,13 @@ class PackageUtils(object):
176 176
             SourcePackageInfo.addSRPMData(package,version,release,arch,srpmName)
177 177
 
178 178
     
179
-    def buildRPM(self,specFile,logFile,chrootCmd):
179
+    def buildRPM(self,specFile,logFile,chrootCmd,package,macros):
180 180
         
181 181
         rpmBuildcmd= self.rpmbuildBinary+" "+self.rpmbuildBuildallOption+" "+self.rpmbuildDistOption
182 182
         if not constants.rpmCheck:
183 183
             rpmBuildcmd+=" "+self.rpmbuildNocheckOption
184
+        for macro in macros:
185
+            rpmBuildcmd+=' --define \\\"%s\\\"' % macro
184 186
         rpmBuildcmd+=" "+self.rpmbuildBuildNum+" "+self.rpmbuildReleaseVer
185 187
         rpmBuildcmd+=" "+specFile
186 188
         
... ...
@@ -7,6 +7,8 @@ class ThreadPool(object):
7 7
     inactiveWorkerThreads=[]
8 8
     mapPackageToCycle={}
9 9
     listAvailableCyclicPackages=[]
10
+    listBuildOptionPackages=[]
11
+    pkgBuildOptionFile=""
10 12
     logger=None
11 13
     statusEvent=None
12 14
     
... ...
@@ -27,7 +29,14 @@ class ThreadPool(object):
27 27
         
28 28
     @staticmethod
29 29
     def addWorkerThread(workerThreadName):
30
-        workerThread = WorkerThread.WorkerThread(ThreadPool.statusEvent,workerThreadName,ThreadPool.mapPackageToCycle,ThreadPool.listAvailableCyclicPackages,ThreadPool.logger)
30
+        workerThread = WorkerThread.WorkerThread(
31
+				ThreadPool.statusEvent,
32
+				workerThreadName,
33
+				ThreadPool.mapPackageToCycle,
34
+				ThreadPool.listAvailableCyclicPackages,
35
+				ThreadPool.logger,
36
+				ThreadPool.listBuildOptionPackages,
37
+				ThreadPool.pkgBuildOptionFile)
31 38
         ThreadPool.mapWorkerThreads[workerThreadName]=workerThread
32 39
    
33 40
     @staticmethod
... ...
@@ -94,10 +94,10 @@ class ToolChainUtils(object):
94 94
                 rpmFile=self.findRPMFileInGivenLocation(package, constants.prevPublishRPMRepo)
95 95
                 if rpmFile is None:
96 96
                     if package == "util-linux-devel":
97
-                        self.logger.info("No old verion of util-linux-devel exists, skip until the new version is built")
97
+                        self.logger.info("No old version of util-linux-devel exists, skip until the new version is built")
98 98
                         continue
99 99
                     if package == "flex-devel":
100
-                        self.logger.info("No old verion of flex-devel exists, skip until the new version is built")
100
+                        self.logger.info("No old version of flex-devel exists, skip until the new version is built")
101 101
                         continue
102 102
 
103 103
                     self.logger.error("Unable to find rpm "+ package +" in current and previous versions")
... ...
@@ -163,7 +163,7 @@ class ToolChainUtils(object):
163 163
             self.logger.error("Found multiple rpm files for given package in rpm directory.Unable to determine the rpm file for package:"+package)
164 164
             return None
165 165
     
166
-    def buildCoreToolChainPackages(self):
166
+    def buildCoreToolChainPackages(self, listBuildOptionPackages, pkgBuildOptionFile):
167 167
         self.logger.info("Building core tool chain packages.....")
168 168
         chrootID=None
169 169
         try:
... ...
@@ -184,7 +184,7 @@ class ToolChainUtils(object):
184 184
                     raise Exception("creating chroot failed")
185 185
                 self.installToolChainRPMS(chrootID)
186 186
                 pkgUtils.adjustGCCSpecs(package, chrootID, destLogPath)
187
-                pkgUtils.buildRPMSForGivenPackage(package, chrootID,destLogPath)
187
+                pkgUtils.buildRPMSForGivenPackage(package, chrootID, listBuildOptionPackages, pkgBuildOptionFile, destLogPath)
188 188
                 chrUtils.destroyChroot(chrootID)
189 189
                 chrootID=None
190 190
             self.logger.info("Successfully built toolchain")
... ...
@@ -209,10 +209,10 @@ class ToolChainUtils(object):
209 209
                 rpmFile=self.findRPMFileInGivenLocation(package, constants.prevPublishRPMRepo)
210 210
                 if rpmFile is None:
211 211
                     if package == "util-linux-devel":
212
-                        self.logger.info("No old verion of util-linux-devel exists, skip until the new version is built")
212
+                        self.logger.info("No old version of util-linux-devel exists, skip until the new version is built")
213 213
                         continue
214 214
                     if package == "flex-devel":
215
-                        self.logger.info("No old verion of flex-devel exists, skip until the new version is built")
215
+                        self.logger.info("No old version of flex-devel exists, skip until the new version is built")
216 216
                         continue
217 217
                     self.logger.error("Unable to find rpm "+ package +" in current and previous versions")
218 218
                     raise Exception("Input Error")
... ...
@@ -5,13 +5,15 @@ import ThreadPool
5 5
  
6 6
 class WorkerThread(threading.Thread):
7 7
     
8
-    def __init__(self,event,name,mapPackageToCycle,listAvailableCyclicPackages,logger):
8
+    def __init__(self,event,name,mapPackageToCycle,listAvailableCyclicPackages,logger,listBuildOptionPackages,pkgBuildOptionFile):
9 9
         threading.Thread.__init__(self)
10 10
         self.statusEvent=event
11 11
         self.name=name
12 12
         self.mapPackageToCycle=mapPackageToCycle
13 13
         self.listAvailableCyclicPackages=listAvailableCyclicPackages
14 14
         self.logger=logger
15
+        self.listBuildOptionPackages=listBuildOptionPackages
16
+        self.pkgBuildOptionFile=pkgBuildOptionFile
15 17
         
16 18
     def run(self):
17 19
         buildThreadFailed=False
... ...
@@ -23,7 +25,7 @@ class WorkerThread(threading.Thread):
23 23
             if pkg is None:
24 24
                 break
25 25
             self.logger.info("Thread "+self.name+" is building package:"+ pkg)
26
-            pkgBuilder = PackageBuilder(self.mapPackageToCycle,self.listAvailableCyclicPackages,"build-"+pkg)
26
+            pkgBuilder = PackageBuilder(self.mapPackageToCycle,self.listAvailableCyclicPackages,self.listBuildOptionPackages,self.pkgBuildOptionFile,"build-"+pkg)
27 27
             t = threading.Thread(target=pkgBuilder.buildPackageThreadAPI,args=(pkg,outputMap,pkg))
28 28
             t.start()
29 29
             t.join()
... ...
@@ -51,4 +53,4 @@ class WorkerThread(threading.Thread):
51 51
 
52 52
                     
53 53
                 
54
-        
55 54
\ No newline at end of file
55
+        
... ...
@@ -27,7 +27,7 @@ def main():
27 27
     parser.add_option("-z",  "--top-dir-path", dest="topDirPath",  default="/usr/src/photon")
28 28
     parser.add_option("-j",  "--json-file", dest="inputJSONFile",  default="../../common/data/build_install_options_all.json")
29 29
     parser.add_option("-b",  "--build-root-path", dest="buildRootPath",  default="/mnt")
30
-    parser.add_option("-t",  "--threads", dest="buildThreads",  default=1, type="int", help="Numbeer of working threads")
30
+    parser.add_option("-t",  "--threads", dest="buildThreads",  default=1, type="int", help="Number of working threads")
31 31
     parser.add_option("-m",  "--tool-chain-stage", dest="toolChainStage",  default="None")
32 32
     parser.add_option("-c",  "--pullsources-config", dest="pullsourcesConfig",  default="pullsources.conf")
33 33
     parser.add_option("-d",  "--dist", dest="dist",  default="")
... ...
@@ -37,6 +37,7 @@ def main():
37 37
     parser.add_option("-u",  "--enable-rpmcheck", dest="rpmCheck",  default=False, action ="store_true")
38 38
     parser.add_option("-a",  "--source-rpm-path",  dest="sourceRpmPath",  default="../../stage/SRPMS")
39 39
     parser.add_option("-w",  "--pkginfo-file",  dest="pkgInfoFile",  default="../../common/data/pkg_info.json")
40
+    parser.add_option("-g",  "--pkg-build-option-file",  dest="pkgBuildOptionFile",  default="../../common/data/pkg_build_options.json")
40 41
 
41 42
     (options,  args) = parser.parse_args()
42 43
     cmdUtils=CommandUtils()
... ...
@@ -66,7 +67,9 @@ def main():
66 66
     
67 67
     if not os.path.isfile(options.inputJSONFile) and not options.installPackage:
68 68
         logger.error("Given JSON File is not a file:"+options.inputJSONFile)
69
-        errorFlag = True
69
+        errorFlag = True    
70
+    if not os.path.isfile(options.pkgBuildOptionFile):
71
+        logger.warning("Given JSON File is not a file:"+options.pkgBuildOptionFile)
70 72
         
71 73
     if options.inputRPMSPath is not None and not os.path.isdir(options.inputRPMSPath):
72 74
         logger.error("Given input RPMS Path is not a directory:"+options.publishRPMSPath)
... ...
@@ -104,6 +107,8 @@ def main():
104 104
         logger.info("JSON File :" + options.inputJSONFile)
105 105
     else:
106 106
         logger.info("Package to build:"+package)
107
+    
108
+    listBuildOptionPackages = get_packages_with_build_options(options.pkgBuildOptionFile)
107 109
 
108 110
     try:
109 111
         constants.initialize(options)
... ...
@@ -120,9 +125,9 @@ def main():
120 120
             pkgManager = PackageManager()
121 121
             pkgManager.buildToolChainPackages(options.buildThreads)
122 122
         elif options.installPackage:
123
-            buildAPackage(package, options.buildThreads)
123
+            buildAPackage(package, listBuildOptionPackages, options.pkgBuildOptionFile, options.buildThreads)
124 124
         else:
125
-            buildPackagesFromGivenJSONFile(options.inputJSONFile, options.buildOption,logger, options.buildThreads)
125
+            buildPackagesFromGivenJSONFile(options.inputJSONFile, options.buildOption, listBuildOptionPackages, options.pkgBuildOptionFile, logger, options.buildThreads)
126 126
     except Exception as e:
127 127
         logger.error("Caught an exception")
128 128
         logger.error(str(e))
... ...
@@ -210,13 +215,13 @@ def buildSourcesList(specPath, yamlDir, singleFile=False):
210 210
     if singleFile:
211 211
         yamlFile.close()
212 212
 
213
-def buildAPackage(package, buildThreads):
213
+def buildAPackage(package, listBuildOptionPackages, pkgBuildOptionFile, buildThreads):
214 214
     listPackages=[]
215 215
     listPackages.append(package)
216 216
     pkgManager = PackageManager()
217
-    pkgManager.buildPackages(listPackages, buildThreads)
217
+    pkgManager.buildPackages(listPackages, listBuildOptionPackages, pkgBuildOptionFile, buildThreads)
218 218
 
219
-def buildPackagesFromGivenJSONFile(inputJSONFile,buildOption,logger, buildThreads):
219
+def buildPackagesFromGivenJSONFile(inputJSONFile, buildOption, listBuildOptionPackages, pkgBuildOptionFile, logger, buildThreads):
220 220
     listPackages = get_all_package_names(inputJSONFile)
221 221
 
222 222
     listPackagesToBuild=[]
... ...
@@ -226,7 +231,20 @@ def buildPackagesFromGivenJSONFile(inputJSONFile,buildOption,logger, buildThread
226 226
     logger.info("List of packages to build:")
227 227
     logger.info(listPackagesToBuild)
228 228
     pkgManager = PackageManager()
229
-    pkgManager.buildPackages(listPackagesToBuild, buildThreads)
229
+    pkgManager.buildPackages(listPackagesToBuild, listBuildOptionPackages, pkgBuildOptionFile, buildThreads)
230
+
231
+def get_packages_with_build_options(pkg_build_options_file):
232
+    packages = []
233
+    if os.path.exists(pkg_build_options_file):
234
+        jsonData = open(pkg_build_options_file)
235
+        pkg_build_option_json = json.load(jsonData, object_pairs_hook=collections.OrderedDict)
236
+        jsonData.close()
237
+        pkgs_sorted = pkg_build_option_json.items()
238
+        for pkg in pkgs_sorted:
239
+            p =  pkg[0].encode('utf-8')
240
+            packages.append(str(p))
241
+
242
+    return packages
230 243
     
231 244
 def get_all_package_names(build_install_option):
232 245
     base_path = os.path.dirname(build_install_option)