| #!/usr/bin/env python3 | |
| """This script generates httplib.cppm module file from httplib.h.""" | |
| import os | |
| import sys | |
| from argparse import ArgumentParser, Namespace | |
| from typing import List | |
| def main() -> None: | |
| """Main entry point for the script.""" | |
| args_parser: ArgumentParser = ArgumentParser(description=__doc__) | |
| args_parser.add_argument( | |
| "-o", "--out", help="where to write the files (default: out)", default="out" | |
| ) | |
| args: Namespace = args_parser.parse_args() | |
| cur_dir: str = os.path.dirname(sys.argv[0]) | |
| if not cur_dir: | |
| cur_dir = '.' | |
| lib_name: str = "httplib" | |
| header_name: str = f"/{lib_name}.h" | |
| # get the input file | |
| in_file: str = f"{cur_dir}{header_name}" | |
| # get the output file | |
| cppm_out: str = f"{args.out}/{lib_name}.cppm" | |
| # if the modification time of the out file is after the in file, | |
| # don't generate (as it is already finished) | |
| do_generate: bool = True | |
| if os.path.exists(cppm_out): | |
| in_time: float = os.path.getmtime(in_file) | |
| out_time: float = os.path.getmtime(cppm_out) | |
| do_generate: bool = in_time > out_time | |
| if do_generate: | |
| with open(in_file) as f: | |
| lines: List[str] = f.readlines() | |
| os.makedirs(args.out, exist_ok=True) | |
| # Find the Headers and Declaration comment markers | |
| headers_start: int = -1 | |
| declaration_start: int = -1 | |
| for i, line in enumerate(lines): | |
| if ' * Headers' in line: | |
| headers_start = i - 1 # Include the /* line | |
| elif ' * Declaration' in line: | |
| declaration_start = i - 1 # Stop before the /* line | |
| break | |
| with open(cppm_out, 'w') as fm: | |
| # Write module file | |
| fm.write("module;\n\n") | |
| # Write global module fragment (from Headers to Declaration comment) | |
| # Filter out 'using' declarations to avoid conflicts | |
| if headers_start >= 0 and declaration_start >= 0: | |
| for i in range(headers_start, declaration_start): | |
| line: str = lines[i] | |
| if 'using' not in line: | |
| fm.write(line) | |
| fm.write("\nexport module httplib;\n\n") | |
| fm.write("export extern \"C++\" {\n") | |
| fm.write(f"{' ' * 4}#include \"httplib.h\"\n") | |
| fm.write("}\n") | |
| print(f"Wrote {cppm_out}") | |
| else: | |
| print(f"{cppm_out} is up to date") | |
| if __name__ == "__main__": | |
| main() |