cmake_minimum_required(VERSION 3.10) project(interface_test VERSION 1.0.0 LANGUAGES C CXX) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) message(STATUS "Setting build type to 'Release' as none was specified.") set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE) set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") endif() option(A_BUILD_MAIN "Build the main executable" ON) option(MY_BUILD_SHARED_LIBS "Build libraries as shared (.so/.dll) instead of static (.a)" OFF) set(MY_MEMPOOL_SIZE "800 * 1024" CACHE STRING "Custom memory pool size (e.g., 800*1024 or 2097152)") set(MY_BUILD_STATIC ON CACHE BOOL "Build libraries as static (.a)") if(MY_BUILD_SHARED_LIBS) set(MY_BUILD_STATIC OFF) endif() set(GLOBAL_ENABLED_MODULES "" CACHE INTERNAL "List of enabled module targets") set(GLOBAL_ENABLED_MACROS "" CACHE INTERNAL "List of enabled macros for main") list(APPEND GLOBAL_ENABLED_MACROS MEM_POOL_TOTAL_SIZE=${MY_MEMPOOL_SIZE}) set(GLOBAL_ENABLED_MACROS ${GLOBAL_ENABLED_MACROS} PARENT_SCOPE) function(add_module MOD_NAME MOD_PATH) if(ARGC GREATER 2) set(DEFAULT_STATE ${ARGV2}) else() set(DEFAULT_STATE OFF) endif() if(ARGC GREATER 3) set(HAS_TEST ${ARGV2}) set(HAS_TEST ${ARGV3}) else() set(HAS_TEST OFF) endif() if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${MOD_PATH}") message(WARNING "[Root] Module '${MOD_NAME}' skipped: Path '${MOD_PATH}' does not exist!") # message(FATAL_ERROR "[Root] Module '${MOD_NAME}' failed: Path '${MOD_PATH}' does not exist!") return() endif() string(TOUPPER ${MOD_NAME} MOD_UPPER) option(BUILD_${MOD_UPPER} "Build ${MOD_NAME} module" ${DEFAULT_STATE}) if(${BUILD_${MOD_UPPER}}) set(BUILD_${MOD_UPPER}_HAS_TEST ${HAS_TEST} CACHE INTERNAL "Has test support") add_subdirectory(${MOD_PATH}) list(APPEND GLOBAL_ENABLED_MODULES ${MOD_NAME}) list(APPEND GLOBAL_ENABLED_MACROS BUILD_${MOD_UPPER}) message(STATUS "[Root] Enabled module(TestSupport: ${HAS_TEST}): ${MOD_NAME} (Default: ${DEFAULT_STATE}) -> Macro: BUILD_${MOD_UPPER}") set(GLOBAL_ENABLED_MODULES ${GLOBAL_ENABLED_MODULES} PARENT_SCOPE) set(GLOBAL_ENABLED_MACROS ${GLOBAL_ENABLED_MACROS} PARENT_SCOPE) endif() endfunction() add_module(base base ON ON) add_module(controller controller OFF ON) add_module(motor motor OFF ON) add_module(ctrl2 ctrl2 OFF ON) add_module(motorTT motorTT OFF ON) add_module(paint paint OFF ON) add_module(swing swing OFF ON) if(A_BUILD_MAIN) add_subdirectory(main) endif() message(STATUS "========================================") message(STATUS "Enabled Modules: ${GLOBAL_ENABLED_MODULES}") message(STATUS "Macros for Main: ${GLOBAL_ENABLED_MACROS}") message(STATUS "Build Static Libs: ${MY_BUILD_STATIC}") message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}") message(STATUS "========================================")