diff --git a/appveyor-test.py b/appveyor-test.py index 6b84316..4b9c0d4 100644 --- a/appveyor-test.py +++ b/appveyor-test.py @@ -234,10 +234,21 @@ class TestDefaultModuleURLs(unittest.TestCase): self.assertEqual(repo_access(mod), 0, 'Defaults for {0} do not point to a valid git repository at {1}' .format(mod, do.setup[mod + '_REPOURL'])) +class TestVCVars(unittest.TestCase): + def test_vcvars(self): + if os.environ['CC'] in ('mingw',): + raise unittest.SkipTest() + + do.with_vcvars('env') + if __name__ == "__main__": do.host_info() if 'SET' in os.environ and os.environ['SET'] == "test00": - unittest.main() + if sys.argv[1:]==['env']: + # testing with_vcvars + [print(K,'=',V) for K, V in os.environ.items()] + else: + unittest.main() else: do.actions['prepare']() do.actions['build']() diff --git a/appveyor/do.py b/appveyor/do.py index d633a4f..5ae0afc 100644 --- a/appveyor/do.py +++ b/appveyor/do.py @@ -347,19 +347,68 @@ def build(): print('{0}Building the module{1}'.format(ANSI_YELLOW, ANSI_RESET)) - def test(): print('Running the tests') +def with_vcvars(cmd): + '''re-exec main script with a (hopefully different) command + ''' + CC = os.environ['CC'] + + # cf. https://docs.microsoft.com/en-us/cpp/build/building-on-the-command-line + + info = { + 'python':sys.executable, + 'self':sys.argv[0], + 'cmd':cmd, + } + + info['arch'] = { + 'x86':'x86', # 'amd64_x86' ?? + 'x64':'amd64', + }[os.environ['PLATFORM']] # 'x86' or 'x64' + + info['vcvars'] = { + # https://en.wikipedia.org/wiki/Microsoft_Visual_Studio#History + 'vs2019':r'C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat', + 'vs2017':r'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat', + 'vs2015':r'C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat', + 'vs2013':r'C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat', + 'vs2012':r'C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat', + 'vs2010':r'C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat', + 'vs2008':r'C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat', + }[CC] + + script=''' +call "{vcvars}" {arch} + +"{python}" "{self}" {cmd} +'''.format(**info) + + print('vcvars-trampoline.bat') + print(script) + + with open('vcvars-trampoline.bat', 'w') as F: + F.write(script) + + sys.stdout.flush() + sp.check_call('vcvars-trampoline.bat', shell=True) + actions = { 'prepare': prepare, 'build': build, 'test': test, + '_vcvars':lambda:None, } if __name__=='__main__': args = sys.argv[1:] - while len(args)>0: - name = args.pop(0) - print('IN', name, 'with', args) - actions[name]() + if args[0]!='_vcvars' and os.environ['CC']!='mingw': + # re-exec with MSVC in PATH + with_vcvars(' '.join(['_vcvars']+args)) + + else: + while len(args)>0: + name = args.pop(0) + print('IN', name, 'with', args) + actions[name]()