xref: /aosp_15_r20/external/deqp/scripts/ctsbuild/config.py (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker# -*- coding: utf-8 -*-
2*35238bceSAndroid Build Coastguard Worker
3*35238bceSAndroid Build Coastguard Worker#-------------------------------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker# drawElements Quality Program utilities
5*35238bceSAndroid Build Coastguard Worker# --------------------------------------
6*35238bceSAndroid Build Coastguard Worker#
7*35238bceSAndroid Build Coastguard Worker# Copyright 2015 The Android Open Source Project
8*35238bceSAndroid Build Coastguard Worker#
9*35238bceSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
10*35238bceSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
11*35238bceSAndroid Build Coastguard Worker# You may obtain a copy of the License at
12*35238bceSAndroid Build Coastguard Worker#
13*35238bceSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
14*35238bceSAndroid Build Coastguard Worker#
15*35238bceSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
16*35238bceSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
17*35238bceSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18*35238bceSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
19*35238bceSAndroid Build Coastguard Worker# limitations under the License.
20*35238bceSAndroid Build Coastguard Worker#
21*35238bceSAndroid Build Coastguard Worker#-------------------------------------------------------------------------
22*35238bceSAndroid Build Coastguard Worker
23*35238bceSAndroid Build Coastguard Workerimport os
24*35238bceSAndroid Build Coastguard Workerimport sys
25*35238bceSAndroid Build Coastguard Workerimport copy
26*35238bceSAndroid Build Coastguard Workerimport multiprocessing
27*35238bceSAndroid Build Coastguard Worker
28*35238bceSAndroid Build Coastguard Workerfrom . common import which, HostInfo, DEQP_DIR
29*35238bceSAndroid Build Coastguard Worker
30*35238bceSAndroid Build Coastguard Workertry:
31*35238bceSAndroid Build Coastguard Worker    if sys.version_info < (3, 0):
32*35238bceSAndroid Build Coastguard Worker        import _winreg
33*35238bceSAndroid Build Coastguard Worker    else:
34*35238bceSAndroid Build Coastguard Worker        import winreg
35*35238bceSAndroid Build Coastguard Worker        _winreg = winreg
36*35238bceSAndroid Build Coastguard Workerexcept:
37*35238bceSAndroid Build Coastguard Worker    _winreg = None
38*35238bceSAndroid Build Coastguard Worker
39*35238bceSAndroid Build Coastguard Workerclass BuildConfig:
40*35238bceSAndroid Build Coastguard Worker    def __init__ (self, buildDir, buildType, args, srcPath = DEQP_DIR):
41*35238bceSAndroid Build Coastguard Worker        self.srcPath = srcPath
42*35238bceSAndroid Build Coastguard Worker        self.buildDir = buildDir
43*35238bceSAndroid Build Coastguard Worker        self.buildType = buildType
44*35238bceSAndroid Build Coastguard Worker        self.args = copy.copy(args)
45*35238bceSAndroid Build Coastguard Worker        self.cmakePath = BuildConfig.findCMake()
46*35238bceSAndroid Build Coastguard Worker
47*35238bceSAndroid Build Coastguard Worker    def getSrcPath (self):
48*35238bceSAndroid Build Coastguard Worker        return self.srcPath
49*35238bceSAndroid Build Coastguard Worker
50*35238bceSAndroid Build Coastguard Worker    def getBuildDir (self):
51*35238bceSAndroid Build Coastguard Worker        return self.buildDir
52*35238bceSAndroid Build Coastguard Worker
53*35238bceSAndroid Build Coastguard Worker    def getBuildType (self):
54*35238bceSAndroid Build Coastguard Worker        return self.buildType
55*35238bceSAndroid Build Coastguard Worker
56*35238bceSAndroid Build Coastguard Worker    def getArgs (self):
57*35238bceSAndroid Build Coastguard Worker        return self.args
58*35238bceSAndroid Build Coastguard Worker
59*35238bceSAndroid Build Coastguard Worker    def getCMakePath (self):
60*35238bceSAndroid Build Coastguard Worker        return self.cmakePath
61*35238bceSAndroid Build Coastguard Worker
62*35238bceSAndroid Build Coastguard Worker    @staticmethod
63*35238bceSAndroid Build Coastguard Worker    def findCMake ():
64*35238bceSAndroid Build Coastguard Worker        if which("cmake") == None:
65*35238bceSAndroid Build Coastguard Worker            possiblePaths = [
66*35238bceSAndroid Build Coastguard Worker                "/Applications/CMake.app/Contents/bin/cmake"
67*35238bceSAndroid Build Coastguard Worker            ]
68*35238bceSAndroid Build Coastguard Worker            for path in possiblePaths:
69*35238bceSAndroid Build Coastguard Worker                if os.path.exists(path):
70*35238bceSAndroid Build Coastguard Worker                    return path
71*35238bceSAndroid Build Coastguard Worker            raise FileNotFoundError("cmake executable file is not avaliable on the platform. It may not have been installed or added to PATH environment variable")
72*35238bceSAndroid Build Coastguard Worker        return "cmake"
73*35238bceSAndroid Build Coastguard Worker
74*35238bceSAndroid Build Coastguard Workerclass CMakeGenerator:
75*35238bceSAndroid Build Coastguard Worker    def __init__ (self, name, isMultiConfig = False, extraBuildArgs = [], platform = None):
76*35238bceSAndroid Build Coastguard Worker        self.name = name
77*35238bceSAndroid Build Coastguard Worker        self.isMultiConfig = isMultiConfig
78*35238bceSAndroid Build Coastguard Worker        self.extraBuildArgs = copy.copy(extraBuildArgs)
79*35238bceSAndroid Build Coastguard Worker        self.platform = platform
80*35238bceSAndroid Build Coastguard Worker
81*35238bceSAndroid Build Coastguard Worker    def getName (self):
82*35238bceSAndroid Build Coastguard Worker        return self.name
83*35238bceSAndroid Build Coastguard Worker
84*35238bceSAndroid Build Coastguard Worker    def getGenerateArgs (self, buildType):
85*35238bceSAndroid Build Coastguard Worker        args = ['-G', self.name]
86*35238bceSAndroid Build Coastguard Worker        if not self.isMultiConfig:
87*35238bceSAndroid Build Coastguard Worker            args.append('-DCMAKE_BUILD_TYPE=%s' % buildType)
88*35238bceSAndroid Build Coastguard Worker        if self.platform:
89*35238bceSAndroid Build Coastguard Worker            # this is supported since CMake 3.1, needed for VS2019+
90*35238bceSAndroid Build Coastguard Worker            args.append('-A')
91*35238bceSAndroid Build Coastguard Worker            args.append(self.platform)
92*35238bceSAndroid Build Coastguard Worker        return args
93*35238bceSAndroid Build Coastguard Worker
94*35238bceSAndroid Build Coastguard Worker    def getBuildArgs (self, buildType):
95*35238bceSAndroid Build Coastguard Worker        args = []
96*35238bceSAndroid Build Coastguard Worker        if self.isMultiConfig:
97*35238bceSAndroid Build Coastguard Worker            args += ['--config', buildType]
98*35238bceSAndroid Build Coastguard Worker        if len(self.extraBuildArgs) > 0:
99*35238bceSAndroid Build Coastguard Worker            args += ['--'] + self.extraBuildArgs
100*35238bceSAndroid Build Coastguard Worker        return args
101*35238bceSAndroid Build Coastguard Worker
102*35238bceSAndroid Build Coastguard Worker    def getBinaryPath (self, buildType, basePath):
103*35238bceSAndroid Build Coastguard Worker        return basePath
104*35238bceSAndroid Build Coastguard Worker
105*35238bceSAndroid Build Coastguard Workerclass UnixMakefileGenerator(CMakeGenerator):
106*35238bceSAndroid Build Coastguard Worker    def __init__(self):
107*35238bceSAndroid Build Coastguard Worker        CMakeGenerator.__init__(self, "Unix Makefiles", extraBuildArgs = ["-j%d" % multiprocessing.cpu_count()])
108*35238bceSAndroid Build Coastguard Worker
109*35238bceSAndroid Build Coastguard Worker    def isAvailable (self):
110*35238bceSAndroid Build Coastguard Worker        return which('make') != None
111*35238bceSAndroid Build Coastguard Worker
112*35238bceSAndroid Build Coastguard Workerclass NMakeGenerator(CMakeGenerator):
113*35238bceSAndroid Build Coastguard Worker    def __init__(self):
114*35238bceSAndroid Build Coastguard Worker        CMakeGenerator.__init__(self, "NMake Makefiles")
115*35238bceSAndroid Build Coastguard Worker
116*35238bceSAndroid Build Coastguard Worker    def isAvailable (self):
117*35238bceSAndroid Build Coastguard Worker        return which('nmake') != None
118*35238bceSAndroid Build Coastguard Worker
119*35238bceSAndroid Build Coastguard Workerclass NinjaGenerator(CMakeGenerator):
120*35238bceSAndroid Build Coastguard Worker    def __init__(self):
121*35238bceSAndroid Build Coastguard Worker        CMakeGenerator.__init__(self, "Ninja")
122*35238bceSAndroid Build Coastguard Worker
123*35238bceSAndroid Build Coastguard Worker    def isAvailable (self):
124*35238bceSAndroid Build Coastguard Worker        return which('ninja') != None
125*35238bceSAndroid Build Coastguard Worker
126*35238bceSAndroid Build Coastguard Workerclass VSProjectGenerator(CMakeGenerator):
127*35238bceSAndroid Build Coastguard Worker    ARCH_32BIT = 0
128*35238bceSAndroid Build Coastguard Worker    ARCH_64BIT = 1
129*35238bceSAndroid Build Coastguard Worker
130*35238bceSAndroid Build Coastguard Worker    def __init__(self, version, arch):
131*35238bceSAndroid Build Coastguard Worker        name = "Visual Studio %d" % version
132*35238bceSAndroid Build Coastguard Worker
133*35238bceSAndroid Build Coastguard Worker        platform = None
134*35238bceSAndroid Build Coastguard Worker
135*35238bceSAndroid Build Coastguard Worker        if version >= 16:
136*35238bceSAndroid Build Coastguard Worker            # From VS2019 onwards, the architecture is given by -A <platform-name> switch
137*35238bceSAndroid Build Coastguard Worker            if arch == self.ARCH_64BIT:
138*35238bceSAndroid Build Coastguard Worker                platform = "x64"
139*35238bceSAndroid Build Coastguard Worker            elif arch == self.ARCH_32BIT:
140*35238bceSAndroid Build Coastguard Worker                platform = "Win32"
141*35238bceSAndroid Build Coastguard Worker        else:
142*35238bceSAndroid Build Coastguard Worker            if arch == self.ARCH_64BIT:
143*35238bceSAndroid Build Coastguard Worker                name += " Win64"
144*35238bceSAndroid Build Coastguard Worker
145*35238bceSAndroid Build Coastguard Worker        CMakeGenerator.__init__(self, name, isMultiConfig = True, extraBuildArgs = ['/m'], platform = platform)
146*35238bceSAndroid Build Coastguard Worker        self.version = version
147*35238bceSAndroid Build Coastguard Worker        self.arch = arch
148*35238bceSAndroid Build Coastguard Worker
149*35238bceSAndroid Build Coastguard Worker    def getBinaryPath (self, buildType, basePath):
150*35238bceSAndroid Build Coastguard Worker        return os.path.join(os.path.dirname(basePath), buildType, os.path.basename(basePath) + ".exe")
151*35238bceSAndroid Build Coastguard Worker
152*35238bceSAndroid Build Coastguard Worker    @staticmethod
153*35238bceSAndroid Build Coastguard Worker    def getNativeArch ():
154*35238bceSAndroid Build Coastguard Worker        bits = HostInfo.getArchBits()
155*35238bceSAndroid Build Coastguard Worker
156*35238bceSAndroid Build Coastguard Worker        if bits == 32:
157*35238bceSAndroid Build Coastguard Worker            return VSProjectGenerator.ARCH_32BIT
158*35238bceSAndroid Build Coastguard Worker        elif bits == 64:
159*35238bceSAndroid Build Coastguard Worker            return VSProjectGenerator.ARCH_64BIT
160*35238bceSAndroid Build Coastguard Worker        else:
161*35238bceSAndroid Build Coastguard Worker            raise Exception("Unhandled bits '%s'" % bits)
162*35238bceSAndroid Build Coastguard Worker
163*35238bceSAndroid Build Coastguard Worker    @staticmethod
164*35238bceSAndroid Build Coastguard Worker    def registryKeyAvailable (root, arch, name):
165*35238bceSAndroid Build Coastguard Worker        try:
166*35238bceSAndroid Build Coastguard Worker            key = _winreg.OpenKey(root, name, 0, _winreg.KEY_READ | arch)
167*35238bceSAndroid Build Coastguard Worker            _winreg.CloseKey(key)
168*35238bceSAndroid Build Coastguard Worker            return True
169*35238bceSAndroid Build Coastguard Worker        except:
170*35238bceSAndroid Build Coastguard Worker            return False
171*35238bceSAndroid Build Coastguard Worker
172*35238bceSAndroid Build Coastguard Worker    def isAvailable (self):
173*35238bceSAndroid Build Coastguard Worker        if sys.platform == 'win32' and _winreg != None:
174*35238bceSAndroid Build Coastguard Worker            nativeArch = VSProjectGenerator.getNativeArch()
175*35238bceSAndroid Build Coastguard Worker            if nativeArch == self.ARCH_32BIT and self.arch == self.ARCH_64BIT:
176*35238bceSAndroid Build Coastguard Worker                return False
177*35238bceSAndroid Build Coastguard Worker
178*35238bceSAndroid Build Coastguard Worker            arch = _winreg.KEY_WOW64_32KEY if nativeArch == self.ARCH_64BIT else 0
179*35238bceSAndroid Build Coastguard Worker            keyMap = {
180*35238bceSAndroid Build Coastguard Worker                10: [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.10.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\10.0")],
181*35238bceSAndroid Build Coastguard Worker                11: [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.11.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\11.0")],
182*35238bceSAndroid Build Coastguard Worker                12: [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.12.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\12.0")],
183*35238bceSAndroid Build Coastguard Worker                14: [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.14.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\14.0")],
184*35238bceSAndroid Build Coastguard Worker                15: [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.15.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\15.0")],
185*35238bceSAndroid Build Coastguard Worker                16: [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.16.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\16.0")],
186*35238bceSAndroid Build Coastguard Worker                17: [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.17.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\17.0")]
187*35238bceSAndroid Build Coastguard Worker            }
188*35238bceSAndroid Build Coastguard Worker
189*35238bceSAndroid Build Coastguard Worker            if not self.version in keyMap:
190*35238bceSAndroid Build Coastguard Worker                raise Exception("Unsupported VS version %d" % self.version)
191*35238bceSAndroid Build Coastguard Worker
192*35238bceSAndroid Build Coastguard Worker            keys = keyMap[self.version]
193*35238bceSAndroid Build Coastguard Worker            for root, name in keys:
194*35238bceSAndroid Build Coastguard Worker                if VSProjectGenerator.registryKeyAvailable(root, arch, name):
195*35238bceSAndroid Build Coastguard Worker                    return True
196*35238bceSAndroid Build Coastguard Worker            return False
197*35238bceSAndroid Build Coastguard Worker        else:
198*35238bceSAndroid Build Coastguard Worker            return False
199*35238bceSAndroid Build Coastguard Worker
200*35238bceSAndroid Build Coastguard Worker# Pre-defined generators
201*35238bceSAndroid Build Coastguard Worker
202*35238bceSAndroid Build Coastguard WorkerMAKEFILE_GENERATOR = UnixMakefileGenerator()
203*35238bceSAndroid Build Coastguard WorkerNMAKE_GENERATOR = NMakeGenerator()
204*35238bceSAndroid Build Coastguard WorkerNINJA_GENERATOR = NinjaGenerator()
205*35238bceSAndroid Build Coastguard WorkerVS2010_X32_GENERATOR = VSProjectGenerator(10, VSProjectGenerator.ARCH_32BIT)
206*35238bceSAndroid Build Coastguard WorkerVS2010_X64_GENERATOR = VSProjectGenerator(10, VSProjectGenerator.ARCH_64BIT)
207*35238bceSAndroid Build Coastguard WorkerVS2012_X32_GENERATOR = VSProjectGenerator(11, VSProjectGenerator.ARCH_32BIT)
208*35238bceSAndroid Build Coastguard WorkerVS2012_X64_GENERATOR = VSProjectGenerator(11, VSProjectGenerator.ARCH_64BIT)
209*35238bceSAndroid Build Coastguard WorkerVS2013_X32_GENERATOR = VSProjectGenerator(12, VSProjectGenerator.ARCH_32BIT)
210*35238bceSAndroid Build Coastguard WorkerVS2013_X64_GENERATOR = VSProjectGenerator(12, VSProjectGenerator.ARCH_64BIT)
211*35238bceSAndroid Build Coastguard WorkerVS2015_X32_GENERATOR = VSProjectGenerator(14, VSProjectGenerator.ARCH_32BIT)
212*35238bceSAndroid Build Coastguard WorkerVS2015_X64_GENERATOR = VSProjectGenerator(14, VSProjectGenerator.ARCH_64BIT)
213*35238bceSAndroid Build Coastguard WorkerVS2017_X32_GENERATOR = VSProjectGenerator(15, VSProjectGenerator.ARCH_32BIT)
214*35238bceSAndroid Build Coastguard WorkerVS2017_X64_GENERATOR = VSProjectGenerator(15, VSProjectGenerator.ARCH_64BIT)
215*35238bceSAndroid Build Coastguard WorkerVS2019_X32_GENERATOR = VSProjectGenerator(16, VSProjectGenerator.ARCH_32BIT)
216*35238bceSAndroid Build Coastguard WorkerVS2019_X64_GENERATOR = VSProjectGenerator(16, VSProjectGenerator.ARCH_64BIT)
217*35238bceSAndroid Build Coastguard WorkerVS2022_X32_GENERATOR = VSProjectGenerator(17, VSProjectGenerator.ARCH_32BIT)
218*35238bceSAndroid Build Coastguard WorkerVS2022_X64_GENERATOR = VSProjectGenerator(17, VSProjectGenerator.ARCH_64BIT)
219*35238bceSAndroid Build Coastguard Worker
220*35238bceSAndroid Build Coastguard Workerdef selectFirstAvailableGenerator (generators):
221*35238bceSAndroid Build Coastguard Worker    for generator in generators:
222*35238bceSAndroid Build Coastguard Worker        if generator.isAvailable():
223*35238bceSAndroid Build Coastguard Worker            return generator
224*35238bceSAndroid Build Coastguard Worker    return None
225*35238bceSAndroid Build Coastguard Worker
226*35238bceSAndroid Build Coastguard WorkerANY_VS_X32_GENERATOR = selectFirstAvailableGenerator([
227*35238bceSAndroid Build Coastguard Worker                                VS2022_X32_GENERATOR,
228*35238bceSAndroid Build Coastguard Worker                                VS2019_X32_GENERATOR,
229*35238bceSAndroid Build Coastguard Worker                                VS2017_X32_GENERATOR,
230*35238bceSAndroid Build Coastguard Worker                                VS2015_X32_GENERATOR,
231*35238bceSAndroid Build Coastguard Worker                                VS2013_X32_GENERATOR,
232*35238bceSAndroid Build Coastguard Worker                                VS2012_X32_GENERATOR,
233*35238bceSAndroid Build Coastguard Worker                                VS2010_X32_GENERATOR,
234*35238bceSAndroid Build Coastguard Worker                            ])
235*35238bceSAndroid Build Coastguard WorkerANY_VS_X64_GENERATOR = selectFirstAvailableGenerator([
236*35238bceSAndroid Build Coastguard Worker                                VS2022_X64_GENERATOR,
237*35238bceSAndroid Build Coastguard Worker                                VS2019_X64_GENERATOR,
238*35238bceSAndroid Build Coastguard Worker                                VS2017_X64_GENERATOR,
239*35238bceSAndroid Build Coastguard Worker                                VS2015_X64_GENERATOR,
240*35238bceSAndroid Build Coastguard Worker                                VS2013_X64_GENERATOR,
241*35238bceSAndroid Build Coastguard Worker                                VS2012_X64_GENERATOR,
242*35238bceSAndroid Build Coastguard Worker                                VS2010_X64_GENERATOR,
243*35238bceSAndroid Build Coastguard Worker                            ])
244*35238bceSAndroid Build Coastguard WorkerANY_UNIX_GENERATOR = selectFirstAvailableGenerator([
245*35238bceSAndroid Build Coastguard Worker                                NINJA_GENERATOR,
246*35238bceSAndroid Build Coastguard Worker                                MAKEFILE_GENERATOR,
247*35238bceSAndroid Build Coastguard Worker                                NMAKE_GENERATOR,
248*35238bceSAndroid Build Coastguard Worker                            ])
249*35238bceSAndroid Build Coastguard WorkerANY_GENERATOR = selectFirstAvailableGenerator([
250*35238bceSAndroid Build Coastguard Worker                                VS2022_X64_GENERATOR,
251*35238bceSAndroid Build Coastguard Worker                                VS2022_X32_GENERATOR,
252*35238bceSAndroid Build Coastguard Worker                                VS2019_X64_GENERATOR,
253*35238bceSAndroid Build Coastguard Worker                                VS2019_X32_GENERATOR,
254*35238bceSAndroid Build Coastguard Worker                                VS2017_X64_GENERATOR,
255*35238bceSAndroid Build Coastguard Worker                                VS2017_X32_GENERATOR,
256*35238bceSAndroid Build Coastguard Worker                                VS2015_X64_GENERATOR,
257*35238bceSAndroid Build Coastguard Worker                                VS2015_X32_GENERATOR,
258*35238bceSAndroid Build Coastguard Worker                                VS2013_X64_GENERATOR,
259*35238bceSAndroid Build Coastguard Worker                                VS2012_X64_GENERATOR,
260*35238bceSAndroid Build Coastguard Worker                                VS2010_X64_GENERATOR,
261*35238bceSAndroid Build Coastguard Worker                                VS2013_X32_GENERATOR,
262*35238bceSAndroid Build Coastguard Worker                                VS2012_X32_GENERATOR,
263*35238bceSAndroid Build Coastguard Worker                                VS2010_X32_GENERATOR,
264*35238bceSAndroid Build Coastguard Worker                                NINJA_GENERATOR,
265*35238bceSAndroid Build Coastguard Worker                                MAKEFILE_GENERATOR,
266*35238bceSAndroid Build Coastguard Worker                                NMAKE_GENERATOR,
267*35238bceSAndroid Build Coastguard Worker                            ])
268