##====================================================================================================================== ## ROTGEN - Runtime Overlay for Eigen ## Copyright : CODE RECKONS ## SPDX-License-Identifier: BSL-1.0 ##====================================================================================================================== function(assert_integer VAR_NAME) if(DEFINED ${VAR_NAME} AND NOT ${${VAR_NAME}} STREQUAL "") if(NOT ${${VAR_NAME}} MATCHES "^[0-9]+$") message(FATAL_ERROR "[ROTGEN] - ${VAR_NAME} must be a non-negative integer, got '${${VAR_NAME}}'}") endif() endif() endfunction() function(check_force_dynamic_and_sizes FORCE_DYNAMIC_VAR MAX_SIZE_VAR) if(${FORCE_DYNAMIC_VAR}) if(NOT ${MAX_SIZE_VAR} STREQUAL "") message(FATAL_ERROR "[ROTGEN] - ROTGEN_FORCE_DYNAMIC is set, so ROTGEN_MAX_SIZE must not be defined.") endif() endif() endfunction() function(infer_force_dynamic FORCE_DYNAMIC_VAR MAX_SIZE_VAR OUT_FORCE_DYNAMIC_INFERRED) set(${OUT_FORCE_DYNAMIC_INFERRED} OFF PARENT_SCOPE) if(${FORCE_DYNAMIC_VAR}) if(NOT ${MAX_SIZE_VAR} STREQUAL "") message(FATAL_ERROR "ROTGEN_FORCE_DYNAMIC cannot be used together with MAX_SIZE.") endif() elseif(${MAX_SIZE_VAR} STREQUAL "") # None set, enable force_dynamic set(${OUT_FORCE_DYNAMIC_INFERRED} ON PARENT_SCOPE) set(${FORCE_DYNAMIC_VAR} ON PARENT_SCOPE) # update caller variable! endif() endfunction() function(build_compile_definitions FORCE_DYNAMIC_VAR MAX_SIZE_VAR OUT_DEFS) set(defs "") if(${FORCE_DYNAMIC_VAR}) list(APPEND defs "ROTGEN_FORCE_DYNAMIC") else() if(NOT ${MAX_SIZE_VAR} STREQUAL "") list(APPEND defs "ROTGEN_MAX_SIZE=${${MAX_SIZE_VAR}}") endif() endif() set(${OUT_DEFS} "${defs}" PARENT_SCOPE) endfunction() function(print_configuration_summary FORCE_DYNAMIC_VAR FORCE_CONFIG_REASON MAX_SIZE_VAR COMPILE_DEFS) message(STATUS "==================== Rotgen Configuration Summary ====================") if(DEFINED ROTGEN_DISABLE_EXPRESSION_TEMPLATES AND ROTGEN_DISABLE_EXPRESSION_TEMPLATES) message(STATUS " Configuration mode: DISABLE_EXPRESSION_TEMPLATES (overrides other settings)") elseif(${FORCE_DYNAMIC_VAR}) message(STATUS " Configuration mode: DYNAMIC") if(${FORCE_CONFIG_REASON}) message(STATUS " Reason : No static size options were provided") endif() else() message(STATUS " Configuration mode: STATIC") endif() set(PREPROCESSOR_FLAGS "") foreach(def IN LISTS COMPILE_DEFS) string(APPEND PREPROCESSOR_FLAGS " -D${def}") endforeach() message(STATUS " Preprocessor flags: ${PREPROCESSOR_FLAGS}") message(STATUS "======================================================================") endfunction() function(handle_option OUT_DEFS) # Early-out if disabling expression templates if(NOT DEFINED ROTGEN_DISABLE_EXPRESSION_TEMPLATES) set(ROTGEN_DISABLE_EXPRESSION_TEMPLATES OFF) endif() if(ROTGEN_DISABLE_EXPRESSION_TEMPLATES) # Pass only the disable flag set(${OUT_DEFS} "ROTGEN_DISABLE_EXPRESSION_TEMPLATES" PARENT_SCOPE) message(STATUS "==================== Rotgen Configuration Summary ====================") message(STATUS " Configuration mode: DISABLE_EXPRESSION_TEMPLATES (overrides other settings)") message(STATUS " Preprocessor flags: -DROTGEN_DISABLE_EXPRESSION_TEMPLATES") message(STATUS "======================================================================") # Propagate to parent set(ROTGEN_DISABLE_EXPRESSION_TEMPLATES ${ROTGEN_DISABLE_EXPRESSION_TEMPLATES} PARENT_SCOPE) return() endif() # Defaults for other options if(NOT DEFINED ROTGEN_FORCE_DYNAMIC) set(ROTGEN_FORCE_DYNAMIC OFF) endif() if(NOT DEFINED ROTGEN_MAX_SIZE) set(ROTGEN_MAX_SIZE "") endif() assert_integer("ROTGEN_MAX_SIZE") check_force_dynamic_and_sizes("ROTGEN_FORCE_DYNAMIC" "ROTGEN_MAX_SIZE") infer_force_dynamic("ROTGEN_FORCE_DYNAMIC" "ROTGEN_MAX_SIZE" _force_dynamic_inferred) build_compile_definitions("ROTGEN_FORCE_DYNAMIC" "ROTGEN_MAX_SIZE" defs) print_configuration_summary("ROTGEN_FORCE_DYNAMIC" "_force_dynamic_inferred" "ROTGEN_MAX_SIZE" "${defs}") set(${OUT_DEFS} "${defs}" PARENT_SCOPE) set(ROTGEN_FORCE_DYNAMIC ${ROTGEN_FORCE_DYNAMIC} PARENT_SCOPE) set(ROTGEN_MAX_SIZE ${ROTGEN_MAX_SIZE} PARENT_SCOPE) endfunction()