cmake: simplify feature-flag dependency resolution

Replace scattered option() calls, PIP_HAS_DEPS_* variables, and while-loop
resolver with pip_feature_flag() function and pip_resolve_feature_flags()
macro. Dependencies are declared inline and resolved in a single pass.
This commit is contained in:
2026-08-31 18:51:08 +03:00
parent d16f4bdaf7
commit 09144acf4d
+48 -47
View File
@@ -69,14 +69,50 @@ option(INTROSPECTION "Build with introspection" OFF)
option(TESTS "Build tests" OFF)
option(TESTS_RUN "Run tests before install step" OFF)
option(COVERAGE "Build project with coverage info" OFF)
option(PIP_HAS_FILESYSTEM "Enable filesystem support" ON)
option(PIP_HAS_THREADS "Enable threading support" ON)
option(PIP_HAS_SOCKET "Enable socket/network support" ON)
option(PIP_HAS_PROCESS "Enable process management" ON)
option(PIP_HAS_DYNLIB "Enable dynamic library loading" ON)
option(PIP_HAS_FFT "Enable FFT support" ON)
option(PIP_HAS_SERIAL "Enable serial port support" ON)
set(PIP_HAS_FLAGS "PIP_HAS_FILESYSTEM" "PIP_HAS_THREADS" "PIP_HAS_SOCKET" "PIP_HAS_PROCESS" "PIP_HAS_DYNLIB" "PIP_HAS_FFT" "PIP_HAS_SERIAL")
function(pip_feature_flag NAME)
set(_deps ${ARGN})
option(${NAME} "Feature flag" ON)
list(APPEND PIP_FEATURE_FLAGS "${NAME}")
set(PIP_FEATURE_FLAGS "${PIP_FEATURE_FLAGS}" PARENT_SCOPE)
set(PIP_FEATURE_DEPS_${NAME} "${_deps}" PARENT_SCOPE)
endfunction()
macro(pip_resolve_feature_flags)
foreach(_f ${PIP_FEATURE_FLAGS})
if(${_f})
foreach(_d ${PIP_FEATURE_DEPS_${_f}})
if(NOT ${_d})
message(STATUS "${_f} requires ${_d}, disabling ${_f}")
set(${_f} OFF CACHE BOOL "" FORCE)
endif()
endforeach()
endif()
endforeach()
foreach(_f ${PIP_FEATURE_FLAGS})
if(${_f})
add_definitions(-D${_f})
endif()
endforeach()
endmacro()
# Base flags (no dependencies)
pip_feature_flag(PIP_HAS_FILESYSTEM)
pip_feature_flag(PIP_HAS_THREADS)
pip_feature_flag(PIP_HAS_SOCKET)
pip_feature_flag(PIP_HAS_DYNLIB)
pip_feature_flag(PIP_HAS_FFT)
pip_feature_flag(PIP_HAS_SERIAL)
pip_feature_flag(PIP_BUILD_IO_UTILS)
# Dependent flags
pip_feature_flag(PIP_HAS_PROCESS PIP_HAS_THREADS)
pip_feature_flag(INTROSPECTION PIP_HAS_THREADS PIP_HAS_SOCKET)
pip_feature_flag(PIP_BUILD_CONSOLE PIP_HAS_THREADS)
pip_feature_flag(PIP_BUILD_FFTW PIP_HAS_FFT)
pip_feature_flag(PIP_BUILD_HTTP_CLIENT PIP_HAS_THREADS)
pip_feature_flag(PIP_BUILD_HTTP_SERVER PIP_HAS_THREADS PIP_HAS_SOCKET)
pip_feature_flag(PIP_BUILD_MQTT_CLIENT PIP_HAS_THREADS PIP_HAS_SOCKET)
pip_feature_flag(PIP_BUILD_CLIENT_SERVER PIP_HAS_THREADS PIP_HAS_SOCKET PIP_BUILD_IO_UTILS)
pip_feature_flag(PIP_BUILD_CLOUD PIP_HAS_THREADS PIP_HAS_SOCKET PIP_BUILD_IO_UTILS)
option(PIP_FFTW_F "Support fftw module for float" ON)
option(PIP_FFTW_L "Support fftw module for long double" ON)
option(PIP_FFTW_Q "Support fftw module for quad double" OFF)
@@ -261,43 +297,8 @@ if(DEFINED PICO_BOARD OR PIP_FREERTOS)
endif()
# Feature flags
set(PIP_HAS_DEPS_TARGETS
"PIP_HAS_PROCESS" "PIP_HAS_SERIAL" "INTROSPECTION"
"PIP_BUILD_CONSOLE" "PIP_BUILD_CLIENT_SERVER" "PIP_BUILD_CLOUD"
"PIP_BUILD_FFTW" "PIP_BUILD_HTTP_CLIENT" "PIP_BUILD_HTTP_SERVER"
"PIP_BUILD_MQTT_CLIENT")
set(PIP_HAS_DEPS_PIP_HAS_PROCESS "PIP_HAS_THREADS")
set(PIP_HAS_DEPS_INTROSPECTION "PIP_HAS_THREADS;PIP_HAS_SOCKET")
set(PIP_HAS_DEPS_PIP_BUILD_CONSOLE "PIP_HAS_THREADS")
set(PIP_HAS_DEPS_PIP_BUILD_CLIENT_SERVER "PIP_HAS_THREADS;PIP_HAS_SOCKET;PIP_BUILD_IO_UTILS")
set(PIP_HAS_DEPS_PIP_BUILD_CLOUD "PIP_HAS_THREADS;PIP_HAS_SOCKET;PIP_BUILD_IO_UTILS")
set(PIP_HAS_DEPS_PIP_BUILD_FFTW "PIP_HAS_FFT")
set(PIP_HAS_DEPS_PIP_BUILD_HTTP_CLIENT "PIP_HAS_THREADS")
set(PIP_HAS_DEPS_PIP_BUILD_HTTP_SERVER "PIP_HAS_THREADS;PIP_HAS_SOCKET")
set(PIP_HAS_DEPS_PIP_BUILD_MQTT_CLIENT "PIP_HAS_THREADS;PIP_HAS_SOCKET")
set(_PIP_HAS_DEPS_CHANGED TRUE)
while(_PIP_HAS_DEPS_CHANGED)
set(_PIP_HAS_DEPS_CHANGED FALSE)
foreach(_t ${PIP_HAS_DEPS_TARGETS})
if(${_t})
foreach(_d ${PIP_HAS_DEPS_${_t}})
if(NOT ${_d})
message(STATUS "${_t} requires ${_d}, disabling ${_t}")
set(${_t} OFF CACHE BOOL "" FORCE)
set(_PIP_HAS_DEPS_CHANGED TRUE)
endif()
endforeach()
endif()
endforeach()
endwhile()
foreach(_PIP_FLAG ${PIP_HAS_FLAGS})
if(${_PIP_FLAG})
add_definitions(-D${_PIP_FLAG})
endif()
endforeach()
# Resolve feature-flag dependencies (order: deps checked after their targets)
pip_resolve_feature_flags()
# Check Bessel functions
@@ -950,13 +951,13 @@ message(" Introspection: ${PIP_INTROSPECTION}")
message(" Coverage : ${PIP_COVERAGE}")
message(" Feature flags:")
set(_max_flag_len 0)
foreach(_f ${PIP_HAS_FLAGS})
foreach(_f ${PIP_FEATURE_FLAGS})
string(LENGTH "${_f}" _f_len)
if (_f_len GREATER _max_flag_len)
set(_max_flag_len ${_f_len})
endif()
endforeach()
foreach(_f ${PIP_HAS_FLAGS})
foreach(_f ${PIP_FEATURE_FLAGS})
expand_to_length(_f_e "${_f}" ${_max_flag_len})
message(" ${_f_e}: ${${_f}}")
endforeach()