rotgen/cmake/options.cmake
Jules Pénuchot e151e136d6 Resolve "[API-#2] Pseudo-privatization of rotgen entity member functions"
Closes #18

Co-authored-by: Jules Pénuchot <jules@penuchot.com>

See merge request oss/rotgen!50
2025-12-17 20:48:00 +01:00

104 lines
4 KiB
CMake

##======================================================================================================================
## 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()