cmake_minimum_required(VERSION 3.20) project(MobileCommand VERSION 0.1.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # Export compile commands for IDE support set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # ============================================================================ # GroveEngine Integration # ============================================================================ set(GROVE_BUILD_TESTS OFF CACHE BOOL "Disable GroveEngine tests" FORCE) set(GROVE_BUILD_MODULES OFF CACHE BOOL "Disable GroveEngine modules" FORCE) add_subdirectory(external/GroveEngine) # ============================================================================ # Dependencies # ============================================================================ include(FetchContent) # ============================================================================ # Main Executable # ============================================================================ add_executable(mobilecommand src/main.cpp ) target_link_libraries(mobilecommand PRIVATE GroveEngine::impl spdlog::spdlog ) target_include_directories(mobilecommand PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ) # ============================================================================ # Hot-Reloadable Modules (.so/.dll) - Game modules # ============================================================================ # GameModule - Core game loop add_library(GameModule SHARED src/modules/GameModule.cpp src/modules/GameModule.h ) target_link_libraries(GameModule PRIVATE GroveEngine::impl spdlog::spdlog ) target_include_directories(GameModule PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ) set_target_properties(GameModule PROPERTIES PREFIX "lib" LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules ) # ResourceModule - Core inventory and crafting (game-agnostic) add_library(ResourceModule SHARED src/modules/core/ResourceModule.cpp src/modules/core/ResourceModule.h ) target_link_libraries(ResourceModule PRIVATE GroveEngine::impl spdlog::spdlog ) target_include_directories(ResourceModule PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ) set_target_properties(ResourceModule PROPERTIES PREFIX "lib" LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules/core ) # EventModule - Core event scripting system (game-agnostic) add_library(EventModule SHARED src/modules/core/EventModule.cpp src/modules/core/EventModule.h ) target_link_libraries(EventModule PRIVATE GroveEngine::impl spdlog::spdlog ) target_include_directories(EventModule PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ) set_target_properties(EventModule PROPERTIES PREFIX "lib" LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules/core ) # StorageModule - Core save/load system (game-agnostic) add_library(StorageModule SHARED src/modules/core/StorageModule.cpp src/modules/core/StorageModule.h ) target_link_libraries(StorageModule PRIVATE GroveEngine::impl spdlog::spdlog ) target_include_directories(StorageModule PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ) set_target_properties(StorageModule PROPERTIES PREFIX "lib" LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules/core ) # CombatModule - Core combat resolver (game-agnostic) add_library(CombatModule SHARED src/modules/core/CombatModule.cpp src/modules/core/CombatModule.h ) target_link_libraries(CombatModule PRIVATE GroveEngine::impl spdlog::spdlog ) target_include_directories(CombatModule PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ) set_target_properties(CombatModule PROPERTIES PREFIX "lib" LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules/core ) # TrainBuilderModule - MC-specific train management add_library(TrainBuilderModule SHARED src/modules/mc_specific/TrainBuilderModule.cpp src/modules/mc_specific/TrainBuilderModule.h ) target_link_libraries(TrainBuilderModule PRIVATE GroveEngine::impl spdlog::spdlog ) target_include_directories(TrainBuilderModule PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ) set_target_properties(TrainBuilderModule PROPERTIES PREFIX "lib" LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules/mc_specific ) # ExpeditionModule - MC-specific expedition system add_library(ExpeditionModule SHARED src/modules/mc_specific/ExpeditionModule.cpp src/modules/mc_specific/ExpeditionModule.h ) target_link_libraries(ExpeditionModule PRIVATE GroveEngine::impl spdlog::spdlog ) target_include_directories(ExpeditionModule PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ) set_target_properties(ExpeditionModule PROPERTIES PREFIX "lib" LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules/mc_specific ) # ============================================================================ # Copy config files to build directory # ============================================================================ file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/config/ DESTINATION ${CMAKE_BINARY_DIR}/config) # ============================================================================ # Development targets # ============================================================================ # Quick rebuild of modules only (for hot-reload workflow) add_custom_target(modules DEPENDS GameModule ResourceModule StorageModule CombatModule EventModule TrainBuilderModule ExpeditionModule COMMENT "Building hot-reloadable modules only" ) # Run MobileCommand add_custom_target(run COMMAND $ DEPENDS mobilecommand modules WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMENT "Running Mobile Command" ) # ============================================================================ # Tests # ============================================================================ # Google Test (for GameModule tests) include(FetchContent) FetchContent_Declare( googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG v1.14.0 ) # For Windows: Prevent overriding the parent project's compiler/linker settings set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) FetchContent_MakeAvailable(googletest) # Enable testing enable_testing() # GameModule unit tests add_executable(GameModuleTest tests/GameModuleTest.cpp src/modules/GameModule.cpp src/modules/GameModule.h ) target_link_libraries(GameModuleTest PRIVATE GroveEngine::impl spdlog::spdlog gtest_main gmock_main ) target_include_directories(GameModuleTest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ) # ResourceModule independent test add_executable(ResourceModuleTest tests/ResourceModuleTest.cpp src/modules/core/ResourceModule.cpp src/modules/core/ResourceModule.h ) target_link_libraries(ResourceModuleTest PRIVATE GroveEngine::impl spdlog::spdlog ) target_include_directories(ResourceModuleTest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ) # EventModule independent test add_executable(EventModuleTest tests/EventModuleTest.cpp src/modules/core/EventModule.cpp src/modules/core/EventModule.h ) target_link_libraries(EventModuleTest PRIVATE GroveEngine::impl spdlog::spdlog ) target_include_directories(EventModuleTest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ) # Test targets add_custom_target(test_game COMMAND $ DEPENDS GameModuleTest WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMENT "Running GameModule tests" ) add_custom_target(test_resource COMMAND $ DEPENDS ResourceModuleTest WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMENT "Running ResourceModule tests" ) add_custom_target(test_event COMMAND $ DEPENDS EventModuleTest WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMENT "Running EventModule tests" ) # TrainBuilderModule independent test add_executable(TrainBuilderModuleTest tests/TrainBuilderModuleTest.cpp src/modules/mc_specific/TrainBuilderModule.cpp src/modules/mc_specific/TrainBuilderModule.h ) target_link_libraries(TrainBuilderModuleTest PRIVATE GroveEngine::impl spdlog::spdlog gtest_main gmock_main ) target_include_directories(TrainBuilderModuleTest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ) add_custom_target(test_train COMMAND $ DEPENDS TrainBuilderModuleTest WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMENT "Running TrainBuilderModule tests" ) # StorageModule independent test add_executable(StorageModuleTest tests/StorageModuleTest.cpp src/modules/core/StorageModule.cpp src/modules/core/StorageModule.h ) target_link_libraries(StorageModuleTest PRIVATE GroveEngine::impl spdlog::spdlog ) target_include_directories(StorageModuleTest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ) add_custom_target(test_storage COMMAND $ DEPENDS StorageModuleTest WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMENT "Running StorageModule tests" ) # CombatModule independent test add_executable(CombatModuleTest tests/CombatModuleTest.cpp src/modules/core/CombatModule.cpp src/modules/core/CombatModule.h ) target_link_libraries(CombatModuleTest PRIVATE GroveEngine::impl spdlog::spdlog ) target_include_directories(CombatModuleTest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ) add_custom_target(test_combat COMMAND $ DEPENDS CombatModuleTest WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMENT "Running CombatModule tests" ) # ExpeditionModule independent test add_executable(ExpeditionModuleTest tests/ExpeditionModuleTest.cpp src/modules/mc_specific/ExpeditionModule.cpp src/modules/mc_specific/ExpeditionModule.h ) target_link_libraries(ExpeditionModuleTest PRIVATE GroveEngine::impl spdlog::spdlog ) target_include_directories(ExpeditionModuleTest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ) add_custom_target(test_expedition COMMAND $ DEPENDS ExpeditionModuleTest WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMENT "Running ExpeditionModule tests" ) # Run all tests add_custom_target(test_all COMMAND $ DEPENDS GameModuleTest ResourceModuleTest StorageModuleTest CombatModuleTest EventModuleTest TrainBuilderModuleTest ExpeditionModuleTest WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMENT "Running all tests" )