afegit suport Emscripten/WebAssembly al build system (milestone 4)
- createSystemFolder() adaptat per Emscripten (MEMFS, sense pwd.h/unistd.h) - initOptions() amb windowSize=1 i videoMode=0 per Emscripten - CMakeLists.txt: SDL3 via FetchContent per Emscripten, --preload-file data - Makefile: target wasm amb Docker (emscripten/emsdk) - Build de Linux verificat, segueix funcionant correctament Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -30,8 +30,24 @@ if(NOT SOURCES)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Configuración de SDL3
|
# Configuración de SDL3
|
||||||
find_package(SDL3 REQUIRED CONFIG REQUIRED COMPONENTS SDL3)
|
if(EMSCRIPTEN)
|
||||||
message(STATUS "SDL3 encontrado: ${SDL3_INCLUDE_DIRS}")
|
# En Emscripten, SDL3 se compila desde source con FetchContent
|
||||||
|
include(FetchContent)
|
||||||
|
FetchContent_Declare(
|
||||||
|
SDL3
|
||||||
|
GIT_REPOSITORY https://github.com/libsdl-org/SDL.git
|
||||||
|
GIT_TAG release-3.2.12
|
||||||
|
GIT_SHALLOW TRUE
|
||||||
|
)
|
||||||
|
set(SDL_SHARED OFF CACHE BOOL "" FORCE)
|
||||||
|
set(SDL_STATIC ON CACHE BOOL "" FORCE)
|
||||||
|
set(SDL_TEST_LIBRARY OFF CACHE BOOL "" FORCE)
|
||||||
|
FetchContent_MakeAvailable(SDL3)
|
||||||
|
message(STATUS "SDL3 compilado desde source para Emscripten")
|
||||||
|
else()
|
||||||
|
find_package(SDL3 REQUIRED CONFIG REQUIRED COMPONENTS SDL3)
|
||||||
|
message(STATUS "SDL3 encontrado: ${SDL3_INCLUDE_DIRS}")
|
||||||
|
endif()
|
||||||
|
|
||||||
# Configuración común de salida de ejecutables en el directorio raíz
|
# Configuración común de salida de ejecutables en el directorio raíz
|
||||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR})
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR})
|
||||||
@@ -66,6 +82,14 @@ elseif(APPLE)
|
|||||||
-rpath @executable_path/../Frameworks/
|
-rpath @executable_path/../Frameworks/
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
elseif(EMSCRIPTEN)
|
||||||
|
target_compile_definitions(${PROJECT_NAME} PRIVATE EMSCRIPTEN_BUILD)
|
||||||
|
target_link_options(${PROJECT_NAME} PRIVATE
|
||||||
|
--preload-file ${CMAKE_SOURCE_DIR}/data@/data
|
||||||
|
-sALLOW_MEMORY_GROWTH=1
|
||||||
|
-sMAX_WEBGL_VERSION=2
|
||||||
|
)
|
||||||
|
set_target_properties(${PROJECT_NAME} PROPERTIES SUFFIX ".html")
|
||||||
elseif(UNIX AND NOT APPLE)
|
elseif(UNIX AND NOT APPLE)
|
||||||
target_compile_definitions(${PROJECT_NAME} PRIVATE LINUX_BUILD)
|
target_compile_definitions(${PROJECT_NAME} PRIVATE LINUX_BUILD)
|
||||||
target_link_options(${PROJECT_NAME} PRIVATE -Wl,--gc-sections)
|
target_link_options(${PROJECT_NAME} PRIVATE -Wl,--gc-sections)
|
||||||
|
|||||||
15
Makefile
15
Makefile
@@ -236,6 +236,18 @@ linux_release:
|
|||||||
# Elimina la carpeta temporal
|
# Elimina la carpeta temporal
|
||||||
$(RMDIR) "$(RELEASE_FOLDER)"
|
$(RMDIR) "$(RELEASE_FOLDER)"
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# COMPILACIÓN PARA WEBASSEMBLY (requiere Docker)
|
||||||
|
# ==============================================================================
|
||||||
|
wasm:
|
||||||
|
@echo "Compilando para WebAssembly - Version: $(VERSION)"
|
||||||
|
docker run --rm \
|
||||||
|
-v $(DIR_ROOT):/src \
|
||||||
|
-w /src \
|
||||||
|
emscripten/emsdk:latest \
|
||||||
|
bash -c "emcmake cmake -S . -B build_wasm -DCMAKE_BUILD_TYPE=Release && cmake --build build_wasm"
|
||||||
|
@echo "Output: build_wasm/coffee_crisis.html, .js, .wasm, .data"
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# REGLAS ESPECIALES
|
# REGLAS ESPECIALES
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
@@ -255,9 +267,10 @@ help:
|
|||||||
@echo " make windows_release - Crear release para Windows"
|
@echo " make windows_release - Crear release para Windows"
|
||||||
@echo " make linux_release - Crear release para Linux"
|
@echo " make linux_release - Crear release para Linux"
|
||||||
@echo " make macos_release - Crear release para macOS"
|
@echo " make macos_release - Crear release para macOS"
|
||||||
|
@echo " make wasm - Compilar para WebAssembly (requiere Docker)"
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo " Otros:"
|
@echo " Otros:"
|
||||||
@echo " make show_version - Mostrar version actual ($(VERSION))"
|
@echo " make show_version - Mostrar version actual ($(VERSION))"
|
||||||
@echo " make help - Mostrar esta ayuda"
|
@echo " make help - Mostrar esta ayuda"
|
||||||
|
|
||||||
.PHONY: all debug release windows_release macos_release linux_release show_version help
|
.PHONY: all debug release windows_release macos_release linux_release wasm show_version help
|
||||||
|
|||||||
@@ -4,8 +4,10 @@
|
|||||||
#include <errno.h> // for errno, EEXIST, EACCES, ENAMETOO...
|
#include <errno.h> // for errno, EEXIST, EACCES, ENAMETOO...
|
||||||
#include <stdio.h> // for printf, perror
|
#include <stdio.h> // for printf, perror
|
||||||
#include <string.h> // for strcmp
|
#include <string.h> // for strcmp
|
||||||
|
#ifndef __EMSCRIPTEN__
|
||||||
#include <sys/stat.h> // for mkdir, stat, S_IRWXU
|
#include <sys/stat.h> // for mkdir, stat, S_IRWXU
|
||||||
#include <unistd.h> // for getuid
|
#include <unistd.h> // for getuid
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <cstdlib> // for exit, EXIT_FAILURE, srand
|
#include <cstdlib> // for exit, EXIT_FAILURE, srand
|
||||||
#include <fstream> // for basic_ostream, operator<<, basi...
|
#include <fstream> // for basic_ostream, operator<<, basi...
|
||||||
@@ -27,7 +29,7 @@
|
|||||||
#include "title.h" // for Title
|
#include "title.h" // for Title
|
||||||
#include "utils.h" // for options_t, input_t, boolToString
|
#include "utils.h" // for options_t, input_t, boolToString
|
||||||
|
|
||||||
#ifndef _WIN32
|
#if !defined(_WIN32) && !defined(__EMSCRIPTEN__)
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -385,6 +387,12 @@ void Director::initOptions() {
|
|||||||
options->difficulty = DIFFICULTY_NORMAL;
|
options->difficulty = DIFFICULTY_NORMAL;
|
||||||
options->language = ba_BA;
|
options->language = ba_BA;
|
||||||
options->console = false;
|
options->console = false;
|
||||||
|
|
||||||
|
#ifdef __EMSCRIPTEN__
|
||||||
|
// En Emscripten la ventana la gestiona el navegador
|
||||||
|
options->windowSize = 1;
|
||||||
|
options->videoMode = 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Comprueba los parametros del programa
|
// Comprueba los parametros del programa
|
||||||
@@ -402,7 +410,10 @@ void Director::checkProgramArguments(int argc, const char *argv[]) {
|
|||||||
|
|
||||||
// Crea la carpeta del sistema donde guardar datos
|
// Crea la carpeta del sistema donde guardar datos
|
||||||
void Director::createSystemFolder(const std::string &folder) {
|
void Director::createSystemFolder(const std::string &folder) {
|
||||||
#ifdef _WIN32
|
#ifdef __EMSCRIPTEN__
|
||||||
|
// En Emscripten usamos una carpeta en MEMFS (no persistente)
|
||||||
|
systemFolder = "/config/" + folder;
|
||||||
|
#elif _WIN32
|
||||||
systemFolder = std::string(getenv("APPDATA")) + "/" + folder;
|
systemFolder = std::string(getenv("APPDATA")) + "/" + folder;
|
||||||
#elif __APPLE__
|
#elif __APPLE__
|
||||||
struct passwd *pw = getpwuid(getuid());
|
struct passwd *pw = getpwuid(getuid());
|
||||||
@@ -424,6 +435,10 @@ void Director::createSystemFolder(const std::string &folder) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __EMSCRIPTEN__
|
||||||
|
// En Emscripten no necesitamos crear carpetas (MEMFS las crea automáticamente)
|
||||||
|
(void)folder;
|
||||||
|
#else
|
||||||
struct stat st = {0};
|
struct stat st = {0};
|
||||||
if (stat(systemFolder.c_str(), &st) == -1) {
|
if (stat(systemFolder.c_str(), &st) == -1) {
|
||||||
errno = 0;
|
errno = 0;
|
||||||
@@ -453,6 +468,7 @@ void Director::createSystemFolder(const std::string &folder) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Carga el fichero de configuración
|
// Carga el fichero de configuración
|
||||||
|
|||||||
Reference in New Issue
Block a user