summaryrefslogtreecommitdiffstats
path: root/src/engine
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2006-02-12 15:34:44 (GMT)
committerSteven Knight <knight@baldmt.com>2006-02-12 15:34:44 (GMT)
commite12ccf2b9d0e046ff6c4d433d1d093e945e71d33 (patch)
tree5ffda5496ca57b65815f1f1574af5759be5d677e /src/engine
parentfaaf9c51fae2ef1dc6c67c3bc4c263b63dbc8987 (diff)
downloadSCons-e12ccf2b9d0e046ff6c4d433d1d093e945e71d33.zip
SCons-e12ccf2b9d0e046ff6c4d433d1d093e945e71d33.tar.gz
SCons-e12ccf2b9d0e046ff6c4d433d1d093e945e71d33.tar.bz2
Fix over-zealous common prefix matching when generating Visual Studio project files. (David J. Van Maren) Avoid overwriting available MSVS versions that are already set. (Thad Ward) Add a runfile parameter to Project creation. (Matthias)
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/SCons/Tool/msvs.py82
-rw-r--r--src/engine/SCons/Tool/msvs.xml18
2 files changed, 73 insertions, 27 deletions
diff --git a/src/engine/SCons/Tool/msvs.py b/src/engine/SCons/Tool/msvs.py
index 6747d54..074733a 100644
--- a/src/engine/SCons/Tool/msvs.py
+++ b/src/engine/SCons/Tool/msvs.py
@@ -72,6 +72,8 @@ def xmlify(s):
s = string.replace(s, '"', "&quot;")
return s
+external_makefile_guid = '{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}'
+
def _generateGUID(slnfile, name):
"""This generates a dummy GUID for the sln file to use. It is
based on the MD5 signatures of the sln filename plus the name of
@@ -228,6 +230,28 @@ class _DSPGenerator:
for v in variants:
outdir.append(s)
+ if not env.has_key('runfile') or env['runfile'] == None:
+ runfile = buildtarget[-1:]
+ elif SCons.Util.is_String(env['runfile']):
+ runfile = [env['runfile']]
+ elif SCons.Util.is_List(env['runfile']):
+ if len(env['runfile']) != len(variants):
+ raise SCons.Errors.InternalError, \
+ "Sizes of 'runfile' and 'variant' lists must be the same."
+ runfile = []
+ for s in env['runfile']:
+ if SCons.Util.is_String(s):
+ runfile.append(s)
+ else:
+ runfile.append(s.get_abspath())
+ else:
+ runfile = [env['runfile'].get_abspath()]
+ if len(runfile) == 1:
+ s = runfile[0]
+ runfile = []
+ for v in variants:
+ runfile.append(s)
+
self.sconscript = env['MSVSSCONSCRIPT']
cmdargs = env.get('cmdargs', '')
@@ -238,6 +262,7 @@ class _DSPGenerator:
self.name = self.env['name']
else:
self.name = os.path.basename(SCons.Util.splitext(self.dspfile)[0])
+ self.name = self.env.subst(self.name)
sourcenames = [
'Source Files',
@@ -272,11 +297,12 @@ class _DSPGenerator:
for n in sourcenames:
self.sources[n].sort(lambda a, b: cmp(a.lower(), b.lower()))
- def AddConfig(variant, buildtarget, outdir, cmdargs):
+ def AddConfig(variant, buildtarget, outdir, runfile, cmdargs):
config = Config()
config.buildtarget = buildtarget
config.outdir = outdir
config.cmdargs = cmdargs
+ config.runfile = runfile
match = re.match('(.*)\|(.*)', variant)
if match:
@@ -290,7 +316,7 @@ class _DSPGenerator:
print "Adding '" + self.name + ' - ' + config.variant + '|' + config.platform + "' to '" + str(dspfile) + "'"
for i in range(len(variants)):
- AddConfig(variants[i], buildtarget[i], outdir[i],cmdargs)
+ AddConfig(variants[i], buildtarget[i], outdir[i], runfile[i], cmdargs)
self.platforms = []
for key in self.configs.keys():
@@ -521,7 +547,7 @@ V7DSPConfiguration = """\
\t\t\t\tBuildCommandLine="%(buildcmd)s"
\t\t\t\tCleanCommandLine="%(cleancmd)s"
\t\t\t\tRebuildCommandLine="%(rebuildcmd)s"
-\t\t\t\tOutput="%(buildtarget)s"/>
+\t\t\t\tOutput="%(runfile)s"/>
\t\t</Configuration>
"""
@@ -548,7 +574,7 @@ V8DSPConfiguration = """\
\t\t\t\tBuildCommandLine="%(buildcmd)s"
\t\t\t\tReBuildCommandLine="%(rebuildcmd)s"
\t\t\t\tCleanCommandLine="%(cleancmd)s"
-\t\t\t\tOutput="%(buildtarget)s"
+\t\t\t\tOutput="%(runfile)s"
\t\t\t\tPreprocessorDefinitions=""
\t\t\t\tIncludeSearchPath=""
\t\t\t\tForcedIncludes=""
@@ -624,6 +650,7 @@ class _GenerateV7DSP(_DSPGenerator):
platform = self.configs[kind].platform
outdir = self.configs[kind].outdir
buildtarget = self.configs[kind].buildtarget
+ runfile = self.configs[kind].runfile
cmdargs = self.configs[kind].cmdargs
env_has_buildtarget = self.env.has_key('MSVSBUILDTARGET')
@@ -682,7 +709,7 @@ class _GenerateV7DSP(_DSPGenerator):
'\t\t\tFilter="%s">\n' % (kind, categories[kind]))
- def printSources(hierarchy):
+ def printSources(hierarchy, commonprefix):
sorteditems = hierarchy.items()
sorteditems.sort(lambda a, b: cmp(a[0].lower(), b[0].lower()))
@@ -692,7 +719,7 @@ class _GenerateV7DSP(_DSPGenerator):
self.file.write('\t\t\t<Filter\n'
'\t\t\t\tName="%s"\n'
'\t\t\t\tFilter="">\n' % (key))
- printSources(value)
+ printSources(value, commonprefix)
self.file.write('\t\t\t</Filter>\n')
for key, value in sorteditems:
@@ -710,13 +737,14 @@ class _GenerateV7DSP(_DSPGenerator):
# First remove any common prefix
commonprefix = None
if len(sources) > 1:
- commonprefix = os.path.commonprefix(sources)
- prefixlen = len(commonprefix)
- if prefixlen:
- sources = map(lambda s, p=prefixlen: s[p:], sources)
+ s = map(os.path.normpath, sources)
+ cp = os.path.commonprefix(s)
+ if cp and s[0][len(cp)] == os.path.sep:
+ sources = map(lambda s, l=len(cp): s[l:], sources)
+ commonprefix = cp
hierarchy = makeHierarchy(sources)
- printSources(hierarchy)
+ printSources(hierarchy, commonprefix=commonprefix)
if len(cats)>1:
self.file.write('\t\t</Filter>\n')
@@ -810,6 +838,7 @@ class _DSWGenerator:
self.name = self.env['name']
else:
self.name = os.path.basename(SCons.Util.splitext(self.dswfile)[0])
+ self.name = self.env.subst(self.name)
def Build(self):
pass
@@ -913,9 +942,9 @@ class _GenerateV7DSW(_DSWGenerator):
base, suffix = SCons.Util.splitext(name)
if suffix == '.vcproj':
name = base
- # the next line has the GUID for an external makefile project.
- self.file.write('Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "%s", "%s", "%s"\n'
- % ( name, p, self.slnguid ) )
+ guid = _generateGUID(p, '')
+ self.file.write('Project("%s") = "%s", "%s", "%s"\n'
+ % ( external_makefile_guid, name, p, guid ) )
if self.version_num >= 7.1 and self.version_num < 8.0:
self.file.write('\tProjectSection(ProjectDependencies) = postProject\n'
'\tEndProjectSection\n')
@@ -1102,21 +1131,24 @@ def get_default_visualstudio_version(env):
version = '6.0'
versions = [version]
+
if not env.has_key('MSVS') or not SCons.Util.is_Dict(env['MSVS']):
- env['MSVS'] = {}
+ env['MSVS'] = {}
- if env.has_key('MSVS_VERSION'):
- version = env['MSVS_VERSION']
- versions = [version]
- else:
if SCons.Util.can_read_reg:
- versions = get_visualstudio_versions()
- if versions:
- version = versions[0] #use highest version by default
+ v = get_visualstudio_versions()
+ if v:
+ versions = v
+ if env.has_key('MSVS_VERSION'):
+ version = env['MSVS_VERSION']
+ else:
+ version = versions[0] #use highest version by default
- env['MSVS_VERSION'] = version
- env['MSVS']['VERSIONS'] = versions
- env['MSVS']['VERSION'] = version
+ env['MSVS_VERSION'] = version
+ env['MSVS']['VERSIONS'] = versions
+ env['MSVS']['VERSION'] = version
+ else:
+ version = env['MSVS']['VERSION']
return version
diff --git a/src/engine/SCons/Tool/msvs.xml b/src/engine/SCons/Tool/msvs.xml
index babc20f..56180b0 100644
--- a/src/engine/SCons/Tool/msvs.xml
+++ b/src/engine/SCons/Tool/msvs.xml
@@ -61,8 +61,11 @@ NOT as SCons File Nodes. This is because they represent file
names to be added to the project file, not the source files used to
build the project file.
-In addition to the above lists of values (which are all optional,
-although not specifying any of them results in an empty project file),
+The above filename lists are all optional,
+although at least one must be specified
+for the resulting project file to be non-empty.
+
+In addition to the above lists of values,
the following values may be specified:
<literal>target</literal>:
@@ -108,6 +111,17 @@ entries must match the number of
<literal>variant</literal>
entries.
+<literal>runfile</literal>:
+The name of the file that Visual Studio 7 and later
+will run and debug.
+This appears as the value of the
+<literal>Output</literal>
+field in the resutling Visual Studio project file.
+If this is not specified,
+the default is the same as the specified
+<literal>buildtarget</literal>
+value.
+
Example usage:
<example>