733a224b11a2755502624420d964da0fb2db1dd6
[platform/upstream/VK-GL-CTS.git] / scripts / build / config.py
1 # -*- coding: utf-8 -*-
2
3 import os
4 import sys
5 import copy
6 import platform
7 import multiprocessing
8
9 from common import which, DEQP_DIR
10
11 try:
12         import _winreg
13 except:
14         _winreg = None
15
16 class BuildConfig:
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)
22
23         def getSrcPath (self):
24                 return self.srcPath
25
26         def getBuildDir (self):
27                 return self.buildDir
28
29         def getBuildType (self):
30                 return self.buildType
31
32         def getArgs (self):
33                 return self.args
34
35 class CMakeGenerator:
36         def __init__ (self, name, isMultiConfig = False, extraBuildArgs = []):
37                 self.name                       = name
38                 self.isMultiConfig      = isMultiConfig
39                 self.extraBuildArgs     = copy.copy(extraBuildArgs)
40
41         def getName (self):
42                 return self.name
43
44         def getGenerateArgs (self, buildType):
45                 args = ['-G', self.name]
46                 if not self.isMultiConfig:
47                         args.append('-DCMAKE_BUILD_TYPE=%s' % buildType)
48                 return args
49
50         def getBuildArgs (self, buildType):
51                 args = []
52                 if self.isMultiConfig:
53                         args += ['--config', buildType]
54                 if len(self.extraBuildArgs) > 0:
55                         args += ['--'] + self.extraBuildArgs
56                 return args
57
58         def getBinaryPath (self, buildType, basePath):
59                 return basePath
60
61 class UnixMakefileGenerator(CMakeGenerator):
62         def __init__(self):
63                 CMakeGenerator.__init__(self, "Unix Makefiles", extraBuildArgs = ["-j%d" % multiprocessing.cpu_count()])
64
65         def isAvailable (self):
66                 return which('make') != None
67
68 class NinjaGenerator(CMakeGenerator):
69         def __init__(self):
70                 CMakeGenerator.__init__(self, "Ninja")
71
72         def isAvailable (self):
73                 return which('ninja') != None
74
75 class VSProjectGenerator(CMakeGenerator):
76         ARCH_32BIT      = 0
77         ARCH_64BIT      = 1
78
79         def __init__(self, version, arch):
80                 name = "Visual Studio %d" % version
81                 if arch == self.ARCH_64BIT:
82                         name += " Win64"
83
84                 CMakeGenerator.__init__(self, name, isMultiConfig = True, extraBuildArgs = ['/m'])
85                 self.version            = version
86                 self.arch                       = arch
87
88         def getBinaryPath (self, buildType, basePath):
89                 return os.path.join(os.path.dirname(basePath), buildType, os.path.basename(basePath) + ".exe")
90
91         @staticmethod
92         def getNativeArch ():
93                 arch = platform.machine().lower()
94
95                 if arch == 'x86':
96                         return VSProjectGenerator.ARCH_32BIT
97                 elif arch == 'amd64':
98                         return VSProjectGenerator.ARCH_64BIT
99                 else:
100                         raise Exception("Unhandled arch '%s'" % arch)
101
102         @staticmethod
103         def registryKeyAvailable (root, arch, name):
104                 try:
105                         key = _winreg.OpenKey(root, name, 0, _winreg.KEY_READ | arch)
106                         _winreg.CloseKey(key)
107                         return True
108                 except:
109                         return False
110
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:
115                                 return False
116
117                         arch = _winreg.KEY_WOW64_32KEY if nativeArch == self.ARCH_64BIT else 0
118                         keyMap = {
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")],
122                         }
123
124                         if not self.version in keyMap:
125                                 raise Exception("Unsupported VS version %d" % self.version)
126
127                         keys = keyMap[self.version]
128                         for root, name in keys:
129                                 if VSProjectGenerator.registryKeyAvailable(root, arch, name):
130                                         return True
131                         return False
132                 else:
133                         return False
134
135 # Pre-defined generators
136
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)
145
146 def selectFirstAvailableGenerator (generators):
147         for generator in generators:
148                 if generator.isAvailable():
149                         return generator
150         return None
151
152 ANY_VS_X32_GENERATOR    = selectFirstAvailableGenerator([
153                                                                 VS2013_X32_GENERATOR,
154                                                                 VS2012_X32_GENERATOR,
155                                                                 VS2010_X32_GENERATOR,
156                                                         ])
157 ANY_VS_X64_GENERATOR    = selectFirstAvailableGenerator([
158                                                                 VS2013_X64_GENERATOR,
159                                                                 VS2012_X64_GENERATOR,
160                                                                 VS2010_X64_GENERATOR,
161                                                         ])
162 ANY_UNIX_GENERATOR              = selectFirstAvailableGenerator([
163                                                                 NINJA_GENERATOR,
164                                                                 MAKEFILE_GENERATOR,
165                                                         ])
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,
173                                                                 NINJA_GENERATOR,
174                                                                 MAKEFILE_GENERATOR,
175                                                         ])