import argparse #!/usr/bin/env python3 import os import re def create_cmake_lists (folder, module_name, top_level=True, deps = []): header_and_source = [] subfolder = [] newline = '\n ' add_sub = '\nadd_subdirectory( ' for entry in os.scandir(folder): if entry.name == 'all.h': continue if entry.is_file(): if entry.name.endswith('.h') or entry.name.endswith('.cpp'): header_and_source += [entry.name] else: if entry.name != 'doc' and entry.name != 'CMakeFiles': subfolder += [entry.name] create_cmake_lists(folder + '/' + entry.name, module_name, False) print(subfolder) if not header_and_source: return if top_level: with open(folder + '/CMakeListsRefactor.txt', 'w') as f: content = f"""add_library( {module_name} ) target_link_libraries( {module_name} PUBLIC {' '.join(x for x in deps)} ) target_sources( {module_name} PRIVATE {newline.join(x for x in header_and_source)} ) add_subdirectory( {add_sub.join(x + ' )' for x in subfolder)} """ f.write(content) else: with open(folder + '/CMakeLists.txt', 'w') as f: content = f"""target_sources( {module_name} PRIVATE {newline.join(x for x in header_and_source)} ) """ f.write(content) if __name__ == '__main__': parser = argparse.ArgumentParser(description='Refactor CMakeLists.txt file') parser.add_argument('folder', type=str, help='Folder to be refactored; a CMakeListsRefactor.txt file will be created in each subfolder') args = parser.parse_args() print(args.folder) with open(args.folder + '/CMakeLists.txt', 'r') as f: depsRaw = re.findall(r'DEPENDS (.*)\)', f.read(), re.DOTALL) deps = [] if depsRaw: deps = depsRaw[0].split() create_cmake_lists( args.folder, args.folder.split('/')[-1], True, deps )