Fix missing dependency on sparse binds
[platform/upstream/VK-GL-CTS.git] / scripts / build_caselists.py
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 ctsbuild.common import *
24 from ctsbuild.config import *
25 from ctsbuild.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         Module("dEQP-VKSC",             "../external/vulkancts/modules/vulkan", "deqp-vksc"),
48 ]
49
50 DEFAULT_BUILD_DIR       = os.path.join(tempfile.gettempdir(), "deqp-caselists", "{targetName}-{buildType}")
51 DEFAULT_TARGET          = "null"
52
53 def getModuleByName (name):
54         for module in MODULES:
55                 if module.name == name:
56                         return module
57         else:
58                 raise Exception("Unknown module %s" % name)
59
60 def getBuildConfig (buildPathPtrn, targetName, buildType):
61         buildPath = buildPathPtrn.format(
62                 targetName      = targetName,
63                 buildType       = buildType)
64
65         return BuildConfig(buildPath, buildType, ["-DDEQP_TARGET=%s" % targetName])
66
67 def getModulesPath (buildCfg):
68         return os.path.join(buildCfg.getBuildDir(), "modules")
69
70 def getBuiltModules (buildCfg):
71         modules         = []
72         modulesDir      = getModulesPath(buildCfg)
73
74         for module in MODULES:
75                 fullPath = os.path.join(modulesDir, module.dirName)
76                 if os.path.exists(fullPath) and os.path.isdir(fullPath):
77                         modules.append(module)
78
79         return modules
80
81 def getCaseListFileName (module, caseListType):
82         return "%s-cases.%s" % (module.name, caseListType)
83
84 def getCaseListPath (buildCfg, module, caseListType):
85         return os.path.join(getModulesPath(buildCfg), module.dirName, getCaseListFileName(module, caseListType))
86
87 def genCaseList (buildCfg, generator, module, caseListType):
88         workDir = os.path.join(getModulesPath(buildCfg), module.dirName)
89
90         pushWorkingDir(workDir)
91
92         try:
93                 binPath = generator.getBinaryPath(buildCfg.getBuildType(), os.path.join(".", module.binName))
94                 execute([binPath, "--deqp-runmode=%s-caselist" % caseListType])
95         finally:
96                 popWorkingDir()
97
98 def genAndCopyCaseList (buildCfg, generator, module, dstDir, caseListType):
99         caseListFile    = getCaseListFileName(module, caseListType)
100         srcPath                 = getCaseListPath(buildCfg, module, caseListType)
101         dstPath                 = os.path.join(dstDir, caseListFile)
102
103         if os.path.exists(srcPath):
104                 os.remove(srcPath)
105
106         genCaseList(buildCfg, generator, module, caseListType)
107
108         if not os.path.exists(srcPath):
109                 raise Exception("%s not generated" % srcPath)
110
111         shutil.copyfile(srcPath, dstPath)
112
113 def parseArgs ():
114         parser = argparse.ArgumentParser(description = "Build test case lists",
115                                                                          formatter_class=argparse.ArgumentDefaultsHelpFormatter)
116         parser.add_argument("-b",
117                                                 "--build-dir",
118                                                 dest="buildDir",
119                                                 default=DEFAULT_BUILD_DIR,
120                                                 help="Temporary build directory")
121         parser.add_argument("-t",
122                                                 "--build-type",
123                                                 dest="buildType",
124                                                 default="Debug",
125                                                 help="Build type")
126         parser.add_argument("-c",
127                                                 "--deqp-target",
128                                                 dest="targetName",
129                                                 default=DEFAULT_TARGET,
130                                                 help="dEQP build target")
131         parser.add_argument("--case-list-type",
132                                                 dest="caseListType",
133                                                 default="xml",
134                                                 help="Case list type (xml, txt)")
135         parser.add_argument("-m",
136                                                 "--modules",
137                                                 dest="modules",
138                                                 help="Comma-separated list of modules to update")
139         parser.add_argument("dst",
140                                                 help="Destination directory for test case lists")
141         return parser.parse_args()
142
143 if __name__ == "__main__":
144         args = parseArgs()
145
146         generator       = ANY_GENERATOR
147         buildCfg        = getBuildConfig(args.buildDir, args.targetName, args.buildType)
148         modules         = None
149
150         if args.modules:
151                 modules = []
152                 for m in args.modules.split(","):
153                         modules.append(getModuleByName(m))
154
155         if modules:
156                 build(buildCfg, generator, [m.binName for m in modules])
157         else:
158                 build(buildCfg, generator)
159                 modules = getBuiltModules(buildCfg)
160
161         for module in modules:
162                 print("Generating test case list for %s" % module.name)
163                 genAndCopyCaseList(buildCfg, generator, module, args.dst, args.caseListType)