#!/usr/bin/env python3 import pathlib import sys include_dir = pathlib.Path(sys.argv[1]) / "include" sysicncl_path = pathlib.Path(sys.argv[2]) sysincl = open(sysicncl_path).read() GENERATED_BEG = "# GENERATED BY YM2\n" GENERATED_END = "# END OF GENERATION\n" assert sysincl.count("# GENERATED BY YM2") == 1 assert sysincl.count("# END OF GENERATION") == 1 headers = [] ext_headers = [] expr_headers = [] for header in include_dir.glob("**/*"): if not header.is_file(): continue rel_path = header.relative_to(include_dir) if header.parent == include_dir: if header.name.startswith("__") or not '.' in header.name: headers.append(str(rel_path)) else: str_path = str(rel_path) if str_path.startswith('experimental'): expr_headers.append(str_path) elif str_path.startswith('ext'): ext_headers.append(str_path) else: headers.append(str_path) headers = sorted(headers, key = lambda header: (header.count('/') != 0, header.count('__') != 0, header)) ext_headers = sorted(ext_headers) expr_headers = sorted(expr_headers) manual, generated = sysincl.split(GENERATED_BEG) generated, manual_end = generated.split(GENERATED_END) generated = [] banned_generated = [] for header in ext_headers + expr_headers: banned_generated.append( " - {name}:{spaces}DO_NOT_INCLUDE_NON_STANDARD_{banned_name}".format( name=str(header), spaces=' ' * max(1, 54 - len(header)), banned_name=header.replace('/', '_').replace('.', '_').upper(), ) ) if "experimental/propagate_const" == header: banned_generated[-1] = "#TODO: ban this header too\n#" + banned_generated[-1] for header in headers: generated.append( " - {name}:{spaces}contrib/libs/cxxsupp/libcxx/include/{name}".format( name=header, spaces=' ' * max(1, 54 - len(header)) ) ) generated = """- source_filter: "^(?!(contrib/libs/cxxsupp/libcxx)).*" includes: """ \ + '\n'.join(banned_generated) \ + """ # This includes all headers needed to resolve includes in c-headers from libcxx listed above - includes: """ \ + '\n'.join(generated) with open(sysicncl_path, 'w') as f: f.write(f"{manual}{GENERATED_BEG}{generated}\n{GENERATED_END}{manual_end}")