156e2fc
import argparse
40f6765
import sys
40f6765
import subprocess
40f6765
40f6765
156e2fc
def parse_config_settings_args(config_settings):
156e2fc
    """
156e2fc
    Given a list of config `KEY=VALUE` formatted config settings,
156e2fc
    return a dictionary that can be passed to PEP 517 hook functions.
156e2fc
    """
156e2fc
    if not config_settings:
156e2fc
        return config_settings
156e2fc
    new_config_settings = {}
156e2fc
    for arg in config_settings:
156e2fc
        key, _, value = arg.partition('=')
d14a2db
        if key in new_config_settings:
d14a2db
            if not isinstance(new_config_settings[key], list):
d14a2db
                # convert the existing value to a list
d14a2db
                new_config_settings[key] = [new_config_settings[key]]
d14a2db
            new_config_settings[key].append(value)
d14a2db
        else:
d14a2db
            new_config_settings[key] = value
156e2fc
    return new_config_settings
156e2fc
156e2fc
156e2fc
def get_config_settings_args(config_settings):
156e2fc
    """
156e2fc
    Given a dictionary of PEP 517 backend config_settings,
156e2fc
    yield --config-settings args that can be passed to pip's CLI
156e2fc
    """
156e2fc
    if not config_settings:
156e2fc
        return
d14a2db
    for key, values in config_settings.items():
d14a2db
        if not isinstance(values, list):
d14a2db
            values = [values]
d14a2db
        for value in values:
d14a2db
            if value == '':
d14a2db
                yield f'--config-settings={key}'
d14a2db
            else:
d14a2db
                yield f'--config-settings={key}={value}'
156e2fc
156e2fc
156e2fc
def build_wheel(*, wheeldir, stdout=None, config_settings=None):
40f6765
    command = (
40f6765
        sys.executable,
40f6765
        '-m', 'pip',
40f6765
        'wheel',
40f6765
        '--wheel-dir', wheeldir,
40f6765
        '--no-deps',
40f6765
        '--use-pep517',
40f6765
        '--no-build-isolation',
40f6765
        '--disable-pip-version-check',
40f6765
        '--no-clean',
40f6765
        '--progress-bar', 'off',
40f6765
        '--verbose',
156e2fc
        *get_config_settings_args(config_settings),
40f6765
        '.',
40f6765
    )
40f6765
    cp = subprocess.run(command, stdout=stdout)
40f6765
    return cp.returncode
40f6765
40f6765
156e2fc
def parse_args(argv=None):
156e2fc
    parser = argparse.ArgumentParser(prog='%pyproject_wheel')
156e2fc
    parser.add_argument('wheeldir', help=argparse.SUPPRESS)
156e2fc
    parser.add_argument(
156e2fc
        '-C',
156e2fc
        dest='config_settings',
156e2fc
        action='append',
156e2fc
        help='Configuration settings to pass to the PEP 517 backend',
156e2fc
    )
156e2fc
    args = parser.parse_args(argv)
156e2fc
    args.config_settings = parse_config_settings_args(args.config_settings)
156e2fc
    return args
156e2fc
156e2fc
40f6765
if __name__ == '__main__':
156e2fc
    sys.exit(build_wheel(**vars(parse_args())))