Files
fgl-aircon/CMakeLists.txt
T
petr.polezhaev 0292404756 ha(H1): pyfglair — cffi-ядро (очередь событий), wheel, CLI discover/monitor
- CMake: shared-таргет fgl-aircon-shared (FGL_BUILD_SHARED, PIC, SOVERSION)
- C-API: fgl_prop_raw_range + кольцевые очереди событий/логов
  (fgl_session_poll/wait_events, fgl_log_poll/wait_events): прямые колбэки
  из потоков ядра со стеком 8 КБ небезопасны для интерпретатора Python
- pyfglair: _corebuild (cmake->wheel), _cffi (ABI), Session (reader-поток ->
  loop.call_soon_threadsafe), templates (интроспекция C-таблиц), provision
  (aiohttp), CLI discover/monitor + esphome-secrets
- setup.py/pyproject: платформенный wheel py3-none-linux_x86_64 с .so
- tests/pyfglair: templates, provision (мок-облако), session + CLI против
  mock_ac.py; scripts/py-ci.sh; ci.sh запускает python-часть
2026-09-29 11:31:57 +03:00

144 lines
4.8 KiB
CMake

cmake_minimum_required(VERSION 3.16)
if(ESP_PLATFORM)
# ---------------------------------------------------------------------------
# Сборка как компонента ESP-IDF (корень репозитория = компонент; имя
# компонента = имя каталога, из которого он подключён).
# ВАЖНО: cmake_minimum_required должен остаться до этой ветки, project()
# для IDF-сборки не вызывается.
# ---------------------------------------------------------------------------
idf_component_register(
SRCS
"src/ayla/crypto.cpp"
"src/ayla/envelope.cpp"
"src/ayla/httpc.cpp"
"src/ayla/httpd.cpp"
"src/ayla/log.cpp"
"src/ayla/session.cpp"
"src/aircon/c_api.cpp"
"src/aircon/session.cpp"
"src/aircon/tables.cpp"
"src/ayla/platform/esp-idf/platform.cpp"
INCLUDE_DIRS
"include"
PRIV_INCLUDE_DIRS
"."
"src"
PRIV_REQUIRES
lwip
esp_timer
esp_hw_support
pthread
mbedtls
)
target_compile_options(${COMPONENT_LIB} PRIVATE
-Wall -Wextra -Werror
-fno-exceptions -fno-rtti
)
target_compile_features(${COMPONENT_LIB} PUBLIC cxx_std_20)
else()
# ---------------------------------------------------------------------------
# Обычная (POSIX) сборка: статическая библиотека + тесты.
# ---------------------------------------------------------------------------
project(fgl-aircon VERSION 0.1.0 LANGUAGES CXX)
option(FGL_BUILD_TESTS "Build tests" ON)
option(FGL_BUILD_EXAMPLES "Build examples (fglctl)" ON)
option(FGL_BUILD_SHARED "Build shared library (pyfglair/cffi)" ON)
option(FGL_BUNDLED_MBEDTLS "Fetch and build Mbed TLS instead of system" OFF)
# ---- mbedtls ----
if(NOT FGL_BUNDLED_MBEDTLS)
find_path(MBEDTLS_INCLUDE_DIR mbedtls/aes.h
HINTS /usr/include/mbedtls3 /usr/include
)
find_library(MBEDTLS_CRYPTO_LIB
NAMES mbedcrypto-3 mbedcrypto
)
if(NOT MBEDTLS_INCLUDE_DIR OR NOT MBEDTLS_CRYPTO_LIB)
message(STATUS "System Mbed TLS not found - falling back to bundled")
set(FGL_BUNDLED_MBEDTLS ON)
endif()
endif()
if(FGL_BUNDLED_MBEDTLS)
include(FetchContent)
FetchContent_Declare(mbedtls
GIT_REPOSITORY https://github.com/Mbed-TLS/mbedtls.git
GIT_TAG v3.6.2
GIT_SHALLOW TRUE
)
set(ENABLE_PROGRAMS OFF CACHE BOOL "" FORCE)
set(ENABLE_TESTING OFF CACHE BOOL "" FORCE)
set(USE_SHARED_MBEDTLS_LIBRARY OFF CACHE BOOL "" FORCE)
set(USE_STATIC_MBEDTLS_LIBRARY ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(mbedtls)
set(FGL_MBEDTLS_TARGET mbedcrypto STATIC)
set(FGL_MBEDTLS_INCLUDE_DIR "")
# Статический mbedcrypto нужен и для shared-библиотеки (pyfglair).
set_target_properties(mbedcrypto PROPERTIES POSITION_INDEPENDENT_CODE ON)
else()
set(FGL_MBEDTLS_TARGET "${MBEDTLS_CRYPTO_LIB}")
set(FGL_MBEDTLS_INCLUDE_DIR "${MBEDTLS_INCLUDE_DIR}")
endif()
set(FGL_SOURCES
src/ayla/crypto.cpp
src/ayla/envelope.cpp
src/ayla/httpc.cpp
src/ayla/httpd.cpp
src/ayla/log.cpp
src/ayla/session.cpp
src/aircon/c_api.cpp
src/aircon/session.cpp
src/aircon/tables.cpp
src/ayla/platform/posix/platform.cpp
)
function(fgl_configure_target tgt)
target_include_directories(${tgt}
PUBLIC
"${CMAKE_CURRENT_SOURCE_DIR}/include"
"${CMAKE_CURRENT_SOURCE_DIR}"
"${FGL_MBEDTLS_INCLUDE_DIR}"
PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/src"
)
target_link_libraries(${tgt} PUBLIC ${FGL_MBEDTLS_TARGET})
target_compile_features(${tgt} PUBLIC cxx_std_20)
target_compile_options(${tgt} PRIVATE
-Wall -Wextra -Werror
-fno-exceptions -fno-rtti
)
endfunction()
add_library(fgl-aircon STATIC ${FGL_SOURCES})
fgl_configure_target(fgl-aircon)
# Shared-библиотека для cffi/pyfglair (Home Assistant). Имя то же
# (libfgl-aircon.so), чтобы dlopen по имени был предсказуем.
if(FGL_BUILD_SHARED)
add_library(fgl-aircon-shared SHARED ${FGL_SOURCES})
fgl_configure_target(fgl-aircon-shared)
set_target_properties(fgl-aircon-shared PROPERTIES
OUTPUT_NAME fgl-aircon
POSITION_INDEPENDENT_CODE ON
VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION_MAJOR}
)
endif()
if(FGL_BUILD_TESTS)
enable_testing()
add_subdirectory(tests)
endif()
if(FGL_BUILD_EXAMPLES)
add_executable(fglctl examples/cli/fglctl.cpp)
target_compile_features(fglctl PRIVATE cxx_std_20)
target_link_libraries(fglctl PRIVATE fgl-aircon)
target_include_directories(fglctl PRIVATE "${CMAKE_SOURCE_DIR}/src")
target_compile_options(fglctl PRIVATE -Wall -Wextra -Werror
-fno-exceptions -fno-rtti)
endif()
endif()