From 5601a57afc1742e007bfa6150ef04903163d4f64 Mon Sep 17 00:00:00 2001 From: Roman Lacko Date: Thu, 25 Apr 2013 12:49:09 +0200 Subject: Introduce option --msvc-version to specify version of MSVC compiler. Use that optition to get MSVC environment variables. --- utils.py | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 64 insertions(+), 5 deletions(-) (limited to 'utils.py') diff --git a/utils.py b/utils.py index 66f1eb457..669314add 100644 --- a/utils.py +++ b/utils.py @@ -6,17 +6,17 @@ import time import shutil import subprocess import fnmatch +import itertools +import popenasync + +from distutils.spawn import spawn +from distutils.spawn import DistutilsExecError try: WindowsError except NameError: WindowsError = None -from distutils.spawn import spawn -from distutils.spawn import DistutilsExecError - -import popenasync - def has_option(name): try: @@ -53,6 +53,12 @@ def filter_match(name, patterns): return False +def find_vcvarsall(version): + from distutils import msvc9compiler + vcvarsall_path = msvc9compiler.find_vcvarsall(version) + return vcvarsall_path + + def copyfile(src, dst, logger=None, force=True, vars=None, subst_content=False): if vars is not None: src = src.format(**vars) @@ -217,3 +223,56 @@ def run_process(args, logger=None): proc.wait() return proc.returncode + + +def get_environment_from_batch_command(env_cmd, initial=None): + """ + Take a command (either a single command or list of arguments) + and return the environment created after running that command. + Note that if the command must be a batch file or .cmd file, or the + changes to the environment will not be captured. + + If initial is supplied, it is used as the initial environment passed + to the child process. + """ + + def validate_pair(ob): + try: + if not (len(ob) == 2): + print("Unexpected result: %s" % ob) + raise ValueError + except: + return False + return True + + def consume(iter): + try: + while True: next(iter) + except StopIteration: + pass + + if not isinstance(env_cmd, (list, tuple)): + env_cmd = [env_cmd] + # construct the command that will alter the environment + env_cmd = subprocess.list2cmdline(env_cmd) + # create a tag so we can tell in the output when the proc is done + tag = 'Done running command' + # construct a cmd.exe command to do accomplish this + cmd = 'cmd.exe /s /c "{env_cmd} && echo "{tag}" && set"'.format(**vars()) + # launch the process + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, env=initial) + # parse the output sent to stdout + lines = proc.stdout + # consume whatever output occurs until the tag is reached + consume(itertools.takewhile(lambda l: tag not in l, lines)) + # define a way to handle each KEY=VALUE line + handle_line = lambda l: l.rstrip().split('=',1) + # parse key/values into pairs + pairs = map(handle_line, lines) + # make sure the pairs are valid + valid_pairs = filter(validate_pair, pairs) + # construct a dictionary of the pairs + result = dict(valid_pairs) + # let the process finish + proc.communicate() + return result -- cgit v1.2.3