def get_c_compiler_command(c_paths: List[Path], exepath: Path) -> Tuple[(List[str], str)]:
    compile_info = {}
    with ((project_root / 'obj') / 'compile_info.txt').open() as file:
        for line in file:
            (key, value) = line.rstrip('\n').split('=', maxsplit=1)
            compile_info[key] = value
    before_files = (([compile_info['cc']] + shlex.split(compile_info['cflags'])) + [str(path) for path in project_root.glob('obj/*.o')])
    after_files = ((['-o', str(exepath)] + shlex.split(compile_info['ldflags'])) + ['-I', str(project_root)])
    return (((before_files + [str(path) for path in c_paths]) + after_files), ' '.join((([shlex.quote(arg) for arg in before_files] + [f'<{len(c_paths)} files>']) + [shlex.quote(arg) for arg in after_files])))
def get_c_compiler_command(c_paths: List[Path], exepath: Path) -> Tuple[(List[str], str)]:
    compile_info = {}
    with ((project_root / 'obj') / 'compile_info.txt').open() as file:
        for line in file:
            (key, value) = line.rstrip('\n').split('=', maxsplit=1)
            compile_info[key] = value
    before_files = (([compile_info['cc']] + shlex.split(compile_info['cflags'])) + [str(path) for path in project_root.glob('obj/*.o')])
    after_files = ((['-o', str(exepath)] + shlex.split(compile_info['ldflags'])) + ['-I', str(project_root)])
    return (((before_files + [str(path) for path in c_paths]) + after_files), ' '.join((([shlex.quote(arg) for arg in before_files] + [f'<{len(c_paths)} files>']) + [shlex.quote(arg) for arg in after_files])))