diff --git a/CMakeLists.txt b/CMakeLists.txt index 7cf1018c..7170b826 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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()