1*35238bceSAndroid Build Coastguard Worker# -*- coding: utf-8 -*- 2*35238bceSAndroid Build Coastguard Worker 3*35238bceSAndroid Build Coastguard Worker#------------------------------------------------------------------------- 4*35238bceSAndroid Build Coastguard Worker# drawElements Quality Program utilities 5*35238bceSAndroid Build Coastguard Worker# -------------------------------------- 6*35238bceSAndroid Build Coastguard Worker# 7*35238bceSAndroid Build Coastguard Worker# Copyright 2015 The Android Open Source Project 8*35238bceSAndroid Build Coastguard Worker# 9*35238bceSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 10*35238bceSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 11*35238bceSAndroid Build Coastguard Worker# You may obtain a copy of the License at 12*35238bceSAndroid Build Coastguard Worker# 13*35238bceSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 14*35238bceSAndroid Build Coastguard Worker# 15*35238bceSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 16*35238bceSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 17*35238bceSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18*35238bceSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 19*35238bceSAndroid Build Coastguard Worker# limitations under the License. 20*35238bceSAndroid Build Coastguard Worker# 21*35238bceSAndroid Build Coastguard Worker#------------------------------------------------------------------------- 22*35238bceSAndroid Build Coastguard Worker 23*35238bceSAndroid Build Coastguard Workerimport os 24*35238bceSAndroid Build Coastguard Workerimport re 25*35238bceSAndroid Build Coastguard Workerimport sys 26*35238bceSAndroid Build Coastguard Workerimport copy 27*35238bceSAndroid Build Coastguard Workerimport zlib 28*35238bceSAndroid Build Coastguard Workerimport time 29*35238bceSAndroid Build Coastguard Workerimport shlex 30*35238bceSAndroid Build Coastguard Workerimport shutil 31*35238bceSAndroid Build Coastguard Workerimport fnmatch 32*35238bceSAndroid Build Coastguard Workerimport tarfile 33*35238bceSAndroid Build Coastguard Workerimport argparse 34*35238bceSAndroid Build Coastguard Workerimport platform 35*35238bceSAndroid Build Coastguard Workerimport datetime 36*35238bceSAndroid Build Coastguard Workerimport tempfile 37*35238bceSAndroid Build Coastguard Workerimport posixpath 38*35238bceSAndroid Build Coastguard Workerimport subprocess 39*35238bceSAndroid Build Coastguard Worker 40*35238bceSAndroid Build Coastguard Workerfrom ctsbuild.common import * 41*35238bceSAndroid Build Coastguard Workerfrom ctsbuild.config import * 42*35238bceSAndroid Build Coastguard Workerfrom ctsbuild.build import * 43*35238bceSAndroid Build Coastguard Worker 44*35238bceSAndroid Build Coastguard WorkerpythonExecutable = sys.executable or "python" 45*35238bceSAndroid Build Coastguard Worker 46*35238bceSAndroid Build Coastguard Workerdef die (msg): 47*35238bceSAndroid Build Coastguard Worker print(msg) 48*35238bceSAndroid Build Coastguard Worker sys.exit(-1) 49*35238bceSAndroid Build Coastguard Worker 50*35238bceSAndroid Build Coastguard Workerdef removeLeadingPath (path, basePath): 51*35238bceSAndroid Build Coastguard Worker # Both inputs must be normalized already 52*35238bceSAndroid Build Coastguard Worker assert os.path.normpath(path) == path 53*35238bceSAndroid Build Coastguard Worker assert os.path.normpath(basePath) == basePath 54*35238bceSAndroid Build Coastguard Worker return path[len(basePath) + 1:] 55*35238bceSAndroid Build Coastguard Worker 56*35238bceSAndroid Build Coastguard Workerdef findFile (candidates): 57*35238bceSAndroid Build Coastguard Worker for file in candidates: 58*35238bceSAndroid Build Coastguard Worker if os.path.exists(file): 59*35238bceSAndroid Build Coastguard Worker return file 60*35238bceSAndroid Build Coastguard Worker return None 61*35238bceSAndroid Build Coastguard Worker 62*35238bceSAndroid Build Coastguard Workerdef getFileList (basePath): 63*35238bceSAndroid Build Coastguard Worker allFiles = [] 64*35238bceSAndroid Build Coastguard Worker basePath = os.path.normpath(basePath) 65*35238bceSAndroid Build Coastguard Worker for root, dirs, files in os.walk(basePath): 66*35238bceSAndroid Build Coastguard Worker for file in files: 67*35238bceSAndroid Build Coastguard Worker relPath = removeLeadingPath(os.path.normpath(os.path.join(root, file)), basePath) 68*35238bceSAndroid Build Coastguard Worker allFiles.append(relPath) 69*35238bceSAndroid Build Coastguard Worker return allFiles 70*35238bceSAndroid Build Coastguard Worker 71*35238bceSAndroid Build Coastguard Workerdef toDatetime (dateTuple): 72*35238bceSAndroid Build Coastguard Worker Y, M, D = dateTuple 73*35238bceSAndroid Build Coastguard Worker return datetime.datetime(Y, M, D) 74*35238bceSAndroid Build Coastguard Worker 75*35238bceSAndroid Build Coastguard Workerclass PackageBuildInfo: 76*35238bceSAndroid Build Coastguard Worker def __init__ (self, releaseConfig, srcBasePath, dstBasePath, tmpBasePath): 77*35238bceSAndroid Build Coastguard Worker self.releaseConfig = releaseConfig 78*35238bceSAndroid Build Coastguard Worker self.srcBasePath = srcBasePath 79*35238bceSAndroid Build Coastguard Worker self.dstBasePath = dstBasePath 80*35238bceSAndroid Build Coastguard Worker self.tmpBasePath = tmpBasePath 81*35238bceSAndroid Build Coastguard Worker 82*35238bceSAndroid Build Coastguard Worker def getReleaseConfig (self): 83*35238bceSAndroid Build Coastguard Worker return self.releaseConfig 84*35238bceSAndroid Build Coastguard Worker 85*35238bceSAndroid Build Coastguard Worker def getReleaseVersion (self): 86*35238bceSAndroid Build Coastguard Worker return self.releaseConfig.getVersion() 87*35238bceSAndroid Build Coastguard Worker 88*35238bceSAndroid Build Coastguard Worker def getReleaseId (self): 89*35238bceSAndroid Build Coastguard Worker # Release id is crc32(releaseConfig + release) 90*35238bceSAndroid Build Coastguard Worker return zlib.crc32(self.releaseConfig.getName() + self.releaseConfig.getVersion()) & 0xffffffff 91*35238bceSAndroid Build Coastguard Worker 92*35238bceSAndroid Build Coastguard Worker def getSrcBasePath (self): 93*35238bceSAndroid Build Coastguard Worker return self.srcBasePath 94*35238bceSAndroid Build Coastguard Worker 95*35238bceSAndroid Build Coastguard Worker def getTmpBasePath (self): 96*35238bceSAndroid Build Coastguard Worker return self.tmpBasePath 97*35238bceSAndroid Build Coastguard Worker 98*35238bceSAndroid Build Coastguard Workerclass DstFile (object): 99*35238bceSAndroid Build Coastguard Worker def __init__ (self, dstFile): 100*35238bceSAndroid Build Coastguard Worker self.dstFile = dstFile 101*35238bceSAndroid Build Coastguard Worker 102*35238bceSAndroid Build Coastguard Worker def makeDir (self): 103*35238bceSAndroid Build Coastguard Worker dirName = os.path.dirname(self.dstFile) 104*35238bceSAndroid Build Coastguard Worker if not os.path.exists(dirName): 105*35238bceSAndroid Build Coastguard Worker os.makedirs(dirName) 106*35238bceSAndroid Build Coastguard Worker 107*35238bceSAndroid Build Coastguard Worker def make (self, packageBuildInfo): 108*35238bceSAndroid Build Coastguard Worker assert False # Should not be called 109*35238bceSAndroid Build Coastguard Worker 110*35238bceSAndroid Build Coastguard Workerclass CopyFile (DstFile): 111*35238bceSAndroid Build Coastguard Worker def __init__ (self, srcFile, dstFile): 112*35238bceSAndroid Build Coastguard Worker super(CopyFile, self).__init__(dstFile) 113*35238bceSAndroid Build Coastguard Worker self.srcFile = srcFile 114*35238bceSAndroid Build Coastguard Worker 115*35238bceSAndroid Build Coastguard Worker def make (self, packageBuildInfo): 116*35238bceSAndroid Build Coastguard Worker self.makeDir() 117*35238bceSAndroid Build Coastguard Worker if os.path.exists(self.dstFile): 118*35238bceSAndroid Build Coastguard Worker die("%s already exists" % self.dstFile) 119*35238bceSAndroid Build Coastguard Worker shutil.copyfile(self.srcFile, self.dstFile) 120*35238bceSAndroid Build Coastguard Worker 121*35238bceSAndroid Build Coastguard Workerclass GenReleaseInfoFileTarget (DstFile): 122*35238bceSAndroid Build Coastguard Worker def __init__ (self, dstFile): 123*35238bceSAndroid Build Coastguard Worker super(GenReleaseInfoFileTarget, self).__init__(dstFile) 124*35238bceSAndroid Build Coastguard Worker 125*35238bceSAndroid Build Coastguard Worker def make (self, packageBuildInfo): 126*35238bceSAndroid Build Coastguard Worker self.makeDir() 127*35238bceSAndroid Build Coastguard Worker 128*35238bceSAndroid Build Coastguard Worker scriptPath = os.path.normpath(os.path.join(packageBuildInfo.srcBasePath, "framework", "qphelper", "gen_release_info.py")) 129*35238bceSAndroid Build Coastguard Worker execute([ 130*35238bceSAndroid Build Coastguard Worker pythonExecutable, 131*35238bceSAndroid Build Coastguard Worker "-B", # no .py[co] 132*35238bceSAndroid Build Coastguard Worker scriptPath, 133*35238bceSAndroid Build Coastguard Worker "--name=%s" % packageBuildInfo.getReleaseVersion(), 134*35238bceSAndroid Build Coastguard Worker "--id=0x%08x" % packageBuildInfo.getReleaseId(), 135*35238bceSAndroid Build Coastguard Worker "--out=%s" % self.dstFile 136*35238bceSAndroid Build Coastguard Worker ]) 137*35238bceSAndroid Build Coastguard Worker 138*35238bceSAndroid Build Coastguard Workerclass GenCMake (DstFile): 139*35238bceSAndroid Build Coastguard Worker def __init__ (self, srcFile, dstFile, replaceVars): 140*35238bceSAndroid Build Coastguard Worker super(GenCMake, self).__init__(dstFile) 141*35238bceSAndroid Build Coastguard Worker self.srcFile = srcFile 142*35238bceSAndroid Build Coastguard Worker self.replaceVars = replaceVars 143*35238bceSAndroid Build Coastguard Worker 144*35238bceSAndroid Build Coastguard Worker def make (self, packageBuildInfo): 145*35238bceSAndroid Build Coastguard Worker self.makeDir() 146*35238bceSAndroid Build Coastguard Worker print(" GenCMake: %s" % removeLeadingPath(self.dstFile, packageBuildInfo.dstBasePath)) 147*35238bceSAndroid Build Coastguard Worker src = readFile(self.srcFile) 148*35238bceSAndroid Build Coastguard Worker for var, value in self.replaceVars: 149*35238bceSAndroid Build Coastguard Worker src = re.sub('set\(%s\s+"[^"]*"' % re.escape(var), 150*35238bceSAndroid Build Coastguard Worker 'set(%s "%s"' % (var, value), src) 151*35238bceSAndroid Build Coastguard Worker writeFile(self.dstFile, src) 152*35238bceSAndroid Build Coastguard Worker 153*35238bceSAndroid Build Coastguard Workerdef createFileTargets (srcBasePath, dstBasePath, files, filters): 154*35238bceSAndroid Build Coastguard Worker usedFiles = set() # Files that are already included by other filters 155*35238bceSAndroid Build Coastguard Worker targets = [] 156*35238bceSAndroid Build Coastguard Worker 157*35238bceSAndroid Build Coastguard Worker for isMatch, createFileObj in filters: 158*35238bceSAndroid Build Coastguard Worker # Build list of files that match filter 159*35238bceSAndroid Build Coastguard Worker matchingFiles = [] 160*35238bceSAndroid Build Coastguard Worker for file in files: 161*35238bceSAndroid Build Coastguard Worker if not file in usedFiles and isMatch(file): 162*35238bceSAndroid Build Coastguard Worker matchingFiles.append(file) 163*35238bceSAndroid Build Coastguard Worker 164*35238bceSAndroid Build Coastguard Worker # Build file objects, add to used set 165*35238bceSAndroid Build Coastguard Worker for file in matchingFiles: 166*35238bceSAndroid Build Coastguard Worker usedFiles.add(file) 167*35238bceSAndroid Build Coastguard Worker targets.append(createFileObj(os.path.join(srcBasePath, file), os.path.join(dstBasePath, file))) 168*35238bceSAndroid Build Coastguard Worker 169*35238bceSAndroid Build Coastguard Worker return targets 170*35238bceSAndroid Build Coastguard Worker 171*35238bceSAndroid Build Coastguard Worker# Generates multiple file targets based on filters 172*35238bceSAndroid Build Coastguard Workerclass FileTargetGroup: 173*35238bceSAndroid Build Coastguard Worker def __init__ (self, srcBasePath, dstBasePath, filters, srcBasePathFunc=PackageBuildInfo.getSrcBasePath): 174*35238bceSAndroid Build Coastguard Worker self.srcBasePath = srcBasePath 175*35238bceSAndroid Build Coastguard Worker self.dstBasePath = dstBasePath 176*35238bceSAndroid Build Coastguard Worker self.filters = filters 177*35238bceSAndroid Build Coastguard Worker self.getSrcBasePath = srcBasePathFunc 178*35238bceSAndroid Build Coastguard Worker 179*35238bceSAndroid Build Coastguard Worker def make (self, packageBuildInfo): 180*35238bceSAndroid Build Coastguard Worker fullSrcPath = os.path.normpath(os.path.join(self.getSrcBasePath(packageBuildInfo), self.srcBasePath)) 181*35238bceSAndroid Build Coastguard Worker fullDstPath = os.path.normpath(os.path.join(packageBuildInfo.dstBasePath, self.dstBasePath)) 182*35238bceSAndroid Build Coastguard Worker 183*35238bceSAndroid Build Coastguard Worker allFiles = getFileList(fullSrcPath) 184*35238bceSAndroid Build Coastguard Worker targets = createFileTargets(fullSrcPath, fullDstPath, allFiles, self.filters) 185*35238bceSAndroid Build Coastguard Worker 186*35238bceSAndroid Build Coastguard Worker # Make all file targets 187*35238bceSAndroid Build Coastguard Worker for file in targets: 188*35238bceSAndroid Build Coastguard Worker file.make(packageBuildInfo) 189*35238bceSAndroid Build Coastguard Worker 190*35238bceSAndroid Build Coastguard Worker# Single file target 191*35238bceSAndroid Build Coastguard Workerclass SingleFileTarget: 192*35238bceSAndroid Build Coastguard Worker def __init__ (self, srcFile, dstFile, makeTarget): 193*35238bceSAndroid Build Coastguard Worker self.srcFile = srcFile 194*35238bceSAndroid Build Coastguard Worker self.dstFile = dstFile 195*35238bceSAndroid Build Coastguard Worker self.makeTarget = makeTarget 196*35238bceSAndroid Build Coastguard Worker 197*35238bceSAndroid Build Coastguard Worker def make (self, packageBuildInfo): 198*35238bceSAndroid Build Coastguard Worker fullSrcPath = os.path.normpath(os.path.join(packageBuildInfo.srcBasePath, self.srcFile)) 199*35238bceSAndroid Build Coastguard Worker fullDstPath = os.path.normpath(os.path.join(packageBuildInfo.dstBasePath, self.dstFile)) 200*35238bceSAndroid Build Coastguard Worker 201*35238bceSAndroid Build Coastguard Worker target = self.makeTarget(fullSrcPath, fullDstPath) 202*35238bceSAndroid Build Coastguard Worker target.make(packageBuildInfo) 203*35238bceSAndroid Build Coastguard Worker 204*35238bceSAndroid Build Coastguard Workerclass BuildTarget: 205*35238bceSAndroid Build Coastguard Worker def __init__ (self, baseConfig, generator, targets = None): 206*35238bceSAndroid Build Coastguard Worker self.baseConfig = baseConfig 207*35238bceSAndroid Build Coastguard Worker self.generator = generator 208*35238bceSAndroid Build Coastguard Worker self.targets = targets 209*35238bceSAndroid Build Coastguard Worker 210*35238bceSAndroid Build Coastguard Worker def make (self, packageBuildInfo): 211*35238bceSAndroid Build Coastguard Worker print(" Building %s" % self.baseConfig.getBuildDir()) 212*35238bceSAndroid Build Coastguard Worker 213*35238bceSAndroid Build Coastguard Worker # Create config with full build dir path 214*35238bceSAndroid Build Coastguard Worker config = BuildConfig(os.path.join(packageBuildInfo.getTmpBasePath(), self.baseConfig.getBuildDir()), 215*35238bceSAndroid Build Coastguard Worker self.baseConfig.getBuildType(), 216*35238bceSAndroid Build Coastguard Worker self.baseConfig.getArgs(), 217*35238bceSAndroid Build Coastguard Worker srcPath = os.path.join(packageBuildInfo.dstBasePath, "src")) 218*35238bceSAndroid Build Coastguard Worker 219*35238bceSAndroid Build Coastguard Worker assert not os.path.exists(config.getBuildDir()) 220*35238bceSAndroid Build Coastguard Worker build(config, self.generator, self.targets) 221*35238bceSAndroid Build Coastguard Worker 222*35238bceSAndroid Build Coastguard Workerclass BuildAndroidTarget: 223*35238bceSAndroid Build Coastguard Worker def __init__ (self, dstFile): 224*35238bceSAndroid Build Coastguard Worker self.dstFile = dstFile 225*35238bceSAndroid Build Coastguard Worker 226*35238bceSAndroid Build Coastguard Worker def make (self, packageBuildInfo): 227*35238bceSAndroid Build Coastguard Worker print(" Building Android binary") 228*35238bceSAndroid Build Coastguard Worker 229*35238bceSAndroid Build Coastguard Worker buildRoot = os.path.join(packageBuildInfo.tmpBasePath, "android-build") 230*35238bceSAndroid Build Coastguard Worker 231*35238bceSAndroid Build Coastguard Worker assert not os.path.exists(buildRoot) 232*35238bceSAndroid Build Coastguard Worker os.makedirs(buildRoot) 233*35238bceSAndroid Build Coastguard Worker 234*35238bceSAndroid Build Coastguard Worker # Execute build script 235*35238bceSAndroid Build Coastguard Worker scriptPath = os.path.normpath(os.path.join(packageBuildInfo.dstBasePath, "src", "android", "scripts", "build.py")) 236*35238bceSAndroid Build Coastguard Worker execute([ 237*35238bceSAndroid Build Coastguard Worker pythonExecutable, 238*35238bceSAndroid Build Coastguard Worker "-B", # no .py[co] 239*35238bceSAndroid Build Coastguard Worker scriptPath, 240*35238bceSAndroid Build Coastguard Worker "--build-root=%s" % buildRoot, 241*35238bceSAndroid Build Coastguard Worker ]) 242*35238bceSAndroid Build Coastguard Worker 243*35238bceSAndroid Build Coastguard Worker srcFile = os.path.normpath(os.path.join(buildRoot, "package", "bin", "dEQP-debug.apk")) 244*35238bceSAndroid Build Coastguard Worker dstFile = os.path.normpath(os.path.join(packageBuildInfo.dstBasePath, self.dstFile)) 245*35238bceSAndroid Build Coastguard Worker 246*35238bceSAndroid Build Coastguard Worker CopyFile(srcFile, dstFile).make(packageBuildInfo) 247*35238bceSAndroid Build Coastguard Worker 248*35238bceSAndroid Build Coastguard Workerclass FetchExternalSourcesTarget: 249*35238bceSAndroid Build Coastguard Worker def __init__ (self): 250*35238bceSAndroid Build Coastguard Worker pass 251*35238bceSAndroid Build Coastguard Worker 252*35238bceSAndroid Build Coastguard Worker def make (self, packageBuildInfo): 253*35238bceSAndroid Build Coastguard Worker scriptPath = os.path.normpath(os.path.join(packageBuildInfo.dstBasePath, "src", "external", "fetch_sources.py")) 254*35238bceSAndroid Build Coastguard Worker execute([ 255*35238bceSAndroid Build Coastguard Worker pythonExecutable, 256*35238bceSAndroid Build Coastguard Worker "-B", # no .py[co] 257*35238bceSAndroid Build Coastguard Worker scriptPath, 258*35238bceSAndroid Build Coastguard Worker ]) 259*35238bceSAndroid Build Coastguard Worker 260*35238bceSAndroid Build Coastguard Workerclass RemoveSourcesTarget: 261*35238bceSAndroid Build Coastguard Worker def __init__ (self): 262*35238bceSAndroid Build Coastguard Worker pass 263*35238bceSAndroid Build Coastguard Worker 264*35238bceSAndroid Build Coastguard Worker def make (self, packageBuildInfo): 265*35238bceSAndroid Build Coastguard Worker shutil.rmtree(os.path.join(packageBuildInfo.dstBasePath, "src"), ignore_errors=False) 266*35238bceSAndroid Build Coastguard Worker 267*35238bceSAndroid Build Coastguard Workerclass Module: 268*35238bceSAndroid Build Coastguard Worker def __init__ (self, name, targets): 269*35238bceSAndroid Build Coastguard Worker self.name = name 270*35238bceSAndroid Build Coastguard Worker self.targets = targets 271*35238bceSAndroid Build Coastguard Worker 272*35238bceSAndroid Build Coastguard Worker def make (self, packageBuildInfo): 273*35238bceSAndroid Build Coastguard Worker for target in self.targets: 274*35238bceSAndroid Build Coastguard Worker target.make(packageBuildInfo) 275*35238bceSAndroid Build Coastguard Worker 276*35238bceSAndroid Build Coastguard Workerclass ReleaseConfig: 277*35238bceSAndroid Build Coastguard Worker def __init__ (self, name, version, modules, sources = True): 278*35238bceSAndroid Build Coastguard Worker self.name = name 279*35238bceSAndroid Build Coastguard Worker self.version = version 280*35238bceSAndroid Build Coastguard Worker self.modules = modules 281*35238bceSAndroid Build Coastguard Worker self.sources = sources 282*35238bceSAndroid Build Coastguard Worker 283*35238bceSAndroid Build Coastguard Worker def getName (self): 284*35238bceSAndroid Build Coastguard Worker return self.name 285*35238bceSAndroid Build Coastguard Worker 286*35238bceSAndroid Build Coastguard Worker def getVersion (self): 287*35238bceSAndroid Build Coastguard Worker return self.version 288*35238bceSAndroid Build Coastguard Worker 289*35238bceSAndroid Build Coastguard Worker def getModules (self): 290*35238bceSAndroid Build Coastguard Worker return self.modules 291*35238bceSAndroid Build Coastguard Worker 292*35238bceSAndroid Build Coastguard Worker def packageWithSources (self): 293*35238bceSAndroid Build Coastguard Worker return self.sources 294*35238bceSAndroid Build Coastguard Worker 295*35238bceSAndroid Build Coastguard Workerdef matchIncludeExclude (includePatterns, excludePatterns, filename): 296*35238bceSAndroid Build Coastguard Worker components = os.path.normpath(filename).split(os.sep) 297*35238bceSAndroid Build Coastguard Worker for pattern in excludePatterns: 298*35238bceSAndroid Build Coastguard Worker for component in components: 299*35238bceSAndroid Build Coastguard Worker if fnmatch.fnmatch(component, pattern): 300*35238bceSAndroid Build Coastguard Worker return False 301*35238bceSAndroid Build Coastguard Worker 302*35238bceSAndroid Build Coastguard Worker for pattern in includePatterns: 303*35238bceSAndroid Build Coastguard Worker for component in components: 304*35238bceSAndroid Build Coastguard Worker if fnmatch.fnmatch(component, pattern): 305*35238bceSAndroid Build Coastguard Worker return True 306*35238bceSAndroid Build Coastguard Worker 307*35238bceSAndroid Build Coastguard Worker return False 308*35238bceSAndroid Build Coastguard Worker 309*35238bceSAndroid Build Coastguard Workerdef copyFileFilter (includePatterns, excludePatterns=[]): 310*35238bceSAndroid Build Coastguard Worker return (lambda f: matchIncludeExclude(includePatterns, excludePatterns, f), 311*35238bceSAndroid Build Coastguard Worker lambda s, d: CopyFile(s, d)) 312*35238bceSAndroid Build Coastguard Worker 313*35238bceSAndroid Build Coastguard Workerdef makeFileCopyGroup (srcDir, dstDir, includePatterns, excludePatterns=[]): 314*35238bceSAndroid Build Coastguard Worker return FileTargetGroup(srcDir, dstDir, [copyFileFilter(includePatterns, excludePatterns)]) 315*35238bceSAndroid Build Coastguard Worker 316*35238bceSAndroid Build Coastguard Workerdef makeTmpFileCopyGroup (srcDir, dstDir, includePatterns, excludePatterns=[]): 317*35238bceSAndroid Build Coastguard Worker return FileTargetGroup(srcDir, dstDir, [copyFileFilter(includePatterns, excludePatterns)], PackageBuildInfo.getTmpBasePath) 318*35238bceSAndroid Build Coastguard Worker 319*35238bceSAndroid Build Coastguard Workerdef makeFileCopy (srcFile, dstFile): 320*35238bceSAndroid Build Coastguard Worker return SingleFileTarget(srcFile, dstFile, lambda s, d: CopyFile(s, d)) 321*35238bceSAndroid Build Coastguard Worker 322*35238bceSAndroid Build Coastguard Workerdef getReleaseFileName (configName, releaseName): 323*35238bceSAndroid Build Coastguard Worker today = datetime.date.today() 324*35238bceSAndroid Build Coastguard Worker return "dEQP-%s-%04d-%02d-%02d-%s" % (releaseName, today.year, today.month, today.day, configName) 325*35238bceSAndroid Build Coastguard Worker 326*35238bceSAndroid Build Coastguard Workerdef getTempDir (): 327*35238bceSAndroid Build Coastguard Worker dirName = os.path.join(tempfile.gettempdir(), "dEQP-Releases") 328*35238bceSAndroid Build Coastguard Worker if not os.path.exists(dirName): 329*35238bceSAndroid Build Coastguard Worker os.makedirs(dirName) 330*35238bceSAndroid Build Coastguard Worker return dirName 331*35238bceSAndroid Build Coastguard Worker 332*35238bceSAndroid Build Coastguard Workerdef makeRelease (releaseConfig): 333*35238bceSAndroid Build Coastguard Worker releaseName = getReleaseFileName(releaseConfig.getName(), releaseConfig.getVersion()) 334*35238bceSAndroid Build Coastguard Worker tmpPath = getTempDir() 335*35238bceSAndroid Build Coastguard Worker srcBasePath = DEQP_DIR 336*35238bceSAndroid Build Coastguard Worker dstBasePath = os.path.join(tmpPath, releaseName) 337*35238bceSAndroid Build Coastguard Worker tmpBasePath = os.path.join(tmpPath, releaseName + "-tmp") 338*35238bceSAndroid Build Coastguard Worker packageBuildInfo = PackageBuildInfo(releaseConfig, srcBasePath, dstBasePath, tmpBasePath) 339*35238bceSAndroid Build Coastguard Worker dstArchiveName = releaseName + ".tar.bz2" 340*35238bceSAndroid Build Coastguard Worker 341*35238bceSAndroid Build Coastguard Worker print("Creating release %s to %s" % (releaseName, tmpPath)) 342*35238bceSAndroid Build Coastguard Worker 343*35238bceSAndroid Build Coastguard Worker # Remove old temporary dirs 344*35238bceSAndroid Build Coastguard Worker for path in [dstBasePath, tmpBasePath]: 345*35238bceSAndroid Build Coastguard Worker if os.path.exists(path): 346*35238bceSAndroid Build Coastguard Worker shutil.rmtree(path, ignore_errors=False) 347*35238bceSAndroid Build Coastguard Worker 348*35238bceSAndroid Build Coastguard Worker # Make all modules 349*35238bceSAndroid Build Coastguard Worker for module in releaseConfig.getModules(): 350*35238bceSAndroid Build Coastguard Worker print(" Processing module %s" % module.name) 351*35238bceSAndroid Build Coastguard Worker module.make(packageBuildInfo) 352*35238bceSAndroid Build Coastguard Worker 353*35238bceSAndroid Build Coastguard Worker # Remove sources? 354*35238bceSAndroid Build Coastguard Worker if not releaseConfig.packageWithSources(): 355*35238bceSAndroid Build Coastguard Worker shutil.rmtree(os.path.join(dstBasePath, "src"), ignore_errors=False) 356*35238bceSAndroid Build Coastguard Worker 357*35238bceSAndroid Build Coastguard Worker # Create archive 358*35238bceSAndroid Build Coastguard Worker print("Creating %s" % dstArchiveName) 359*35238bceSAndroid Build Coastguard Worker archive = tarfile.open(dstArchiveName, 'w:bz2') 360*35238bceSAndroid Build Coastguard Worker archive.add(dstBasePath, arcname=releaseName) 361*35238bceSAndroid Build Coastguard Worker archive.close() 362*35238bceSAndroid Build Coastguard Worker 363*35238bceSAndroid Build Coastguard Worker # Remove tmp dirs 364*35238bceSAndroid Build Coastguard Worker for path in [dstBasePath, tmpBasePath]: 365*35238bceSAndroid Build Coastguard Worker if os.path.exists(path): 366*35238bceSAndroid Build Coastguard Worker shutil.rmtree(path, ignore_errors=False) 367*35238bceSAndroid Build Coastguard Worker 368*35238bceSAndroid Build Coastguard Worker print("Done!") 369*35238bceSAndroid Build Coastguard Worker 370*35238bceSAndroid Build Coastguard Worker# Module declarations 371*35238bceSAndroid Build Coastguard Worker 372*35238bceSAndroid Build Coastguard WorkerSRC_FILE_PATTERNS = ["*.h", "*.hpp", "*.c", "*.cpp", "*.m", "*.mm", "*.inl", "*.java", "*.aidl", "CMakeLists.txt", "LICENSE.txt", "*.cmake"] 373*35238bceSAndroid Build Coastguard WorkerTARGET_PATTERNS = ["*.cmake", "*.h", "*.lib", "*.dll", "*.so", "*.txt"] 374*35238bceSAndroid Build Coastguard Worker 375*35238bceSAndroid Build Coastguard WorkerBASE = Module("Base", [ 376*35238bceSAndroid Build Coastguard Worker makeFileCopy ("LICENSE", "src/LICENSE"), 377*35238bceSAndroid Build Coastguard Worker makeFileCopy ("CMakeLists.txt", "src/CMakeLists.txt"), 378*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("targets", "src/targets", TARGET_PATTERNS), 379*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("execserver", "src/execserver", SRC_FILE_PATTERNS), 380*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("executor", "src/executor", SRC_FILE_PATTERNS), 381*35238bceSAndroid Build Coastguard Worker makeFileCopy ("modules/CMakeLists.txt", "src/modules/CMakeLists.txt"), 382*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("external", "src/external", ["CMakeLists.txt", "*.py"]), 383*35238bceSAndroid Build Coastguard Worker 384*35238bceSAndroid Build Coastguard Worker # Stylesheet for displaying test logs on browser 385*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("doc/testlog-stylesheet", "doc/testlog-stylesheet", ["*"]), 386*35238bceSAndroid Build Coastguard Worker 387*35238bceSAndroid Build Coastguard Worker # Non-optional parts of framework 388*35238bceSAndroid Build Coastguard Worker makeFileCopy ("framework/CMakeLists.txt", "src/framework/CMakeLists.txt"), 389*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("framework/delibs", "src/framework/delibs", SRC_FILE_PATTERNS), 390*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("framework/common", "src/framework/common", SRC_FILE_PATTERNS), 391*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("framework/qphelper", "src/framework/qphelper", SRC_FILE_PATTERNS), 392*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("framework/platform", "src/framework/platform", SRC_FILE_PATTERNS), 393*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("framework/opengl", "src/framework/opengl", SRC_FILE_PATTERNS, ["simplereference"]), 394*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("framework/egl", "src/framework/egl", SRC_FILE_PATTERNS), 395*35238bceSAndroid Build Coastguard Worker 396*35238bceSAndroid Build Coastguard Worker # android sources 397*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("android/package/src", "src/android/package/src", SRC_FILE_PATTERNS), 398*35238bceSAndroid Build Coastguard Worker makeFileCopy ("android/package/AndroidManifest.xml", "src/android/package/AndroidManifest.xml"), 399*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("android/package/res", "src/android/package/res", ["*.png", "*.xml"]), 400*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("android/scripts", "src/android/scripts", [ 401*35238bceSAndroid Build Coastguard Worker "common.py", 402*35238bceSAndroid Build Coastguard Worker "build.py", 403*35238bceSAndroid Build Coastguard Worker "resources.py", 404*35238bceSAndroid Build Coastguard Worker "install.py", 405*35238bceSAndroid Build Coastguard Worker "launch.py", 406*35238bceSAndroid Build Coastguard Worker "debug.py" 407*35238bceSAndroid Build Coastguard Worker ]), 408*35238bceSAndroid Build Coastguard Worker 409*35238bceSAndroid Build Coastguard Worker # Release info 410*35238bceSAndroid Build Coastguard Worker GenReleaseInfoFileTarget("src/framework/qphelper/qpReleaseInfo.inl") 411*35238bceSAndroid Build Coastguard Worker]) 412*35238bceSAndroid Build Coastguard Worker 413*35238bceSAndroid Build Coastguard WorkerDOCUMENTATION = Module("Documentation", [ 414*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("doc/pdf", "doc", ["*.pdf"]), 415*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("doc", "doc", ["porting_layer_changes_*.txt"]), 416*35238bceSAndroid Build Coastguard Worker]) 417*35238bceSAndroid Build Coastguard Worker 418*35238bceSAndroid Build Coastguard WorkerGLSHARED = Module("Shared GL Tests", [ 419*35238bceSAndroid Build Coastguard Worker # Optional framework components 420*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("framework/randomshaders", "src/framework/randomshaders", SRC_FILE_PATTERNS), 421*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("framework/opengl/simplereference", "src/framework/opengl/simplereference", SRC_FILE_PATTERNS), 422*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("framework/referencerenderer", "src/framework/referencerenderer", SRC_FILE_PATTERNS), 423*35238bceSAndroid Build Coastguard Worker 424*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("modules/glshared", "src/modules/glshared", SRC_FILE_PATTERNS), 425*35238bceSAndroid Build Coastguard Worker]) 426*35238bceSAndroid Build Coastguard Worker 427*35238bceSAndroid Build Coastguard WorkerGLES2 = Module("GLES2", [ 428*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("modules/gles2", "src/modules/gles2", SRC_FILE_PATTERNS), 429*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("data/gles2", "src/data/gles2", ["*.*"]), 430*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("doc/testspecs/GLES2", "doc/testspecs/GLES2", ["*.txt"]) 431*35238bceSAndroid Build Coastguard Worker]) 432*35238bceSAndroid Build Coastguard Worker 433*35238bceSAndroid Build Coastguard WorkerGLES3 = Module("GLES3", [ 434*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("modules/gles3", "src/modules/gles3", SRC_FILE_PATTERNS), 435*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("data/gles3", "src/data/gles3", ["*.*"]), 436*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("doc/testspecs/GLES3", "doc/testspecs/GLES3", ["*.txt"]) 437*35238bceSAndroid Build Coastguard Worker]) 438*35238bceSAndroid Build Coastguard Worker 439*35238bceSAndroid Build Coastguard WorkerGLES31 = Module("GLES31", [ 440*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("modules/gles31", "src/modules/gles31", SRC_FILE_PATTERNS), 441*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("data/gles31", "src/data/gles31", ["*.*"]), 442*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("doc/testspecs/GLES31", "doc/testspecs/GLES31", ["*.txt"]) 443*35238bceSAndroid Build Coastguard Worker]) 444*35238bceSAndroid Build Coastguard Worker 445*35238bceSAndroid Build Coastguard WorkerEGL = Module("EGL", [ 446*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("modules/egl", "src/modules/egl", SRC_FILE_PATTERNS) 447*35238bceSAndroid Build Coastguard Worker]) 448*35238bceSAndroid Build Coastguard Worker 449*35238bceSAndroid Build Coastguard WorkerINTERNAL = Module("Internal", [ 450*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("modules/internal", "src/modules/internal", SRC_FILE_PATTERNS), 451*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("data/internal", "src/data/internal", ["*.*"]), 452*35238bceSAndroid Build Coastguard Worker]) 453*35238bceSAndroid Build Coastguard Worker 454*35238bceSAndroid Build Coastguard WorkerEXTERNAL_SRCS = Module("External sources", [ 455*35238bceSAndroid Build Coastguard Worker FetchExternalSourcesTarget() 456*35238bceSAndroid Build Coastguard Worker]) 457*35238bceSAndroid Build Coastguard Worker 458*35238bceSAndroid Build Coastguard WorkerANDROID_BINARIES = Module("Android Binaries", [ 459*35238bceSAndroid Build Coastguard Worker BuildAndroidTarget ("bin/android/dEQP.apk"), 460*35238bceSAndroid Build Coastguard Worker makeFileCopyGroup ("targets/android", "bin/android", ["*.bat", "*.sh"]), 461*35238bceSAndroid Build Coastguard Worker]) 462*35238bceSAndroid Build Coastguard Worker 463*35238bceSAndroid Build Coastguard WorkerCOMMON_BUILD_ARGS = ['-DPNG_SRC_PATH=%s' % os.path.realpath(os.path.join(DEQP_DIR, '..', 'libpng'))] 464*35238bceSAndroid Build Coastguard WorkerNULL_X32_CONFIG = BuildConfig('null-x32', 'Release', ['-DDEQP_TARGET=null', '-DCMAKE_C_FLAGS=-m32', '-DCMAKE_CXX_FLAGS=-m32'] + COMMON_BUILD_ARGS) 465*35238bceSAndroid Build Coastguard WorkerNULL_X64_CONFIG = BuildConfig('null-x64', 'Release', ['-DDEQP_TARGET=null', '-DCMAKE_C_FLAGS=-m64', '-DCMAKE_CXX_FLAGS=-m64'] + COMMON_BUILD_ARGS) 466*35238bceSAndroid Build Coastguard WorkerGLX_X32_CONFIG = BuildConfig('glx-x32', 'Release', ['-DDEQP_TARGET=x11_glx', '-DCMAKE_C_FLAGS=-m32', '-DCMAKE_CXX_FLAGS=-m32'] + COMMON_BUILD_ARGS) 467*35238bceSAndroid Build Coastguard WorkerGLX_X64_CONFIG = BuildConfig('glx-x64', 'Release', ['-DDEQP_TARGET=x11_glx', '-DCMAKE_C_FLAGS=-m64', '-DCMAKE_CXX_FLAGS=-m64'] + COMMON_BUILD_ARGS) 468*35238bceSAndroid Build Coastguard Worker 469*35238bceSAndroid Build Coastguard WorkerEXCLUDE_BUILD_FILES = ["CMakeFiles", "*.a", "*.cmake"] 470*35238bceSAndroid Build Coastguard Worker 471*35238bceSAndroid Build Coastguard WorkerLINUX_X32_COMMON_BINARIES = Module("Linux x32 Common Binaries", [ 472*35238bceSAndroid Build Coastguard Worker BuildTarget (NULL_X32_CONFIG, ANY_UNIX_GENERATOR), 473*35238bceSAndroid Build Coastguard Worker makeTmpFileCopyGroup(NULL_X32_CONFIG.getBuildDir() + "/execserver", "bin/linux32", ["*"], EXCLUDE_BUILD_FILES), 474*35238bceSAndroid Build Coastguard Worker makeTmpFileCopyGroup(NULL_X32_CONFIG.getBuildDir() + "/executor", "bin/linux32", ["*"], EXCLUDE_BUILD_FILES), 475*35238bceSAndroid Build Coastguard Worker]) 476*35238bceSAndroid Build Coastguard Worker 477*35238bceSAndroid Build Coastguard WorkerLINUX_X64_COMMON_BINARIES = Module("Linux x64 Common Binaries", [ 478*35238bceSAndroid Build Coastguard Worker BuildTarget (NULL_X64_CONFIG, ANY_UNIX_GENERATOR), 479*35238bceSAndroid Build Coastguard Worker makeTmpFileCopyGroup(NULL_X64_CONFIG.getBuildDir() + "/execserver", "bin/linux64", ["*"], EXCLUDE_BUILD_FILES), 480*35238bceSAndroid Build Coastguard Worker makeTmpFileCopyGroup(NULL_X64_CONFIG.getBuildDir() + "/executor", "bin/linux64", ["*"], EXCLUDE_BUILD_FILES), 481*35238bceSAndroid Build Coastguard Worker]) 482*35238bceSAndroid Build Coastguard Worker 483*35238bceSAndroid Build Coastguard Worker# Special module to remove src dir, for example after binary build 484*35238bceSAndroid Build Coastguard WorkerREMOVE_SOURCES = Module("Remove sources from package", [ 485*35238bceSAndroid Build Coastguard Worker RemoveSourcesTarget() 486*35238bceSAndroid Build Coastguard Worker]) 487*35238bceSAndroid Build Coastguard Worker 488*35238bceSAndroid Build Coastguard Worker# Release configuration 489*35238bceSAndroid Build Coastguard Worker 490*35238bceSAndroid Build Coastguard WorkerALL_MODULES = [ 491*35238bceSAndroid Build Coastguard Worker BASE, 492*35238bceSAndroid Build Coastguard Worker DOCUMENTATION, 493*35238bceSAndroid Build Coastguard Worker GLSHARED, 494*35238bceSAndroid Build Coastguard Worker GLES2, 495*35238bceSAndroid Build Coastguard Worker GLES3, 496*35238bceSAndroid Build Coastguard Worker GLES31, 497*35238bceSAndroid Build Coastguard Worker EGL, 498*35238bceSAndroid Build Coastguard Worker INTERNAL, 499*35238bceSAndroid Build Coastguard Worker EXTERNAL_SRCS, 500*35238bceSAndroid Build Coastguard Worker] 501*35238bceSAndroid Build Coastguard Worker 502*35238bceSAndroid Build Coastguard WorkerALL_BINARIES = [ 503*35238bceSAndroid Build Coastguard Worker LINUX_X64_COMMON_BINARIES, 504*35238bceSAndroid Build Coastguard Worker ANDROID_BINARIES, 505*35238bceSAndroid Build Coastguard Worker] 506*35238bceSAndroid Build Coastguard Worker 507*35238bceSAndroid Build Coastguard WorkerRELEASE_CONFIGS = { 508*35238bceSAndroid Build Coastguard Worker "src": ALL_MODULES, 509*35238bceSAndroid Build Coastguard Worker "src-bin": ALL_MODULES + ALL_BINARIES, 510*35238bceSAndroid Build Coastguard Worker "bin": ALL_MODULES + ALL_BINARIES + [REMOVE_SOURCES], 511*35238bceSAndroid Build Coastguard Worker} 512*35238bceSAndroid Build Coastguard Worker 513*35238bceSAndroid Build Coastguard Workerdef parseArgs (): 514*35238bceSAndroid Build Coastguard Worker parser = argparse.ArgumentParser(description = "Build release package") 515*35238bceSAndroid Build Coastguard Worker parser.add_argument("-c", 516*35238bceSAndroid Build Coastguard Worker "--config", 517*35238bceSAndroid Build Coastguard Worker dest="config", 518*35238bceSAndroid Build Coastguard Worker choices=RELEASE_CONFIGS.keys(), 519*35238bceSAndroid Build Coastguard Worker required=True, 520*35238bceSAndroid Build Coastguard Worker help="Release configuration") 521*35238bceSAndroid Build Coastguard Worker parser.add_argument("-n", 522*35238bceSAndroid Build Coastguard Worker "--name", 523*35238bceSAndroid Build Coastguard Worker dest="name", 524*35238bceSAndroid Build Coastguard Worker required=True, 525*35238bceSAndroid Build Coastguard Worker help="Package-specific name") 526*35238bceSAndroid Build Coastguard Worker parser.add_argument("-v", 527*35238bceSAndroid Build Coastguard Worker "--version", 528*35238bceSAndroid Build Coastguard Worker dest="version", 529*35238bceSAndroid Build Coastguard Worker required=True, 530*35238bceSAndroid Build Coastguard Worker help="Version code") 531*35238bceSAndroid Build Coastguard Worker return parser.parse_args() 532*35238bceSAndroid Build Coastguard Worker 533*35238bceSAndroid Build Coastguard Workerif __name__ == "__main__": 534*35238bceSAndroid Build Coastguard Worker args = parseArgs() 535*35238bceSAndroid Build Coastguard Worker config = ReleaseConfig(args.name, args.version, RELEASE_CONFIGS[args.config]) 536*35238bceSAndroid Build Coastguard Worker makeRelease(config) 537