| #!/usr/bin/env python |
| |
| import os, pathlib, sys |
| |
| |
| def generate(private, public): |
| return f'{{ include: [ "{private}", "private", "<{public}>", "public" ] }}' |
| |
| |
| def panic(file): |
| print(f"========== {__file__} error ==========", file=sys.stderr) |
| print( |
| f"\tFile '{file}' is a top-level detail header without a mapping", |
| file=sys.stderr, |
| ) |
| sys.exit(1) |
| |
| |
| def generate_map(include): |
| detail_files = [] |
| detail_directories = [] |
| c_headers = [] |
| |
| for i in include.iterdir(): |
| if i.is_dir() and i.name.startswith("__"): |
| detail_directories.append(f"{i.name}") |
| continue |
| |
| if i.name.startswith("__"): |
| detail_files.append(i.name) |
| continue |
| |
| if i.name.endswith(".h"): |
| c_headers.append(i.name) |
| |
| result = [] |
| temporary_mappings = {"__locale_dir": "locale"} |
| for i in detail_directories: |
| public_header = temporary_mappings.get(i, i.lstrip("_")) |
| result.append(f'{generate(f"@<{i}/.*>", public_header)},') |
| |
| for i in detail_files: |
| public = [] |
| if i == "__assert": |
| continue |
| elif i == "__availability": |
| continue |
| elif i == "__bit_reference": |
| continue |
| elif i == "__bits": |
| public = ["bits"] |
| elif i == "__config_site.in": |
| continue |
| elif i == "__config": |
| continue |
| elif i == "__errc": |
| continue |
| elif i == "__hash_table": |
| public = ["unordered_map", "unordered_set"] |
| elif i == "__locale": |
| public = ["locale"] |
| elif i == "__mbstate_t.h": |
| continue |
| elif i == "__mutex_base": |
| continue |
| elif i == "__node_handle": |
| public = ["map", "set", "unordered_map", "unordered_set"] |
| elif i == "__pstl_algorithm": |
| continue |
| elif i == "__pstl_config_site.in": |
| continue |
| elif i == "__pstl_execution": |
| continue |
| elif i == "__pstl_memory": |
| continue |
| elif i == "__pstl_numeric": |
| continue |
| elif i == "__split_buffer": |
| public = ["deque", "vector"] |
| elif i == "__std_mbstate_t.h": |
| continue |
| elif i == "__threading_support": |
| public = ["atomic", "mutex", "semaphore", "thread"] |
| elif i == "__tree": |
| public = ["map", "set"] |
| elif i == "__undef_macros": |
| continue |
| elif i == "__verbose_abort": |
| continue |
| else: |
| panic(i) |
| |
| for p in public: |
| result.append(f'{generate(f"<{i}>", p)},') |
| |
| result.sort() |
| return result |
| |
| |
| def main(): |
| monorepo_root = pathlib.Path( |
| os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) |
| ) |
| assert monorepo_root.exists() |
| include = pathlib.Path(os.path.join(monorepo_root, "libcxx", "include")) |
| |
| mapping = generate_map(include) |
| data = "[\n " + "\n ".join(mapping) + "\n]\n" |
| with open(f"{include}/libcxx.imp", "w") as f: |
| f.write(data) |
| |
| |
| if __name__ == "__main__": |
| main() |