From 426202ba9e72f8bc1f625928c11b037ce7682cdf Mon Sep 17 00:00:00 2001 From: zhenyan121 <3367366583@qq.com> Date: Sat, 27 Jun 2026 16:04:48 +0800 Subject: [PATCH] build(cmake): modularize build configuration --- CMakeLists.txt | 272 +++++++++----------------------- cmake/Dependencies.cmake | 79 ++++++++++ src/CMakeLists.txt | 47 ++++++ third_party/glad/CMakeLists.txt | 8 + 4 files changed, 212 insertions(+), 194 deletions(-) create mode 100644 cmake/Dependencies.cmake create mode 100644 src/CMakeLists.txt create mode 100644 third_party/glad/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 18bc1c9..68c0ba4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.14...3.24) +cmake_minimum_required(VERSION 3.21) project(Cubed LANGUAGES C CXX) set(CMAKE_CXX_STANDARD 23) @@ -6,194 +6,104 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Debug) +if(NOT CMAKE_CONFIGURATION_TYPES + AND NOT CMAKE_BUILD_TYPE) + + set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE) + endif() set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${PROJECT_NAME}) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${PROJECT_NAME}) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) -if(MSVC) - add_compile_options(/utf-8) -endif() -list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") -find_package(OpenGL REQUIRED) -find_package(Protobuf REQUIRED) -find_package(absl REQUIRED) -find_package(zstd REQUIRED) - -if (UNIX AND NOT APPLE) - find_package(Freetype REQUIRED) - find_package(PkgConfig REQUIRED) - pkg_check_modules(EGL REQUIRED egl) - pkg_check_modules(Wayland REQUIRED wayland-client wayland-egl) - find_package(glfw3 REQUIRED) -endif() - -add_library(glad STATIC third_party/glad/src/glad.c) -target_include_directories(glad PUBLIC third_party/glad/include) - -include(FetchContent) - -if (WIN32) - FetchContent_Declare( - glfw - GIT_REPOSITORY https://github.com/glfw/glfw.git - GIT_TAG 3.4 - ) - - set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE) - set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE) - set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) - set(GLFW_INSTALL OFF CACHE BOOL "" FORCE) - set(GLFW_VULKAN_STATIC ON CACHE BOOL "" FORCE) - set(GLFW_STATIC ON CACHE BOOL "" FORCE) - - FetchContent_MakeAvailable(glfw) - - FetchContent_Declare( - freetype - GIT_REPOSITORY https://gitlab.freedesktop.org/freetype/freetype.git - GIT_TAG VER-2-14-3 - ) - FetchContent_MakeAvailable(freetype) - if(TARGET freetype) - add_library(Freetype::Freetype ALIAS freetype) - endif() - set(_BUILD_SHARED_LIBS_SAVED ${BUILD_SHARED_LIBS}) - set(BUILD_SHARED_LIBS ON) - - FetchContent_Declare( - onetbb - GIT_REPOSITORY https://github.com/uxlfoundation/oneTBB.git - GIT_TAG v2023.0.0 - ) - set(BUILD_TESTING OFF CACHE BOOL "Build tests" FORCE) - set(TBB_TEST OFF CACHE BOOL "Build TBB tests" FORCE) - FetchContent_MakeAvailable(onetbb) - - set(BUILD_SHARED_LIBS ${_BUILD_SHARED_LIBS_SAVED}) - unset(_BUILD_SHARED_LIBS_SAVED) - -endif() - -FetchContent_Declare( - glm - GIT_REPOSITORY https://github.com/g-truc/glm.git - GIT_TAG 1.0.3 - +list(APPEND CMAKE_MODULE_PATH + "${CMAKE_CURRENT_SOURCE_DIR}/cmake" + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" ) -FetchContent_MakeAvailable(glm) -FetchContent_Declare( - soil2 - GIT_REPOSITORY https://github.com/SpartanJ/SOIL2.git - GIT_TAG 1.31 - -) -FetchContent_MakeAvailable(soil2) -FetchContent_Declare( - tomlplusplus - GIT_REPOSITORY https://github.com/marzer/tomlplusplus.git - GIT_TAG v3.4.0 -) -FetchContent_MakeAvailable(tomlplusplus) + +include(Dependencies) + +add_subdirectory(third_party/glad) add_subdirectory(third_party/imgui) +add_executable(${PROJECT_NAME}) +add_subdirectory(src) -add_executable(${PROJECT_NAME} - src/main.cpp - src/app.cpp - src/debug_collector.cpp - src/camera.cpp - src/config.cpp - src/dev_panel.cpp - src/gameplay/biome.cpp - src/gameplay/chunk_generator.cpp - src/gameplay/tree.cpp - src/input.cpp - src/map_table.cpp - src/renderer.cpp - src/shader.cpp - src/texture_manager.cpp - src/tools/cubed_random.cpp - src/tools/math_tools.cpp - src/tools/shader_tools.cpp - src/tools/font.cpp - src/tools/perlin_noise.cpp - src/ui/text.cpp - src/window.cpp - src/gameplay/builders/biome_builder.cpp - src/gameplay/builders/plain_builder.cpp - src/gameplay/builders/mountain_builder.cpp - src/gameplay/builders/river_builder.cpp - src/gameplay/builders/desert_builder.cpp - src/gameplay/builders/forest_builder.cpp - src/gameplay/cave_carver.cpp - src/gameplay/cave_path.cpp - src/gameplay/builders/snowy_plain_builder.cpp - src/gameplay/river_worm.cpp - src/gameplay/river_path.cpp - src/gameplay/block.cpp - src/gameplay/vertex_data.cpp - src/gameplay/builders/ocean_builder.cpp - src/gameplay/network_server.cpp - src/gameplay/server_world.cpp - src/gameplay/client_world.cpp - src/gameplay/server_chunk.cpp - src/gameplay/client_chunk.cpp - src/gameplay/server_player.cpp - src/gameplay/client_player.cpp - src/gameplay/session.cpp - src/gameplay/network_client.cpp -) file(GLOB_RECURSE PROTO_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/proto/*.proto ) + protobuf_generate( TARGET ${PROJECT_NAME} LANGUAGE cpp PROTOS ${PROTO_FILES} IMPORT_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/src/proto ) -if(CMAKE_BUILD_TYPE STREQUAL "Debug") - message(STATUS "Building with AddressSanitizer enabled for target: ${PROJECT_NAME}") - target_compile_options(${PROJECT_NAME} PRIVATE - #-fsanitize=address - #-fsanitize=thread - -fno-omit-frame-pointer - -g - ) +target_compile_options(${PROJECT_NAME} + PRIVATE + $<$:-fno-omit-frame-pointer> + $<$:-g> + #$<$:-fsanitize=address> + #$<$:-fsanitize=thread> - target_link_options(${PROJECT_NAME} PRIVATE - #-fsanitize=address - #-fsanitize=thread - ) + $<$:-Wall> + $<$:-Wextra> + $<$:-Wpedantic> - target_compile_definitions(${PROJECT_NAME} PRIVATE DEBUG_MODE) - target_compile_definitions(${PROJECT_NAME} PRIVATE - ASSETS_PATH="${CMAKE_SOURCE_DIR}/assets/" + $<$:/utf-8> + $<$:/W4> +) + +target_link_options(${PROJECT_NAME} + PRIVATE + #$<$:-fsanitize=address> + #$<$:-fsanitize=thread> +) + +target_compile_definitions(${PROJECT_NAME} + PRIVATE + ASIO_STANDALONE + ASIO_NO_DEPRECATED + $<$:DEBUG_MODE> +) + +if(CMAKE_CONFIGURATION_TYPES) + # Visual Studio / Xcode multi-configuration generator + target_compile_definitions(${PROJECT_NAME} + PRIVATE + ASSETS_PATH="$<$:${PROJECT_SOURCE_DIR}/assets/>$<$>:./assets/>" ) else() - target_compile_definitions(${PROJECT_NAME} PRIVATE - ASSETS_PATH="./assets/" - ) + # Ninja / Makefiles single-configuration generator + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + target_compile_definitions(${PROJECT_NAME} + PRIVATE + ASSETS_PATH="${PROJECT_SOURCE_DIR}/assets/" + ) + else() + target_compile_definitions(${PROJECT_NAME} + PRIVATE + ASSETS_PATH="./assets/" + ) + endif() endif() -target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/include) -target_include_directories(${PROJECT_NAME} PRIVATE - ${CMAKE_SOURCE_DIR}/third_party/asio/include + +target_include_directories(${PROJECT_NAME} + PRIVATE + ${PROJECT_SOURCE_DIR}/include + ${PROJECT_SOURCE_DIR}/third_party/asio/include + + ${PROJECT_BINARY_DIR} + ${PROJECT_BINARY_DIR}/src + ) -target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src) -target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -target_compile_definitions(${PROJECT_NAME} PRIVATE - ASIO_STANDALONE - ASIO_NO_DEPRECATED -) + target_link_libraries(${PROJECT_NAME} PRIVATE glfw @@ -209,42 +119,16 @@ target_link_libraries(${PROJECT_NAME} absl::log absl::check zstd::zstd + ) -if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") -# target_link_libraries(${PROJECT_NAME} PRIVATE tbb) -endif() - -if (UNIX AND NOT APPLE) - target_link_libraries(${PROJECT_NAME} - PRIVATE - ${EGL_LIBRARIES} - ${Wayland_LIBRARIES} +if(WIN32) + add_custom_command( + TARGET ${PROJECT_NAME} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + $ + $ + COMMAND_EXPAND_LISTS ) - - - target_include_directories(${PROJECT_NAME} - PRIVATE - ${EGL_INCLUDE_DIRS} - ${Wayland_INCLUDE_DIRS} - ) - - - target_compile_options(${PROJECT_NAME} PRIVATE ${EGL_CFLAGS_OTHER} ${Wayland_CFLAGS_OTHER}) -endif() - -if (WIN32) - foreach(TBB_LIB IN ITEMS tbb tbbmalloc tbbmalloc_proxy) - if(TARGET ${TBB_LIB}) - add_custom_command( - TARGET ${PROJECT_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different - $ - $ - COMMENT "Copying ${TBB_LIB}.dll" - ) - else() - message(STATUS "Target ${TBB_LIB} not found, skipping copy") - endif() - endforeach() endif() \ No newline at end of file diff --git a/cmake/Dependencies.cmake b/cmake/Dependencies.cmake new file mode 100644 index 0000000..44c3802 --- /dev/null +++ b/cmake/Dependencies.cmake @@ -0,0 +1,79 @@ +include(FetchContent) + +# System packages +find_package(OpenGL REQUIRED) +find_package(Protobuf REQUIRED) +find_package(absl REQUIRED) +find_package(zstd REQUIRED) +if (UNIX AND NOT APPLE) + find_package(Freetype REQUIRED) + find_package(glfw3 REQUIRED) +endif() + + +# Third-party libraries +FetchContent_Declare( + glm + GIT_REPOSITORY https://github.com/g-truc/glm.git + GIT_TAG 1.0.3 + +) +FetchContent_MakeAvailable(glm) +FetchContent_Declare( + soil2 + GIT_REPOSITORY https://github.com/SpartanJ/SOIL2.git + GIT_TAG 1.31 + +) +FetchContent_MakeAvailable(soil2) +FetchContent_Declare( + tomlplusplus + GIT_REPOSITORY https://github.com/marzer/tomlplusplus.git + GIT_TAG v3.4.0 +) +FetchContent_MakeAvailable(tomlplusplus) + + +if (WIN32) + FetchContent_Declare( + glfw + GIT_REPOSITORY https://github.com/glfw/glfw.git + GIT_TAG 3.4 + ) + + set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE) + set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE) + set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) + set(GLFW_INSTALL OFF CACHE BOOL "" FORCE) + set(GLFW_VULKAN_STATIC ON CACHE BOOL "" FORCE) + set(BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE) + + FetchContent_MakeAvailable(glfw) + + FetchContent_Declare( + freetype + GIT_REPOSITORY https://gitlab.freedesktop.org/freetype/freetype.git + GIT_TAG VER-2-14-3 + ) + FetchContent_MakeAvailable(freetype) + if(TARGET freetype) + add_library(Freetype::Freetype ALIAS freetype) + endif() + set(_BUILD_SHARED_LIBS_SAVED ${BUILD_SHARED_LIBS}) + set(BUILD_SHARED_LIBS ON) + + FetchContent_Declare( + onetbb + GIT_REPOSITORY https://github.com/uxlfoundation/oneTBB.git + GIT_TAG v2023.0.0 + ) + + set(BUILD_TESTING OFF CACHE BOOL "Build tests" FORCE) + set(TBB_TEST OFF CACHE BOOL "Build TBB tests" FORCE) + FetchContent_MakeAvailable(onetbb) + + set(BUILD_SHARED_LIBS ${_BUILD_SHARED_LIBS_SAVED}) + unset(_BUILD_SHARED_LIBS_SAVED) + +endif() + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..368384b --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,47 @@ +target_sources(${PROJECT_NAME} + PRIVATE + main.cpp + app.cpp + debug_collector.cpp + camera.cpp + config.cpp + dev_panel.cpp + gameplay/biome.cpp + gameplay/chunk_generator.cpp + gameplay/tree.cpp + input.cpp + map_table.cpp + renderer.cpp + shader.cpp + texture_manager.cpp + tools/cubed_random.cpp + tools/math_tools.cpp + tools/shader_tools.cpp + tools/font.cpp + tools/perlin_noise.cpp + ui/text.cpp + window.cpp + gameplay/builders/biome_builder.cpp + gameplay/builders/plain_builder.cpp + gameplay/builders/mountain_builder.cpp + gameplay/builders/river_builder.cpp + gameplay/builders/desert_builder.cpp + gameplay/builders/forest_builder.cpp + gameplay/cave_carver.cpp + gameplay/cave_path.cpp + gameplay/builders/snowy_plain_builder.cpp + gameplay/river_worm.cpp + gameplay/river_path.cpp + gameplay/block.cpp + gameplay/vertex_data.cpp + gameplay/builders/ocean_builder.cpp + gameplay/network_server.cpp + gameplay/server_world.cpp + gameplay/client_world.cpp + gameplay/server_chunk.cpp + gameplay/client_chunk.cpp + gameplay/server_player.cpp + gameplay/client_player.cpp + gameplay/session.cpp + gameplay/network_client.cpp +) \ No newline at end of file diff --git a/third_party/glad/CMakeLists.txt b/third_party/glad/CMakeLists.txt new file mode 100644 index 0000000..d783ed9 --- /dev/null +++ b/third_party/glad/CMakeLists.txt @@ -0,0 +1,8 @@ +add_library(glad STATIC + src/glad.c +) + +target_include_directories(glad + PUBLIC + include +) \ No newline at end of file