summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussel Winder <russel@winder.org.uk>2017-07-27 10:57:24 +0100
committerRussel Winder <russel@winder.org.uk>2017-07-27 10:57:24 +0100
commit0483984bc700030993e9fd4d5b2c79d423496a96 (patch)
tree89fd550c2ed78cd7c594f048367f6b9c0491d5cb
parentfaf62f1cfa050dbbc256455a254d2225b1f4ad99 (diff)
parent73289b7368a875f2a007b79c7263009868020c49 (diff)
downloadscons-0483984bc700030993e9fd4d5b2c79d423496a96.tar.gz
Merge in from mainline.
-rw-r--r--src/CHANGES.txt4
-rw-r--r--src/engine/SCons/Tool/MSCommon/vc.py19
-rw-r--r--src/engine/SCons/Tool/msvc.xml25
-rw-r--r--test/MSVC/MSVC_UWP_APP.py103
4 files changed, 145 insertions, 6 deletions
diff --git a/src/CHANGES.txt b/src/CHANGES.txt
index 5be0399f..c585eaf5 100644
--- a/src/CHANGES.txt
+++ b/src/CHANGES.txt
@@ -11,6 +11,10 @@ NOTE: This is a major release. You should expect that some targets may rebuild
Significant changes in some python action signatures. Also switching between PY 2 and PY 3.5, 3.6
may cause rebuilds. In no case should rebuilds not happen.
+ From Ibrahim Esmat:
+ - Added the capability to build Windows Store Compatible libraries that can be used
+ with Universal Windows Platform (UWP) Apps and published to the store
+
From Richard West:
- Added nested / namespace tool support
- Added a small fix to the python3 tool loader when loading a tool as a package
diff --git a/src/engine/SCons/Tool/MSCommon/vc.py b/src/engine/SCons/Tool/MSCommon/vc.py
index 7b8dd9d1..41263147 100644
--- a/src/engine/SCons/Tool/MSCommon/vc.py
+++ b/src/engine/SCons/Tool/MSCommon/vc.py
@@ -185,18 +185,17 @@ _VCVER_TO_PRODUCT_DIR = {
}
def msvc_version_to_maj_min(msvc_version):
-
msvc_version_numeric = ''.join([x for x in msvc_version if x in string_digits + '.'])
t = msvc_version_numeric.split(".")
if not len(t) == 2:
- raise ValueError("Unrecognized version %s (%s)" % (msvc_version,msvc_version_numeric))
+ raise ValueError("Unrecognized version %s (%s)" % (msvc_version,msvc_version_numeric))
try:
- maj = int(t[0])
- min = int(t[1])
- return maj, min
+ maj = int(t[0])
+ min = int(t[1])
+ return maj, min
except ValueError as e:
- raise ValueError("Unrecognized version %s (%s)" % (msvc_version,msvc_version_numeric))
+ raise ValueError("Unrecognized version %s (%s)" % (msvc_version,msvc_version_numeric))
def is_host_target_supported(host_target, msvc_version):
"""Return True if the given (host, target) tuple is supported given the
@@ -435,6 +434,14 @@ def msvc_find_valid_batch_script(env,version):
(host_target, version)
SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg)
arg = _HOST_TARGET_ARCH_TO_BAT_ARCH[host_target]
+
+ # Get just version numbers
+ maj, min = msvc_version_to_maj_min(version)
+ # VS2015+
+ if maj >= 14:
+ if env.get('MSVC_UWP_APP') == '1':
+ # Initialize environment variables with store/universal paths
+ arg += ' store'
# Try to locate a batch file for this host/target platform combo
try:
diff --git a/src/engine/SCons/Tool/msvc.xml b/src/engine/SCons/Tool/msvc.xml
index 2b4619e4..1823a895 100644
--- a/src/engine/SCons/Tool/msvc.xml
+++ b/src/engine/SCons/Tool/msvc.xml
@@ -352,6 +352,8 @@ constructor; setting it later has no effect.
<para>
Valid values for Windows are
+<literal>14.0</literal>,
+<literal>14.0Exp</literal>,
<literal>12.0</literal>,
<literal>12.0Exp</literal>,
<literal>11.0</literal>,
@@ -440,4 +442,27 @@ For example, if you want to compile 64-bit binaries, you would set
</summary>
</cvar>
+<cvar name="MSVC_UWP_APP">
+<summary>
+<para>
+Build libraries for a Universal Windows Platform (UWP) Application.
+</para>
+
+<para>
+If &cv-MSVC_UWP_APP; is set, the Visual Studio environment will be set up to point
+to the Windows Store compatible libraries and Visual Studio runtimes. In doing so,
+any libraries that are built will be able to be used in a UWP App and published
+to the Windows Store.
+This flag will only have an effect with Visual Studio 2015+.
+This variable must be passed as an argument to the Environment()
+constructor; setting it later has no effect.
+</para>
+
+<para>
+Valid values are '1' or '0'
+</para>
+
+</summary>
+</cvar>
+
</sconsdoc>
diff --git a/test/MSVC/MSVC_UWP_APP.py b/test/MSVC/MSVC_UWP_APP.py
new file mode 100644
index 00000000..2521ad6f
--- /dev/null
+++ b/test/MSVC/MSVC_UWP_APP.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+"""
+Test the ability to configure the $MSVC_UWP_APP construction variable with
+the desired effect.
+"""
+
+import TestSCons
+
+def AreVCStoreLibPathsInLIBPATH(output):
+ lines = output.splitlines()
+ for line in lines:
+ if 'env[ENV][LIBPATH]=' in line:
+ idx_eq = line.find('=')
+ libpath = line[idx_eq + 1:]
+
+ if not libpath:
+ # Couldn't find the libpath in the output
+ return (False, False)
+
+ libpaths = libpath.lower().split(';')
+ (vclibstore_path_present, vclibstorerefs_path_present) = (False, False)
+ for path in libpaths:
+ # Look for the Store VC Lib paths in the LIBPATH:
+ # [VS install path]\VC\LIB\store[\arch] and
+ # [VS install path]\VC\LIB\store\references
+ # For example,
+ # C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\LIB\store\amd64
+ # C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\LIB\store\references
+ if r'vc\lib\store\references' in path:
+ vclibstorerefs_path_present = True
+ elif r'vc\lib\store' in path:
+ vclibstore_path_present = True
+
+ return (vclibstore_path_present, vclibstorerefs_path_present)
+
+_python_ = TestSCons._python_
+
+test = TestSCons.TestSCons()
+
+test.skip_if_not_msvc()
+
+test.write('SConstruct', """
+if ARGUMENTS.get('MSVC_UWP_APP'):
+ help_vars = Variables()
+ help_vars.Add(EnumVariable(
+ 'MSVC_UWP_APP',
+ 'Build for a Universal Windows Platform (UWP) Application',
+ '0',
+ allowed_values=('0', '1')))
+else:
+ help_vars = None
+env = Environment(tools=['default', 'msvc'], variables=help_vars)
+# Print the ENV LIBPATH to stdout
+print('env[ENV][LIBPATH]=%s' % env.get('ENV').get('LIBPATH'))
+""")
+
+# Test setting MSVC_UWP_APP is '1' (True)
+test.run(arguments = "MSVC_UWP_APP=1")
+(vclibstore_path_present, vclibstorerefs_path_present) = AreVCStoreLibPathsInLIBPATH(test.stdout())
+test.fail_test((vclibstore_path_present is False) or (vclibstorerefs_path_present is False))
+
+# Test setting MSVC_UWP_APP is '0' (False)
+test.run(arguments = "MSVC_UWP_APP=0")
+(vclibstore_path_present, vclibstorerefs_path_present) = AreVCStoreLibPathsInLIBPATH(test.stdout())
+test.fail_test((vclibstore_path_present is True) or (vclibstorerefs_path_present is True))
+
+# Test not setting MSVC_UWP_APP
+test.run(arguments = "")
+(vclibstore_path_present, vclibstorerefs_path_present) = AreVCStoreLibPathsInLIBPATH(test.stdout())
+test.fail_test((vclibstore_path_present is True) or (vclibstorerefs_path_present is True))
+
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4: