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 23 from build.common import * 24 from build.config import * 25 from build.build import * 26 27 import os 28 import sys 29 import string 30 import argparse 31 import tempfile 32 import shutil 33 34 class Module: 35 def __init__ (self, name, dirName, binName): 36 self.name = name 37 self.dirName = dirName 38 self.binName = binName 39 40 MODULES = [ 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 Module("dEQP-VK", "../external/vulkancts/modules/vulkan", "deqp-vk"), 47 ] 48 49 DEFAULT_BUILD_DIR = os.path.join(tempfile.gettempdir(), "deqp-caselists", "{targetName}-{buildType}") 50 DEFAULT_TARGET = "null" 51 52 def getModuleByName (name): 53 for module in MODULES: 54 if module.name == name: 55 return module 56 else: 57 raise Exception("Unknown module %s" % name) 58 59 def getBuildConfig (buildPathPtrn, targetName, buildType): 60 buildPath = buildPathPtrn.format( 61 targetName = targetName, 62 buildType = buildType) 63 64 return BuildConfig(buildPath, buildType, ["-DDEQP_TARGET=%s" % targetName]) 65 66 def getModulesPath (buildCfg): 67 return os.path.join(buildCfg.getBuildDir(), "modules") 68 69 def getBuiltModules (buildCfg): 70 modules = [] 71 modulesDir = getModulesPath(buildCfg) 72 73 for module in MODULES: 74 fullPath = os.path.join(modulesDir, module.dirName) 75 if os.path.exists(fullPath) and os.path.isdir(fullPath): 76 modules.append(module) 77 78 return modules 79 80 def getCaseListFileName (module, caseListType): 81 return "%s-cases.%s" % (module.name, caseListType) 82 83 def getCaseListPath (buildCfg, module, caseListType): 84 return os.path.join(getModulesPath(buildCfg), module.dirName, getCaseListFileName(module, caseListType)) 85 86 def 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 97 def 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 112 def 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 142 if __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