1 # -*- coding: utf-8 -*-
9 from common import which, DEQP_DIR
17 def __init__ (self, buildDir, buildType, args, srcPath = DEQP_DIR):
18 self.srcPath = srcPath
19 self.buildDir = buildDir
20 self.buildType = buildType
21 self.args = copy.copy(args)
23 def getSrcPath (self):
26 def getBuildDir (self):
29 def getBuildType (self):
36 def __init__ (self, name, isMultiConfig = False, extraBuildArgs = []):
38 self.isMultiConfig = isMultiConfig
39 self.extraBuildArgs = copy.copy(extraBuildArgs)
44 def getGenerateArgs (self, buildType):
45 args = ['-G', self.name]
46 if not self.isMultiConfig:
47 args.append('-DCMAKE_BUILD_TYPE=%s' % buildType)
50 def getBuildArgs (self, buildType):
52 if self.isMultiConfig:
53 args += ['--config', buildType]
54 if len(self.extraBuildArgs) > 0:
55 args += ['--'] + self.extraBuildArgs
58 def getBinaryPath (self, buildType, basePath):
61 class UnixMakefileGenerator(CMakeGenerator):
63 CMakeGenerator.__init__(self, "Unix Makefiles", extraBuildArgs = ["-j%d" % multiprocessing.cpu_count()])
65 def isAvailable (self):
66 return which('make') != None
68 class NinjaGenerator(CMakeGenerator):
70 CMakeGenerator.__init__(self, "Ninja")
72 def isAvailable (self):
73 return which('ninja') != None
75 class VSProjectGenerator(CMakeGenerator):
79 def __init__(self, version, arch):
80 name = "Visual Studio %d" % version
81 if arch == self.ARCH_64BIT:
84 CMakeGenerator.__init__(self, name, isMultiConfig = True, extraBuildArgs = ['/m'])
85 self.version = version
88 def getBinaryPath (self, buildType, basePath):
89 return os.path.join(os.path.dirname(basePath), buildType, os.path.basename(basePath) + ".exe")
93 arch = platform.machine().lower()
96 return VSProjectGenerator.ARCH_32BIT
98 return VSProjectGenerator.ARCH_64BIT
100 raise Exception("Unhandled arch '%s'" % arch)
103 def registryKeyAvailable (root, arch, name):
105 key = _winreg.OpenKey(root, name, 0, _winreg.KEY_READ | arch)
106 _winreg.CloseKey(key)
111 def isAvailable (self):
112 if sys.platform == 'win32' and _winreg != None:
113 nativeArch = VSProjectGenerator.getNativeArch()
114 if nativeArch == self.ARCH_32BIT and self.arch == self.ARCH_64BIT:
117 arch = _winreg.KEY_WOW64_32KEY if nativeArch == self.ARCH_64BIT else 0
119 10: [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.10.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\10.0")],
120 11: [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.11.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\11.0")],
121 12: [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.12.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\12.0")],
124 if not self.version in keyMap:
125 raise Exception("Unsupported VS version %d" % self.version)
127 keys = keyMap[self.version]
128 for root, name in keys:
129 if VSProjectGenerator.registryKeyAvailable(root, arch, name):
135 # Pre-defined generators
137 MAKEFILE_GENERATOR = UnixMakefileGenerator()
138 NINJA_GENERATOR = NinjaGenerator()
139 VS2010_X32_GENERATOR = VSProjectGenerator(10, VSProjectGenerator.ARCH_32BIT)
140 VS2010_X64_GENERATOR = VSProjectGenerator(10, VSProjectGenerator.ARCH_64BIT)
141 VS2012_X32_GENERATOR = VSProjectGenerator(11, VSProjectGenerator.ARCH_32BIT)
142 VS2012_X64_GENERATOR = VSProjectGenerator(11, VSProjectGenerator.ARCH_64BIT)
143 VS2013_X32_GENERATOR = VSProjectGenerator(12, VSProjectGenerator.ARCH_32BIT)
144 VS2013_X64_GENERATOR = VSProjectGenerator(12, VSProjectGenerator.ARCH_64BIT)
146 def selectFirstAvailableGenerator (generators):
147 for generator in generators:
148 if generator.isAvailable():
152 ANY_VS_X32_GENERATOR = selectFirstAvailableGenerator([
153 VS2013_X32_GENERATOR,
154 VS2012_X32_GENERATOR,
155 VS2010_X32_GENERATOR,
157 ANY_VS_X64_GENERATOR = selectFirstAvailableGenerator([
158 VS2013_X64_GENERATOR,
159 VS2012_X64_GENERATOR,
160 VS2010_X64_GENERATOR,
162 ANY_UNIX_GENERATOR = selectFirstAvailableGenerator([
166 ANY_GENERATOR = selectFirstAvailableGenerator([
167 VS2013_X64_GENERATOR,
168 VS2012_X64_GENERATOR,
169 VS2010_X64_GENERATOR,
170 VS2013_X32_GENERATOR,
171 VS2012_X32_GENERATOR,
172 VS2010_X32_GENERATOR,