mirror of
https://github.com/Z3Prover/z3
synced 2026-05-31 06:07:46 +00:00
add dependency checks to memory-safety and static-analysis
This commit is contained in:
parent
d74f610264
commit
ed5b1929f1
2 changed files with 29 additions and 3 deletions
|
|
@ -11,6 +11,7 @@ import argparse
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
import shutil
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
|
|
@ -32,6 +33,25 @@ LEAK_ERROR = re.compile(r"ERROR:\s*LeakSanitizer:")
|
||||||
LOCATION = re.compile(r"(\S+\.(?:cpp|c|h|hpp)):(\d+)")
|
LOCATION = re.compile(r"(\S+\.(?:cpp|c|h|hpp)):(\d+)")
|
||||||
|
|
||||||
|
|
||||||
|
def check_dependencies():
|
||||||
|
"""Fail early if required build tools are not on PATH."""
|
||||||
|
missing = []
|
||||||
|
if not shutil.which("cmake"):
|
||||||
|
missing.append(("cmake", "sudo apt install cmake"))
|
||||||
|
if not shutil.which("make"):
|
||||||
|
missing.append(("make", "sudo apt install build-essential"))
|
||||||
|
|
||||||
|
cc = shutil.which("clang") or shutil.which("gcc")
|
||||||
|
if not cc:
|
||||||
|
missing.append(("clang or gcc", "sudo apt install clang"))
|
||||||
|
|
||||||
|
if missing:
|
||||||
|
print("required tools not found:", file=sys.stderr)
|
||||||
|
for tool, install in missing:
|
||||||
|
print(f" {tool}: {install}", file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
def find_repo_root() -> Path:
|
def find_repo_root() -> Path:
|
||||||
d = Path.cwd()
|
d = Path.cwd()
|
||||||
for _ in range(10):
|
for _ in range(10):
|
||||||
|
|
@ -199,6 +219,7 @@ def main():
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
setup_logging(args.debug)
|
setup_logging(args.debug)
|
||||||
|
check_dependencies()
|
||||||
repo_root = find_repo_root()
|
repo_root = find_repo_root()
|
||||||
|
|
||||||
sanitizers = ["asan", "ubsan"] if args.sanitizer == "both" else [args.sanitizer]
|
sanitizers = ["asan", "ubsan"] if args.sanitizer == "both" else [args.sanitizer]
|
||||||
|
|
|
||||||
|
|
@ -34,9 +34,14 @@ def find_scan_build() -> str:
|
||||||
if path:
|
if path:
|
||||||
logger.debug("found scan-build: %s", path)
|
logger.debug("found scan-build: %s", path)
|
||||||
return path
|
return path
|
||||||
logger.error(
|
print(
|
||||||
"scan-build not found. Install clang-tools or set PATH. "
|
"scan-build not found on PATH.\n"
|
||||||
"Searched: %s", ", ".join(SCAN_BUILD_NAMES)
|
"Install one of the following:\n"
|
||||||
|
" Ubuntu/Debian: sudo apt install clang-tools\n"
|
||||||
|
" macOS: brew install llvm\n"
|
||||||
|
" Fedora: sudo dnf install clang-tools-extra\n"
|
||||||
|
f"searched for: {', '.join(SCAN_BUILD_NAMES)}",
|
||||||
|
file=sys.stderr,
|
||||||
)
|
)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue