mirror of
https://github.com/esphome/esphome.git
synced 2026-10-02 14:22:58 +08:00
[esp32] Run clang-tidy via the native ESP-IDF toolchain (#16748)
CI / Create common environment (push) Has been cancelled
CI / Check pylint (push) Has been cancelled
CI / Run script/ci-custom (push) Has been cancelled
CI / Check import esphome.__main__ time (push) Has been cancelled
CI / Test downstream esphome/device-builder (push) Has been cancelled
CI / Run pytest (macOS-latest, 3.11) (push) Has been cancelled
CI / Run pytest (macOS-latest, 3.14) (push) Has been cancelled
CI / Run pytest (ubuntu-latest, 3.11) (push) Has been cancelled
CI / Run pytest (ubuntu-latest, 3.13) (push) Has been cancelled
CI / Run pytest (ubuntu-latest, 3.14) (push) Has been cancelled
CI / Run pytest (windows-latest, 3.11) (push) Has been cancelled
CI / Run pytest (windows-latest, 3.14) (push) Has been cancelled
CI / Determine which jobs to run (push) Has been cancelled
CI / Run integration tests (${{ matrix.bucket.name }}) (push) Has been cancelled
CI / Run C++ unit tests (push) Has been cancelled
CI / Run CodSpeed benchmarks (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 IDF (push) Has been cancelled
CI / Run script/clang-tidy for ESP8266 (push) Has been cancelled
CI / Run script/clang-tidy for ZEPHYR (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 1/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 2/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 3/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 4/4 (push) Has been cancelled
CI / Test components batch (${{ matrix.components }}) (push) Has been cancelled
CI / Test components with native ESP-IDF (push) Has been cancelled
CI / pre-commit.ci lite (push) Has been cancelled
CI / Build target branch for memory impact (push) Has been cancelled
CI / Build PR branch for memory impact (push) Has been cancelled
CI / Comment memory impact (push) Has been cancelled
CI / CI Status (push) Has been cancelled
CI / Create common environment (push) Has been cancelled
CI / Check pylint (push) Has been cancelled
CI / Run script/ci-custom (push) Has been cancelled
CI / Check import esphome.__main__ time (push) Has been cancelled
CI / Test downstream esphome/device-builder (push) Has been cancelled
CI / Run pytest (macOS-latest, 3.11) (push) Has been cancelled
CI / Run pytest (macOS-latest, 3.14) (push) Has been cancelled
CI / Run pytest (ubuntu-latest, 3.11) (push) Has been cancelled
CI / Run pytest (ubuntu-latest, 3.13) (push) Has been cancelled
CI / Run pytest (ubuntu-latest, 3.14) (push) Has been cancelled
CI / Run pytest (windows-latest, 3.11) (push) Has been cancelled
CI / Run pytest (windows-latest, 3.14) (push) Has been cancelled
CI / Determine which jobs to run (push) Has been cancelled
CI / Run integration tests (${{ matrix.bucket.name }}) (push) Has been cancelled
CI / Run C++ unit tests (push) Has been cancelled
CI / Run CodSpeed benchmarks (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 IDF (push) Has been cancelled
CI / Run script/clang-tidy for ESP8266 (push) Has been cancelled
CI / Run script/clang-tidy for ZEPHYR (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 1/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 2/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 3/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 4/4 (push) Has been cancelled
CI / Test components batch (${{ matrix.components }}) (push) Has been cancelled
CI / Test components with native ESP-IDF (push) Has been cancelled
CI / pre-commit.ci lite (push) Has been cancelled
CI / Build target branch for memory impact (push) Has been cancelled
CI / Build PR branch for memory impact (push) Has been cancelled
CI / Comment memory impact (push) Has been cancelled
CI / CI Status (push) Has been cancelled
This commit is contained in:
+1
-1
@@ -1 +1 @@
|
||||
44db8a62d94c8fba83b95b73938db4377ebacc0adb504881387389f1cd8f2f3a
|
||||
0550a8ea4182dbc007660de060dd023ce22c865c8e95040a36f3d07a5b354fc6
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+24
-2
@@ -28,6 +28,12 @@ from helpers import (
|
||||
temp_header_file,
|
||||
)
|
||||
|
||||
# Limit the ESP-IDF tool install to esp32 for clang-tidy: the one xtensa-esp-elf
|
||||
# toolchain bundles the s2/s3 compilers too, so all xtensa tidy envs still
|
||||
# reconfigure while the large riscv32-esp-elf toolchain is skipped. Must be set
|
||||
# before esphome.espidf.framework is imported (lazily, via load_idedata).
|
||||
os.environ.setdefault("ESPHOME_IDF_DEFAULT_TARGETS", "esp32")
|
||||
|
||||
|
||||
def clang_options(idedata):
|
||||
cmd = []
|
||||
@@ -52,6 +58,10 @@ def clang_options(idedata):
|
||||
"-mfix-esp32-psram-cache-issue",
|
||||
"-mfix-esp32-psram-cache-strategy=memw",
|
||||
"-fno-tree-switch-conversion",
|
||||
# GCC-only flags emitted by the native ESP-IDF toolchain build
|
||||
"-freorder-blocks",
|
||||
"-fno-jump-tables",
|
||||
"-fno-shrink-wrap",
|
||||
)
|
||||
|
||||
if "zephyr" in triplet:
|
||||
@@ -97,8 +107,20 @@ def clang_options(idedata):
|
||||
]
|
||||
)
|
||||
|
||||
# copy compiler flags, except those clang doesn't understand.
|
||||
cmd.extend(flag for flag in idedata["cxx_flags"] if flag not in omit_flags)
|
||||
# Copy compiler flags, dropping: ones clang doesn't understand; -Werror*
|
||||
# (clang-tidy enforces .clang-tidy's WarningsAsErrors, and a build -Werror
|
||||
# would bypass the -clang-diagnostic-* suppressions); and -std= (the native
|
||||
# ESP-IDF build defaults to gnu++2b, but ESPHome compiles with gnu++20 per
|
||||
# platformio.ini -- analyzing as C++23 flags code that doesn't build under
|
||||
# gnu++20). Force gnu++20 to match the real build.
|
||||
cmd.extend(
|
||||
flag
|
||||
for flag in idedata["cxx_flags"]
|
||||
if flag not in omit_flags
|
||||
and not flag.startswith("-Werror")
|
||||
and not flag.startswith("-std=")
|
||||
)
|
||||
cmd.append("-std=gnu++20")
|
||||
|
||||
# defines
|
||||
cmd.extend(f"-D{define}" for define in idedata["defines"])
|
||||
|
||||
+21
-19
@@ -664,26 +664,22 @@ def load_idedata(environment: str) -> dict[str, Any]:
|
||||
start_time = time.time()
|
||||
print(f"Loading IDE data for environment '{environment}'...")
|
||||
|
||||
platformio_ini = Path(root_path) / "platformio.ini"
|
||||
# Reuse the clang-tidy input hash as the cache key: it already covers every
|
||||
# file baked into the generated idedata (platformio.ini, sdkconfig.defaults,
|
||||
# esphome/idf_component.yml), so this can't drift from that file list. A
|
||||
# content hash -- unlike an mtime comparison -- stays correct across git
|
||||
# checkouts, which don't preserve mtimes.
|
||||
from clang_tidy_hash import calculate_clang_tidy_hash
|
||||
|
||||
temp_idedata = Path(temp_folder) / f"idedata-{environment}.json"
|
||||
changed = False
|
||||
if (
|
||||
not platformio_ini.is_file()
|
||||
or not temp_idedata.is_file()
|
||||
or platformio_ini.stat().st_mtime >= temp_idedata.stat().st_mtime
|
||||
):
|
||||
changed = True
|
||||
temp_hash = Path(temp_folder) / f"idedata-{environment}.hash"
|
||||
|
||||
if "idf" in environment:
|
||||
# remove full sdkconfig when the defaults have changed so that it is regenerated
|
||||
default_sdkconfig = Path(root_path) / "sdkconfig.defaults"
|
||||
temp_sdkconfig = Path(temp_folder) / f"sdkconfig-{environment}"
|
||||
|
||||
if not temp_sdkconfig.is_file():
|
||||
changed = True
|
||||
elif default_sdkconfig.stat().st_mtime >= temp_sdkconfig.stat().st_mtime:
|
||||
temp_sdkconfig.unlink()
|
||||
changed = True
|
||||
cache_key = calculate_clang_tidy_hash()
|
||||
changed = (
|
||||
not temp_idedata.is_file()
|
||||
or not temp_hash.is_file()
|
||||
or temp_hash.read_text().strip() != cache_key
|
||||
)
|
||||
|
||||
if not changed:
|
||||
data = json.loads(temp_idedata.read_text())
|
||||
@@ -694,7 +690,12 @@ def load_idedata(environment: str) -> dict[str, Any]:
|
||||
# ensure temp directory exists before running pio, as it writes sdkconfig to it
|
||||
Path(temp_folder).mkdir(exist_ok=True)
|
||||
|
||||
if "nrf" in environment:
|
||||
platformio_ini = Path(root_path) / "platformio.ini"
|
||||
if "esp32" in environment:
|
||||
from esphome.espidf.clang_tidy import load_idedata as idf_load_idedata
|
||||
|
||||
data = idf_load_idedata(environment, temp_folder, platformio_ini)
|
||||
elif "nrf" in environment:
|
||||
from helpers_zephyr import load_idedata as zephyr_load_idedata
|
||||
|
||||
data = zephyr_load_idedata(environment, temp_folder, platformio_ini)
|
||||
@@ -705,6 +706,7 @@ def load_idedata(environment: str) -> dict[str, Any]:
|
||||
match = re.search(r'{\s*".*}', stdout.decode("utf-8"))
|
||||
data = json.loads(match.group())
|
||||
temp_idedata.write_text(json.dumps(data, indent=2) + "\n")
|
||||
temp_hash.write_text(cache_key + "\n")
|
||||
|
||||
elapsed = time.time() - start_time
|
||||
print(f"IDE data generated and cached in {elapsed:.2f} seconds")
|
||||
|
||||
+5
-10
@@ -1,15 +1,11 @@
|
||||
# ESP-IDF sdkconfig defaults used for development purposes only, not used during runtime. Used when PlatformIO is ran
|
||||
# directly from the source directory, e.g. by IDEs or for static analysis (clang-tidy). This should enable all flags
|
||||
# that are set by any component.
|
||||
# ESP-IDF sdkconfig defaults used for development purposes only, not used during runtime. Used for static analysis
|
||||
# (clang-tidy) -- by both the PlatformIO and the native ESP-IDF toolchain paths -- and when PlatformIO is run directly
|
||||
# from the source directory (e.g. by IDEs). This should enable all flags that are set by any component.
|
||||
|
||||
# esp32
|
||||
CONFIG_COMPILER_OPTIMIZATION_DEFAULT=n
|
||||
CONFIG_COMPILER_OPTIMIZATION_SIZE=y
|
||||
CONFIG_PARTITION_TABLE_CUSTOM=y
|
||||
#CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv"
|
||||
CONFIG_PARTITION_TABLE_SINGLE_APP=n
|
||||
CONFIG_FREERTOS_HZ=1000
|
||||
CONFIG_ESP_TASK_WDT=y
|
||||
CONFIG_ESP_TASK_WDT_INIT=y
|
||||
CONFIG_ESP_TASK_WDT_PANIC=y
|
||||
CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=n
|
||||
CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=n
|
||||
@@ -18,8 +14,7 @@ CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=n
|
||||
CONFIG_BT_ENABLED=y
|
||||
|
||||
# esp32_camera
|
||||
CONFIG_RTCIO_SUPPORT_RTC_GPIO_DESC=y
|
||||
CONFIG_ESP32_SPIRAM_SUPPORT=y
|
||||
CONFIG_SPIRAM=y
|
||||
|
||||
# zigbee
|
||||
CONFIG_ZB_ENABLED=y
|
||||
|
||||
Reference in New Issue
Block a user