1# -*- coding: utf-8 -*- 2 3#------------------------------------------------------------------------- 4# drawElements Quality Program utilities 5# -------------------------------------- 6# 7# Copyright 2015 The Android Open Source Project 8# 9# Licensed under the Apache License, Version 2.0 (the "License"); 10# you may not use this file except in compliance with the License. 11# You may obtain a copy of the License at 12# 13# http://www.apache.org/licenses/LICENSE-2.0 14# 15# Unless required by applicable law or agreed to in writing, software 16# distributed under the License is distributed on an "AS IS" BASIS, 17# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18# See the License for the specific language governing permissions and 19# limitations under the License. 20# 21#------------------------------------------------------------------------- 22 23from build.common import * 24from build.config import * 25from build.build import * 26 27import os 28import sys 29import string 30import argparse 31import tempfile 32import shutil 33 34class Module: 35 def __init__ (self, name, dirName, binName): 36 self.name = name 37 self.dirName = dirName 38 self.binName = binName 39 40MODULES = [ 41 Module("dE-IT", "internal", "de-internal-tests"), 42 Module("dEQP-EGL", "egl", "deqp-egl"), 43 Module("dEQP-GLES2", "gles2", "deqp-gles2"), 44 Module("dEQP-GLES3", "gles3", "deqp-gles3"), 45 Module("dEQP-GLES31", "gles31", "deqp-gles31"), 46] 47 48DEFAULT_BUILD_DIR = os.path.join(tempfile.gettempdir(), "deqp-caselists", "{targetName}-{buildType}") 49DEFAULT_TARGET = "null" 50 51def getModuleByName (name): 52 for module in MODULES: 53 if module.name == name: 54 return module 55 else: 56 raise Exception("Unknown module %s" % name) 57 58def getBuildConfig (buildPathPtrn, targetName, buildType): 59 buildPath = buildPathPtrn.format( 60 targetName = targetName, 61 buildType = buildType) 62 63 return BuildConfig(buildPath, buildType, ["-DDEQP_TARGET=%s" % targetName]) 64 65def getModulesPath (buildCfg): 66 return os.path.join(buildCfg.getBuildDir(), "modules") 67 68def getBuiltModules (buildCfg): 69 modules = [] 70 modulesDir = getModulesPath(buildCfg) 71 modMap = {m.dirName: m for m in MODULES} 72 73 for entry in os.listdir(modulesDir): 74 fullPath = os.path.join(modulesDir, entry) 75 if os.path.isdir(fullPath) and entry in modMap: 76 modules.append(modMap[entry]) 77 78 return modules 79 80def getCaseListFileName (module, caseListType): 81 return "%s-cases.%s" % (module.name, caseListType) 82 83def getCaseListPath (buildCfg, module, caseListType): 84 return os.path.join(getModulesPath(buildCfg), module.dirName, getCaseListFileName(module, caseListType)) 85 86def genCaseList (buildCfg, generator, module, caseListType): 87 workDir = os.path.join(getModulesPath(buildCfg), module.dirName) 88 89 pushWorkingDir(workDir) 90 91 try: 92 binPath = generator.getBinaryPath(buildCfg.getBuildType(), os.path.join(".", module.binName)) 93 execute([binPath, "--deqp-runmode=%s-caselist" % caseListType]) 94 finally: 95 popWorkingDir() 96 97def genAndCopyCaseList (buildCfg, generator, module, dstDir, caseListType): 98 caseListFile = getCaseListFileName(module, caseListType) 99 srcPath = getCaseListPath(buildCfg, module, caseListType) 100 dstPath = os.path.join(dstDir, caseListFile) 101 102 if os.path.exists(srcPath): 103 os.remove(srcPath) 104 105 genCaseList(buildCfg, generator, module, caseListType) 106 107 if not os.path.exists(srcPath): 108 raise Exception("%s not generated" % srcPath) 109 110 shutil.copyfile(srcPath, dstPath) 111 112def parseArgs (): 113 parser = argparse.ArgumentParser(description = "Build test case lists", 114 formatter_class=argparse.ArgumentDefaultsHelpFormatter) 115 parser.add_argument("-b", 116 "--build-dir", 117 dest="buildDir", 118 default=DEFAULT_BUILD_DIR, 119 help="Temporary build directory") 120 parser.add_argument("-t", 121 "--build-type", 122 dest="buildType", 123 default="Debug", 124 help="Build type") 125 parser.add_argument("-c", 126 "--deqp-target", 127 dest="targetName", 128 default=DEFAULT_TARGET, 129 help="dEQP build target") 130 parser.add_argument("--case-list-type", 131 dest="caseListType", 132 default="xml", 133 help="Case list type (xml, txt)") 134 parser.add_argument("-m", 135 "--modules", 136 dest="modules", 137 help="Comma-separated list of modules to update") 138 parser.add_argument("dst", 139 help="Destination directory for test case lists") 140 return parser.parse_args() 141 142if __name__ == "__main__": 143 args = parseArgs() 144 145 generator = ANY_GENERATOR 146 buildCfg = getBuildConfig(args.buildDir, args.targetName, args.buildType) 147 modules = None 148 149 if args.modules: 150 modules = [] 151 for m in args.modules.split(","): 152 modules.append(getModuleByName(m)) 153 154 if modules: 155 build(buildCfg, generator, [m.binName for m in modules]) 156 else: 157 build(buildCfg, generator) 158 modules = getBuiltModules(buildCfg) 159 160 for module in modules: 161 print "Generating test case list for %s" % module.name 162 genAndCopyCaseList(buildCfg, generator, module, args.dst, args.caseListType) 163