mirror of
https://github.com/esphome/esphome.git
synced 2026-10-17 19:52:50 +00:00
[ci] Add a host clang-tidy environment and job (#20747)
This commit is contained in:
@@ -81,8 +81,8 @@ jobs:
|
||||
- name: Install apt packages (cached)
|
||||
uses: awalsh128/cache-apt-pkgs-action@553a35bb8ebd9fcabcb1c9451aa4c98e1b4ca8a9 # v1.6.3
|
||||
with:
|
||||
packages: libsdl2-dev ccache
|
||||
version: 1.1
|
||||
packages: libsdl2-dev libmbedtls-dev ccache
|
||||
version: 1.2
|
||||
|
||||
determine-jobs:
|
||||
name: Determine which jobs to run
|
||||
@@ -415,8 +415,8 @@ jobs:
|
||||
timeout-minutes: 10
|
||||
uses: awalsh128/cache-apt-pkgs-action@553a35bb8ebd9fcabcb1c9451aa4c98e1b4ca8a9 # v1.6.3
|
||||
with:
|
||||
packages: libsdl2-dev ccache
|
||||
version: 1.1
|
||||
packages: libsdl2-dev libmbedtls-dev ccache
|
||||
version: 1.2
|
||||
- name: Set up Python 3.13
|
||||
id: python
|
||||
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
||||
@@ -695,6 +695,10 @@ jobs:
|
||||
name: Run script/clang-tidy for RP2
|
||||
options: --environment rp2-tidy --grep USE_RP2
|
||||
pio_cache_key: tidyrp2
|
||||
- id: clang-tidy
|
||||
name: Run script/clang-tidy for host
|
||||
options: --environment host-tidy --grep USE_HOST
|
||||
pio_cache_key: tidyhost
|
||||
- id: clang-tidy
|
||||
name: Run script/clang-tidy for LibreTiny
|
||||
environments: bk72xx-tidy ln882h-tidy rtl87xxb-tidy rtl87xxc-tidy
|
||||
@@ -707,6 +711,16 @@ jobs:
|
||||
with:
|
||||
# Need history for HEAD~1 to work for checking changed files
|
||||
fetch-depth: 2
|
||||
- name: Install apt packages (cached)
|
||||
if: matrix.pio_cache_key == 'tidyhost'
|
||||
# libsdl2-dev is needed by the sdl component on the host, libmbedtls-dev
|
||||
# by dsmr and dlms_meter. Packages and version must match seed-apt-cache
|
||||
# exactly.
|
||||
timeout-minutes: 10
|
||||
uses: awalsh128/cache-apt-pkgs-action@553a35bb8ebd9fcabcb1c9451aa4c98e1b4ca8a9 # v1.6.3
|
||||
with:
|
||||
packages: libsdl2-dev libmbedtls-dev ccache
|
||||
version: 1.2
|
||||
|
||||
- name: Restore Python
|
||||
id: restore-python
|
||||
@@ -1102,8 +1116,8 @@ jobs:
|
||||
timeout-minutes: 10
|
||||
uses: awalsh128/cache-apt-pkgs-action@553a35bb8ebd9fcabcb1c9451aa4c98e1b4ca8a9 # v1.6.3
|
||||
with:
|
||||
packages: libsdl2-dev ccache
|
||||
version: 1.1
|
||||
packages: libsdl2-dev libmbedtls-dev ccache
|
||||
version: 1.2
|
||||
|
||||
- name: Check out code from GitHub
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
|
||||
@@ -59,8 +59,8 @@ namespace esphome::host {
|
||||
char **get_argv() { return s_argv; }
|
||||
|
||||
const std::string &get_exe_path() {
|
||||
static const std::string empty;
|
||||
return s_exe_path != nullptr ? *s_exe_path : empty;
|
||||
static const std::string EMPTY;
|
||||
return s_exe_path != nullptr ? *s_exe_path : EMPTY;
|
||||
}
|
||||
|
||||
void arm_reexec(const std::string &path) {
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include "esphome/core/log.h"
|
||||
#include "core.h"
|
||||
|
||||
#include <time.h>
|
||||
#include <ctime>
|
||||
#include <unistd.h>
|
||||
#include <cerrno>
|
||||
#include <cstdlib>
|
||||
|
||||
@@ -39,8 +39,8 @@ bool Mutex::try_lock() { return static_cast<std::mutex *>(handle_)->try_lock();
|
||||
void Mutex::unlock() { static_cast<std::mutex *>(handle_)->unlock(); }
|
||||
|
||||
void get_mac_address_raw(uint8_t *mac) { // NOLINT(readability-non-const-parameter)
|
||||
static const uint8_t esphome_host_mac_address[MAC_ADDRESS_SIZE] = USE_ESPHOME_HOST_MAC_ADDRESS;
|
||||
memcpy(mac, esphome_host_mac_address, sizeof(esphome_host_mac_address));
|
||||
static constexpr uint8_t HOST_MAC_ADDRESS[MAC_ADDRESS_SIZE] = USE_ESPHOME_HOST_MAC_ADDRESS;
|
||||
memcpy(mac, HOST_MAC_ADDRESS, sizeof(HOST_MAC_ADDRESS));
|
||||
}
|
||||
|
||||
} // namespace esphome
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
#include <filesystem>
|
||||
#include <fstream>
|
||||
#include <utility>
|
||||
#include "preferences.h"
|
||||
#include "esphome/core/application.h"
|
||||
#include "esphome/core/log.h"
|
||||
@@ -45,11 +46,10 @@ void HostPreferences::setup_() {
|
||||
break;
|
||||
if (fread(&len, sizeof(len), 1, fp) != 1)
|
||||
break;
|
||||
uint8_t data[len];
|
||||
if (fread(data, sizeof(uint8_t), len, fp) != len)
|
||||
std::vector<uint8_t> data(len);
|
||||
if (fread(data.data(), sizeof(uint8_t), len, fp) != len)
|
||||
break;
|
||||
std::vector vec(data, data + len);
|
||||
this->data_[key] = vec;
|
||||
this->data_[key] = std::move(data);
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ std::shared_ptr<HttpContainer> HttpRequestHost::perform(const char *url, const c
|
||||
for (const auto &[name, value] : request_headers) {
|
||||
h_headers.emplace(name, value);
|
||||
}
|
||||
httplib::Client client(scheme_host.c_str());
|
||||
httplib::Client client(scheme_host);
|
||||
if (!client.is_valid()) {
|
||||
ESP_LOGE(TAG, "HTTP Request failed; Invalid URL: %s", url);
|
||||
return nullptr;
|
||||
@@ -114,7 +114,7 @@ std::shared_ptr<HttpContainer> HttpRequestHost::perform(const char *url, const c
|
||||
}
|
||||
|
||||
container->content_length = container->response_body_.size();
|
||||
for (auto header : response.headers) {
|
||||
for (const auto &header : response.headers) {
|
||||
ESP_LOGD(TAG, "Header: %s: %s", header.first.c_str(), header.second.c_str());
|
||||
auto lower_name = str_lower_case(header.first); // NOLINT
|
||||
if (should_collect_header(lower_case_collect_headers, lower_name)) {
|
||||
|
||||
@@ -32,7 +32,7 @@ ESPHOME_LOG_TAG(TAG, "ota");
|
||||
constexpr size_t MAX_OTA_SIZE = 256u * 1024u * 1024u; // 256 MiB
|
||||
constexpr size_t HEADER_PEEK_SIZE = 64;
|
||||
|
||||
ssize_t read_header_(const char *path, uint8_t *buf, size_t len) {
|
||||
ssize_t read_header(const char *path, uint8_t *buf, size_t len) {
|
||||
int fd = ::open(path, O_RDONLY);
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
@@ -50,7 +50,7 @@ struct ElfIdent {
|
||||
uint16_t e_type;
|
||||
};
|
||||
|
||||
ElfIdent parse_elf_(const uint8_t *buf, size_t len) {
|
||||
ElfIdent parse_elf(const uint8_t *buf, size_t len) {
|
||||
ElfIdent out{};
|
||||
if (len < EI_NIDENT + 4)
|
||||
return out;
|
||||
@@ -76,17 +76,17 @@ ElfIdent parse_elf_(const uint8_t *buf, size_t len) {
|
||||
return out;
|
||||
}
|
||||
|
||||
bool validate_elf_(const char *staging_path, const std::string &exe_path) {
|
||||
bool validate_elf(const char *staging_path, const std::string &exe_path) {
|
||||
uint8_t new_buf[HEADER_PEEK_SIZE];
|
||||
uint8_t cur_buf[HEADER_PEEK_SIZE];
|
||||
ssize_t new_n = read_header_(staging_path, new_buf, sizeof(new_buf));
|
||||
ssize_t cur_n = read_header_(exe_path.c_str(), cur_buf, sizeof(cur_buf));
|
||||
ssize_t new_n = read_header(staging_path, new_buf, sizeof(new_buf));
|
||||
ssize_t cur_n = read_header(exe_path.c_str(), cur_buf, sizeof(cur_buf));
|
||||
if (new_n < static_cast<ssize_t>(EI_NIDENT + 4) || cur_n < static_cast<ssize_t>(EI_NIDENT + 4)) {
|
||||
ESP_LOGE(TAG, "ELF header read failed");
|
||||
return false;
|
||||
}
|
||||
ElfIdent new_id = parse_elf_(new_buf, new_n);
|
||||
ElfIdent cur_id = parse_elf_(cur_buf, cur_n);
|
||||
ElfIdent new_id = parse_elf(new_buf, new_n);
|
||||
ElfIdent cur_id = parse_elf(cur_buf, cur_n);
|
||||
if (!new_id.valid) {
|
||||
ESP_LOGE(TAG, "Uploaded payload is not a valid ELF");
|
||||
return false;
|
||||
@@ -122,7 +122,7 @@ struct MachOIdent {
|
||||
uint32_t cpusubtype;
|
||||
};
|
||||
|
||||
MachOIdent parse_macho_(const uint8_t *buf, size_t len) {
|
||||
MachOIdent parse_macho(const uint8_t *buf, size_t len) {
|
||||
MachOIdent out{};
|
||||
// mach_header is the common prefix of mach_header and mach_header_64;
|
||||
// cputype/cpusubtype/filetype have identical offsets in both.
|
||||
@@ -153,18 +153,18 @@ MachOIdent parse_macho_(const uint8_t *buf, size_t len) {
|
||||
return out;
|
||||
}
|
||||
|
||||
bool validate_macho_(const char *staging_path, const std::string &exe_path) {
|
||||
bool validate_macho(const char *staging_path, const std::string &exe_path) {
|
||||
uint8_t new_buf[HEADER_PEEK_SIZE];
|
||||
uint8_t cur_buf[HEADER_PEEK_SIZE];
|
||||
ssize_t new_n = read_header_(staging_path, new_buf, sizeof(new_buf));
|
||||
ssize_t cur_n = read_header_(exe_path.c_str(), cur_buf, sizeof(cur_buf));
|
||||
ssize_t new_n = read_header(staging_path, new_buf, sizeof(new_buf));
|
||||
ssize_t cur_n = read_header(exe_path.c_str(), cur_buf, sizeof(cur_buf));
|
||||
if (new_n < static_cast<ssize_t>(sizeof(struct mach_header)) ||
|
||||
cur_n < static_cast<ssize_t>(sizeof(struct mach_header))) {
|
||||
ESP_LOGE(TAG, "Mach-O header read failed");
|
||||
return false;
|
||||
}
|
||||
MachOIdent new_id = parse_macho_(new_buf, new_n);
|
||||
MachOIdent cur_id = parse_macho_(cur_buf, cur_n);
|
||||
MachOIdent new_id = parse_macho(new_buf, new_n);
|
||||
MachOIdent cur_id = parse_macho(cur_buf, cur_n);
|
||||
if (!new_id.valid) {
|
||||
ESP_LOGE(TAG, "Uploaded payload is not a valid thin Mach-O executable");
|
||||
return false;
|
||||
@@ -182,11 +182,11 @@ bool validate_macho_(const char *staging_path, const std::string &exe_path) {
|
||||
}
|
||||
#endif // __APPLE__
|
||||
|
||||
bool validate_executable_(const char *staging_path, const std::string &exe_path) {
|
||||
bool validate_executable(const char *staging_path, const std::string &exe_path) {
|
||||
#ifdef __linux__
|
||||
return validate_elf_(staging_path, exe_path);
|
||||
return validate_elf(staging_path, exe_path);
|
||||
#elif defined(__APPLE__)
|
||||
return validate_macho_(staging_path, exe_path);
|
||||
return validate_macho(staging_path, exe_path);
|
||||
#else
|
||||
(void) staging_path;
|
||||
(void) exe_path;
|
||||
@@ -298,7 +298,7 @@ OTAResponseTypes HostOTABackend::end() {
|
||||
::close(this->fd_);
|
||||
this->fd_ = -1;
|
||||
|
||||
if (!validate_executable_(this->staging_path_.c_str(), this->final_path_)) {
|
||||
if (!validate_executable(this->staging_path_.c_str(), this->final_path_)) {
|
||||
::unlink(this->staging_path_.c_str());
|
||||
this->staging_path_.clear();
|
||||
return OTA_RESPONSE_ERROR_UPDATE_END;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "prometheus_handler.h"
|
||||
#ifdef USE_NETWORK
|
||||
#if defined(USE_NETWORK) && !defined(USE_HOST)
|
||||
#include "esphome/core/application.h"
|
||||
|
||||
namespace esphome::prometheus {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
#include "esphome/core/defines.h"
|
||||
#if defined(USE_NETWORK) && !defined(USE_ZEPHYR)
|
||||
#if defined(USE_NETWORK) && !defined(USE_ZEPHYR) && !defined(USE_HOST)
|
||||
#include <map>
|
||||
#include <utility>
|
||||
|
||||
|
||||
@@ -157,7 +157,7 @@ void Sdl::draw_pixels_at(int x_start, int y_start, int w, int h, const uint8_t *
|
||||
Display::draw_pixels_at(x_start, y_start, w, h, ptr, order, bitness, big_endian, x_offset, y_offset, x_pad);
|
||||
} else {
|
||||
auto stride = x_offset + w + x_pad;
|
||||
auto data = ptr + (stride * y_offset + x_offset) * 2;
|
||||
const auto *data = ptr + (stride * y_offset + x_offset) * 2;
|
||||
SDL_UpdateTexture(this->texture_, &rect, data, stride * 2);
|
||||
}
|
||||
this->redraw_(rect);
|
||||
@@ -199,7 +199,7 @@ void Sdl::process_key(uint32_t keycode, bool down) {
|
||||
callback->second(down);
|
||||
}
|
||||
|
||||
Sdl *Sdl::instance_for_window_(uint32_t window_id) {
|
||||
Sdl *Sdl::instance_for_window(uint32_t window_id) {
|
||||
SDL_Window *window = SDL_GetWindowFromID(window_id);
|
||||
if (window == nullptr)
|
||||
return nullptr;
|
||||
@@ -293,7 +293,7 @@ void Sdl::loop() {
|
||||
continue;
|
||||
}
|
||||
|
||||
Sdl *target = instance_for_window_(window_id);
|
||||
Sdl *target = instance_for_window(window_id);
|
||||
if (target == nullptr) {
|
||||
// Nothing to route this to: the window has gone, or it is not one of ours. Say so, otherwise
|
||||
// input that stops working leaves no trace at all.
|
||||
|
||||
@@ -42,7 +42,7 @@ class Sdl final : public display::Display, public snapshot::Snapshot {
|
||||
float get_setup_priority() const override { return setup_priority::HARDWARE; }
|
||||
void dump_config() override { LOG_DISPLAY("", "SDL", this); }
|
||||
template<typename F> void add_key_listener(int32_t keycode, F &&callback) {
|
||||
if (!this->key_callbacks_.count(keycode)) {
|
||||
if (!this->key_callbacks_.contains(keycode)) {
|
||||
this->key_callbacks_[keycode] = CallbackManager<void(bool)>();
|
||||
}
|
||||
this->key_callbacks_[keycode].add(std::forward<F>(callback));
|
||||
@@ -66,7 +66,7 @@ class Sdl final : public display::Display, public snapshot::Snapshot {
|
||||
bool capture_bgr(uint8_t *dest, size_t row_stride) override;
|
||||
void handle_event_(const SDL_Event &event);
|
||||
/// The display owning the given window, or nullptr if it is not one of ours.
|
||||
static Sdl *instance_for_window_(uint32_t window_id);
|
||||
static Sdl *instance_for_window(uint32_t window_id);
|
||||
SDL_Renderer *renderer_{};
|
||||
SDL_Window *window_{};
|
||||
SDL_Texture *texture_{};
|
||||
|
||||
@@ -50,9 +50,9 @@ struct BitWriter {
|
||||
uint32_t buffer{0};
|
||||
unsigned count{0};
|
||||
|
||||
void put(uint32_t code, unsigned size) {
|
||||
this->buffer |= code << this->count;
|
||||
this->count += size;
|
||||
void put(uint32_t value, unsigned bits) {
|
||||
this->buffer |= value << this->count;
|
||||
this->count += bits;
|
||||
while (this->count >= 8) {
|
||||
this->out.push_back(static_cast<uint8_t>(this->buffer & 0xFF));
|
||||
this->buffer >>= 8;
|
||||
|
||||
@@ -55,7 +55,7 @@ std::string sanitise_filename(const char *const name, const char *extension, boo
|
||||
break;
|
||||
}
|
||||
char c = *p;
|
||||
if (!(std::isalnum(static_cast<unsigned char>(c)) || c == '.' || c == '_' || c == '-')) {
|
||||
if (!std::isalnum(static_cast<unsigned char>(c)) && c != '.' && c != '_' && c != '-') {
|
||||
c = '_';
|
||||
changed = true;
|
||||
}
|
||||
|
||||
@@ -9,11 +9,11 @@
|
||||
#error This HostUartComponent implementation is not supported on this host OS
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <cerrno>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <termios.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
@@ -210,7 +210,6 @@ void HostUartComponent::write_array(const uint8_t *data, size_t len) {
|
||||
this->debug_callback_.call(UART_DIRECTION_TX, data[i]);
|
||||
}
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
bool HostUartComponent::peek_byte(uint8_t *data) {
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
#ifdef USE_HOST
|
||||
|
||||
#include <utility>
|
||||
|
||||
#include "esphome/core/component.h"
|
||||
#include "esphome/core/log.h"
|
||||
#include "uart_component.h"
|
||||
@@ -10,7 +12,7 @@ namespace esphome::uart {
|
||||
|
||||
class HostUartComponent final : public UARTComponent, public Component {
|
||||
public:
|
||||
virtual ~HostUartComponent();
|
||||
~HostUartComponent();
|
||||
void setup() override;
|
||||
void dump_config() override;
|
||||
float get_setup_priority() const override { return setup_priority::BUS; }
|
||||
@@ -19,7 +21,7 @@ class HostUartComponent final : public UARTComponent, public Component {
|
||||
bool read_array(uint8_t *data, size_t len) override;
|
||||
size_t available() override;
|
||||
UARTFlushResult flush() override;
|
||||
void set_name(std::string port_name) { port_name_ = port_name; };
|
||||
void set_name(std::string port_name) { this->port_name_ = std::move(port_name); }
|
||||
|
||||
protected:
|
||||
void update_error_(const std::string &error);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "web_server_base.h"
|
||||
#if defined(USE_NETWORK) && !defined(USE_ZEPHYR)
|
||||
#if defined(USE_NETWORK) && !defined(USE_ZEPHYR) && !defined(USE_HOST)
|
||||
|
||||
namespace esphome::web_server_base {
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
#include "esphome/core/defines.h"
|
||||
#if defined(USE_NETWORK) && !defined(USE_ZEPHYR)
|
||||
#if defined(USE_NETWORK) && !defined(USE_ZEPHYR) && !defined(USE_HOST)
|
||||
#include <vector>
|
||||
|
||||
#include "esphome/core/progmem.h"
|
||||
|
||||
@@ -331,7 +331,7 @@
|
||||
#define USE_NOISE
|
||||
#define USE_NOISE_SPARE_EPHEMERAL
|
||||
#define USE_SHA256
|
||||
#ifndef USE_RP2 // no MQTT backend or esp_wireguard library on RP2
|
||||
#if !defined(USE_RP2) && !defined(USE_HOST) // no MQTT backend or esp_wireguard library on RP2 and host
|
||||
#define USE_MQTT
|
||||
#define USE_MQTT_COVER_JSON
|
||||
#define USE_WIREGUARD
|
||||
@@ -420,7 +420,9 @@
|
||||
#define USE_ESPNOW
|
||||
#define USE_ESPNOW_MAX_PAYLOAD_SIZE 1470
|
||||
|
||||
#ifndef USE_HOST // web_server, captive_portal: no ESPAsyncWebServer on host
|
||||
#define USE_CAPTIVE_PORTAL
|
||||
#endif
|
||||
#define USE_WIFI_SCAN_RESULTS_LOCK
|
||||
#define USE_ESP32_BLE
|
||||
#define USE_ESP32_BLE_MAX_CONNECTIONS 3
|
||||
@@ -478,6 +480,7 @@
|
||||
#define USE_SPI
|
||||
#define USE_SPI_PSRAM_DMA
|
||||
#define USE_VOICE_ASSISTANT
|
||||
#ifndef USE_HOST
|
||||
#define USE_WEBSERVER
|
||||
#define USE_WEBSERVER_AUTH
|
||||
#define USE_WEBSERVER_AUTH_DIGEST
|
||||
@@ -489,6 +492,7 @@
|
||||
#define USE_WEBSERVER_ALLOWED_ORIGINS
|
||||
#define WEB_SERVER_DEFAULT_HEADERS_COUNT 1
|
||||
#define USE_CAPTIVE_PORTAL_GZIP
|
||||
#endif
|
||||
#define USE_WIFI_11KV_SUPPORT
|
||||
#define USE_WIFI_FAST_CONNECT
|
||||
#define USE_WIFI_FAST_CONNECT_IN_FLASH
|
||||
@@ -691,6 +695,8 @@
|
||||
#endif
|
||||
|
||||
#ifdef USE_HOST
|
||||
#define USE_ESPHOME_HOST_MAC_ADDRESS \
|
||||
{ 0x98, 0x35, 0x69, 0xab, 0xf6, 0x79 }
|
||||
#define USE_HTTP_REQUEST_RESPONSE
|
||||
// Host only: the uart arm would shadow the native logger UART arms in other envs
|
||||
#define USE_IMPROV_SERIAL_UART
|
||||
|
||||
@@ -654,6 +654,23 @@ build_flags =
|
||||
build_unflags =
|
||||
${common.build_unflags}
|
||||
|
||||
[env:host-tidy]
|
||||
extends = env:host
|
||||
; every library a header under esphome/ may include: a missing one is a
|
||||
; fatal error that breaks the all-include analysis for every later header
|
||||
lib_deps =
|
||||
${common.lib_deps}
|
||||
${common:idf-component-libs.lib_deps}
|
||||
${env:host.lib_deps}
|
||||
build_flags =
|
||||
${env:host.build_flags}
|
||||
${flags:clangtidy.build_flags}
|
||||
; analyze with the same language model as the embedded targets
|
||||
-fno-exceptions
|
||||
-fno-rtti
|
||||
-I/usr/include/SDL2 ; sdl
|
||||
-D__LINUX__ ; runtime_image: JPEGDEC's host detection, see its __init__.py
|
||||
|
||||
;;;;;;;; nRF52 ;;;;;;;;
|
||||
|
||||
[env:nrf52]
|
||||
|
||||
+33
-9
@@ -68,6 +68,9 @@ def clang_options(idedata, environment):
|
||||
|
||||
# extract target architecture from triplet in g++ filename
|
||||
triplet = Path(idedata["cxx_path"]).name[:-4]
|
||||
# env:host compiles with the system g++, so there is no triplet and the
|
||||
# host's own target and headers are the right ones.
|
||||
native = environment.startswith("host")
|
||||
if triplet.startswith("xtensa-"):
|
||||
# clang has an Xtensa frontend, but only a generic core -- the esp32 IDF
|
||||
# toolchain headers (xtruntime, xtensa/config) need the GCC core config
|
||||
@@ -83,6 +86,8 @@ def clang_options(idedata, environment):
|
||||
cmd.append("-D__XTENSA__")
|
||||
cmd.append("-D__XTENSA_EL__")
|
||||
cmd.append("-D_LIBC")
|
||||
elif native:
|
||||
cmd.append("-Qunused-arguments")
|
||||
else:
|
||||
# RISC-V (and other non-Xtensa targets) have a real clang backend, so
|
||||
# compile for the actual triplet. Espressif's RISC-V GCC -march adds
|
||||
@@ -118,7 +123,7 @@ def clang_options(idedata, environment):
|
||||
"-mfp16-format=ieee",
|
||||
"--param=min-pagesize=0",
|
||||
)
|
||||
else:
|
||||
elif not native:
|
||||
cmd.extend(
|
||||
[
|
||||
# disable built-in include directories from the host
|
||||
@@ -127,10 +132,11 @@ def clang_options(idedata, environment):
|
||||
)
|
||||
|
||||
# set flags
|
||||
if not native:
|
||||
# disable built-in include directories from the host
|
||||
cmd.append("-nostdinc")
|
||||
cmd.extend(
|
||||
[
|
||||
# disable built-in include directories from the host
|
||||
"-nostdinc",
|
||||
# allow to condition code on the presence of clang-tidy
|
||||
"-DCLANG_TIDY",
|
||||
# (esp-idf) Fix __once_callable in some libstdc++ headers
|
||||
@@ -314,11 +320,17 @@ def run_tidy(
|
||||
if args.environment.startswith(("rp2", "bk72xx", "ln882h", "rtl87xx")):
|
||||
# MMIO peripheral access on these bare-metal platforms is all
|
||||
# fixed-address.
|
||||
disabled_checks.append("-clang-analyzer-core.FixedAddressDereference")
|
||||
if args.environment.startswith("host"):
|
||||
# glibc's assert() expands to a call the check mistakes for a
|
||||
# constant condition.
|
||||
disabled_checks += ["-misc-static-assert", "-cert-dcl03-c"]
|
||||
if args.environment.startswith(("rp2", "bk72xx", "ln882h", "rtl87xx", "host")):
|
||||
# bugprone-pointer-arithmetic-on-polymorphic-object (and its
|
||||
# cert-ctr56-cpp alias) crashes clang-tidy 22 with infinite matcher
|
||||
# recursion on lvgl_esphome.h under the RP2 defines.
|
||||
# recursion on lvgl_esphome.h under the RP2 defines and on the
|
||||
# all-include file under the host defines.
|
||||
disabled_checks += [
|
||||
"-clang-analyzer-core.FixedAddressDereference",
|
||||
"-bugprone-pointer-arithmetic-on-polymorphic-object",
|
||||
"-cert-ctr56-cpp",
|
||||
]
|
||||
@@ -327,6 +339,8 @@ def run_tidy(
|
||||
if disabled_checks:
|
||||
invocation.append("--checks=" + ",".join(disabled_checks))
|
||||
invocation.append(f"--header-filter={Path(basepath).resolve()}/.*")
|
||||
# Vendored third-party headers are kept as upstream wrote them.
|
||||
invocation.append("--exclude-header-filter=.*/http_request/httplib\\.h")
|
||||
invocation.append(str(Path(path).resolve()))
|
||||
invocation.append("--")
|
||||
invocation.extend(options)
|
||||
@@ -448,6 +462,11 @@ def main():
|
||||
|
||||
if args.grep:
|
||||
files = filter_grep(files, args.grep)
|
||||
# Not every tidy environment carries googletest (LibreTiny does not),
|
||||
# so a platform grep that matched a unit test would fail on
|
||||
# <gtest/gtest.h>. The tests are analyzed by the full ESP32 IDF run,
|
||||
# which has no --grep.
|
||||
files = [f for f in files if not f.startswith("tests/")]
|
||||
|
||||
if args.exclude_grep:
|
||||
excluded = set(filter_grep(files, args.exclude_grep))
|
||||
@@ -464,11 +483,16 @@ def main():
|
||||
|
||||
# Add header file for checking (before early exit check)
|
||||
if args.all_headers and args.split_at in (None, 1):
|
||||
all_headers = [
|
||||
os.path.relpath(p, cwd) for p in git_ls_files(["esphome/**/*.h"])
|
||||
]
|
||||
# The path filter applies to headers too: a component left out because
|
||||
# it does not build in this environment must not come back via the
|
||||
# all-include file.
|
||||
if args.files:
|
||||
all_headers = [p for p in all_headers if file_name_re.search(p)]
|
||||
# When --changed is used, only include changed headers instead of all headers
|
||||
if args.changed:
|
||||
all_headers = [
|
||||
os.path.relpath(p, cwd) for p in git_ls_files(["esphome/**/*.h"])
|
||||
]
|
||||
changed_headers = filter_changed(all_headers)
|
||||
if changed_headers:
|
||||
build_all_include(changed_headers)
|
||||
@@ -476,7 +500,7 @@ def main():
|
||||
else:
|
||||
print("No changed headers to check")
|
||||
else:
|
||||
build_all_include()
|
||||
build_all_include(all_headers)
|
||||
files.insert(0, temp_header_file)
|
||||
print(f"Added all-include header file, new total: {len(files)}")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user