summaryrefslogtreecommitdiff
path: root/gr-utils/modtool/core/disable.py
diff options
context:
space:
mode:
Diffstat (limited to 'gr-utils/modtool/core/disable.py')
-rw-r--r--gr-utils/modtool/core/disable.py161
1 files changed, 161 insertions, 0 deletions
diff --git a/gr-utils/modtool/core/disable.py b/gr-utils/modtool/core/disable.py
new file mode 100644
index 0000000000..1fb4628312
--- /dev/null
+++ b/gr-utils/modtool/core/disable.py
@@ -0,0 +1,161 @@
+#
+# Copyright 2013, 2018, 2019 Free Software Foundation, Inc.
+#
+# This file is part of GNU Radio
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+#
+""" Disable blocks module """
+
+from __future__ import print_function
+from __future__ import absolute_import
+from __future__ import unicode_literals
+
+import os
+import re
+import sys
+import logging
+
+from ..tools import CMakeFileEditor
+from .base import ModTool, ModToolException
+
+logger = logging.getLogger(__name__)
+
+
+class ModToolDisable(ModTool):
+ """ Disable block (comments out CMake entries for files) """
+ name = 'disable'
+ description = 'Disable selected block in module.'
+
+ def __init__(self, blockname=None, **kwargs):
+ ModTool.__init__(self, blockname, **kwargs)
+ self.info['pattern'] = blockname
+
+ def validate(self):
+ """ Validates the arguments """
+ ModTool._validate(self)
+ if not self.info['pattern'] or self.info['pattern'].isspace():
+ raise ModToolException("Invalid pattern!")
+
+ def run(self):
+ """ Go, go, go! """
+ def _handle_py_qa(cmake, fname):
+ """ Do stuff for py qa """
+ cmake.comment_out_lines('GR_ADD_TEST.*'+fname)
+ self.scm.mark_file_updated(cmake.filename)
+ return True
+ def _handle_py_mod(cmake, fname):
+ """ Do stuff for py extra files """
+ try:
+ with open(self._file['pyinit']) as f:
+ initfile = f.read()
+ except IOError:
+ logger.warning("Could not edit __init__.py, that might be a problem.")
+ return False
+ pymodname = os.path.splitext(fname)[0]
+ initfile = re.sub(r'((from|import)\s+\b'+pymodname+r'\b)', r'#\1', initfile)
+ with open(self._file['pyinit'], 'w') as f:
+ f.write(initfile)
+ self.scm.mark_file_updated(self._file['pyinit'])
+ return False
+ def _handle_cc_qa(cmake, fname):
+ """ Do stuff for cc qa """
+ if self.info['version'] == '37':
+ cmake.comment_out_lines(r'\$\{CMAKE_CURRENT_SOURCE_DIR\}/'+fname)
+ fname_base = os.path.splitext(fname)[0]
+ ed = CMakeFileEditor(self._file['qalib']) # Abusing the CMakeFileEditor...
+ ed.comment_out_lines(r'#include\s+"{}.h"'.format(fname_base), comment_str='//')
+ ed.comment_out_lines(r'{}::suite\(\)'.format(fname_base), comment_str='//')
+ ed.write()
+ self.scm.mark_file_updated(self._file['qalib'])
+ elif self.info['version'] == '38':
+ fname_qa_cc = 'qa_{}.cc'.format(self.info['blockname'])
+ cmake.comment_out_lines(fname_qa_cc)
+ elif self.info['version'] == '36':
+ cmake.comment_out_lines('add_executable.*'+fname)
+ cmake.comment_out_lines('target_link_libraries.*'+os.path.splitext(fname)[0])
+ cmake.comment_out_lines('GR_ADD_TEST.*'+os.path.splitext(fname)[0])
+ self.scm.mark_file_updated(cmake.filename)
+ return True
+ def _handle_h_swig(cmake, fname):
+ """ Comment out include files from the SWIG file,
+ as well as the block magic """
+ with open(self._file['swig']) as f:
+ swigfile = f.read()
+ (swigfile, nsubs) = re.subn(r'(.include\s+"({}/)?{}")'.format(
+ self.info['modname'], fname),
+ r'//\1', swigfile)
+ if nsubs > 0:
+ logger.info("Changing {}...".format(self._file['swig']))
+ if nsubs > 1: # Need to find a single BLOCK_MAGIC
+ blockname = os.path.splitext(fname[len(self.info['modname'])+1:])[0]
+ if self.info['version'] in ('37', '38'):
+ blockname = os.path.splitext(fname)[0]
+ (swigfile, nsubs) = re.subn('(GR_SWIG_BLOCK_MAGIC2?.+{}.+;)'.format(blockname), r'//\1', swigfile)
+ if nsubs > 1:
+ logger.warning("Hm, changed more then expected while editing {}.".format(self._file['swig']))
+ with open(self._file['swig'], 'w') as f:
+ f.write(swigfile)
+ self.scm.mark_file_updated(self._file['swig'])
+ return False
+ def _handle_i_swig(cmake, fname):
+ """ Comment out include files from the SWIG file,
+ as well as the block magic """
+ with open(self._file['swig']) as f:
+ swigfile = f.read()
+ blockname = os.path.splitext(fname[len(self.info['modname'])+1:])[0]
+ if self.info['version'] in ('37', '38'):
+ blockname = os.path.splitext(fname)[0]
+ swigfile = re.sub(r'(%include\s+"'+fname+'")', r'//\1', swigfile)
+ logger.info("Changing {}...".format(self._file['swig']))
+ swigfile = re.sub('(GR_SWIG_BLOCK_MAGIC2?.+'+blockname+'.+;)', r'//\1', swigfile)
+ with open(self._file['swig'], 'w') as f:
+ f.write(swigfile)
+ self.scm.mark_file_updated(self._file['swig'])
+ return False
+
+ # This portion will be covered by the CLI
+ if not self.cli:
+ self.validate()
+ else:
+ from ..cli import cli_input
+ # List of special rules: 0: subdir, 1: filename re match, 2: callback
+ special_treatments = (
+ ('python', r'qa.+py$', _handle_py_qa),
+ ('python', r'^(?!qa).+py$', _handle_py_mod),
+ ('lib', r'qa.+\.cc$', _handle_cc_qa),
+ ('include/{}'.format(self.info['modname']), r'.+\.h$', _handle_h_swig),
+ ('include', r'.+\.h$', _handle_h_swig),
+ ('swig', r'.+\.i$', _handle_i_swig)
+ )
+ for subdir in self._subdirs:
+ if self.skip_subdirs[subdir]:
+ continue
+ if self.info['version'] in ('37', '38') and subdir == 'include':
+ subdir = 'include/{}'.format(self.info['modname'])
+ try:
+ cmake = CMakeFileEditor(os.path.join(subdir, 'CMakeLists.txt'))
+ except IOError:
+ continue
+ logger.info("Traversing {}...".format(subdir))
+ filenames = cmake.find_filenames_match(self.info['pattern'])
+ yes = self.info['yes']
+ for fname in filenames:
+ file_disabled = False
+ if not yes:
+ ans = cli_input("Really disable {}? [Y/n/a/q]: ".format(fname)).lower().strip()
+ if ans == 'a':
+ yes = True
+ if ans == 'q':
+ sys.exit(0)
+ if ans == 'n':
+ continue
+ for special_treatment in special_treatments:
+ if special_treatment[0] == subdir and re.match(special_treatment[1], fname):
+ file_disabled = special_treatment[2](cmake, fname)
+ if not file_disabled:
+ cmake.disable_file(fname)
+ cmake.write()
+ self.scm.mark_files_updated((os.path.join(subdir, 'CMakeLists.txt'),))
+ logger.warning("Careful: 'gr_modtool disable' does not resolve dependencies.")