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:
+48
-47
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user