space-game001/proj-web/CMakeLists.txt
2026-01-09 23:19:39 +03:00

142 lines
4.7 KiB
CMake

cmake_minimum_required(VERSION 3.15)
project(space-game001 CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Список исходных файлов
set(SOURCES
../src/main.cpp
../src/Game.cpp
../src/Environment.cpp
../src/BoneAnimatedModel.cpp
../src/TextModel.cpp
../src/Projectile.cpp
../src/SparkEmitter.cpp
../src/UiManager.cpp
../src/render/Renderer.cpp
../src/render/ShaderManager.cpp
../src/render/TextureManager.cpp
../src/render/FrameBuffer.cpp
../src/render/OpenGlExtensions.cpp
../src/utils/Utils.cpp
../src/utils/TaskManager.cpp
../src/utils/Perlin.cpp
../src/planet/PlanetData.cpp
../src/planet/PlanetObject.cpp
../src/planet/StoneObject.cpp
)
add_executable(space-game001 ${SOURCES})
# Пути к инклудам
target_include_directories(space-game001 PRIVATE
../src
./src
../thirdparty1/eigen-5.0.0
../thirdparty1/boost_1_90_0
./thirdparty/libzip-1.11.3/build-emcmake/install/include
)
# Пути к либам и сами либы
target_link_directories(space-game001 PRIVATE
./thirdparty/libzip-1.11.3/build-emcmake/install/lib
)
target_link_libraries(space-game001 zip z)
set(EMSCRIPTEN_FLAGS
"-sUSE_SDL=2"
"-sUSE_SDL_IMAGE=2"
"-sUSE_LIBPNG=1"
"-pthread"
"-sUSE_PTHREADS=1"
"-fexceptions"
)
# Добавляем флаги компиляции
target_compile_options(space-game001 PRIVATE
${EMSCRIPTEN_FLAGS}
"-O2"
)
# Специфичные флаги только для линковки
set(EMSCRIPTEN_LINK_FLAGS
${EMSCRIPTEN_FLAGS} # SDL и Pthreads нужны и здесь
"-O2"
"-sPTHREAD_POOL_SIZE=4"
"-sTOTAL_MEMORY=4294967296"
"-sINITIAL_MEMORY=3221225472"
"-sMAXIMUM_MEMORY=4294967296"
"-sALLOW_MEMORY_GROWTH=1"
"--preload-file resources.zip"
)
# Используем современный target_link_options вместо set_target_properties
target_link_options(space-game001 PRIVATE ${EMSCRIPTEN_LINK_FLAGS})
# Объединяем флаги в строку и применяем к таргету
string(REPLACE ";" " " EMSCRIPTEN_LINK_FLAGS_STR "${EMSCRIPTEN_LINK_FLAGS}")
set_target_properties(space-game001 PROPERTIES
LINK_FLAGS "${EMSCRIPTEN_LINK_FLAGS_STR}"
SUFFIX ".html"
)
# Добавляем те же флаги для компиляции (pthread, exceptions и т.д.)
target_compile_options(space-game001 PRIVATE -O2 -pthread -fexceptions)
# 1. Определяем пути
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)
# 2. Создаем команду для запаковки
add_custom_command(
OUTPUT "${RESOURCES_ZIP}"
# Указываем "resources" как объект упаковки
COMMAND ${CMAKE_COMMAND} -E tar "cf" "${RESOURCES_ZIP}" --format=zip "resources"
# Запускаем из корня проекта, чтобы путь "resources" был валидным
WORKING_DIRECTORY "${RESOURCES_PARENT_DIR}"
DEPENDS "${RESOURCES_PARENT_DIR}/resources"
COMMENT "Packing resources folder into ${RESOURCES_ZIP}..."
)
# 3. Создаем таргет-пустышку, чтобы CMake знал, что нужно запустить команду
add_custom_target(pack_resources DEPENDS "${RESOURCES_ZIP}")
# 4. Делаем основной проект зависимым от архивации
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 и сгенерированный архив данных)
# Emscripten создает их в той же папке, что и таргет
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 отдельно в папке public:
#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..."
)