225 lines
7.8 KiB
CMake
225 lines
7.8 KiB
CMake
cmake_minimum_required(VERSION 3.15)
|
||
|
||
# Фикс для Ninja на Windows
|
||
if(NOT CMAKE_MAKE_PROGRAM AND WIN32)
|
||
set(POTENTIAL_NINJA "${CMAKE_CURRENT_SOURCE_DIR}/ninja/ninja.exe")
|
||
if(EXISTS "${POTENTIAL_NINJA}")
|
||
set(CMAKE_MAKE_PROGRAM "${POTENTIAL_NINJA}" CACHE FILEPATH "Path to ninja" FORCE)
|
||
endif()
|
||
endif()
|
||
|
||
project(space-game001 LANGUAGES C CXX)
|
||
|
||
set(CMAKE_CXX_STANDARD 17)
|
||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||
|
||
# --- АВТО-ЗАГРУЗКА ЗАВИСИМОСТЕЙ ---
|
||
include("${CMAKE_CURRENT_SOURCE_DIR}/../cmake/FetchDependencies.cmake")
|
||
# Теперь гарантированно есть папка ../thirdparty со всеми исходниками
|
||
|
||
# ===========================================
|
||
# Lua (5.5.0) - embedded scripting, pure C, compiles with Emscripten
|
||
# ===========================================
|
||
set(LUA_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../thirdparty/lua-5.4.8")
|
||
file(GLOB LUA_SOURCES "${LUA_SRC_DIR}/*.c")
|
||
list(REMOVE_ITEM LUA_SOURCES
|
||
"${LUA_SRC_DIR}/lua.c"
|
||
"${LUA_SRC_DIR}/luac.c"
|
||
"${LUA_SRC_DIR}/onelua.c"
|
||
)
|
||
add_library(lua_static STATIC ${LUA_SOURCES})
|
||
target_include_directories(lua_static PUBLIC "${LUA_SRC_DIR}")
|
||
|
||
# sol2 (header-only)
|
||
set(SOL2_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../thirdparty/sol2-3.3.0")
|
||
|
||
# Apply patch for Clang/Emscripten compatibility in optional<T&>::emplace().
|
||
set(_sol2_sentinel "${SOL2_SRC_DIR}/.patched")
|
||
if(NOT EXISTS "${_sol2_sentinel}")
|
||
find_package(Git QUIET)
|
||
if(GIT_FOUND)
|
||
execute_process(
|
||
COMMAND ${GIT_EXECUTABLE} apply --ignore-whitespace
|
||
"${CMAKE_CURRENT_SOURCE_DIR}/../cmake/patches/sol2-3.3.0-clang-optional.patch"
|
||
WORKING_DIRECTORY "${SOL2_SRC_DIR}"
|
||
RESULT_VARIABLE _sol2_patch_res
|
||
)
|
||
if(_sol2_patch_res EQUAL 0)
|
||
file(WRITE "${_sol2_sentinel}" "patched\n")
|
||
message(STATUS "Applied sol2 Clang optional patch")
|
||
else()
|
||
message(WARNING "sol2 patch failed (exit ${_sol2_patch_res}) — Clang/Emscripten builds may not compile")
|
||
endif()
|
||
else()
|
||
message(WARNING "Git not found — cannot apply sol2 patch automatically. "
|
||
"Apply cmake/patches/sol2-3.3.0-clang-optional.patch manually.")
|
||
endif()
|
||
endif()
|
||
|
||
# Список исходных файлов (синхронизирован с proj-windows/CMakeLists.txt)
|
||
set(SOURCES
|
||
../src/main.cpp
|
||
../src/Game.cpp
|
||
../src/Game.h
|
||
../src/Character.cpp
|
||
../src/Character.h
|
||
../src/Environment.cpp
|
||
../src/Environment.h
|
||
../src/render/Renderer.cpp
|
||
../src/render/Renderer.h
|
||
../src/render/ShaderManager.cpp
|
||
../src/render/ShaderManager.h
|
||
../src/render/TextureManager.cpp
|
||
../src/render/TextureManager.h
|
||
../src/TextModel.cpp
|
||
../src/TextModel.h
|
||
../src/AudioPlayerAsync.cpp
|
||
../src/AudioPlayerAsync.h
|
||
../src/BoneAnimatedModel.cpp
|
||
../src/BoneAnimatedModel.h
|
||
../src/render/OpenGlExtensions.cpp
|
||
../src/render/OpenGlExtensions.h
|
||
../src/utils/Utils.cpp
|
||
../src/utils/Utils.h
|
||
../src/SparkEmitter.cpp
|
||
../src/SparkEmitter.h
|
||
# ../src/planet/PlanetObject.cpp
|
||
# ../src/planet/PlanetObject.h
|
||
# ../src/planet/PlanetData.cpp
|
||
# ../src/planet/PlanetData.h
|
||
../src/utils/Perlin.cpp
|
||
../src/utils/Perlin.h
|
||
../src/utils/TaskManager.cpp
|
||
../src/utils/TaskManager.h
|
||
# ../src/planet/StoneObject.cpp
|
||
# ../src/planet/StoneObject.h
|
||
../src/render/FrameBuffer.cpp
|
||
../src/render/FrameBuffer.h
|
||
../src/UiManager.cpp
|
||
../src/UiManager.h
|
||
../src/Projectile.h
|
||
../src/Projectile.cpp
|
||
# ../src/network/NetworkInterface.h
|
||
# ../src/network/LocalClient.h
|
||
# ../src/network/LocalClient.cpp
|
||
# ../src/network/ClientState.h
|
||
# ../src/network/ClientState.cpp
|
||
# ../src/network/WebSocketClientBase.h
|
||
# ../src/network/WebSocketClientBase.cpp
|
||
# ../src/network/WebSocketClientEmscripten.h
|
||
# ../src/network/WebSocketClientEmscripten.cpp
|
||
../src/render/TextRenderer.h
|
||
../src/render/TextRenderer.cpp
|
||
../src/MenuManager.h
|
||
../src/MenuManager.cpp
|
||
# ../src/Space.h
|
||
# ../src/Space.cpp
|
||
../src/GameConstants.h
|
||
../src/GameConstants.cpp
|
||
../src/ScriptEngine.h
|
||
../src/ScriptEngine.cpp
|
||
)
|
||
|
||
add_executable(space-game001 ${SOURCES})
|
||
|
||
# Настройка путей к инклудам (используем скачанные исходники)
|
||
target_include_directories(space-game001 PRIVATE
|
||
../src
|
||
../thirdparty/eigen-5.0.0
|
||
../thirdparty/boost_1_90_0
|
||
"${SOL2_SRC_DIR}/include"
|
||
)
|
||
|
||
# Сборка libzip через add_subdirectory (Emscripten соберет её из исходников)
|
||
set(ENABLE_GNUTLS OFF CACHE BOOL "" FORCE)
|
||
set(ENABLE_OPENSSL OFF CACHE BOOL "" FORCE)
|
||
set(ENABLE_WINDOWS_CRYPTO OFF CACHE BOOL "" FORCE)
|
||
set(ENABLE_COMMONCRYPTO OFF CACHE BOOL "" FORCE)
|
||
|
||
add_subdirectory("../thirdparty/libzip-1.11.4" libzip-build)
|
||
|
||
target_link_libraries(space-game001 PRIVATE zip z lua_static websocket.js)
|
||
|
||
# Эмскриптен-флаги
|
||
set(EMSCRIPTEN_FLAGS
|
||
"-sUSE_SDL=2"
|
||
"-sUSE_SDL_IMAGE=2"
|
||
"-sUSE_LIBPNG=1"
|
||
"-sUSE_ZLIB=1"
|
||
"-sUSE_SDL_TTF=2"
|
||
#"-pthread"
|
||
#"-sUSE_PTHREADS=1"
|
||
"-fexceptions"
|
||
"-DNETWORK"
|
||
)
|
||
|
||
target_compile_options(space-game001 PRIVATE ${EMSCRIPTEN_FLAGS} "-O2")
|
||
|
||
# Only loading.png and the shaders used before resources.zip is ready are preloaded.
|
||
# resources.zip is downloaded asynchronously at runtime and served as a separate file.
|
||
set(EMSCRIPTEN_LINK_FLAGS
|
||
${EMSCRIPTEN_FLAGS}
|
||
"-O2"
|
||
#"-sPTHREAD_POOL_SIZE=4"
|
||
"-sALLOW_MEMORY_GROWTH=1"
|
||
"-sFULL_ES3=1"
|
||
"--preload-file ${CMAKE_CURRENT_SOURCE_DIR}/../resources/loading.png@resources/loading.png"
|
||
"--preload-file ${CMAKE_CURRENT_SOURCE_DIR}/../resources/shaders@resources/shaders"
|
||
"--preload-file ${CMAKE_CURRENT_SOURCE_DIR}/../resources/start.lua@resources/start.lua"
|
||
)
|
||
|
||
# Применяем настройки линковки
|
||
target_link_options(space-game001 PRIVATE ${EMSCRIPTEN_LINK_FLAGS})
|
||
|
||
# Для совместимости со старыми версиями CMake, если target_link_options недостаточно
|
||
string(REPLACE ";" " " EMSCRIPTEN_LINK_FLAGS_STR "${EMSCRIPTEN_LINK_FLAGS}")
|
||
set_target_properties(space-game001 PROPERTIES
|
||
LINK_FLAGS "${EMSCRIPTEN_LINK_FLAGS_STR}"
|
||
SUFFIX ".html"
|
||
)
|
||
|
||
# --- Ресурсы и Деплой (без изменений) ---
|
||
set(RESOURCES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../resources")
|
||
set(RESOURCES_ZIP "${CMAKE_CURRENT_BINARY_DIR}/resources.zip")
|
||
get_filename_component(RESOURCES_PARENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/.." ABSOLUTE)
|
||
|
||
add_custom_command(
|
||
OUTPUT "${RESOURCES_ZIP}"
|
||
COMMAND ${CMAKE_COMMAND} -E tar "cf" "${RESOURCES_ZIP}" --format=zip "resources"
|
||
WORKING_DIRECTORY "${RESOURCES_PARENT_DIR}"
|
||
DEPENDS "${RESOURCES_PARENT_DIR}/resources"
|
||
)
|
||
|
||
add_custom_target(pack_resources DEPENDS "${RESOURCES_ZIP}")
|
||
add_dependencies(space-game001 pack_resources)
|
||
|
||
|
||
# Определяем путь к директории установки (относительно папки билда)
|
||
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/public")
|
||
|
||
# 1. Устанавливаем основной HTML файл
|
||
install(TARGETS space-game001
|
||
RUNTIME DESTINATION .
|
||
)
|
||
|
||
# 2. Устанавливаем сопутствующие файлы (JS, WASM и сгенерированный архив данных)
|
||
install(FILES
|
||
"${CMAKE_CURRENT_BINARY_DIR}/space-game001.js"
|
||
"${CMAKE_CURRENT_BINARY_DIR}/space-game001.wasm"
|
||
"${CMAKE_CURRENT_BINARY_DIR}/space-game001.data"
|
||
DESTINATION .
|
||
)
|
||
|
||
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/space-game001plain.html"
|
||
DESTINATION .
|
||
)
|
||
|
||
# resources.zip is served separately and downloaded asynchronously at runtime
|
||
install(FILES "${RESOURCES_ZIP}" DESTINATION .)
|
||
|
||
add_custom_command(TARGET space-game001 POST_BUILD
|
||
COMMAND ${CMAKE_COMMAND} --install .
|
||
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
|
||
COMMENT "Automatically deploying to public directory..."
|
||
)
|