cad57a86d709217c133bbe9865c2b0454040f5a3
[platform/upstream/VK-GL-CTS.git] / scripts / build / config.py
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
23 import os
24 import sys
25 import copy
26 import platform
27 import multiprocessing
28
29 from common import which, DEQP_DIR
30
31 try:
32         import _winreg
33 except:
34         _winreg = None
35
36 class 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
55 class 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
81 class 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
88 class NinjaGenerator(CMakeGenerator):
89         def __init__(self):
90                 CMakeGenerator.__init__(self, "Ninja")
91
92         def isAvailable (self):
93                 return which('ninja') != None
94
95 class VSProjectGenerator(CMakeGenerator):
96         ARCH_32BIT      = 0
97         ARCH_64BIT      = 1
98
99         def __init__(self, version, arch):
100                 name = "Visual Studio %d" % version
101                 if arch == self.ARCH_64BIT:
102                         name += " Win64"
103
104                 CMakeGenerator.__init__(self, name, isMultiConfig = True, extraBuildArgs = ['/m'])
105                 self.version            = version
106                 self.arch                       = arch
107
108         def getBinaryPath (self, buildType, basePath):
109                 return os.path.join(os.path.dirname(basePath), buildType, os.path.basename(basePath) + ".exe")
110
111         @staticmethod
112         def getNativeArch ():
113                 arch = platform.machine().lower()
114
115                 if arch == 'x86':
116                         return VSProjectGenerator.ARCH_32BIT
117                 elif arch == 'amd64':
118                         return VSProjectGenerator.ARCH_64BIT
119                 else:
120                         raise Exception("Unhandled arch '%s'" % arch)
121
122         @staticmethod
123         def registryKeyAvailable (root, arch, name):
124                 try:
125                         key = _winreg.OpenKey(root, name, 0, _winreg.KEY_READ | arch)
126                         _winreg.CloseKey(key)
127                         return True
128                 except:
129                         return False
130
131         def isAvailable (self):
132                 if sys.platform == 'win32' and _winreg != None:
133                         nativeArch = VSProjectGenerator.getNativeArch()
134                         if nativeArch == self.ARCH_32BIT and self.arch == self.ARCH_64BIT:
135                                 return False
136
137                         arch = _winreg.KEY_WOW64_32KEY if nativeArch == self.ARCH_64BIT else 0
138                         keyMap = {
139                                 10:             [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.10.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\10.0")],
140                                 11:             [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.11.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\11.0")],
141                                 12:             [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.12.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\12.0")],
142                                 14:             [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.14.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\14.0")],
143                         }
144
145                         if not self.version in keyMap:
146                                 raise Exception("Unsupported VS version %d" % self.version)
147
148                         keys = keyMap[self.version]
149                         for root, name in keys:
150                                 if VSProjectGenerator.registryKeyAvailable(root, arch, name):
151                                         return True
152                         return False
153                 else:
154                         return False
155
156 # Pre-defined generators
157
158 MAKEFILE_GENERATOR              = UnixMakefileGenerator()
159 NINJA_GENERATOR                 = NinjaGenerator()
160 VS2010_X32_GENERATOR    = VSProjectGenerator(10, VSProjectGenerator.ARCH_32BIT)
161 VS2010_X64_GENERATOR    = VSProjectGenerator(10, VSProjectGenerator.ARCH_64BIT)
162 VS2012_X32_GENERATOR    = VSProjectGenerator(11, VSProjectGenerator.ARCH_32BIT)
163 VS2012_X64_GENERATOR    = VSProjectGenerator(11, VSProjectGenerator.ARCH_64BIT)
164 VS2013_X32_GENERATOR    = VSProjectGenerator(12, VSProjectGenerator.ARCH_32BIT)
165 VS2013_X64_GENERATOR    = VSProjectGenerator(12, VSProjectGenerator.ARCH_64BIT)
166 VS2015_X32_GENERATOR    = VSProjectGenerator(14, VSProjectGenerator.ARCH_32BIT)
167 VS2015_X64_GENERATOR    = VSProjectGenerator(14, VSProjectGenerator.ARCH_64BIT)
168
169 def selectFirstAvailableGenerator (generators):
170         for generator in generators:
171                 if generator.isAvailable():
172                         return generator
173         return None
174
175 ANY_VS_X32_GENERATOR    = selectFirstAvailableGenerator([
176                                                                 VS2015_X32_GENERATOR,
177                                                                 VS2013_X32_GENERATOR,
178                                                                 VS2012_X32_GENERATOR,
179                                                                 VS2010_X32_GENERATOR,
180                                                         ])
181 ANY_VS_X64_GENERATOR    = selectFirstAvailableGenerator([
182                                                                 VS2015_X64_GENERATOR,
183                                                                 VS2013_X64_GENERATOR,
184                                                                 VS2012_X64_GENERATOR,
185                                                                 VS2010_X64_GENERATOR,
186                                                         ])
187 ANY_UNIX_GENERATOR              = selectFirstAvailableGenerator([
188                                                                 NINJA_GENERATOR,
189                                                                 MAKEFILE_GENERATOR,
190                                                         ])
191 ANY_GENERATOR                   = selectFirstAvailableGenerator([
192                                                                 VS2015_X64_GENERATOR,
193                                                                 VS2015_X32_GENERATOR,
194                                                                 VS2013_X64_GENERATOR,
195                                                                 VS2012_X64_GENERATOR,
196                                                                 VS2010_X64_GENERATOR,
197                                                                 VS2013_X32_GENERATOR,
198                                                                 VS2012_X32_GENERATOR,
199                                                                 VS2010_X32_GENERATOR,
200                                                                 NINJA_GENERATOR,
201                                                                 MAKEFILE_GENERATOR,
202                                                         ])