diff options
Diffstat (limited to 'gr-utils/modtool/core/update.py')
-rw-r--r-- | gr-utils/modtool/core/update.py | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/gr-utils/modtool/core/update.py b/gr-utils/modtool/core/update.py new file mode 100644 index 0000000000..2d3af1e7e0 --- /dev/null +++ b/gr-utils/modtool/core/update.py @@ -0,0 +1,101 @@ +# +# Copyright 2018 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# SPDX-License-Identifier: GPL-3.0-or-later +# +# +""" Module to convert XML bindings to YAML bindings """ + +from __future__ import print_function +from __future__ import absolute_import +from __future__ import unicode_literals + +import os +import re +import glob +import logging + +from .base import ModTool, ModToolException +from ..tools import get_modname + +logger = logging.getLogger(__name__) + + +def get_xml_candidates(): + """ Returns a list of XML candidates for update """ + xml_candidates = [] + xml_files = [x for x in glob.glob1("grc", "*.xml")] + mod_name = get_modname() + for candidate in xml_files: + candidate = os.path.splitext(candidate)[0] + candidate = candidate.split(mod_name + "_", 1)[-1] + xml_candidates.append(candidate) + return xml_candidates + + +class ModToolUpdate(ModTool): + """ Update the grc bindings for a block """ + name = 'update' + description = 'Update the grc bindings for a block' + + def __init__(self, blockname=None, complete=False, include_blacklisted=False, **kwargs): + ModTool.__init__(self, blockname, **kwargs) + self.info['complete'] = complete + self.info['include_blacklisted'] = include_blacklisted + + + def validate(self): + """ Validates the arguments """ + ModTool._validate(self) + if self.info['complete']: + return + if not self.info['blockname'] or self.info['blockname'].isspace(): + raise ModToolException('Block name not specified!') + block_candidates = get_xml_candidates() + if self.info['blockname'] not in block_candidates: + choices = [x for x in block_candidates if self.info['blockname'] in x] + if len(choices) > 0: + print("Suggested alternatives: "+str(choices)) + raise ModToolException("The XML bindings does not exists!") + + def run(self): + from gnuradio.grc.converter import Converter + if not self.cli: + self.validate() + logger.warning("Warning: This is an experimental feature. Please verify the bindings.") + module_name = self.info['modname'] + path = './grc/' + conv = Converter(path, path) + if self.info['complete']: + blocks = get_xml_candidates() + else: + blocks = [self.info['blockname']] + for blockname in blocks: + xml_file = "{}_{}.xml".format(module_name, blockname) + yml_file = "{}_{}.block.yml".format(module_name, blockname) + if not conv.load_block_xml(path+xml_file, self.info["include_blacklisted"]): + continue + logger.info("Converted {} to {}".format(xml_file, yml_file)) + os.remove(path+xml_file) + nsubs = self._run_cmakelists(xml_file, yml_file) + if nsubs > 1: + logger.warning("Changed more than expected for the block '%s' in the CMakeLists.txt. " + "Please verify the CMakeLists manually.", blockname) + elif nsubs == 0: + logger.warning("No entry found for the block '%s' in the CMakeLists.txt. " + 'Please verify the CMakeLists manually.', blockname) + else: + logger.info('Updated the CMakeLists.txt') + + def _run_cmakelists(self, to_remove, to_add): + """ Changes in the CMakeLists """ + filename = './grc/CMakeLists.txt' + with open(filename) as f: + cfile = f.read() + (cfile, nsubs) = re.subn(to_remove, to_add, cfile) + with open(filename, 'w') as f: + f.write(cfile) + self.scm.mark_file_updated(filename) + return nsubs |