# The fixture's one input is fixture.env at the project root: KEY=value # lines, read here into a generated header. No file, or a required key # left empty, stops the build with the reason. set(FIXTURE_ENV "${CMAKE_CURRENT_LIST_DIR}/../fixture.env") if(NOT EXISTS "${FIXTURE_ENV}") message(FATAL_ERROR "fixture.env not found at ${FIXTURE_ENV}: copy fixture.env.example to " "fixture.env and fill in WIFI_SSID, WIFI_PSK and API_KEY (./fixture.sh env does it)") endif() set(FIXTURE_WIFI_SSID "") set(FIXTURE_WIFI_PSK "") set(FIXTURE_API_KEY "") set(FIXTURE_HOSTNAME "") # Read the file whole and split on newlines ourselves: file(STRINGS) # would also split on semicolons, which a passphrase may carry. file(READ "${FIXTURE_ENV}" _env_text) string(REPLACE ";" "\\;" _env_text "${_env_text}") string(REGEX REPLACE "\r?\n" ";" _env_lines "${_env_text}") foreach(_line IN LISTS _env_lines) if(_line MATCHES "^[ \t]*#" OR _line MATCHES "^[ \t]*$") continue() endif() if(_line MATCHES "^[ \t]*([A-Za-z_][A-Za-z0-9_]*)[ \t]*=(.*)$") set(_key "${CMAKE_MATCH_1}") set(_val "${CMAKE_MATCH_2}") string(STRIP "${_val}" _val) string(REGEX REPLACE "^\"(.*)\"$" "\\1" _val "${_val}") string(REGEX REPLACE "^'(.*)'$" "\\1" _val "${_val}") set(FIXTURE_${_key} "${_val}") else() message(FATAL_ERROR "fixture.env: cannot read line: ${_line}") endif() endforeach() foreach(_key WIFI_SSID API_KEY) if("${FIXTURE_${_key}}" STREQUAL "") message(FATAL_ERROR "fixture.env: ${_key} is empty") endif() endforeach() if("${FIXTURE_HOSTNAME}" STREQUAL "") set(FIXTURE_HOSTNAME "forgefixture") endif() string(LENGTH "${FIXTURE_HOSTNAME}" _hostlen) if(NOT FIXTURE_HOSTNAME MATCHES "^[a-z0-9][a-z0-9-]*$" OR FIXTURE_HOSTNAME MATCHES "-$" OR _hostlen GREATER 32) message(FATAL_ERROR "fixture.env: HOSTNAME must be a DNS label (lowercase letters, digits, hyphens; 32 at most)") endif() # Into C string literals. foreach(_key WIFI_SSID WIFI_PSK API_KEY HOSTNAME) string(REPLACE "\\" "\\\\" FIXTURE_${_key} "${FIXTURE_${_key}}") string(REPLACE "\"" "\\\"" FIXTURE_${_key} "${FIXTURE_${_key}}") endforeach() set(_gen_dir "${CMAKE_CURRENT_BINARY_DIR}/generated") file(MAKE_DIRECTORY "${_gen_dir}") configure_file("${CMAKE_CURRENT_LIST_DIR}/fixture_config.h.in" "${_gen_dir}/fixture_config.h" @ONLY) idf_component_register( SRCS "main.c" "wifi.c" "relays.c" "api.c" "policy.c" INCLUDE_DIRS "." "${_gen_dir}" REQUIRES nvs_flash esp_wifi esp_netif esp_event esp_http_server json esp_timer driver )