Home | History | Annotate | Download | only in scripts
      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