project-mobile-command/CMakeLists.txt
StillHammer 0953451fea Implement 7 modules: 4 core (game-agnostic) + 3 MC-specific
Core Modules (game-agnostic, reusable for WarFactory):
- ResourceModule: Inventory, crafting system (465 lines)
- StorageModule: Save/load with pub/sub state collection (424 lines)
- CombatModule: Combat resolver, damage/armor/morale (580 lines)
- EventModule: JSON event scripting with choices/outcomes (651 lines)

MC-Specific Modules:
- GameModule v2: State machine + event subscriptions (updated)
- TrainBuilderModule: 3 wagons, 2-axis balance, performance malus (530 lines)
- ExpeditionModule: A→B expeditions, team management, events integration (641 lines)

Features:
- All modules hot-reload compatible (state preservation)
- Pure pub/sub architecture (zero direct coupling)
- 7 config files (resources, storage, combat, events, train, expeditions)
- 7 test suites (GameModuleTest: 12/12 PASSED)
- CMakeLists.txt updated for all modules + tests

Total: ~3,500 lines of production code + comprehensive tests

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-02 16:40:54 +08:00

362 lines
10 KiB
CMake

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 $<TARGET_FILE:mobilecommand>
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 $<TARGET_FILE:GameModuleTest>
DEPENDS GameModuleTest
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMENT "Running GameModule tests"
)
add_custom_target(test_resource
COMMAND $<TARGET_FILE:ResourceModuleTest>
DEPENDS ResourceModuleTest
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMENT "Running ResourceModule tests"
)
add_custom_target(test_event
COMMAND $<TARGET_FILE:EventModuleTest>
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 $<TARGET_FILE:TrainBuilderModuleTest>
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 $<TARGET_FILE:StorageModuleTest>
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 $<TARGET_FILE:CombatModuleTest>
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 $<TARGET_FILE:ExpeditionModuleTest>
DEPENDS ExpeditionModuleTest
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMENT "Running ExpeditionModule tests"
)
# Run all tests
add_custom_target(test_all
COMMAND $<TARGET_FILE:GameModuleTest>
DEPENDS GameModuleTest ResourceModuleTest StorageModuleTest CombatModuleTest EventModuleTest TrainBuilderModuleTest ExpeditionModuleTest
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMENT "Running all tests"
)