Use better defaults in the clang-tidy wrapper script (#61651)
Summary:
Pull Request resolved: https://github.com/pytorch/pytorch/pull/61651
This PR sets some QOL defaults to the clang-tidy wrapper script and refactors how defaults are set.
- Runs in parallel
- Custom executable (prints an error message to users asking them to install our custom build)
- `generate_build_files` can now be run as a script
Test Plan: Imported from OSS
Reviewed By: malfet, zhouzhuojie
Differential Revision: D29743661
Pulled By: 1ntEgr8
fbshipit-source-id: 256617d006a03e4ab96091593f5bb80c9b31a2d1
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index 27efda7..b063008 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -335,12 +335,10 @@
- name: Run clang-tidy
run: |
cd "${GITHUB_WORKSPACE}"
+ # The Docker image has our custom build, so we don't need to install it
python3 -m tools.linter.clang_tidy \
- --diff-file pr.diff \
- --parallel \
- --verbose \
- "$@" >"${GITHUB_WORKSPACE}"/clang-tidy-output.txt
- cat "${GITHUB_WORKSPACE}"/clang-tidy-output.txt
+ --clang-tidy-exe "$(which clang-tidy)" \
+ --diff-file pr.diff 2>&1 | tee "${GITHUB_WORKSPACE}"/clang-tidy-output.txt
- name: Annotate output
env:
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
diff --git a/tools/linter/clang_tidy/__main__.py b/tools/linter/clang_tidy/__main__.py
index 6567f43..2450931 100644
--- a/tools/linter/clang_tidy/__main__.py
+++ b/tools/linter/clang_tidy/__main__.py
@@ -9,6 +9,7 @@
from tools.linter.clang_tidy.run import run
from tools.linter.clang_tidy.generate_build_files import generate_build_files
+from tools.linter.install.clang_tidy import INSTALLATION_PATH
def clang_search_dirs() -> List[str]:
@@ -75,15 +76,19 @@
],
"paths": ["torch/csrc/"],
"include-dir": ["/usr/lib/llvm-11/include/openmp"] + clang_search_dirs(),
+ "clang-tidy-exe": INSTALLATION_PATH,
+ "parallel": True,
+ "compile-commands-dir": "build",
+ "config-file": ".clang-tidy",
}
def parse_args() -> argparse.Namespace:
- parser = argparse.ArgumentParser(description="Run Clang-Tidy (on your Git changes)")
+ parser = argparse.ArgumentParser(description="clang-tidy wrapper script")
parser.add_argument(
"-e",
"--clang-tidy-exe",
- default="clang-tidy",
+ default=DEFAULTS["clang-tidy-exe"],
help="Path to clang-tidy executable",
)
parser.add_argument(
@@ -106,7 +111,7 @@
parser.add_argument(
"-c",
"--compile-commands-dir",
- default="build",
+ default=DEFAULTS["compile-commands-dir"],
help="Path to the folder containing compile_commands.json",
)
parser.add_argument(
@@ -129,6 +134,7 @@
parser.add_argument("-v", "--verbose", action="store_true", help="Verbose output")
parser.add_argument(
"--config-file",
+ default=DEFAULTS["config-file"],
help="Path to a clang-tidy config file. Defaults to '.clang-tidy'.",
)
parser.add_argument(
@@ -141,6 +147,7 @@
"-j",
"--parallel",
action="store_true",
+ default=DEFAULTS["parallel"],
help="Run clang tidy in parallel per-file (requires ninja to be installed).",
)
parser.add_argument(
@@ -168,26 +175,26 @@
def main() -> None:
- if not pathlib.Path("build").exists():
- generate_build_files()
options = parse_args()
+ if not pathlib.Path("build").exists():
+ generate_build_files()
+
# Check if clang-tidy executable exists
- exists = os.access(options.clang_tidy_exe, os.X_OK) or shutil.which(
- options.clang_tidy_exe
- )
+ exists = os.access(options.clang_tidy_exe, os.X_OK)
+
if not exists:
msg = (
- "Could not find 'clang-tidy' binary\n"
+ "Could not find '.clang-tidy-bin/clang-tidy'\n"
"You can install it by running:\n"
" python3 tools/linter/install/clang_tidy.py"
)
- print(msg)
- exit(1)
+ raise RuntimeError(msg)
return_code = run(options)
if return_code != 0:
raise RuntimeError("Warnings found in clang-tidy output!")
-main()
+if __name__ == "__main__":
+ main()
diff --git a/tools/linter/clang_tidy/generate_build_files.py b/tools/linter/clang_tidy/generate_build_files.py
index 72107a3..822f818 100644
--- a/tools/linter/clang_tidy/generate_build_files.py
+++ b/tools/linter/clang_tidy/generate_build_files.py
@@ -60,3 +60,7 @@
update_submodules()
gen_compile_commands()
run_autogen()
+
+
+if __name__ == "__main__":
+ generate_build_files()
diff --git a/tools/linter/install/clang_tidy.py b/tools/linter/install/clang_tidy.py
index b2e82af..ad1a7c6 100644
--- a/tools/linter/install/clang_tidy.py
+++ b/tools/linter/install/clang_tidy.py
@@ -10,6 +10,7 @@
}
OUTPUT_DIR = os.path.join(PYTORCH_ROOT, ".clang-tidy-bin")
+INSTALLATION_PATH = os.path.join(OUTPUT_DIR, "clang-tidy")
if __name__ == "__main__":
ok = download("clang-tidy", OUTPUT_DIR, PLATFORM_TO_URL, PLATFORM_TO_HASH)