69 lines
2.6 KiB
Python
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:])
|
|
|