blob: e4121aaa2ebf2e60dae2939f99c3beb20b8be698 [file] [log] [blame]
# -*- coding: utf-8 -*-
import os
import platform
try:
import _winreg
except:
_winreg = None
class BuildConfig:
def __init__ (self, buildDir, buildType, args):
self.buildDir = buildDir
self.buildType = buildType
self.args = args
def getBuildDir (self):
return self.buildDir
def getBuildType (self):
return self.buildType
def getArgs (self):
return self.args
class CMakeGenerator:
def __init__ (self, name, isMultiConfig = False):
self.name = name
self.isMultiConfig = isMultiConfig
def getName (self):
return self.name
def getGenerateArgs (self, buildType):
args = ['-G', self.name]
if not self.isMultiConfig:
args.append('-DCMAKE_BUILD_TYPE=%s' % buildType)
return args
def getBuildArgs (self, buildType):
args = []
if self.isMultiConfig:
args += ['--config', buildType]
return args
def getBinaryPath (self, buildType, basePath):
return basePath
class DefaultGenerator(CMakeGenerator):
def __init__(self):
CMakeGenerator.__init__("default")
def getGenerateArgs (self, buildType):
args = []
if not self.isMultiConfig:
args.append('-DCMAKE_BUILD_TYPE=%s' % buildType)
return args
class VSProjectGenerator(CMakeGenerator):
ARCH_32BIT = 0
ARCH_64BIT = 1
def __init__(self, version, arch):
name = "Visual Studio %d" % version
if arch == self.ARCH_64BIT:
name += " Win64"
CMakeGenerator.__init__(self, name, isMultiConfig = True)
self.version = version
self.arch = arch
def getBuildArgs (self, buildType):
return CMakeGenerator.getBuildArgs(self, buildType) + ['--', '/m']
def getBinaryPath (self, buildType, basePath):
return os.path.join(os.path.dirname(basePath), buildType, os.path.basename(basePath) + ".exe")
@staticmethod
def getNativeArch ():
arch = platform.machine().lower()
if arch == 'x86':
return VSProjectGenerator.ARCH_32BIT
elif arch == 'amd64':
return VSProjectGenerator.ARCH_64BIT
else:
raise Exception("Unhandled arch '%s'" % arch)
@staticmethod
def registryKeyAvailable (root, arch, name):
try:
key = _winreg.OpenKey(root, name, 0, _winreg.KEY_READ | arch)
_winreg.CloseKey(key)
return True
except:
return False
def isAvailable (self):
if _winreg != None:
nativeArch = VSProjectGenerator.getNativeArch()
if nativeArch == self.ARCH_32BIT and self.arch == self.ARCH_64BIT:
return False
arch = _winreg.KEY_WOW64_32KEY if nativeArch == self.ARCH_64BIT else 0
keyMap = {
10: [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.10.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\10.0")],
11: [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.11.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\11.0")],
12: [(_winreg.HKEY_CLASSES_ROOT, "VisualStudio.DTE.12.0"), (_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\VCExpress\\12.0")],
}
if not self.version in keyMap:
raise Exception("Unsupported VS version %d" % self.version)
keys = keyMap[self.version]
for root, name in keys:
if VSProjectGenerator.registryKeyAvailable(root, arch, name):
return True
return False
else:
return False
@staticmethod
def getDefault (arch):
for version in reversed(range(10, 13)):
gen = VSProjectGenerator(version, arch)
if gen.isAvailable():
return gen
return None
# Pre-defined generators
MAKEFILE_GENERATOR = CMakeGenerator("Unix Makefiles")
VS2010_X32_GENERATOR = VSProjectGenerator(10, VSProjectGenerator.ARCH_32BIT)
VS2010_X64_GENERATOR = VSProjectGenerator(10, VSProjectGenerator.ARCH_64BIT)
VS2013_X64_GENERATOR = VSProjectGenerator(12, VSProjectGenerator.ARCH_32BIT)
VS2013_X64_GENERATOR = VSProjectGenerator(12, VSProjectGenerator.ARCH_64BIT)
ANY_VS_X32_GENERATOR = VSProjectGenerator.getDefault(VSProjectGenerator.ARCH_32BIT)
ANY_VS_X64_GENERATOR = VSProjectGenerator.getDefault(VSProjectGenerator.ARCH_64BIT)