mirror of
https://github.com/esphome/esphome.git
synced 2025-06-25 01:33:09 +01:00
Refactor clang-tidy script to use actual compiler flags and includes (#2133)
Co-authored-by: Otto winter <otto@otto-winter.com>
This commit is contained in:
@ -1,13 +1,14 @@
|
||||
import codecs
|
||||
import json
|
||||
import os.path
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
root_path = os.path.abspath(os.path.normpath(os.path.join(__file__, "..", "..")))
|
||||
basepath = os.path.join(root_path, "esphome")
|
||||
temp_header_file = os.path.join(root_path, ".temp-clang-tidy.cpp")
|
||||
temp_folder = os.path.join(root_path, ".temp")
|
||||
temp_header_file = os.path.join(temp_folder, "all-include.cpp")
|
||||
|
||||
|
||||
def shlex_quote(s):
|
||||
@ -33,63 +34,9 @@ def build_all_include():
|
||||
headers.sort()
|
||||
headers.append("")
|
||||
content = "\n".join(headers)
|
||||
with codecs.open(temp_header_file, "w", encoding="utf-8") as f:
|
||||
f.write(content)
|
||||
|
||||
|
||||
def build_compile_commands():
|
||||
gcc_flags_json = os.path.join(root_path, ".gcc-flags.json")
|
||||
if not os.path.isfile(gcc_flags_json):
|
||||
print("Could not find {} file which is required for clang-tidy.".format(gcc_flags_json))
|
||||
print(
|
||||
'Please run "pio init --ide atom" in the root esphome folder to generate that file.'
|
||||
)
|
||||
sys.exit(1)
|
||||
with codecs.open(gcc_flags_json, "r", encoding="utf-8") as f:
|
||||
gcc_flags = json.load(f)
|
||||
exec_path = gcc_flags["execPath"]
|
||||
include_paths = gcc_flags["gccIncludePaths"].split(",")
|
||||
includes = [f"-I{p}" for p in include_paths]
|
||||
cpp_flags = gcc_flags["gccDefaultCppFlags"].split(" ")
|
||||
defines = [flag for flag in cpp_flags if flag.startswith("-D")]
|
||||
command = [exec_path]
|
||||
command.extend(includes)
|
||||
command.extend(defines)
|
||||
command.append("-std=gnu++11")
|
||||
command.append("-Wall")
|
||||
command.append("-Wno-delete-non-virtual-dtor")
|
||||
command.append("-Wno-unused-variable")
|
||||
command.append("-Wunreachable-code")
|
||||
|
||||
source_files = []
|
||||
for path in walk_files(basepath):
|
||||
filetypes = (".cpp",)
|
||||
ext = os.path.splitext(path)[1]
|
||||
if ext in filetypes:
|
||||
source_files.append(os.path.abspath(path))
|
||||
source_files.append(temp_header_file)
|
||||
source_files.sort()
|
||||
compile_commands = [
|
||||
{
|
||||
"directory": root_path,
|
||||
"command": " ".join(
|
||||
shlex_quote(x) for x in (command + ["-o", p + ".o", "-c", p])
|
||||
),
|
||||
"file": p,
|
||||
}
|
||||
for p in source_files
|
||||
]
|
||||
compile_commands_json = os.path.join(root_path, "compile_commands.json")
|
||||
if os.path.isfile(compile_commands_json):
|
||||
with codecs.open(compile_commands_json, "r", encoding="utf-8") as f:
|
||||
try:
|
||||
if json.load(f) == compile_commands:
|
||||
return
|
||||
# pylint: disable=bare-except
|
||||
except:
|
||||
pass
|
||||
with codecs.open(compile_commands_json, "w", encoding="utf-8") as f:
|
||||
json.dump(compile_commands, f, indent=2)
|
||||
p = Path(temp_header_file)
|
||||
p.parent.mkdir(exist_ok=True)
|
||||
p.write_text(content)
|
||||
|
||||
|
||||
def walk_files(path):
|
||||
@ -153,3 +100,28 @@ def git_ls_files(patterns=None):
|
||||
output, err = proc.communicate()
|
||||
lines = [x.split() for x in output.decode("utf-8").splitlines()]
|
||||
return {s[3].strip(): int(s[0]) for s in lines}
|
||||
|
||||
|
||||
def load_idedata(environment):
|
||||
platformio_ini = Path(root_path) / "platformio.ini"
|
||||
temp_idedata = Path(temp_folder) / f"idedata-{environment}.json"
|
||||
if not platformio_ini.is_file() or not temp_idedata.is_file():
|
||||
changed = True
|
||||
elif platformio_ini.stat().st_mtime >= temp_idedata.stat().st_mtime:
|
||||
changed = True
|
||||
else:
|
||||
changed = False
|
||||
|
||||
if not changed:
|
||||
text = temp_idedata.read_text()
|
||||
else:
|
||||
stdout = subprocess.check_output(
|
||||
["pio", "run", "-t", "idedata", "-e", environment]
|
||||
)
|
||||
match = re.search(r'{\s*".*}', stdout.decode("utf-8"))
|
||||
text = match.group()
|
||||
|
||||
temp_idedata.parent.mkdir(exist_ok=True)
|
||||
temp_idedata.write_text(text)
|
||||
|
||||
return json.loads(text)
|
||||
|
Reference in New Issue
Block a user