import os import sys from jinja2 import Environment, FileSystemLoader def generate_context(libname): return { 'project_name': libname, 'project_name_code': libname.replace(' ', '_').lower(), 'project_name_cmake': libname.replace(' ', '-').lower(), 'include_dir': libname.replace(' ', '-').lower(), 'include_header': f"{libname.replace(' ', '-').lower()}/{libname.split(' ')[-1].lower()}.h", 'namespace': libname.split(' ')[-1].lower() } def render_template(filename, context): file_loader = FileSystemLoader('templates') env = Environment(loader=file_loader) template = env.get_template(f'{filename}.jinja') return template.render(context) def write_file(filename, content): with open(filename, 'w') as f: f.write(content) def create_all(libname, libpath, examples): os.mkdir(libpath) os.mkdir(f"{libpath}/include") os.mkdir(f"{libpath}/include/{libname.replace(' ', '-').lower()}") os.mkdir(f"{libpath}/src") os.mkdir(f"{libpath}/tests") context = generate_context(libname) context['examples_names'] = examples write_file(f"{libpath}/CMakeLists.txt", render_template("CMakeLists.txt", context)) write_file(f"{libpath}/include/{context['include_header']}", render_template("include/lib/lib.h", context)) write_file(f"{libpath}/src/{context['namespace']}.cpp", render_template("src/lib.cpp", context)) write_file(f"{libpath}/tests/CMakeLists.txt", render_template("tests/CMakeLists.txt", context)) write_file(f"{libpath}/tests/main.cpp", render_template("tests/main.cpp", context)) write_file(f"{libpath}/tests/test-{context['namespace']}.cpp", render_template("tests/test-lib.cpp", context)) if len(examples) > 0: os.mkdir(f"{libpath}/examples") for example in examples: context = generate_context(libname) context['example_name'] = example context['example_name_code'] = example.replace(' ', '_').lower() context['example_name_cmake'] = example.replace(' ', '-').lower() example_dir = f"{libpath}/examples/{context['example_name_cmake']}" os.mkdir(example_dir) write_file(f"{example_dir}/CMakeLists.txt", render_template("examples/CMakeLists.txt", context)) write_file(f"{example_dir}/main.cpp", render_template("examples/main.cpp", context)) if __name__ == "__main__": if len(sys.argv) < 3: print(f"Usage: {sys.argv[0]} libname /path/to/project ...") exit(1) create_all(sys.argv[1], sys.argv[2], sys.argv[3:])