Ejemplo n.º 1
0
def main(args):
    with in_dir(args[1]):
        with open('saved_options.json', 'wb') as outfile:
            outfile.write(
                subprocess.check_output(
                    ['meson', 'introspect', '--buildoptions']))
Ejemplo n.º 2
0
def main(args):
    with in_dir(os.environ['MESON_BUILD_ROOT']):
        with open('saved_options.json', 'wb') as outfile:
            outfile.write(subprocess.check_output(['meson', 'introspect', '--buildoptions']))
Ejemplo n.º 3
0
def main(args):
    parser = argparse.ArgumentParser(
        description=
        'Regenerate a Meson build directory, attempting to preserve build options.',
        prog=args[0])

    parser.add_argument(
        'build_dir',
        default=Path.cwd(),
        type=Path,
        nargs='?',
        help='the build directory (defaults to CWD)',
    )

    parser.add_argument(
        'dest_build_dir',
        default=None,
        type=Path,
        nargs='?',
        help='the destination directory (defaults to same as build_dir)',
    )

    parser.add_argument(
        '--meson',
        default=['meson'],
        type=shlex.split,
        help='override the Meson executable (useful for wrappers)',
    )

    parser.add_argument(
        'meson_args',
        default=[],
        nargs='*',
        help='additional arguments for Meson',
    )

    add_common_args(parser)
    args = parser.parse_args(args[1:])

    if args.dest_build_dir is None:
        args.dest_build_dir = args.build_dir

    with in_dir(args.build_dir):
        try:
            build_options = meson_introspect('--buildoptions')
        except subprocess.SubprocessError:
            print(
                "Warning: meson introspect failed, retrieving options from saved_options.json. This may not be up to date.",
                file=sys.stderr)

            with open('saved_options.json') as infile:
                build_options = json.loads(infile.read())

    regen_cmdline = args.meson + [
        str(args.rootdir.resolve(strict=True)),
        str(args.dest_build_dir.resolve(strict=False)),
    ]

    meson_options = set(
        re.findall(
            r'\[--([\w-]+)\s+.*?\]',
            subprocess.check_output(args.meson + ['--help']).decode('utf8'),
            re.A))

    def opt_str_value(opt, value):
        if isinstance(value, bool):
            # Meson <= 0.43.0 bug
            return str(value).lower()

        if opt == 'install_umask':
            return '%04o' % int(value)

        return str(value)

    for opt in build_options:
        name = opt['name']
        value = opt_str_value(name, opt['value'])

        if name in meson_options:
            regen_cmdline.append('--{}={}'.format(name, value))

    regen_cmdline += args.meson_args

    args.dest_build_dir.mkdir(parents=True, exist_ok=True)

    with in_dir(args.dest_build_dir):
        obj = {
            'command': regen_cmdline,
            'build_options': build_options,
        }

        with Path('imported_options.json').open('w') as outfile:
            json.dump(
                obj,
                outfile,
                ensure_ascii=False,
                indent=4,
                sort_keys=True,
            )

        meson_dir = Path('meson-private')
        meson_dir_bak = meson_dir.with_name(meson_dir.name + '.bak')

        if meson_dir.is_dir():
            shutil.rmtree(meson_dir_bak, ignore_errors=True)
            meson_dir.rename(meson_dir_bak)

        print('+', regen_cmdline)
        subprocess.check_call(regen_cmdline)

        for opt in build_options:
            name = opt['name']
            value = opt_str_value(name, opt['value'])
            cmdline = args.meson + ['configure', '-D{}={}'.format(name, value)]
            print('+', cmdline)
            subprocess.call(cmdline)

    print('')
    print(
        "Regeneration done. This process is not 100% reliable; you may want to check the output of 'meson configure'"
    )
Ejemplo n.º 4
0
def main(args):
    parser = argparse.ArgumentParser(description='Regenerate a Meson build directory, attempting to preserve build options.', prog=args[0])

    parser.add_argument('build_dir',
        default=Path.cwd(),
        type=Path,
        nargs='?',
        help='the build directory (defaults to CWD)',
    )

    parser.add_argument('dest_build_dir',
        default=None,
        type=Path,
        nargs='?',
        help='the destination directory (defaults to same as build_dir)',
    )

    parser.add_argument('--meson',
        default=['meson'],
        type=shlex.split,
        help='override the Meson executable (useful for wrappers)',
    )

    parser.add_argument('meson_args',
        default=[],
        nargs='*',
        help='additional arguments for Meson',
    )

    add_common_args(parser)
    args = parser.parse_args(args[1:])

    if args.dest_build_dir is None:
        args.dest_build_dir = args.build_dir

    with in_dir(args.build_dir):
        try:
            build_options = meson_introspect('--buildoptions')
        except subprocess.SubprocessError:
            print("Warning: meson introspect failed, retrieving options from saved_options.json. This may not be up to date.", file=sys.stderr)

            with open('saved_options.json') as infile:
                build_options = json.loads(infile.read())

    regen_cmdline = args.meson + [
        str(args.rootdir.resolve(strict=True)),
        str(args.dest_build_dir.resolve(strict=False)),
    ]

    meson_options = set(re.findall(r'\[--([\w-]+)\s+.*?\]', subprocess.check_output(args.meson + ['--help']).decode('utf8'), re.A))

    def opt_str_value(opt, value):
        if isinstance(value, bool):
            # Meson <= 0.43.0 bug
            return str(value).lower()

        if opt == 'install_umask':
            return '%04o' % int(value)

        return str(value)

    for opt in build_options:
        name = opt['name']
        value = opt_str_value(name, opt['value'])

        if name in meson_options:
            regen_cmdline.append('--{}={}'.format(name, value))

    regen_cmdline += args.meson_args

    args.dest_build_dir.mkdir(parents=True, exist_ok=True)

    with in_dir(args.dest_build_dir):
        obj = {
            'command': regen_cmdline,
            'build_options': build_options,
        }

        with Path('imported_options.json').open('w') as outfile:
            json.dump(obj, outfile,
                ensure_ascii=False,
                indent=4,
                sort_keys=True,
            )

        meson_dir = Path('meson-private')
        meson_dir_bak = meson_dir.with_name(meson_dir.name + '.bak')

        if meson_dir.is_dir():
            shutil.rmtree(meson_dir_bak, ignore_errors=True)
            meson_dir.rename(meson_dir_bak)

        print('+', regen_cmdline)
        subprocess.check_call(regen_cmdline)

        for opt in build_options:
            name = opt['name']
            value = opt_str_value(name, opt['value'])
            cmdline = args.meson + ['configure', '-D{}={}'.format(name, value)]
            print('+', cmdline)
            subprocess.call(cmdline)

    print('')
    print("Regeneration done. This process is not 100% reliable; you may want to check the output of 'meson configure'")