1 # -*- coding: utf-8 -*-
3 #-------------------------------------------------------------------------
4 # drawElements Quality Program utilities
5 # --------------------------------------
7 # Copyright 2015 The Android Open Source Project
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
13 # http://www.apache.org/licenses/LICENSE-2.0
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.
21 #-------------------------------------------------------------------------
26 import multiprocessing
28 from common import which, HostInfo, DEQP_DIR
36 def __init__ (self, buildDir, buildType, args, srcPath = DEQP_DIR):
37 self.srcPath = srcPath
38 self.buildDir = buildDir
39 self.buildType = buildType
40 self.args = copy.copy(args)
41 self.cmakePath = BuildConfig.findCMake()
43 def getSrcPath (self):
46 def getBuildDir (self):
49 def getBuildType (self):
55 def getCMakePath (self):
60 if which("cmake") == None:
62 "/Applications/CMake.app/Contents/bin/cmake"
64 for path in possiblePaths:
65 if os.path.exists(path):
68 # Fall back to PATH - may fail later
72 def __init__ (self, name, isMultiConfig = False, extraBuildArgs = []):
74 self.isMultiConfig = isMultiConfig
75 self.extraBuildArgs = copy.copy(extraBuildArgs)
80 def getGenerateArgs (self, buildType):
81 args = ['-G', self.name]
82 if not self.isMultiConfig:
83 args.append('-DCMAKE_BUILD_TYPE=%s' % buildType)
86 def getBuildArgs (self, buildType):
88 if self.isMultiConfig:
89 args += ['--config', buildType]
90 if len(self.extraBuildArgs) > 0:
91 args += ['--'] + self.extraBuildArgs
94 def getBinaryPath (self, buildType, basePath):
97 class UnixMakefileGenerator(CMakeGenerator):
99 CMakeGenerator.__init__(self, "Unix Makefiles", extraBuildArgs = ["-j%d" % multiprocessing.cpu_count()])
101 def isAvailable (self):
102 return which('make') != None
104 class NMakeGenerator(CMakeGenerator):
106 CMakeGenerator.__init__(self, "NMake Makefiles")
108 def isAvailable (self):
109 return which('nmake') != None
111 class NinjaGenerator(CMakeGenerator):
113 CMakeGenerator.__init__(self, "Ninja")
115 def isAvailable (self):
116 return which('ninja') != None
118 class VSProjectGenerator(CMakeGenerator):
122 def __init__(self, version, arch):
123 name = "Visual Studio %d" % version
124 if arch == self.ARCH_64BIT:
127 CMakeGenerator.__init__(self, name, isMultiConfig = True, extraBuildArgs = ['/m'])
128 self.version = version
131 def getBinaryPath (self, buildType, basePath):
132 return os.path.join(os.path.dirname(basePath), buildType, os.path.basename(basePath) + ".exe")
135 def getNativeArch ():
136 bits = HostInfo.getArchBits()
139 return VSProjectGenerator.ARCH_32BIT
141 return VSProjectGenerator.ARCH_64BIT
143 raise Exception("Unhandled bits '%s'" % bits)
146 def registryKeyAvailable (root, arch, name):
148 key = _winreg.OpenKey(root, name, 0, _winreg.KEY_READ | arch)
149 _winreg.CloseKey(key)
154 def isAvailable (self):
155 if sys.platform == 'win32' and _winreg != None:
156 nativeArch = VSProjectGenerator.getNativeArch()
157 if nativeArch == self.ARCH_32BIT and self.arch == self.ARCH_64BIT:
160 arch = _winreg.KEY_WOW64_32KEY if nativeArch == self.ARCH_64BIT else 0
162 10: [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.10.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\10.0")],
163 11: [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.11.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\11.0")],
164 12: [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.12.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\12.0")],
165 14: [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.14.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\14.0")],
166 15: [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.15.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\15.0")]
169 if not self.version in keyMap:
170 raise Exception("Unsupported VS version %d" % self.version)
172 keys = keyMap[self.version]
173 for root, name in keys:
174 if VSProjectGenerator.registryKeyAvailable(root, arch, name):
180 # Pre-defined generators
182 MAKEFILE_GENERATOR = UnixMakefileGenerator()
183 NMAKE_GENERATOR = NMakeGenerator()
184 NINJA_GENERATOR = NinjaGenerator()
185 VS2010_X32_GENERATOR = VSProjectGenerator(10, VSProjectGenerator.ARCH_32BIT)
186 VS2010_X64_GENERATOR = VSProjectGenerator(10, VSProjectGenerator.ARCH_64BIT)
187 VS2012_X32_GENERATOR = VSProjectGenerator(11, VSProjectGenerator.ARCH_32BIT)
188 VS2012_X64_GENERATOR = VSProjectGenerator(11, VSProjectGenerator.ARCH_64BIT)
189 VS2013_X32_GENERATOR = VSProjectGenerator(12, VSProjectGenerator.ARCH_32BIT)
190 VS2013_X64_GENERATOR = VSProjectGenerator(12, VSProjectGenerator.ARCH_64BIT)
191 VS2015_X32_GENERATOR = VSProjectGenerator(14, VSProjectGenerator.ARCH_32BIT)
192 VS2015_X64_GENERATOR = VSProjectGenerator(14, VSProjectGenerator.ARCH_64BIT)
193 VS2017_X32_GENERATOR = VSProjectGenerator(15, VSProjectGenerator.ARCH_32BIT)
194 VS2017_X64_GENERATOR = VSProjectGenerator(15, VSProjectGenerator.ARCH_64BIT)
196 def selectFirstAvailableGenerator (generators):
197 for generator in generators:
198 if generator.isAvailable():
202 ANY_VS_X32_GENERATOR = selectFirstAvailableGenerator([
203 VS2017_X32_GENERATOR,
204 VS2015_X32_GENERATOR,
205 VS2013_X32_GENERATOR,
206 VS2012_X32_GENERATOR,
207 VS2010_X32_GENERATOR,
209 ANY_VS_X64_GENERATOR = selectFirstAvailableGenerator([
210 VS2017_X64_GENERATOR,
211 VS2015_X64_GENERATOR,
212 VS2013_X64_GENERATOR,
213 VS2012_X64_GENERATOR,
214 VS2010_X64_GENERATOR,
216 ANY_UNIX_GENERATOR = selectFirstAvailableGenerator([
221 ANY_GENERATOR = selectFirstAvailableGenerator([
222 VS2017_X64_GENERATOR,
223 VS2017_X32_GENERATOR,
224 VS2015_X64_GENERATOR,
225 VS2015_X32_GENERATOR,
226 VS2013_X64_GENERATOR,
227 VS2012_X64_GENERATOR,
228 VS2010_X64_GENERATOR,
229 VS2013_X32_GENERATOR,
230 VS2012_X32_GENERATOR,
231 VS2010_X32_GENERATOR,