| # -*- coding: utf-8 -*- |
| |
| #------------------------------------------------------------------------- |
| # drawElements Quality Program utilities |
| # -------------------------------------- |
| # |
| # Copyright 2015 The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| #------------------------------------------------------------------------- |
| |
| from build.common import * |
| from build.config import * |
| from build.build import * |
| |
| import os |
| import sys |
| import string |
| import argparse |
| import tempfile |
| import shutil |
| |
| class Module: |
| def __init__ (self, name, dirName, binName): |
| self.name = name |
| self.dirName = dirName |
| self.binName = binName |
| |
| MODULES = [ |
| Module("dE-IT", "internal", "de-internal-tests"), |
| Module("dEQP-EGL", "egl", "deqp-egl"), |
| Module("dEQP-GLES2", "gles2", "deqp-gles2"), |
| Module("dEQP-GLES3", "gles3", "deqp-gles3"), |
| Module("dEQP-GLES31", "gles31", "deqp-gles31"), |
| Module("dEQP-VK", "../external/vulkancts/modules/vulkan", "deqp-vk"), |
| Module("dEQP-VKSC", "../external/vulkancts/modules/vulkan", "deqp-vksc"), |
| ] |
| |
| DEFAULT_BUILD_DIR = os.path.join(tempfile.gettempdir(), "deqp-caselists", "{targetName}-{buildType}") |
| DEFAULT_TARGET = "null" |
| |
| def getModuleByName (name): |
| for module in MODULES: |
| if module.name == name: |
| return module |
| else: |
| raise Exception("Unknown module %s" % name) |
| |
| def getBuildConfig (buildPathPtrn, targetName, buildType): |
| buildPath = buildPathPtrn.format( |
| targetName = targetName, |
| buildType = buildType) |
| |
| return BuildConfig(buildPath, buildType, ["-DDEQP_TARGET=%s" % targetName]) |
| |
| def getModulesPath (buildCfg): |
| return os.path.join(buildCfg.getBuildDir(), "modules") |
| |
| def getBuiltModules (buildCfg): |
| modules = [] |
| modulesDir = getModulesPath(buildCfg) |
| |
| for module in MODULES: |
| fullPath = os.path.join(modulesDir, module.dirName) |
| if os.path.exists(fullPath) and os.path.isdir(fullPath): |
| modules.append(module) |
| |
| return modules |
| |
| def getCaseListFileName (module, caseListType): |
| return "%s-cases.%s" % (module.name, caseListType) |
| |
| def getCaseListPath (buildCfg, module, caseListType): |
| return os.path.join(getModulesPath(buildCfg), module.dirName, getCaseListFileName(module, caseListType)) |
| |
| def genCaseList (buildCfg, generator, module, caseListType): |
| workDir = os.path.join(getModulesPath(buildCfg), module.dirName) |
| |
| pushWorkingDir(workDir) |
| |
| try: |
| binPath = generator.getBinaryPath(buildCfg.getBuildType(), os.path.join(".", module.binName)) |
| execute([binPath, "--deqp-runmode=%s-caselist" % caseListType]) |
| finally: |
| popWorkingDir() |
| |
| def genAndCopyCaseList (buildCfg, generator, module, dstDir, caseListType): |
| caseListFile = getCaseListFileName(module, caseListType) |
| srcPath = getCaseListPath(buildCfg, module, caseListType) |
| dstPath = os.path.join(dstDir, caseListFile) |
| |
| if os.path.exists(srcPath): |
| os.remove(srcPath) |
| |
| genCaseList(buildCfg, generator, module, caseListType) |
| |
| if not os.path.exists(srcPath): |
| raise Exception("%s not generated" % srcPath) |
| |
| shutil.copyfile(srcPath, dstPath) |
| |
| def parseArgs (): |
| parser = argparse.ArgumentParser(description = "Build test case lists", |
| formatter_class=argparse.ArgumentDefaultsHelpFormatter) |
| parser.add_argument("-b", |
| "--build-dir", |
| dest="buildDir", |
| default=DEFAULT_BUILD_DIR, |
| help="Temporary build directory") |
| parser.add_argument("-t", |
| "--build-type", |
| dest="buildType", |
| default="Debug", |
| help="Build type") |
| parser.add_argument("-c", |
| "--deqp-target", |
| dest="targetName", |
| default=DEFAULT_TARGET, |
| help="dEQP build target") |
| parser.add_argument("--case-list-type", |
| dest="caseListType", |
| default="xml", |
| help="Case list type (xml, txt)") |
| parser.add_argument("-m", |
| "--modules", |
| dest="modules", |
| help="Comma-separated list of modules to update") |
| parser.add_argument("dst", |
| help="Destination directory for test case lists") |
| return parser.parse_args() |
| |
| if __name__ == "__main__": |
| args = parseArgs() |
| |
| generator = ANY_GENERATOR |
| buildCfg = getBuildConfig(args.buildDir, args.targetName, args.buildType) |
| modules = None |
| |
| if args.modules: |
| modules = [] |
| for m in args.modules.split(","): |
| modules.append(getModuleByName(m)) |
| |
| if modules: |
| build(buildCfg, generator, [m.binName for m in modules]) |
| else: |
| build(buildCfg, generator) |
| modules = getBuiltModules(buildCfg) |
| |
| for module in modules: |
| print("Generating test case list for %s" % module.name) |
| genAndCopyCaseList(buildCfg, generator, module, args.dst, args.caseListType) |