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 23import os 24import sys 25import copy 26import platform 27import multiprocessing 28 29from common import which, DEQP_DIR 30 31try: 32 import _winreg 33except: 34 _winreg = None 35 36class BuildConfig: 37 def __init__ (self, buildDir, buildType, args, srcPath = DEQP_DIR): 38 self.srcPath = srcPath 39 self.buildDir = buildDir 40 self.buildType = buildType 41 self.args = copy.copy(args) 42 43 def getSrcPath (self): 44 return self.srcPath 45 46 def getBuildDir (self): 47 return self.buildDir 48 49 def getBuildType (self): 50 return self.buildType 51 52 def getArgs (self): 53 return self.args 54 55class CMakeGenerator: 56 def __init__ (self, name, isMultiConfig = False, extraBuildArgs = []): 57 self.name = name 58 self.isMultiConfig = isMultiConfig 59 self.extraBuildArgs = copy.copy(extraBuildArgs) 60 61 def getName (self): 62 return self.name 63 64 def getGenerateArgs (self, buildType): 65 args = ['-G', self.name] 66 if not self.isMultiConfig: 67 args.append('-DCMAKE_BUILD_TYPE=%s' % buildType) 68 return args 69 70 def getBuildArgs (self, buildType): 71 args = [] 72 if self.isMultiConfig: 73 args += ['--config', buildType] 74 if len(self.extraBuildArgs) > 0: 75 args += ['--'] + self.extraBuildArgs 76 return args 77 78 def getBinaryPath (self, buildType, basePath): 79 return basePath 80 81class UnixMakefileGenerator(CMakeGenerator): 82 def __init__(self): 83 CMakeGenerator.__init__(self, "Unix Makefiles", extraBuildArgs = ["-j%d" % multiprocessing.cpu_count()]) 84 85 def isAvailable (self): 86 return which('make') != None 87 88class NMakeGenerator(CMakeGenerator): 89 def __init__(self): 90 CMakeGenerator.__init__(self, "NMake Makefiles") 91 92 def isAvailable (self): 93 return which('nmake.exe') != None 94 95class NinjaGenerator(CMakeGenerator): 96 def __init__(self): 97 CMakeGenerator.__init__(self, "Ninja") 98 99 def isAvailable (self): 100 return which('ninja') != None 101 102class VSProjectGenerator(CMakeGenerator): 103 ARCH_32BIT = 0 104 ARCH_64BIT = 1 105 106 def __init__(self, version, arch): 107 name = "Visual Studio %d" % version 108 if arch == self.ARCH_64BIT: 109 name += " Win64" 110 111 CMakeGenerator.__init__(self, name, isMultiConfig = True, extraBuildArgs = ['/m']) 112 self.version = version 113 self.arch = arch 114 115 def getBinaryPath (self, buildType, basePath): 116 return os.path.join(os.path.dirname(basePath), buildType, os.path.basename(basePath) + ".exe") 117 118 @staticmethod 119 def getNativeArch (): 120 arch = platform.machine().lower() 121 122 if arch == 'x86': 123 return VSProjectGenerator.ARCH_32BIT 124 elif arch == 'amd64': 125 return VSProjectGenerator.ARCH_64BIT 126 else: 127 raise Exception("Unhandled arch '%s'" % arch) 128 129 @staticmethod 130 def registryKeyAvailable (root, arch, name): 131 try: 132 key = _winreg.OpenKey(root, name, 0, _winreg.KEY_READ | arch) 133 _winreg.CloseKey(key) 134 return True 135 except: 136 return False 137 138 def isAvailable (self): 139 if sys.platform == 'win32' and _winreg != None: 140 nativeArch = VSProjectGenerator.getNativeArch() 141 if nativeArch == self.ARCH_32BIT and self.arch == self.ARCH_64BIT: 142 return False 143 144 arch = _winreg.KEY_WOW64_32KEY if nativeArch == self.ARCH_64BIT else 0 145 keyMap = { 146 10: [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.10.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\10.0")], 147 11: [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.11.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\11.0")], 148 12: [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.12.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\12.0")], 149 14: [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.14.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\14.0")], 150 } 151 152 if not self.version in keyMap: 153 raise Exception("Unsupported VS version %d" % self.version) 154 155 keys = keyMap[self.version] 156 for root, name in keys: 157 if VSProjectGenerator.registryKeyAvailable(root, arch, name): 158 return True 159 return False 160 else: 161 return False 162 163# Pre-defined generators 164 165MAKEFILE_GENERATOR = UnixMakefileGenerator() 166NMAKE_GENERATOR = NMakeGenerator() 167NINJA_GENERATOR = NinjaGenerator() 168VS2010_X32_GENERATOR = VSProjectGenerator(10, VSProjectGenerator.ARCH_32BIT) 169VS2010_X64_GENERATOR = VSProjectGenerator(10, VSProjectGenerator.ARCH_64BIT) 170VS2012_X32_GENERATOR = VSProjectGenerator(11, VSProjectGenerator.ARCH_32BIT) 171VS2012_X64_GENERATOR = VSProjectGenerator(11, VSProjectGenerator.ARCH_64BIT) 172VS2013_X32_GENERATOR = VSProjectGenerator(12, VSProjectGenerator.ARCH_32BIT) 173VS2013_X64_GENERATOR = VSProjectGenerator(12, VSProjectGenerator.ARCH_64BIT) 174VS2015_X32_GENERATOR = VSProjectGenerator(14, VSProjectGenerator.ARCH_32BIT) 175VS2015_X64_GENERATOR = VSProjectGenerator(14, VSProjectGenerator.ARCH_64BIT) 176 177def selectFirstAvailableGenerator (generators): 178 for generator in generators: 179 if generator.isAvailable(): 180 return generator 181 return None 182 183ANY_VS_X32_GENERATOR = selectFirstAvailableGenerator([ 184 VS2015_X32_GENERATOR, 185 VS2013_X32_GENERATOR, 186 VS2012_X32_GENERATOR, 187 VS2010_X32_GENERATOR, 188 ]) 189ANY_VS_X64_GENERATOR = selectFirstAvailableGenerator([ 190 VS2015_X64_GENERATOR, 191 VS2013_X64_GENERATOR, 192 VS2012_X64_GENERATOR, 193 VS2010_X64_GENERATOR, 194 ]) 195ANY_UNIX_GENERATOR = selectFirstAvailableGenerator([ 196 NINJA_GENERATOR, 197 MAKEFILE_GENERATOR, 198 NMAKE_GENERATOR, 199 ]) 200ANY_GENERATOR = selectFirstAvailableGenerator([ 201 VS2015_X64_GENERATOR, 202 VS2015_X32_GENERATOR, 203 VS2013_X64_GENERATOR, 204 VS2012_X64_GENERATOR, 205 VS2010_X64_GENERATOR, 206 VS2013_X32_GENERATOR, 207 VS2012_X32_GENERATOR, 208 VS2010_X32_GENERATOR, 209 NINJA_GENERATOR, 210 MAKEFILE_GENERATOR, 211 NMAKE_GENERATOR, 212 ]) 213