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