69 lines
2.6 KiB
Python

import os
import sys
from jinja2 import Environment, FileSystemLoader
def generate_context(libname):
return {
'len': len,
'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 <example-name-1> <example-name-2> ...")
exit(1)
create_all(sys.argv[1], sys.argv[2], sys.argv[3:])