From 143a28de908f04bffa00984a77f3ced3bae763c7 Mon Sep 17 00:00:00 2001 From: GW_MC <72297530+GWMCwing@users.noreply.github.com> Date: Sat, 24 Jan 2026 17:14:32 +0800 Subject: [PATCH] feat: add support for build-time WiFi credentials from .env file --- .gitignore | 3 +++ CMakeLists.txt | 34 ++++++++++++++++++++++++++++++++++ main/network/wifi_handler.cpp | 13 +++++++++++++ 3 files changed, 50 insertions(+) diff --git a/.gitignore b/.gitignore index 33e9252..92e5491 100644 --- a/.gitignore +++ b/.gitignore @@ -85,3 +85,6 @@ Desktop.ini # sample code sample-code/ + +.env +*.env diff --git a/CMakeLists.txt b/CMakeLists.txt index 26eef5b..19d3ac1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,40 @@ cmake_minimum_required(VERSION 3.16) # target_compile_options(${COMPONENT_LIB} PRIVATE -std=c++23) +# Define the path to your .env file +set(ENV_FILE "${CMAKE_SOURCE_DIR}/.env") + +# Check if the .env file exists +if(EXISTS ${ENV_FILE}) + # Read the .env file line by line + file(STRINGS ${ENV_FILE} ENV_VARS) + + foreach(VAR ${ENV_VARS}) + # Use regex to extract the key and value + if (VAR MATCHES "([^=]+)=(.*)") + set(ENV{${CMAKE_MATCH_1}} ${CMAKE_MATCH_2}) + message(STATUS "Loaded environment variable from .env: ${CMAKE_MATCH_1}") + endif() + endforeach() +else() + message(STATUS ".env file not found at ${ENV_FILE}") +endif() + +# If build-time WiFi environment variables were loaded above, expose them +# as compile-time definitions so C++ can use them. +if(DEFINED ENV{WIFI_SSID}) + add_compile_definitions(BUILD_WIFI_SSID="$ENV{WIFI_SSID}") + message(STATUS "Added BUILD_WIFI_SSID compile definition") +else() + message(STATUS "WIFI_SSID not defined; skipping BUILD_WIFI_SSID compile definition") +endif() +if(DEFINED ENV{WIFI_PASSWORD}) + add_compile_definitions(BUILD_WIFI_PASSWORD="$ENV{WIFI_PASSWORD}") + message(STATUS "Added BUILD_WIFI_PASSWORD compile definition") +else() + message(STATUS "WIFI_PASSWORD not defined; skipping BUILD_WIFI_PASSWORD compile definition") +endif() + include($ENV{IDF_PATH}/tools/cmake/project.cmake) # "Trim" the build. Include the minimal set of components, main, and anything it depends on. idf_build_set_property(MINIMAL_BUILD ON) diff --git a/main/network/wifi_handler.cpp b/main/network/wifi_handler.cpp index 38d8d01..6d9f9e6 100644 --- a/main/network/wifi_handler.cpp +++ b/main/network/wifi_handler.cpp @@ -120,6 +120,19 @@ esp_err_t WifiHandler::init() { std::string password; this->get_wifi_credentials(ssid, password); + // If KV storage didn't provide credentials, allow build-time injected values + // via compile-time defines BUILD_WIFI_SSID and BUILD_WIFI_PASSWORD. +#if defined(BUILD_WIFI_SSID) and defined(BUILD_WIFI_PASSWORD) + if (ssid.empty()) { + ssid = std::string(BUILD_WIFI_SSID); + ESP_LOGI(TAG, "Using build-time injected WiFi SSID"); + } + if (password.empty()) { + password = std::string(BUILD_WIFI_PASSWORD); + ESP_LOGI(TAG, "Using build-time injected WiFi password"); + } +#endif + if (!ssid.empty() && !password.empty()) { ESP_LOGI(TAG, "Found stored WiFi credentials, connecting to SSID: %s", ssid.c_str()); err = this->connect(ssid, password);