pandemonium_engine/SCSCons/Tool/MSCommon/vcTests.py

209 lines
7.6 KiB
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.
#
# from typing import Dict, Any
__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
import os
import os.path
import unittest
import SCons.Node.FS
import SCons.Warnings
import SCons.Tool.MSCommon.vc
import TestCmd
original = os.getcwd()
test = TestCmd.TestCmd(workdir='')
os.chdir(test.workpath(''))
MSVCUnsupportedHostArch = SCons.Tool.MSCommon.vc.MSVCUnsupportedHostArch
MSVCUnsupportedTargetArch = SCons.Tool.MSCommon.vc.MSVCUnsupportedTargetArch
MS_TOOLS_VERSION='1.1.1'
class VswhereTestCase(unittest.TestCase):
@staticmethod
def _createVSWhere(path):
os.makedirs(os.path.dirname(path), exist_ok=True)
with open(path, 'w') as f:
f.write("Created:%s"%f)
def testDefaults(self):
"""
Verify that msvc_find_vswhere() find's files in the specified paths
"""
# import pdb; pdb.set_trace()
vswhere_dirs = [os.path.splitdrive(p)[1] for p in SCons.Tool.MSCommon.vc.VSWHERE_PATHS]
base_dir = test.workpath('fake_vswhere')
test_vswhere_dirs = [os.path.join(base_dir,d[1:]) for d in vswhere_dirs]
SCons.Tool.MSCommon.vc.VSWHERE_PATHS = test_vswhere_dirs
for vsw in test_vswhere_dirs:
VswhereTestCase._createVSWhere(vsw)
find_path = SCons.Tool.MSCommon.vc.msvc_find_vswhere()
self.assertTrue(vsw == find_path, "Didn't find vswhere in %s found in %s"%(vsw, find_path))
os.remove(vsw)
# def specifiedVswherePathTest(self):
# "Verify that msvc.generate() respects VSWHERE Specified"
class MSVcTestCase(unittest.TestCase):
@staticmethod
def _createDummyCl(path, add_bin=True):
"""
Creates a dummy cl.exe in the correct directory.
It will create all missing parent directories as well
Args:
path: Relative path to cl.exe for the version about to be tested.
"""
# print("PATH:%s"%path)
path = path.replace('\\', os.sep)
if add_bin:
create_path = os.path.join(path,'bin')
else:
create_path = path
if create_path and not os.path.isdir(create_path):
os.makedirs(create_path)
create_this = os.path.join(create_path,'cl.exe')
# print("Creating: %s"%create_this)
with open(create_this,'w') as ct:
ct.write('created')
def runTest(self):
"""
Check that all proper HOST_PLATFORM and TARGET_PLATFORM are handled.
Verify that improper HOST_PLATFORM and/or TARGET_PLATFORM are properly handled.
by SCons.Tool.MSCommon.vc._check_cl_exists_in_vc_dir()
"""
check = SCons.Tool.MSCommon.vc._check_cl_exists_in_vc_dir
env={'TARGET_ARCH':'x86'}
p = SCons.Tool.MSCommon.vc._HOST_TARGET_TO_CL_DIR[('x86','x86')]
MSVcTestCase._createDummyCl(p)
# print("retval:%s"%check(env, '.', '8.0'))
# Setup for VC 14+ tests
# Create the VC minor/major version file
tools_version_file = SCons.Tool.MSCommon.vc._VC_TOOLS_VERSION_FILE
tools_dir = os.path.dirname(tools_version_file)
if not os.path.isdir(tools_dir):
os.makedirs(tools_dir)
try:
with open(tools_version_file, 'w') as tf:
tf.write(MS_TOOLS_VERSION)
except IOError as e:
print("Failed trying to write :%s :%s"%(tools_version_file, e))
# Now walk all the valid combinations of host/target for VC 14 +
vc_gt_14_map = SCons.Tool.MSCommon.vc._HOST_TARGET_TO_CL_DIR_GREATER_THAN_14
for key, value in vc_gt_14_map.items():
# print("GT 14 Got: %s -> %s"%(key,value))
env={'TARGET_ARCH':key[1], 'HOST_ARCH':key[0]}
path = os.path.join('.','Tools','MSVC', MS_TOOLS_VERSION, 'bin', value[0], value[1])
MSVcTestCase._createDummyCl(path, add_bin=False)
result=check(env, '.', '14.1')
# print("for:%s got :%s"%(key[1], result))
self.assertTrue(result, "Checking host: %s target: %s"%(value[0], value[1]))
# Now test bogus value for HOST_ARCH
env={'TARGET_ARCH':'x86', 'HOST_ARCH':'GARBAGE'}
try:
result=check(env, '.', '14.1')
# print("for:%s got :%s"%(env, result))
self.assertFalse(result, "Did not fail with bogus HOST_ARCH host: %s target: %s"%(value[0], value[1]))
except MSVCUnsupportedHostArch:
pass
else:
self.fail('Did not fail when HOST_ARCH specified as: %s'%env['HOST_ARCH'])
# Now test bogus value for TARGET_ARCH
env={'TARGET_ARCH':'GARBAGE', 'HOST_ARCH':'x86'}
try:
result=check(env, '.', '14.1')
# print("for:%s got :%s"%(env, result))
self.assertFalse(result, "Did not fail with bogus TARGET_ARCH host: %s target: %s"%(value[0], value[1]))
except MSVCUnsupportedTargetArch:
pass
else:
self.fail('Did not fail when HOST_ARCH specified as: %s'%env['TARGET_ARCH'])
# Test >8 < 14 VC versions
vc_map = SCons.Tool.MSCommon.vc._HOST_TARGET_TO_CL_DIR
for key,value in vc_map.items():
# print("LT 14 Got: %s -> %s"%(key,value))
env={'TARGET_ARCH':key[1], 'HOST_ARCH':key[0]}
path = os.path.join('.', 'bin', value )
MSVcTestCase._createDummyCl(path, add_bin=False)
result=check(env, '.', '9.0')
# print("for:%s got :%s"%(key[1], result))
self.assertTrue(result, "Checking host: %s target: %s"%(key[0], key[1]))
# Now test bogus value for HOST_ARCH
env={'TARGET_ARCH':'x86', 'HOST_ARCH':'GARBAGE'}
try:
result=check(env, '.', '9.0')
# print("for:%s got :%s"%(env, result))
self.assertFalse(result, "Did not fail with bogus HOST_ARCH host: %s target: %s"%(env['HOST_ARCH'], env['TARGET_ARCH']))
except MSVCUnsupportedHostArch:
pass
else:
self.fail('Did not fail when HOST_ARCH specified as: %s'%env['HOST_ARCH'])
# Now test bogus value for TARGET_ARCH
env={'TARGET_ARCH':'GARBAGE', 'HOST_ARCH':'x86'}
try:
result=check(env, '.', '9.0')
# print("for:%s got :%s"%(env, result))
self.assertFalse(result, "Did not fail with bogus TARGET_ARCH host: %s target: %s"%(env['HOST_ARCH'], env['TARGET_ARCH']))
except MSVCUnsupportedTargetArch:
pass
else:
self.fail('Did not fail when HOST_ARCH specified as: %s'%env['TARGET_ARCH'])
if __name__ == "__main__":
unittest.main()