[PATCH] scripts/checkkconfig.py: find unused Kconfig parameters

From: Michael Opdenacker
Date: Thu Oct 24 2013 - 01:23:39 EST


This is the first version of a script to look for
Kconfig parameters which are still defined but no longer
used in the kernel source code.

The script may be extended in the future to perform
more checks. This explains why a rather generic name was chosen.

Several issues have already been reported and fixed
thanks to the use of this script. It is time to share it now!

Signed-off-by: Michael Opdenacker <michael.opdenacker@xxxxxxxxxxxxxxxxxx>
---
scripts/checkkconfig.py | 131 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 131 insertions(+)
create mode 100755 scripts/checkkconfig.py

diff --git a/scripts/checkkconfig.py b/scripts/checkkconfig.py
new file mode 100755
index 0000000..4155656
--- /dev/null
+++ b/scripts/checkkconfig.py
@@ -0,0 +1,131 @@
+#!/usr/bin/env python
+#
+# Copyright 2013 Free Electrons
+# Michael Opdenacker <michael.opdenacker@xxxxxxxxxxxxxxxxxx>
+#
+# Look for issues in Kconfig files
+#
+# This first version supports:
+# - Looking for unused Kconfig parameters
+#
+# Usage: scripts/checkkconfig.py
+#
+# Licensed under the terms of the GNU GPL License version 2
+
+import fnmatch
+import os
+import subprocess
+
+########################################################
+# Parse Kconfig files
+########################################################
+
+def parse_kconfig(file):
+
+ global has_select, choice_type, source_file
+
+ current_param = ''
+ in_choice = False
+
+ with open(file, 'r') as f:
+ for line in f:
+ words = line.split()
+
+ if len(words) != 0:
+ key = words[0]
+
+ if len(words) == 1:
+
+ if key == 'choice':
+ in_choice = True
+ elif key == 'endchoice':
+ in_choice = False
+
+ elif len(words) > 1:
+
+ if key == 'config' or key == 'menuconfig':
+ current_param = words[1]
+
+ has_select[current_param] = False
+ choice_type[current_param] = in_choice
+ source_file[current_param] = file
+
+ elif key == 'select' and words[1] != '':
+
+ has_select[current_param] = True
+
+########################################################
+# Find occurrences of a parameter
+########################################################
+
+def count_param(param):
+
+ global source_file, bad_params_in_file
+
+ if os.path.isdir('.git'):
+ # Use git grep when available
+ count = subprocess.check_output('git grep ' + param + '| grep -v defconfig | wc -l', shell=True)
+ else:
+ # Fallback to regular grep
+ count = subprocess.check_output('grep -R ' + param + ' . | grep -v defconfig | wc -l', shell=True)
+
+ num = int(count.strip())
+
+ if num == 1:
+ 'WARNING: parameter ' + param + ' is used nowhere'
+
+ file=source_file[param]
+
+ if bad_params_in_file.has_key(file):
+ bad_params_in_file[file].append(param)
+ else:
+ bad_params_in_file[file]=[param]
+
+
+########################################################
+# Main program
+########################################################
+
+global has_select, choice_type, source_file, bad_params_in_file
+
+has_select = dict()
+choice_type = dict()
+source_file = dict()
+bad_params_in_file = dict()
+
+kconfig_files = []
+
+for root, dirnames, filenames in os.walk('.'):
+ for filename in fnmatch.filter(filenames, 'Kconfig*'):
+ kconfig_files.append(os.path.join(root, filename))
+
+print 'INFO: processing Kconfig files...'
+
+for f in kconfig_files:
+ parse_kconfig(f)
+
+total = len(has_select)
+count = 0
+old_percentage = -1
+
+for param in has_select.keys():
+
+ # Progress information... running the script can take hours!
+
+ count += 1
+ percentage = int((100*count)/total)
+
+ if percentage > old_percentage:
+ print 'INFO: checking kconfig parameter %d / %d (%d %%)' % (count, total, percentage)
+ old_percentage = percentage
+
+ # Ignore parameters with select dependencies
+ # Also ignore parameters inside 'choice ... endchoice'
+ # All of them are valid, even if they have only one instance
+
+ if not(has_select[param]) and not(choice_type[param]):
+ count_param(param)
+
+for file in bad_params_in_file.keys():
+ print 'File: ' + file
+ print bad_params_in_file[file]
--
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/