1#!/usr/bin/env python 2 3import os, pathlib, sys 4 5def generate(private, public): 6 return f'{{ include: [ "{private}", "private", "<{public}>", "public" ] }}' 7 8 9def panic(file): 10 print(f'========== {__file__} error ==========', file=sys.stderr) 11 print(f'\tFile \'{file}\' is a top-level detail header without a mapping', file=sys.stderr) 12 sys.exit(1) 13 14 15def generate_map(include): 16 detail_files = [] 17 detail_directories = [] 18 c_headers = [] 19 20 for i in include.iterdir(): 21 if i.is_dir() and i.name.startswith('__'): 22 detail_directories.append(f'{i.name}') 23 continue 24 25 if i.name.startswith('__'): 26 detail_files.append(i.name) 27 continue 28 29 if i.name.endswith('.h'): 30 c_headers.append(i.name) 31 32 result = [] 33 for i in detail_directories: 34 result.append(f'{generate(f"@<{i}/.*>", i[2:])},') 35 36 for i in detail_files: 37 public = [] 38 match i: 39 case '__assert': continue 40 case '__availability': continue 41 case '__bit_reference': continue 42 case '__bits': public = ['bits'] 43 case '__bsd_locale_defaults.h': continue 44 case '__bsd_locale_fallbacks.h': continue 45 case '__config_site.in': continue 46 case '__config': continue 47 case '__debug': continue 48 case '__errc': continue 49 case '__hash_table': public = ['unordered_map', 'unordered_set'] 50 case '__locale': public = ['locale'] 51 case '__mbstate_t.h': continue 52 case '__mutex_base': continue 53 case '__node_handle': public = ['map', 'set', 'unordered_map', 'unordered_set'] 54 case '__split_buffer': public = ['deque', 'vector'] 55 case '__std_stream': public = ['iostream'] 56 case '__threading_support': public = ['atomic', 'mutex', 'semaphore', 'thread'] 57 case '__tree': public = ['map', 'set'] 58 case '__undef_macros': continue 59 case '__verbose_abort': continue 60 case _: panic() 61 62 for p in public: 63 result.append(f'{generate(f"<{i}>", p)},') 64 65 result.sort() 66 return result 67 68def main(): 69 monorepo_root = pathlib.Path(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) 70 assert(monorepo_root.exists()) 71 include = pathlib.Path(os.path.join(monorepo_root, 'libcxx', 'include')) 72 73 mapping = generate_map(include) 74 data = '[\n ' + '\n '.join(mapping) + '\n]\n' 75 with open(f'{include}/libcxx.imp', 'w') as f: 76 f.write(data) 77 78 79if __name__ == '__main__': 80 main() 81