summaryrefslogtreecommitdiff
path: root/third_party/waf/waflib/extras/msvs.py
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/waf/waflib/extras/msvs.py')
-rw-r--r--third_party/waf/waflib/extras/msvs.py99
1 files changed, 59 insertions, 40 deletions
diff --git a/third_party/waf/waflib/extras/msvs.py b/third_party/waf/waflib/extras/msvs.py
index 5f76c269d1c..b12d9c068e5 100644
--- a/third_party/waf/waflib/extras/msvs.py
+++ b/third_party/waf/waflib/extras/msvs.py
@@ -1,5 +1,9 @@
#! /usr/bin/env python
# encoding: utf-8
+# WARNING! Do not edit! https://waf.io/book/index.html#_obtaining_the_waf_file
+
+#! /usr/bin/env python
+# encoding: utf-8
# Avalanche Studios 2009-2011
# Thomas Nagy 2011
@@ -41,34 +45,42 @@ It can be a good idea to add the sync_exec tool too.
To generate solution files:
$ waf configure msvs
-To customize the outputs, provide subclasses in your wscript files:
-
-from waflib.extras import msvs
-class vsnode_target(msvs.vsnode_target):
- def get_build_command(self, props):
- # likely to be required
- return "waf.bat build"
- def collect_source(self):
- # likely to be required
- ...
-class msvs_bar(msvs.msvs_generator):
- def init(self):
- msvs.msvs_generator.init(self)
- self.vsnode_target = vsnode_target
+To customize the outputs, provide subclasses in your wscript files::
+
+ from waflib.extras import msvs
+ class vsnode_target(msvs.vsnode_target):
+ def get_build_command(self, props):
+ # likely to be required
+ return "waf.bat build"
+ def collect_source(self):
+ # likely to be required
+ ...
+ class msvs_bar(msvs.msvs_generator):
+ def init(self):
+ msvs.msvs_generator.init(self)
+ self.vsnode_target = vsnode_target
The msvs class re-uses the same build() function for reading the targets (task generators),
-you may therefore specify msvs settings on the context object:
+you may therefore specify msvs settings on the context object::
-def build(bld):
- bld.solution_name = 'foo.sln'
- bld.waf_command = 'waf.bat'
- bld.projects_dir = bld.srcnode.make_node('.depproj')
- bld.projects_dir.mkdir()
+ def build(bld):
+ bld.solution_name = 'foo.sln'
+ bld.waf_command = 'waf.bat'
+ bld.projects_dir = bld.srcnode.make_node('.depproj')
+ bld.projects_dir.mkdir()
For visual studio 2008, the command is called 'msvs2008', and the classes
such as vsnode_target are wrapped by a decorator class 'wrap_2008' to
provide special functionality.
+To customize platform toolsets, pass additional parameters, for example::
+
+ class msvs_2013(msvs.msvs_generator):
+ cmd = 'msvs2013'
+ numver = '13.00'
+ vsver = '2013'
+ platform_toolset_ver = 'v120'
+
ASSUMPTIONS:
* a project can be either a directory or a target, vcxproj files are written only for targets that have source files
* each project is a vcxproj file, therefore the project uuid needs only to be a hash of the absolute path
@@ -105,7 +117,7 @@ PROJECT_TEMPLATE = r'''<?xml version="1.0" encoding="UTF-8"?>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='${b.configuration}|${b.platform}'" Label="Configuration">
<ConfigurationType>Makefile</ConfigurationType>
<OutDir>${b.outdir}</OutDir>
- <PlatformToolset>v110</PlatformToolset>
+ <PlatformToolset>${project.platform_toolset_ver}</PlatformToolset>
</PropertyGroup>
${endfor}
@@ -293,7 +305,8 @@ def compile_template(line):
extr = []
def repl(match):
g = match.group
- if g('dollar'): return "$"
+ if g('dollar'):
+ return "$"
elif g('backslash'):
return "\\"
elif g('subst'):
@@ -318,14 +331,14 @@ def compile_template(line):
app("lst.append(%r)" % params[x])
f = extr[x]
- if f.startswith('if') or f.startswith('for'):
+ if f.startswith(('if', 'for')):
app(f + ':')
indent += 1
elif f.startswith('py:'):
app(f[3:])
- elif f.startswith('endif') or f.startswith('endfor'):
+ elif f.startswith(('endif', 'endfor')):
indent -= 1
- elif f.startswith('else') or f.startswith('elif'):
+ elif f.startswith(('else', 'elif')):
indent -= 1
app(f + ':')
indent += 1
@@ -351,7 +364,7 @@ def rm_blank_lines(txt):
BOM = '\xef\xbb\xbf'
try:
- BOM = bytes(BOM, 'iso8859-1') # python 3
+ BOM = bytes(BOM, 'latin-1') # python 3
except TypeError:
pass
@@ -364,7 +377,7 @@ def stealth_write(self, data, flags='wb'):
data = data.decode(sys.getfilesystemencoding(), 'replace')
data = data.encode('utf-8')
- if self.name.endswith('.vcproj') or self.name.endswith('.vcxproj'):
+ if self.name.endswith(('.vcproj', '.vcxproj')):
data = BOM + data
try:
@@ -374,7 +387,7 @@ def stealth_write(self, data, flags='wb'):
except (IOError, ValueError):
self.write(data, flags=flags)
else:
- Logs.debug('msvs: skipping %s' % self.win32path())
+ Logs.debug('msvs: skipping %s', self.win32path())
Node.Node.stealth_write = stealth_write
re_win32 = re.compile(r'^([/\\]cygdrive)?[/\\]([a-z])([^a-z0-9_-].*)', re.I)
@@ -509,6 +522,7 @@ class vsnode_project(vsnode):
self.path = node
self.uuid = make_uuid(node.win32path())
self.name = node.name
+ self.platform_toolset_ver = getattr(ctx, 'platform_toolset_ver', None)
self.title = self.path.win32path()
self.source = [] # list of node objects
self.build_properties = [] # list of properties (nmake commands, output dir, etc)
@@ -528,7 +542,7 @@ class vsnode_project(vsnode):
return lst
def write(self):
- Logs.debug('msvs: creating %r' % self.path)
+ Logs.debug('msvs: creating %r', self.path)
# first write the project file
template1 = compile_template(PROJECT_TEMPLATE)
@@ -548,7 +562,7 @@ class vsnode_project(vsnode):
required for writing the source files
"""
name = node.name
- if name.endswith('.cpp') or name.endswith('.c'):
+ if name.endswith(('.cpp', '.c')):
return 'ClCompile'
return 'ClInclude'
@@ -628,10 +642,10 @@ class vsnode_project_view(vsnode_alias):
vsnode_alias.__init__(self, ctx, node, name)
self.tg = self.ctx() # fake one, cannot remove
self.exclude_files = Node.exclude_regs + '''
-waf-1.8.*
-waf3-1.8.*/**
-.waf-1.8.*
-.waf3-1.8.*/**
+waf-2*
+waf3-2*/**
+.waf-2*
+.waf3-2*/**
**/*.sdf
**/*.suo
**/*.ncb
@@ -715,6 +729,9 @@ class msvs_generator(BuildContext):
'''generates a visual studio 2010 solution'''
cmd = 'msvs'
fun = 'build'
+ numver = '11.00' # Visual Studio Version Number
+ vsver = '2010' # Visual Studio Version Year
+ platform_toolset_ver = 'v110' # Platform Toolset Version Number
def init(self):
"""
@@ -744,8 +761,9 @@ class msvs_generator(BuildContext):
if not getattr(self, 'vsnode_project_view', None):
self.vsnode_project_view = vsnode_project_view
- self.numver = '11.00'
- self.vsver = '2010'
+ self.numver = self.__class__.numver
+ self.vsver = self.__class__.vsver
+ self.platform_toolset_ver = self.__class__.platform_toolset_ver
def execute(self):
"""
@@ -789,7 +807,7 @@ class msvs_generator(BuildContext):
# and finally write the solution file
node = self.get_solution_node()
node.parent.mkdir()
- Logs.warn('Creating %r' % node)
+ Logs.warn('Creating %r', node)
template1 = compile_template(SOLUTION_TEMPLATE)
sln_str = template1(self)
sln_str = rm_blank_lines(sln_str)
@@ -968,7 +986,7 @@ def wrap_2008(cls):
return ''
def write(self):
- Logs.debug('msvs: creating %r' % self.path)
+ Logs.debug('msvs: creating %r', self.path)
template1 = compile_template(self.project_template)
proj_str = template1(self)
proj_str = rm_blank_lines(proj_str)
@@ -980,6 +998,8 @@ class msvs_2008_generator(msvs_generator):
'''generates a visual studio 2008 solution'''
cmd = 'msvs2008'
fun = msvs_generator.fun
+ numver = '10.00'
+ vsver = '2008'
def init(self):
if not getattr(self, 'project_extension', None):
@@ -997,8 +1017,6 @@ class msvs_2008_generator(msvs_generator):
self.vsnode_project_view = wrap_2008(vsnode_project_view)
msvs_generator.init(self)
- self.numver = '10.00'
- self.vsver = '2008'
def options(ctx):
"""
@@ -1031,3 +1049,4 @@ def options(ctx):
else:
old(ctx)
BuildContext.execute = override_build_state
+