summaryrefslogtreecommitdiffstats
path: root/python/mozbuild/mozbuild/backend/static_analysis.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/mozbuild/mozbuild/backend/static_analysis.py')
-rw-r--r--python/mozbuild/mozbuild/backend/static_analysis.py52
1 files changed, 52 insertions, 0 deletions
diff --git a/python/mozbuild/mozbuild/backend/static_analysis.py b/python/mozbuild/mozbuild/backend/static_analysis.py
new file mode 100644
index 0000000000..2b3ce96e75
--- /dev/null
+++ b/python/mozbuild/mozbuild/backend/static_analysis.py
@@ -0,0 +1,52 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this file,
+# You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# This module provides a backend static-analysis, like clang-tidy and coverity.
+# The main difference between this and the default database backend is that this one
+# tracks folders that can be built in the non-unified environment and generates
+# the coresponding build commands for the files.
+
+import os
+
+import mozpack.path as mozpath
+
+from mozbuild.compilation.database import CompileDBBackend
+
+
+class StaticAnalysisBackend(CompileDBBackend):
+ def _init(self):
+ CompileDBBackend._init(self)
+ self.non_unified_build = []
+
+ # List of directories can be built outside of the unified build system.
+ with open(
+ mozpath.join(self.environment.topsrcdir, "build", "non-unified-compat")
+ ) as fh:
+ content = fh.readlines()
+ self.non_unified_build = [
+ mozpath.join(self.environment.topsrcdir, line.strip())
+ for line in content
+ ]
+
+ def _build_cmd(self, cmd, filename, unified):
+ cmd = list(cmd)
+ # Maybe the file is in non-unified environment or it resides under a directory
+ # that can also be built in non-unified environment
+ if unified is None or any(
+ filename.startswith(path) for path in self.non_unified_build
+ ):
+ cmd.append(filename)
+ else:
+ cmd.append(unified)
+
+ return cmd
+
+ def _outputfile_path(self):
+ database_path = os.path.join(self.environment.topobjdir, "static-analysis")
+
+ if not os.path.exists(database_path):
+ os.mkdir(database_path)
+
+ # Output the database (a JSON file) to objdir/static-analysis/compile_commands.json
+ return mozpath.join(database_path, "compile_commands.json")