meshlab/src/make-cmake.py
2019-12-12 17:30:26 -06:00

99 lines
3.3 KiB
Python
Executable File

#!/usr/bin/env python3
from pathlib import Path
from jinja2 import Environment, FileSystemLoader
from jinja2.utils import Markup
try:
# You need to add:
#
# from .configuration import Configuration
# from .__main__ import process_file
#
# to your [~/.local/lib/python3.7/site-packages/]cmake_format/__init__.py
from cmake_format import process_file as cf_process_file, Configuration as CF_Configuration
HAVE_CMAKE_FORMAT = True
except:
HAVE_CMAKE_FORMAT = False
class CMaker:
def __init__(self, format_config=None):
self.root = Path(__file__).parent.resolve()
self.template_dir = self.root / 'templates'
self.env = Environment(keep_trailing_newline=True,
autoescape=False,
loader=FileSystemLoader([str(self.template_dir)]))
self.template = self.env.get_template('CMakeLists.template.cmake')
self.format_config = format_config
def handle_dir(self, d, recurse=True):
# print(d)
if recurse:
glob = d.rglob
else:
glob = d.glob
data = {
"name": d.stem,
}
sources = list(sorted(x.relative_to(d) for x in glob("*.cpp")
if not x.name.startswith('moc_') and not x.name.startswith('qrc_')))
if sources:
data['sources'] = sources
headers = list(sorted(x.relative_to(d) for x in glob("*.h")
if not x.name.startswith('ui_') and not x.name.startswith('moc_')))
if headers:
data["headers"] = headers
resources = list(sorted(x.relative_to(d) for x in glob("*.qrc")))
if resources:
data["resources"] = resources
ui = list(sorted(x.relative_to(d) for x in glob("*.ui")))
if ui:
data["ui"] = ui
data["xml"] = list(sorted(x.relative_to(d) for x in glob("*.xml")))
assert(len(data['xml']) in (0, 1))
custom_template_name = d.name + '.cmake'
if (self.template_dir / custom_template_name).exists():
print(d, "has a custom template")
template = self.env.get_template(custom_template_name)
else:
template = self.template
output = template.render(data)
if self.format_config:
output = cf_process_file(self.format_config, output)
with open(d / 'CMakeLists.txt', 'w', encoding='utf-8') as fp:
fp.write(output)
def run(self):
self.handle_dir(self.root / 'common', False)
self.handle_dir(self.root / 'meshlab')
self.handle_dir(self.root / 'meshlabserver')
plugins_dirs = (
self.root / 'meshlabplugins',
self.root / 'plugins_experimental',
self.root / 'plugins_unsupported',
self.root / 'sampleplugins'
)
for plugins_dir in plugins_dirs:
if not plugins_dir.exists():
continue
for d in plugins_dir.iterdir():
if d.is_dir():
self.handle_dir(d)
if __name__ == "__main__":
config = None
if HAVE_CMAKE_FORMAT:
#config = get_default_cmake_format_config(enable_markup=False)
config = CF_Configuration(enable_markup=False, tab_size=4)
app = CMaker(config)
app.run()