|
@@ -131,6 +131,58 @@ class TrailingBackslash(_CheckFunction):
|
|
|
self.lastline]
|
|
|
|
|
|
|
|
|
+class TypoInPackageVariable(_CheckFunction):
|
|
|
+ ALLOWED = re.compile("|".join([
|
|
|
+ "ACLOCAL_DIR",
|
|
|
+ "ACLOCAL_HOST_DIR",
|
|
|
+ "BR_CCACHE_INITIAL_SETUP",
|
|
|
+ "BR_NO_CHECK_HASH_FOR",
|
|
|
+ "LINUX_POST_PATCH_HOOKS",
|
|
|
+ "LINUX_TOOLS",
|
|
|
+ "LUA_RUN",
|
|
|
+ "MKFS_JFFS2",
|
|
|
+ "MKIMAGE_ARCH",
|
|
|
+ "PKG_CONFIG_HOST_BINARY",
|
|
|
+ "TARGET_FINALIZE_HOOKS",
|
|
|
+ "XTENSA_CORE_NAME"]))
|
|
|
+ PACKAGE_NAME = re.compile("/([^/]+)\.mk")
|
|
|
+ VARIABLE = re.compile("^([A-Z0-9_]+_[A-Z0-9_]+)\s*(\+|)=")
|
|
|
+
|
|
|
+ def before(self):
|
|
|
+ package = self.PACKAGE_NAME.search(self.filename).group(1)
|
|
|
+ package = package.replace("-", "_").upper()
|
|
|
+ # linux tools do not use LINUX_TOOL_ prefix for variables
|
|
|
+ package = package.replace("LINUX_TOOL_", "")
|
|
|
+ self.package = package
|
|
|
+ self.REGEX = re.compile("^(HOST_)?({}_[A-Z0-9_]+)".format(package))
|
|
|
+ self.FIND_VIRTUAL = re.compile(
|
|
|
+ "^{}_PROVIDES\s*(\+|)=\s*(.*)".format(package))
|
|
|
+ self.virtual = []
|
|
|
+
|
|
|
+ def check_line(self, lineno, text):
|
|
|
+ m = self.VARIABLE.search(text)
|
|
|
+ if m is None:
|
|
|
+ return
|
|
|
+
|
|
|
+ variable = m.group(1)
|
|
|
+
|
|
|
+ # allow to set variables for virtual package this package provides
|
|
|
+ v = self.FIND_VIRTUAL.search(text)
|
|
|
+ if v:
|
|
|
+ self.virtual += v.group(2).upper().split()
|
|
|
+ return
|
|
|
+ for virtual in self.virtual:
|
|
|
+ if variable.startswith("{}_".format(virtual)):
|
|
|
+ return
|
|
|
+
|
|
|
+ if self.ALLOWED.match(variable):
|
|
|
+ return
|
|
|
+ if self.REGEX.search(text) is None:
|
|
|
+ return ["{}:{}: possible typo: {} -> *{}*"
|
|
|
+ .format(self.filename, lineno, variable, self.package),
|
|
|
+ text]
|
|
|
+
|
|
|
+
|
|
|
class UselessFlag(_CheckFunction):
|
|
|
DEFAULT_AUTOTOOLS_FLAG = re.compile("^.*{}".format("|".join([
|
|
|
"_AUTORECONF\s*=\s*NO",
|