mirror of
https://github.com/yhirose/cpp-httplib.git
synced 2026-04-11 19:28:30 +00:00
Add C++ modules support (#2291)
* Add C++ modules support * Add module examples * Missing semicolon * Update GitHub Actions script and create a modules updating script * Name the unused param * Use the guarded/direct export of header approach * Update CMakeLists.txt Co-authored-by: Andrea Pappacoda <andrea@pappacoda.it> * Update CMakeLists.txt Co-authored-by: Andrea Pappacoda <andrea@pappacoda.it> * Split scripts into split.py and generate_module.py --------- Co-authored-by: Andrea Pappacoda <andrea@pappacoda.it>
This commit is contained in:
77
generate_module.py
Normal file
77
generate_module.py
Normal file
@@ -0,0 +1,77 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user