def get_enriched_environment(configuration):
    """
    Return a dict containing an 'enriched' environment in which to run
    external commands under autobuild.

    configuration is the requested configuration (e.g. 'Release'), or None.
    This is used to provide abbreviations for certain variables set in
    AUTOBUILD_VARIABLES_FILE.

    os.environ['AUTOBUILD_VARIABLES_FILE'], if set, is the name of a local
    variables file as in
    https://bitbucket.org/lindenlab/build-variables/src/tip/variables.

    On Windows, os.environ['AUTOBUILD_VSVER'] indirectly indicates a Visual
    Studio vcvarsall.bat script from which to load variables. Its values are
    e.g. '100' for Visual Studio 2010 (VS 10), '120' for Visual Studio 2013
    (VS 12) and so on. A correct value nnn for the running system will
    identify a corresponding VSnnnCOMNTOOLS environment variable.

    On Windows, if AUTOBUILD_VSVER isn't set, a value will be inferred from
    the available VSnnnCOMNTOOLS environment variables.
    """
    result = common.get_autobuild_environment()
    exports, vars, vsvars = internal_source_environment(
        [configuration] if configuration else [],
        os.environ.get("AUTOBUILD_VARIABLES_FILE"))
    result.update(exports)
    result.update(vars)
    result.update(vsvars)
    return result
def _build_a_configuration(config, build_configuration, extra_arguments, dry_run=False):
    try:
        common_build_configuration = \
            config.get_build_configuration(build_configuration.name, 'common')
        parent_build = common_build_configuration.build
    except:
        parent_build = None
    if build_configuration.build is not None:
        build_executable = copy.copy(build_configuration.build)
        build_executable.parent = parent_build
    elif parent_build is not None:
        logger.info('no build executable defined; falling back to parent')
        build_executable = parent_build
    else:
        logger.info('no build executable defined; doing nothing')
        return 0
    logger.info('executing build command %s', build_executable.__str__(extra_arguments))
    if not dry_run:
        return build_executable(extra_arguments, common.get_autobuild_environment())
    else:
        return 0
    commands be used.  Build configurations defined in the common platform but not the working
    platform are not configured.
    """
    build_configuration = config.get_build_configuration(build_configuration_name)
    return _configure_a_configuration(config, build_configuration, extra_arguments)


def _configure_a_configuration(config, build_configuration, extra_arguments, dry_run=False):
    try:
        common_build_configuration = \
            config.get_build_configuration(build_configuration.name, 'common')
        parent_configure = common_build_configuration.configure
    except Exception, e:
        if logger.getEffectiveLevel() <= logging.DEBUG:
            logger.exception(e)
        logger.debug('no common platform found')
        parent_configure = None
    if build_configuration.configure is not None:
        configure_executable = copy.copy(build_configuration.configure)
        configure_executable.parent = parent_configure
    elif parent_configure is not None:
        configure_executable = parent_configure
    else:
        logger.info('no configure executable defined; doing nothing')
        return 0
    logger.info('executing configure command %s', configure_executable.__str__(extra_arguments))
    if not dry_run:
        return configure_executable(extra_arguments, common.get_autobuild_environment())
    else:
        return 0