##====================================================================================================================== ## 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 ET_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 ROTGEN_MAX_SIZE.") endif() if(NOT ${ET_VAR} STREQUAL "") message(FATAL_ERROR "ROTGEN_FORCE_DYNAMIC cannot be used together with ROTGEN_ENABLE_EXPRESSION_TEMPLATES.") endif() elseif(NOT ${MAX_SIZE_VAR} AND NOT ${ET_VAR}) # 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 ENABLE_ET 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() if(${ENABLE_ET}) list(APPEND defs "ROTGEN_ENABLE_EXPRESSION_TEMPLATES") 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(${FORCE_DYNAMIC_VAR}) message(STATUS " Configuration mode: DYNAMIC") if(${FORCE_CONFIG_REASON}) message(STATUS " Reason : No fixed size options were provided") endif() else() message(STATUS " Configuration mode: FIXED SIZE") message(STATUS " Expression Templates: ${ROTGEN_ENABLE_EXPRESSION_TEMPLATES}") 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_ENABLE_EXPRESSION_TEMPLATES) set(ROTGEN_DISABLE_EXPRESSION_TEMPLATES OFF) 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" "ROTGEN_ENABLE_EXPRESSION_TEMPLATES" _force_dynamic_inferred ) build_compile_definitions("ROTGEN_FORCE_DYNAMIC" "ROTGEN_MAX_SIZE" "ROTGEN_ENABLE_EXPRESSION_TEMPLATES" 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) set(ROTGEN_ENABLE_EXPRESSION_TEMPLATES ${ROTGEN_ENABLE_EXPRESSION_TEMPLATES} PARENT_SCOPE) endfunction()