From c4bcdea91a155aac77d076c27dff15f1753cdf57 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Thu, 16 Jul 2026 06:36:14 +0200 Subject: [PATCH 01/56] Move SDL download and build procedure into CMakeLists.txt --- CMakeLists.txt | 102 +++++++++++++++++++++++++++++-------------------- 1 file changed, 61 insertions(+), 41 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f240aa81..49456d02 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,9 @@ -cmake_minimum_required(VERSION 3.1) +cmake_minimum_required(VERSION 3.25) project(shockolate VERSION 0.7.8) include(FeatureSummary) +include(FetchContent) #set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS OFF) #set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB32_PATHS ON) @@ -63,11 +64,18 @@ if(ENABLE_SDL2 MATCHES "ON") endif(SDL2_FOUND) endif(ENABLE_SDL2 MATCHES "ON") if(ENABLE_SDL2 MATCHES "BUNDLED") - set(SDL2_DIR ${CMAKE_SOURCE_DIR}/build_ext/built_sdl) - find_library(SDL2_LIBRARY SDL2 PATHS ${SDL2_DIR}/lib NO_DEFAULT_PATH) - find_library(SDL2MAIN_LIBRARY SDL2main PATHS ${SDL2_DIR}/lib NO_DEFAULT_PATH) - set(SDL2_INCLUDE_DIRS ${SDL2_DIR}/include/SDL2) - set(SDL2_LIBRARIES "${SDL2MAIN_LIBRARY};${SDL2_LIBRARY}") + set(SDL_VERSION 2.32.10) + FetchContent_Declare( + SDL2 + GIT_REPOSITORY https://github.com/libsdl-org/SDL + GIT_TAG "release-${SDL_VERSION}" + ) + + set(SDL_TEST OFF CACHE BOOL "Disable SDL Test" FORCE) + + FetchContent_MakeAvailable(SDL2) + set(SDL2_INCLUDE_DIRS ${SDL2_SOURCE_DIR}/include) + set(SDL2_LIBRARIES SDL2::SDL2main SDL2::SDL2-static) endif(ENABLE_SDL2 MATCHES "BUNDLED") if(ENABLE_SOUND MATCHES "ON") @@ -77,10 +85,24 @@ if(ENABLE_SOUND MATCHES "ON") add_definitions(-DUSE_SDL_MIXER=1) endif(ENABLE_SOUND MATCHES "ON") if(ENABLE_SOUND MATCHES "BUNDLED") - set(SDL2_MIXER_DIR ${CMAKE_SOURCE_DIR}/build_ext/built_sdl_mixer) - set(SDL2_MIXER_INCLUDE_DIRS ${SDL2_MIXER_DIR}/include/SDL2) - find_library(SDL2_MIXER_LIBRARY SDL2_mixer PATHS ${SDL2_MIXER_DIR}/lib) - set(SDL2_MIXER_LIBRARIES ${SDL2_MIXER_LIBRARY}) + SET(SDL_MIXER_VERSION 2.8.2) + FetchContent_Declare( + SDL2_mixer + GIT_REPOSITORY https://github.com/libsdl-org/SDL_mixer.git + GIT_TAG release-${SDL_MIXER_VERSION} + ) + + set(BUILD_SHARED_LIBS FALSE) + set(SDL2MIXER_OPUS OFF CACHE BOOL "Disable Opus" FORCE) + set(SDL2MIXER_MOD OFF CACHE BOOL "Disable MOD" FORCE) + set(SDL2MIXER_MP3 OFF CACHE BOOL "Disable MOD" FORCE) + set(SDL2MIXER_MIDI_FLUIDSYNTH OFF CACHE BOOL "Disable MOD" FORCE) + set(SDL2MIXER_WAVPACK OFF CACHE BOOL "Disable MOD" FORCE) + + FetchContent_MakeAvailable(SDL2_mixer) + set(SDL2_MIXER_INCLUDE_DIRS ${SDL2_mixer_SOURCE_DIR}/include) + set(SDL2_MIXER_LIBRARIES SDL2_mixer::SDL2_mixer-static) + add_definitions(-DUSE_SDL_MIXER=1) endif(ENABLE_SOUND MATCHES "BUNDLED") @@ -142,6 +164,32 @@ feature_summary(WHAT DISABLED_FEATURES DESCRIPTION "Disabled features:") # Sources configuration add_subdirectory(src/Libraries/) +include_directories( + BEFORE + src/Libraries/2D/Source + src/Libraries/3D/Source + src/Libraries/AFILE/Source + src/Libraries/DSTRUCT/Source + src/Libraries/EDMS/Source + src/Libraries/FIXPP/Source + src/Libraries/INPUT/Source + src/Libraries/PALETTE/Source + src/Libraries/RES/Source + src/Libraries/UI/Source + src/Libraries/RND/Source + src/Libraries/VOX/Source + src/Libraries/FIX/Source + src/Libraries/SND/Source + src/Libraries/H + src/Libraries/LG/Source + src/Libraries/LG/Source/LOG/src + src/Libraries/adlmidi/include + src/GameSrc/Headers + src/MacSrc + src/MusicSrc + ${CMAKE_BINARY_DIR}/src/GameSrc/Headers +) + set(MAC_SRC src/MacSrc/ShockBitmap.c src/MacSrc/InitMac.c @@ -275,32 +323,6 @@ set(GAME_SRC src/GameSrc/mouselook.c ) -include_directories( - BEFORE - src/Libraries/2D/Source - src/Libraries/3D/Source - src/Libraries/AFILE/Source - src/Libraries/DSTRUCT/Source - src/Libraries/EDMS/Source - src/Libraries/FIXPP/Source - src/Libraries/INPUT/Source - src/Libraries/PALETTE/Source - src/Libraries/RES/Source - src/Libraries/UI/Source - src/Libraries/RND/Source - src/Libraries/VOX/Source - src/Libraries/FIX/Source - src/Libraries/SND/Source - src/Libraries/H - src/Libraries/LG/Source - src/Libraries/LG/Source/LOG/src - src/Libraries/adlmidi/include - src/GameSrc/Headers - src/MacSrc - src/MusicSrc - ${CMAKE_BINARY_DIR}/src/GameSrc/Headers -) - if(ENABLE_EXAMPLES) add_executable(playmov @@ -375,16 +397,14 @@ target_link_libraries(FixTest endif() -# Include magic header file, set struct packing size -add_definitions( - -include precompiled.h -) - add_executable(systemshock ${MAC_SRC} ) +target_precompile_headers(systemshock PUBLIC src/GameSrc/Headers/precompiled.h) add_library(GAME_LIB ${GAME_SRC}) +# Include magic header file, set struct packing size +target_precompile_headers(GAME_LIB PUBLIC src/GameSrc/Headers/precompiled.h) # MINGW additional linker options if(MINGW) From 3e2db314ed818f705409bcd8572f10c764750d23 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Fri, 17 Jul 2026 06:21:34 +0200 Subject: [PATCH 02/56] Move FluidSynth download and build procedure into CMakeLists.txt --- CMakeLists.txt | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 49456d02..169fa585 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -95,9 +95,9 @@ if(ENABLE_SOUND MATCHES "BUNDLED") set(BUILD_SHARED_LIBS FALSE) set(SDL2MIXER_OPUS OFF CACHE BOOL "Disable Opus" FORCE) set(SDL2MIXER_MOD OFF CACHE BOOL "Disable MOD" FORCE) - set(SDL2MIXER_MP3 OFF CACHE BOOL "Disable MOD" FORCE) - set(SDL2MIXER_MIDI_FLUIDSYNTH OFF CACHE BOOL "Disable MOD" FORCE) - set(SDL2MIXER_WAVPACK OFF CACHE BOOL "Disable MOD" FORCE) + set(SDL2MIXER_MP3 OFF CACHE BOOL "Disable MP3" FORCE) + set(SDL2MIXER_MIDI_FLUIDSYNTH OFF CACHE BOOL "Disable FluidSynth" FORCE) + set(SDL2MIXER_WAVPACK OFF CACHE BOOL "Disable WavPack" FORCE) FetchContent_MakeAvailable(SDL2_mixer) set(SDL2_MIXER_INCLUDE_DIRS ${SDL2_mixer_SOURCE_DIR}/include) @@ -112,9 +112,18 @@ if(ENABLE_FLUIDSYNTH MATCHES "ON") add_definitions("-DUSE_FLUIDSYNTH=1") endif(ENABLE_FLUIDSYNTH MATCHES "ON") if(ENABLE_FLUIDSYNTH MATCHES "BUNDLED") - find_library(FLUIDSYNTH_LIBRARY fluidsynth PATHS ${CMAKE_SOURCE_DIR}/build_ext/fluidsynth-lite/src) - set(FLUIDSYNTH_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/build_ext/fluidsynth-lite/include) - set(FLUIDSYNTH_LIBRARIES ${FLUIDSYNTH_LIBRARY}) + SET(FLUIDSYNTH_REVISION c539a8d9270ba5a3f7d6e460606483fc2ab1eb61) + FetchContent_Declare( + FluidSynth + GIT_REPOSITORY https://github.com/EtherTyper/fluidsynth-lite.git + GIT_TAG ${FLUIDSYNTH_REVISION} + ) + + FetchContent_MakeAvailable(FluidSynth) + set(FLUIDSYNTH_INCLUDE_DIRS ${FluidSynth_SOURCE_DIR}/include ${FluidSynth_BINARY_DIR}/include) + find_library(FLUIDSYNTH_LIBRARY fluidsynth PATHS ${FluidSynth_SOURCE_DIR}/include ${FluidSynth_BINARY_DIR}/src) + set(FLUIDSYNTH_LIBRARIES ${FLUIDSYNTH_LIBRARY}) + add_definitions("-DUSE_FLUIDSYNTH=1") endif(ENABLE_FLUIDSYNTH MATCHES "BUNDLED") From 7b78a87a9d0fb1a00a9438079bfdf3ada78ff229 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Fri, 17 Jul 2026 19:05:34 +0200 Subject: [PATCH 03/56] Move GLEW download and build procedure into CMakeLists.txt; Fix FluidSynth for mingw --- CMakeLists.txt | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 169fa585..b7f1bf9c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,8 +7,8 @@ include(FetchContent) #set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS OFF) #set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB32_PATHS ON) -set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB32_PATHS OFF) -set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ON) +#set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB32_PATHS OFF) +#set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ON) # Required for stdbool.h set(CMAKE_C_STANDARD 99) @@ -52,8 +52,24 @@ if(ENABLE_OPENGL) find_package(OpenGL REQUIRED) add_definitions(-DUSE_OPENGL) if(WIN32) - list(APPEND OPENGL_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/build_ext/built_glew/include) - list(APPEND OPENGL_LIBRARIES ${CMAKE_SOURCE_DIR}/build_ext/built_glew/lib/libglew32.dll.a winmm) + SET(GLEW_version 2.1.0) + FetchContent_Declare( + glew + URL https://sourceforge.net/projects/glew/files/glew/${GLEW_version}/glew-${GLEW_version}.tgz + ) + #FetchContent_MakeAvailable(GLEW) + FetchContent_GetProperties(glew) + if(NOT glew_POPULATED) + FetchContent_Populate(glew) + + message("GLEW src-dir '${glew_SOURCE_DIR}'") + message("GLEW bin-dir '${glew_BINARY_DIR}'") + + add_subdirectory(${glew_SOURCE_DIR}/build/cmake ${glew_BINARY_DIR}) + endif() + + list(APPEND OPENGL_INCLUDE_DIRS ${glew_SOURCE_DIR}/include) + list(APPEND OPENGL_LIBRARIES glew_s winmm) endif(WIN32) endif(ENABLE_OPENGL) @@ -71,6 +87,7 @@ if(ENABLE_SDL2 MATCHES "BUNDLED") GIT_TAG "release-${SDL_VERSION}" ) + set(SDL_SHARED OFF CACHE BOOL "Disabled SDL shared lib" FORCE) set(SDL_TEST OFF CACHE BOOL "Disable SDL Test" FORCE) FetchContent_MakeAvailable(SDL2) @@ -119,11 +136,18 @@ if(ENABLE_FLUIDSYNTH MATCHES "BUNDLED") GIT_TAG ${FLUIDSYNTH_REVISION} ) + if ( WIN32 ) + # Sadly, FluidSynth-Lite has its CMakeLists.txt hardcoded to make its functions as exports. + # Idea: Modify CMakeLists.txt as part of this block here? + set(BUILD_SHARED_LIBS TRUE) + endif ( WIN32 ) FetchContent_MakeAvailable(FluidSynth) - set(FLUIDSYNTH_INCLUDE_DIRS ${FluidSynth_SOURCE_DIR}/include ${FluidSynth_BINARY_DIR}/include) - find_library(FLUIDSYNTH_LIBRARY fluidsynth PATHS ${FluidSynth_SOURCE_DIR}/include ${FluidSynth_BINARY_DIR}/src) - set(FLUIDSYNTH_LIBRARIES ${FLUIDSYNTH_LIBRARY}) + message("FluidSynth src-dir '${FluidSynth_SOURCE_DIR}'") + message("FluidSynth bin-dir '${FluidSynth_BINARY_DIR}'") + + set(FLUIDSYNTH_INCLUDE_DIRS ${FLUIDSYNTH_INCLUDE_DIR}) + set(BUILD_SHARED_LIBS FALSE) add_definitions("-DUSE_FLUIDSYNTH=1") endif(ENABLE_FLUIDSYNTH MATCHES "BUNDLED") From 447a689f68c6e7f3484ada3a656a35ba17fabf57 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Fri, 17 Jul 2026 20:45:17 +0200 Subject: [PATCH 04/56] Add toolchain files for mingw cross-compilation --- cmake/toolchains/i686-w64-mingw32.cmake | 21 +++++++++++++++++++++ cmake/toolchains/x86_64-w64-mingw32.cmake | 21 +++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 cmake/toolchains/i686-w64-mingw32.cmake create mode 100644 cmake/toolchains/x86_64-w64-mingw32.cmake diff --git a/cmake/toolchains/i686-w64-mingw32.cmake b/cmake/toolchains/i686-w64-mingw32.cmake new file mode 100644 index 00000000..4830c985 --- /dev/null +++ b/cmake/toolchains/i686-w64-mingw32.cmake @@ -0,0 +1,21 @@ + +set(CMAKE_SYSTEM_NAME Windows) +set(CMAKE_SYSTEM_PROCESSOR i686) + +# specify the cross compiler +set(CMAKE_C_COMPILER i686-w64-mingw32-gcc) +set(CMAKE_CXX_COMPILER i686-w64-mingw32-g++) +set(CMAKE_RC_COMPILER i686-w64-mingw32-windres) + +# where is the target environment +set(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32 /usr/i686-w64-mingw32/sys-root/mingw) + +# search for programs in the build host directories +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +# for libraries and headers in the target directories +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + +# CMake determines how to examine dependencies based on the *host* system, leading to +# a `file unknown error` unless the target platform is explicitly specified. +set(CMAKE_GET_RUNTIME_DEPENDENCIES_PLATFORM "windows+pe") diff --git a/cmake/toolchains/x86_64-w64-mingw32.cmake b/cmake/toolchains/x86_64-w64-mingw32.cmake new file mode 100644 index 00000000..d52e90a4 --- /dev/null +++ b/cmake/toolchains/x86_64-w64-mingw32.cmake @@ -0,0 +1,21 @@ +# From https://www.mingw-w64.org/build-systems/cmake/ +set(CMAKE_SYSTEM_NAME Windows) +set(CMAKE_SYSTEM_PROCESSOR x86_64) + +# specify the cross compiler +set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) +set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) +set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) + +# where is the target environment +set(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32) + +# search for programs in the build host directories +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +# for libraries and headers in the target directories +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + +# CMake determines how to examine dependencies based on the *host* system, leading to +# a `file unknown error` unless the target platform is explicitly specified. +set(CMAKE_GET_RUNTIME_DEPENDENCIES_PLATFORM "windows+pe") From 4ab1dc675474ab0157d03f983dbc1b852f0c80a9 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Fri, 17 Jul 2026 21:30:30 +0200 Subject: [PATCH 05/56] Add toolchain files for linux gcc --- cmake/toolchains/i686-gcc.cmake | 17 +++++++++++++++++ cmake/toolchains/x86-64-gcc.cmake | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 cmake/toolchains/i686-gcc.cmake create mode 100644 cmake/toolchains/x86-64-gcc.cmake diff --git a/cmake/toolchains/i686-gcc.cmake b/cmake/toolchains/i686-gcc.cmake new file mode 100644 index 00000000..105cf8c6 --- /dev/null +++ b/cmake/toolchains/i686-gcc.cmake @@ -0,0 +1,17 @@ + +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR i686) + +# specify the regular compiler +set(CMAKE_C_COMPILER gcc) +set(CMAKE_CXX_COMPILER g++) + +set(CMAKE_C_FLAGS -m32) +set(CMAKE_CXX_FLAGS -m32) + + +# search for programs in the build host directories +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +# for libraries and headers in the target directories +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff --git a/cmake/toolchains/x86-64-gcc.cmake b/cmake/toolchains/x86-64-gcc.cmake new file mode 100644 index 00000000..5e5fdda8 --- /dev/null +++ b/cmake/toolchains/x86-64-gcc.cmake @@ -0,0 +1,17 @@ + +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR i686) + +# specify the regular compiler +set(CMAKE_C_COMPILER gcc) +set(CMAKE_CXX_COMPILER g++) + +set(CMAKE_C_FLAGS -m64) +set(CMAKE_CXX_FLAGS -m64) + + +# search for programs in the build host directories +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +# for libraries and headers in the target directories +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) From 5fe8f779276e542e1f6aa3d2cc70e0acae34443f Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Fri, 17 Jul 2026 21:31:19 +0200 Subject: [PATCH 06/56] Add workflow script for building --- .github/workflows/main-build.yml | 53 ++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 .github/workflows/main-build.yml diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml new file mode 100644 index 00000000..f28cc401 --- /dev/null +++ b/.github/workflows/main-build.yml @@ -0,0 +1,53 @@ +name: Main Build +on: + push: + tags: + - v* + branches: + - main + pull_request: +permissions: + contents: read +jobs: + build: + name: ${{matrix.build}} + runs-on: ubuntu-22.04 + strategy: + matrix: + os: [ linux, mswin ] + arch: [x86-64, i686] + include: + - os: linux + arch: x86-64 + toolchain_file: 'x64-64-gcc.cmake' + extra_packages: 'mesa-utils mesa-common-dev xorg-dev libxrandr-dev' + + - os: linux + arch: i686 + toolchain_file: 'i686-gcc.cmake' + extra_packages: 'mesa-utils mesa-common-dev xorg-dev libxrandr-dev' + + - os: mswin + arch: x86-64 + toolchain_file: 'x86-64-w64-mingw32.cmake' + extra_packages: 'gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64' + + - os: mswin + arch: i686 + toolchain_file: 'i686-w64-mingw32.cmake' + extra_packages: 'gcc-mingw-w64-i686 g++-mingw-w64-i686' + steps: + - uses: actions/checkout@v3 + - name: Install things + run: | + sudo apt-get update + sudo apt-get install -y cmake3 gcc g++ ${{ matrix.extra_packages }} + - name: Generate build files + run: | + mkdir build + cd build + cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/${{ matrix.toolchain_file }} + - name: Compile and link + run: | + cd build + cmake --build . -j6 From 7c6288754de5ceba345e00feff36960dd387edb5 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Fri, 17 Jul 2026 21:44:21 +0200 Subject: [PATCH 07/56] Rename file to be x86-64 instead of x86_64 --- .../{x86_64-w64-mingw32.cmake => x86-64-w64-mingw32.cmake} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename cmake/toolchains/{x86_64-w64-mingw32.cmake => x86-64-w64-mingw32.cmake} (100%) diff --git a/cmake/toolchains/x86_64-w64-mingw32.cmake b/cmake/toolchains/x86-64-w64-mingw32.cmake similarity index 100% rename from cmake/toolchains/x86_64-w64-mingw32.cmake rename to cmake/toolchains/x86-64-w64-mingw32.cmake From 82765a901248b2a2d011760a43b94d895e4f60fe Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Fri, 17 Jul 2026 21:44:38 +0200 Subject: [PATCH 08/56] Fix job name --- .github/workflows/main-build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index f28cc401..0b71d138 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -10,12 +10,12 @@ permissions: contents: read jobs: build: - name: ${{matrix.build}} + name: ${{matrix.os}} - ${{matrix.arch}} runs-on: ubuntu-22.04 strategy: matrix: os: [ linux, mswin ] - arch: [x86-64, i686] + arch: [ x86-64, i686 ] include: - os: linux arch: x86-64 From 10c73ffc78c78482b340424031de45b79822a80a Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Fri, 17 Jul 2026 21:47:16 +0200 Subject: [PATCH 09/56] Add base build workflow for main build --- .github/workflows/main-build.yml | 44 ++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 .github/workflows/main-build.yml diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml new file mode 100644 index 00000000..4f78c1c9 --- /dev/null +++ b/.github/workflows/main-build.yml @@ -0,0 +1,44 @@ +name: Main Build +on: + push: + tags: + - v* + branches: + - main + pull_request: +permissions: + contents: read +jobs: + build: + name: ${{matrix.os}} - ${{matrix.arch}} + runs-on: ubuntu-22.04 + strategy: + matrix: + os: [ linux, mswin ] + arch: [ x86-64, i686 ] + include: + - os: linux + arch: x86-64 + toolchain_file: 'x64-64-gcc.cmake' + extra_packages: 'mesa-utils mesa-common-dev xorg-dev libxrandr-dev' + + - os: linux + arch: i686 + toolchain_file: 'i686-gcc.cmake' + extra_packages: 'mesa-utils mesa-common-dev xorg-dev libxrandr-dev' + + - os: mswin + arch: x86-64 + toolchain_file: 'x86-64-w64-mingw32.cmake' + extra_packages: 'gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64' + + - os: mswin + arch: i686 + toolchain_file: 'i686-w64-mingw32.cmake' + extra_packages: 'gcc-mingw-w64-i686 g++-mingw-w64-i686' + steps: + - uses: actions/checkout@v3 + - name: Install things + run: | + sudo apt-get update + sudo apt-get install -y cmake3 gcc g++ ${{ matrix.extra_packages }} From d33a14313edccdc31074280ec5216a3b84e76252 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Fri, 17 Jul 2026 21:52:08 +0200 Subject: [PATCH 10/56] Change cmake installation --- .github/workflows/main-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index 4f78c1c9..0eaf92ca 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -41,4 +41,4 @@ jobs: - name: Install things run: | sudo apt-get update - sudo apt-get install -y cmake3 gcc g++ ${{ matrix.extra_packages }} + sudo apt-get install -y cmake gcc g++ ${{ matrix.extra_packages }} From 1bbc43f82c10dab5141a9c2757eea7b696321c25 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Fri, 17 Jul 2026 22:02:47 +0200 Subject: [PATCH 11/56] Run build on any branch push --- .github/workflows/main-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index eee878be..84d66a85 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -4,7 +4,7 @@ on: tags: - v* branches: - - main + - ** pull_request: permissions: contents: read From ea8c64f1d1f4516ff88fbfd3f1ac8e0e7b862649 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Fri, 17 Jul 2026 22:03:59 +0200 Subject: [PATCH 12/56] Simplify trigger filter --- .github/workflows/main-build.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index 84d66a85..ccd39988 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -1,11 +1,7 @@ name: Main Build on: - push: - tags: - - v* - branches: - - ** - pull_request: + push + pull_request permissions: contents: read jobs: From 5998ddb9e19268b37bcb4bd92bfffc04ca86fcef Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Fri, 17 Jul 2026 22:04:50 +0200 Subject: [PATCH 13/56] Does it need colons? --- .github/workflows/main-build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index ccd39988..c022a247 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -1,7 +1,7 @@ name: Main Build on: - push - pull_request + push: + pull_request: permissions: contents: read jobs: From 722b535097bec558bfe772937fa9d7b18883efb7 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Fri, 17 Jul 2026 22:22:26 +0200 Subject: [PATCH 14/56] Prefer new GLVND interface for OpenGL --- CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index b7f1bf9c..5f4fefff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,11 @@ cmake_minimum_required(VERSION 3.25) project(shockolate VERSION 0.7.8) +# Prefer new GLVND library interface +if(POLICY CMP0072) + cmake_policy(SET CMP0072 NEW) +endif() + include(FeatureSummary) include(FetchContent) From 5f961bc46e3c0b1c1d31eb771ad812bb3ba931f6 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Fri, 17 Jul 2026 22:23:07 +0200 Subject: [PATCH 15/56] Add parameter also for linker --- cmake/toolchains/i686-gcc.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/toolchains/i686-gcc.cmake b/cmake/toolchains/i686-gcc.cmake index 105cf8c6..0cd1b581 100644 --- a/cmake/toolchains/i686-gcc.cmake +++ b/cmake/toolchains/i686-gcc.cmake @@ -8,7 +8,7 @@ set(CMAKE_CXX_COMPILER g++) set(CMAKE_C_FLAGS -m32) set(CMAKE_CXX_FLAGS -m32) - +set(CMAKE_EXE_LINKER_FLAGS_INIT "-m32") # search for programs in the build host directories set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) From 3620ad842d6a7c6e067b6b0215da312c95c6e00b Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Fri, 17 Jul 2026 22:23:22 +0200 Subject: [PATCH 16/56] Separate 32bit and 64bit installation --- .github/workflows/main-build.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index c022a247..9fbcaa39 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -16,12 +16,12 @@ jobs: - os: linux arch: x86-64 toolchain_file: 'x64-64-gcc.cmake' - extra_packages: 'mesa-utils mesa-common-dev xorg-dev libxrandr-dev' + extra_packages: 'gcc g++ mesa-utils mesa-common-dev xorg-dev libxrandr-dev' - os: linux arch: i686 toolchain_file: 'i686-gcc.cmake' - extra_packages: 'mesa-utils mesa-common-dev xorg-dev libxrandr-dev' + extra_packages: 'gcc-multilib g++-multilib mesa-utils:i386 mesa-common-dev:i386 xorg-dev:i386 libxrandr-dev:i386' - os: mswin arch: x86-64 @@ -36,8 +36,9 @@ jobs: - uses: actions/checkout@v3 - name: Install things run: | + sudo dpkg --add-architecture i386 sudo apt-get update - sudo apt-get install -y cmake gcc g++ ${{ matrix.extra_packages }} + sudo apt-get install -y cmake ${{ matrix.extra_packages }} - name: Generate build files run: | mkdir build From bec24667b226cfea2ab90919c9796d3fd13ea6ac Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Fri, 17 Jul 2026 22:24:40 +0200 Subject: [PATCH 17/56] Reduce i386 needs --- .github/workflows/main-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index 9fbcaa39..e1889abd 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -21,7 +21,7 @@ jobs: - os: linux arch: i686 toolchain_file: 'i686-gcc.cmake' - extra_packages: 'gcc-multilib g++-multilib mesa-utils:i386 mesa-common-dev:i386 xorg-dev:i386 libxrandr-dev:i386' + extra_packages: 'gcc-multilib g++-multilib mesa-utils mesa-common-dev:i386 xorg-dev libxrandr-dev' - os: mswin arch: x86-64 From 8ac242c29074a8c9bf2892280bbf8822bed2bb02 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Fri, 17 Jul 2026 22:28:00 +0200 Subject: [PATCH 18/56] Print content of current directory to see what is up --- .github/workflows/main-build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index e1889abd..a45d660f 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -41,6 +41,7 @@ jobs: sudo apt-get install -y cmake ${{ matrix.extra_packages }} - name: Generate build files run: | + ls -la mkdir build cd build cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/${{ matrix.toolchain_file }} From 2b0ceb26cb2acc487d7d7fc08034d67c5da23f5e Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Fri, 17 Jul 2026 22:29:46 +0200 Subject: [PATCH 19/56] Fix name of toolchain file --- .github/workflows/main-build.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index a45d660f..a37f4f1d 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -15,7 +15,7 @@ jobs: include: - os: linux arch: x86-64 - toolchain_file: 'x64-64-gcc.cmake' + toolchain_file: 'x86-64-gcc.cmake' extra_packages: 'gcc g++ mesa-utils mesa-common-dev xorg-dev libxrandr-dev' - os: linux @@ -41,7 +41,6 @@ jobs: sudo apt-get install -y cmake ${{ matrix.extra_packages }} - name: Generate build files run: | - ls -la mkdir build cd build cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/${{ matrix.toolchain_file }} From a81b8cbc051f7772e72cdc8e67461e31ea3995a8 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 07:18:27 +0200 Subject: [PATCH 20/56] Ignore CLion IDE files --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 75db2893..b36829c7 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,7 @@ savgam*.dat .project .cproject .DS_Store + +# CLion +cmake-build-* +.idea From 7556412c913a91213b209f8bc462a35de4cb75e3 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 07:25:44 +0200 Subject: [PATCH 21/56] Remove commented statements --- CMakeLists.txt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5f4fefff..ffe42561 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,11 +10,6 @@ endif() include(FeatureSummary) include(FetchContent) -#set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS OFF) -#set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB32_PATHS ON) -#set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB32_PATHS OFF) -#set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ON) - # Required for stdbool.h set(CMAKE_C_STANDARD 99) # For nullptr in C++ From 2fcd660e46329d54d2018ff1026ac593ffa0c1ad Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 07:40:33 +0200 Subject: [PATCH 22/56] Avoid using deprecated FetchContent_Populate, use corresponding parameter of _Declare --- CMakeLists.txt | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ffe42561..08f5d04c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,17 +56,12 @@ if(ENABLE_OPENGL) FetchContent_Declare( glew URL https://sourceforge.net/projects/glew/files/glew/${GLEW_version}/glew-${GLEW_version}.tgz + SOURCE_SUBDIR build/cmake ) - #FetchContent_MakeAvailable(GLEW) - FetchContent_GetProperties(glew) - if(NOT glew_POPULATED) - FetchContent_Populate(glew) + FetchContent_MakeAvailable(GLEW) - message("GLEW src-dir '${glew_SOURCE_DIR}'") - message("GLEW bin-dir '${glew_BINARY_DIR}'") - - add_subdirectory(${glew_SOURCE_DIR}/build/cmake ${glew_BINARY_DIR}) - endif() + message("GLEW src-dir '${glew_SOURCE_DIR}'") + message("GLEW bin-dir '${glew_BINARY_DIR}'") list(APPEND OPENGL_INCLUDE_DIRS ${glew_SOURCE_DIR}/include) list(APPEND OPENGL_LIBRARIES glew_s winmm) From 2a7fe9bea9c191ff349549bf4f66d6d0b38ec9db Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 07:56:31 +0200 Subject: [PATCH 23/56] Solve build error under MS Windows with FluidSynth; Make variables explicit Newer CMake hide older variable settings, unless they were forced. --- CMakeLists.txt | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 08f5d04c..f6f7a028 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,10 +2,8 @@ cmake_minimum_required(VERSION 3.25) project(shockolate VERSION 0.7.8) -# Prefer new GLVND library interface -if(POLICY CMP0072) - cmake_policy(SET CMP0072 NEW) -endif() +cmake_policy(SET CMP0072 NEW) # Prefer new GLVND library interface +cmake_policy(SET CMP0077 NEW) # Abort if variables are not clearly set include(FeatureSummary) include(FetchContent) @@ -38,6 +36,9 @@ set(ENABLE_FLUIDSYNTH "BUNDLED" CACHE STRING "Enable FluidSynth MIDI support (ON set_property(CACHE ENABLE_FLUIDSYNTH PROPERTY STRINGS "ON" "BUNDLED" "OFF") add_feature_info(ENABLE_FLUIDSYNTH ENABLE_FLUIDSYNTH "Enable FluidSynth MIDI support") +# To keep a minimum dependency list, any created library should be static, even third-party dependencies. +set(BUILD_SHARED_LIBS FALSE CACHE BOOL "Force creation of static libraries, globally" FORCE) + # HAAAAX!! add_definitions(-DSVGA_SUPPORT) @@ -104,7 +105,6 @@ if(ENABLE_SOUND MATCHES "BUNDLED") GIT_TAG release-${SDL_MIXER_VERSION} ) - set(BUILD_SHARED_LIBS FALSE) set(SDL2MIXER_OPUS OFF CACHE BOOL "Disable Opus" FORCE) set(SDL2MIXER_MOD OFF CACHE BOOL "Disable MOD" FORCE) set(SDL2MIXER_MP3 OFF CACHE BOOL "Disable MP3" FORCE) @@ -131,18 +131,18 @@ if(ENABLE_FLUIDSYNTH MATCHES "BUNDLED") GIT_TAG ${FLUIDSYNTH_REVISION} ) - if ( WIN32 ) - # Sadly, FluidSynth-Lite has its CMakeLists.txt hardcoded to make its functions as exports. - # Idea: Modify CMakeLists.txt as part of this block here? - set(BUILD_SHARED_LIBS TRUE) - endif ( WIN32 ) - FetchContent_MakeAvailable(FluidSynth) - message("FluidSynth src-dir '${FluidSynth_SOURCE_DIR}'") - message("FluidSynth bin-dir '${FluidSynth_BINARY_DIR}'") + if ( WIN32 ) + # Sadly, FluidSynth-Lite has its CMakeLists.txt hardcoded to make its functions as exports. + # Idea: Modify CMakeLists.txt as part of this block here? + set(BUILD_SHARED_LIBS TRUE CACHE BOOL "Force shared libs for FluidSynth on Windows" FORCE) + endif ( WIN32 ) + FetchContent_MakeAvailable(FluidSynth) + message("FluidSynth src-dir '${FluidSynth_SOURCE_DIR}'") + message("FluidSynth bin-dir '${FluidSynth_BINARY_DIR}'") - set(FLUIDSYNTH_INCLUDE_DIRS ${FLUIDSYNTH_INCLUDE_DIR}) + set(FLUIDSYNTH_INCLUDE_DIRS ${FLUIDSYNTH_INCLUDE_DIR}) - set(BUILD_SHARED_LIBS FALSE) + set(BUILD_SHARED_LIBS FALSE CACHE BOOL "Restore creation of static libraries" FORCE) add_definitions("-DUSE_FLUIDSYNTH=1") endif(ENABLE_FLUIDSYNTH MATCHES "BUNDLED") From 41e0f061a40d71c36e4f5a8374a243c184ea8d21 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 08:22:54 +0200 Subject: [PATCH 24/56] Add missing include to ensure isprint() is known --- src/Libraries/INPUT/Source/sdl_events.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Libraries/INPUT/Source/sdl_events.c b/src/Libraries/INPUT/Source/sdl_events.c index 3907b6cb..2a808f5a 100644 --- a/src/Libraries/INPUT/Source/sdl_events.c +++ b/src/Libraries/INPUT/Source/sdl_events.c @@ -25,6 +25,7 @@ along with this program. If not, see . #include "lg.h" #include "kb.h" #include "mouse.h" +#include #include #include #include From fea1fa94a3c86dff848b18e4684f3543442cc060 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 08:23:13 +0200 Subject: [PATCH 25/56] Handle compilation issue in FluidSynth-Lite --- CMakeLists.txt | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f6f7a028..db8ca530 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -124,12 +124,12 @@ if(ENABLE_FLUIDSYNTH MATCHES "ON") add_definitions("-DUSE_FLUIDSYNTH=1") endif(ENABLE_FLUIDSYNTH MATCHES "ON") if(ENABLE_FLUIDSYNTH MATCHES "BUNDLED") - SET(FLUIDSYNTH_REVISION c539a8d9270ba5a3f7d6e460606483fc2ab1eb61) - FetchContent_Declare( - FluidSynth - GIT_REPOSITORY https://github.com/EtherTyper/fluidsynth-lite.git - GIT_TAG ${FLUIDSYNTH_REVISION} - ) + SET(FLUIDSYNTH_REVISION c539a8d9270ba5a3f7d6e460606483fc2ab1eb61) + FetchContent_Declare( + FluidSynth + GIT_REPOSITORY https://github.com/EtherTyper/fluidsynth-lite.git + GIT_TAG ${FLUIDSYNTH_REVISION} + ) if ( WIN32 ) # Sadly, FluidSynth-Lite has its CMakeLists.txt hardcoded to make its functions as exports. @@ -139,7 +139,12 @@ if(ENABLE_FLUIDSYNTH MATCHES "BUNDLED") FetchContent_MakeAvailable(FluidSynth) message("FluidSynth src-dir '${FluidSynth_SOURCE_DIR}'") message("FluidSynth bin-dir '${FluidSynth_BINARY_DIR}'") - + if(CMAKE_C_COMPILER_ID STREQUAL "GNU") + # This is a necessary hack; gcc-15 warns (errors) if a static array is initialized + # with a string that exceeds its storage. This is the case for fluid_defsfont.c, + # where it initializes idlist. + target_compile_options(libfluidsynth PRIVATE -Wno-error=unterminated-string-initialization) + endif() set(FLUIDSYNTH_INCLUDE_DIRS ${FLUIDSYNTH_INCLUDE_DIR}) set(BUILD_SHARED_LIBS FALSE CACHE BOOL "Restore creation of static libraries" FORCE) From 8c31017ed539b55b9dbf74691f268a8a59128d3c Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 08:34:47 +0200 Subject: [PATCH 26/56] Extend compiler option guard to include version --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index db8ca530..09a8c68a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -139,7 +139,7 @@ if(ENABLE_FLUIDSYNTH MATCHES "BUNDLED") FetchContent_MakeAvailable(FluidSynth) message("FluidSynth src-dir '${FluidSynth_SOURCE_DIR}'") message("FluidSynth bin-dir '${FluidSynth_BINARY_DIR}'") - if(CMAKE_C_COMPILER_ID STREQUAL "GNU") + if(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 15) # This is a necessary hack; gcc-15 warns (errors) if a static array is initialized # with a string that exceeds its storage. This is the case for fluid_defsfont.c, # where it initializes idlist. From 926b6b172702177fa5706cef47ddf079147a21bc Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 08:35:24 +0200 Subject: [PATCH 27/56] Rework build script to a better approach; Use CMake's parameters --- .github/workflows/main-build.yml | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index a37f4f1d..1c701704 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -9,6 +9,7 @@ jobs: name: ${{matrix.os}} - ${{matrix.arch}} runs-on: ubuntu-22.04 strategy: + fail-fast: false matrix: os: [ linux, mswin ] arch: [ x86-64, i686 ] @@ -33,18 +34,19 @@ jobs: toolchain_file: 'i686-w64-mingw32.cmake' extra_packages: 'gcc-mingw-w64-i686 g++-mingw-w64-i686' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install things run: | sudo dpkg --add-architecture i386 sudo apt-get update sudo apt-get install -y cmake ${{ matrix.extra_packages }} - name: Generate build files - run: | - mkdir build - cd build - cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/${{ matrix.toolchain_file }} - - name: Compile and link - run: | - cd build - cmake --build . -j6 + run: > + cmake + -B build + -S . + -G Ninja + -DCMAKE_BUILD_TYPE=RelWithDebInfo + -DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/${{ matrix.toolchain_file }} + - name: Build + run: cmake --build build -j $(nproc) From 74ee8e737cc73d3b342d4ae87884d1642c4cfa05 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 08:44:26 +0200 Subject: [PATCH 28/56] Make binaries available for download --- .github/workflows/main-build.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index 1c701704..d22a632b 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -50,3 +50,13 @@ jobs: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/${{ matrix.toolchain_file }} - name: Build run: cmake --build build -j $(nproc) + + - name: Upload Build Artifacts + uses: actions/upload-artifact@v7 + with: + name: systemshock-${{ matrix.os }}-${{ matrix.arch }} + path: | + build/systemshock + build/*.exe + build/*/.dll + if-no-files-found: warn From f18e1b2b39af6efdc0b176618258a12588cc7ec5 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 08:46:22 +0200 Subject: [PATCH 29/56] Fix DLL inclusion in artifact --- .github/workflows/main-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index d22a632b..a38791f6 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -58,5 +58,5 @@ jobs: path: | build/systemshock build/*.exe - build/*/.dll + build/*/*.dll if-no-files-found: warn From f207677866e5f12db27e2b0f348002fd52287803 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 08:47:38 +0200 Subject: [PATCH 30/56] Upgrade to newest checkout action --- .github/workflows/main-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index a38791f6..3cfc3016 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -34,7 +34,7 @@ jobs: toolchain_file: 'i686-w64-mingw32.cmake' extra_packages: 'gcc-mingw-w64-i686 g++-mingw-w64-i686' steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - name: Install things run: | sudo dpkg --add-architecture i386 From 9163a1a431aa5d8e3678bb794ab4cb9cf585e503 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 09:01:25 +0200 Subject: [PATCH 31/56] Use CMake to prepare distribution package --- .github/workflows/main-build.yml | 9 ++++----- CMakeLists.txt | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index 3cfc3016..e537d7e4 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -35,7 +35,7 @@ jobs: extra_packages: 'gcc-mingw-w64-i686 g++-mingw-w64-i686' steps: - uses: actions/checkout@v7 - - name: Install things + - name: Install build dependencies run: | sudo dpkg --add-architecture i386 sudo apt-get update @@ -50,13 +50,12 @@ jobs: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/${{ matrix.toolchain_file }} - name: Build run: cmake --build build -j $(nproc) + - name: Prepare distribution package + run: cmake --install build --prefix dist - name: Upload Build Artifacts uses: actions/upload-artifact@v7 with: name: systemshock-${{ matrix.os }}-${{ matrix.arch }} - path: | - build/systemshock - build/*.exe - build/*/*.dll + path: dist/ if-no-files-found: warn diff --git a/CMakeLists.txt b/CMakeLists.txt index 09a8c68a..29f5627e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -475,3 +475,21 @@ target_link_libraries(systemshock set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/externals/sanitizers/cmake" ${CMAKE_MODULE_PATH}) find_package(Sanitizers) add_sanitizers(systemshock) + +# --- Installation Rules --- + +install(TARGETS systemshock + RUNTIME DESTINATION . +) +if(WIN32) + if(ENABLE_FLUIDSYNTH MATCHES "BUNDLED") + install(FILES $ DESTINATION .) + endif() +endif() + +install(FILES + ${CMAKE_SOURCE_DIR}/README.md + ${CMAKE_SOURCE_DIR}/LICENSE + ${CMAKE_SOURCE_DIR}/COPYING.txt + DESTINATION . +) From 942d9f1bdf5abe88aaf5c26ca6196200a1abaefc Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 09:13:36 +0200 Subject: [PATCH 32/56] Avoid dependencies to end up in distribution package --- CMakeLists.txt | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 29f5627e..1e8fb015 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,6 +58,7 @@ if(ENABLE_OPENGL) glew URL https://sourceforge.net/projects/glew/files/glew/${GLEW_version}/glew-${GLEW_version}.tgz SOURCE_SUBDIR build/cmake + SYSTEM ) FetchContent_MakeAvailable(GLEW) @@ -81,10 +82,12 @@ if(ENABLE_SDL2 MATCHES "BUNDLED") SDL2 GIT_REPOSITORY https://github.com/libsdl-org/SDL GIT_TAG "release-${SDL_VERSION}" + SYSTEM ) set(SDL_SHARED OFF CACHE BOOL "Disabled SDL shared lib" FORCE) set(SDL_TEST OFF CACHE BOOL "Disable SDL Test" FORCE) + set(SDL_INSTALL OFF CACHE BOOL "Disable SDL installation" FORCE) FetchContent_MakeAvailable(SDL2) set(SDL2_INCLUDE_DIRS ${SDL2_SOURCE_DIR}/include) @@ -103,6 +106,7 @@ if(ENABLE_SOUND MATCHES "BUNDLED") SDL2_mixer GIT_REPOSITORY https://github.com/libsdl-org/SDL_mixer.git GIT_TAG release-${SDL_MIXER_VERSION} + SYSTEM ) set(SDL2MIXER_OPUS OFF CACHE BOOL "Disable Opus" FORCE) @@ -110,6 +114,7 @@ if(ENABLE_SOUND MATCHES "BUNDLED") set(SDL2MIXER_MP3 OFF CACHE BOOL "Disable MP3" FORCE) set(SDL2MIXER_MIDI_FLUIDSYNTH OFF CACHE BOOL "Disable FluidSynth" FORCE) set(SDL2MIXER_WAVPACK OFF CACHE BOOL "Disable WavPack" FORCE) + set(SDL2MIXER_INSTALL OFF CACHE BOOL "Disable SDL_mixer installation" FORCE) FetchContent_MakeAvailable(SDL2_mixer) set(SDL2_MIXER_INCLUDE_DIRS ${SDL2_mixer_SOURCE_DIR}/include) @@ -129,6 +134,7 @@ if(ENABLE_FLUIDSYNTH MATCHES "BUNDLED") FluidSynth GIT_REPOSITORY https://github.com/EtherTyper/fluidsynth-lite.git GIT_TAG ${FLUIDSYNTH_REVISION} + SYSTEM ) if ( WIN32 ) @@ -485,6 +491,20 @@ if(WIN32) if(ENABLE_FLUIDSYNTH MATCHES "BUNDLED") install(FILES $ DESTINATION .) endif() + + # Resolve and install MinGW runtime DLLs + if(MINGW) + foreach(DLL libgcc_s_seh-1.dll libstdc++-6.dll) + execute_process( + COMMAND ${CMAKE_C_COMPILER} -print-file-name=${DLL} + OUTPUT_VARIABLE DLL_PATH + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(EXISTS "${DLL_PATH}" AND NOT "${DLL_PATH}" STREQUAL "${DLL}") + install(FILES "${DLL_PATH}" DESTINATION .) + endif() + endforeach() + endif() endif() install(FILES From 4288d5808e0f4fc5d51e5f374a69ce1eba1fa5aa Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 09:22:59 +0200 Subject: [PATCH 33/56] Another attempt at excluding dependency extras from ending up in distribution package --- CMakeLists.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1e8fb015..da0a8943 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.25) +cmake_minimum_required(VERSION 3.28) project(shockolate VERSION 0.7.8) @@ -58,7 +58,7 @@ if(ENABLE_OPENGL) glew URL https://sourceforge.net/projects/glew/files/glew/${GLEW_version}/glew-${GLEW_version}.tgz SOURCE_SUBDIR build/cmake - SYSTEM + EXCLUDE_FROM_ALL ) FetchContent_MakeAvailable(GLEW) @@ -82,7 +82,7 @@ if(ENABLE_SDL2 MATCHES "BUNDLED") SDL2 GIT_REPOSITORY https://github.com/libsdl-org/SDL GIT_TAG "release-${SDL_VERSION}" - SYSTEM + EXCLUDE_FROM_ALL ) set(SDL_SHARED OFF CACHE BOOL "Disabled SDL shared lib" FORCE) @@ -106,7 +106,7 @@ if(ENABLE_SOUND MATCHES "BUNDLED") SDL2_mixer GIT_REPOSITORY https://github.com/libsdl-org/SDL_mixer.git GIT_TAG release-${SDL_MIXER_VERSION} - SYSTEM + EXCLUDE_FROM_ALL ) set(SDL2MIXER_OPUS OFF CACHE BOOL "Disable Opus" FORCE) @@ -134,7 +134,7 @@ if(ENABLE_FLUIDSYNTH MATCHES "BUNDLED") FluidSynth GIT_REPOSITORY https://github.com/EtherTyper/fluidsynth-lite.git GIT_TAG ${FLUIDSYNTH_REVISION} - SYSTEM + EXCLUDE_FROM_ALL ) if ( WIN32 ) From 8efeea81a95683833bfefeea0bdd4201b7e57941 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 09:35:16 +0200 Subject: [PATCH 34/56] Attempt to use static runtime linking for MinGW; avoids need for extra DLLs; In 32bit-build, one was not found --- CMakeLists.txt | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index da0a8943..9cc0bc5b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -477,6 +477,10 @@ target_link_libraries(systemshock ${ALSA_LIBRARIES} ) +if(MINGW) + target_link_options(systemshock PRIVATE "-static-libgcc" "-static-libstdc++") +endif(MINGW) + # Turn on address sanitizing if wanted set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/externals/sanitizers/cmake" ${CMAKE_MODULE_PATH}) find_package(Sanitizers) @@ -491,20 +495,6 @@ if(WIN32) if(ENABLE_FLUIDSYNTH MATCHES "BUNDLED") install(FILES $ DESTINATION .) endif() - - # Resolve and install MinGW runtime DLLs - if(MINGW) - foreach(DLL libgcc_s_seh-1.dll libstdc++-6.dll) - execute_process( - COMMAND ${CMAKE_C_COMPILER} -print-file-name=${DLL} - OUTPUT_VARIABLE DLL_PATH - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - if(EXISTS "${DLL_PATH}" AND NOT "${DLL_PATH}" STREQUAL "${DLL}") - install(FILES "${DLL_PATH}" DESTINATION .) - endif() - endforeach() - endif() endif() install(FILES From 1020d52d88c8adcb59dfdf09e05564026cbda8ea Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 10:03:28 +0200 Subject: [PATCH 35/56] Move static linking of MinGW runtime libraries to toolchain files, where this belongs --- CMakeLists.txt | 4 ---- cmake/toolchains/i686-w64-mingw32.cmake | 3 +++ cmake/toolchains/x86-64-w64-mingw32.cmake | 3 +++ 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9cc0bc5b..62210fb7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -477,10 +477,6 @@ target_link_libraries(systemshock ${ALSA_LIBRARIES} ) -if(MINGW) - target_link_options(systemshock PRIVATE "-static-libgcc" "-static-libstdc++") -endif(MINGW) - # Turn on address sanitizing if wanted set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/externals/sanitizers/cmake" ${CMAKE_MODULE_PATH}) find_package(Sanitizers) diff --git a/cmake/toolchains/i686-w64-mingw32.cmake b/cmake/toolchains/i686-w64-mingw32.cmake index 4830c985..9ff40a1f 100644 --- a/cmake/toolchains/i686-w64-mingw32.cmake +++ b/cmake/toolchains/i686-w64-mingw32.cmake @@ -7,6 +7,9 @@ set(CMAKE_C_COMPILER i686-w64-mingw32-gcc) set(CMAKE_CXX_COMPILER i686-w64-mingw32-g++) set(CMAKE_RC_COMPILER i686-w64-mingw32-windres) +# Static runtime library linking +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++") + # where is the target environment set(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32 /usr/i686-w64-mingw32/sys-root/mingw) diff --git a/cmake/toolchains/x86-64-w64-mingw32.cmake b/cmake/toolchains/x86-64-w64-mingw32.cmake index d52e90a4..da631cb7 100644 --- a/cmake/toolchains/x86-64-w64-mingw32.cmake +++ b/cmake/toolchains/x86-64-w64-mingw32.cmake @@ -7,6 +7,9 @@ set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) +# Static runtime library linking +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++") + # where is the target environment set(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32) From 2a92cd7ffb3d475891d26d4baa72f78f13e297a3 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 10:10:13 +0200 Subject: [PATCH 36/56] Static runtime libraries still not working, attempt with one more flag --- cmake/toolchains/i686-w64-mingw32.cmake | 2 +- cmake/toolchains/x86-64-w64-mingw32.cmake | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/toolchains/i686-w64-mingw32.cmake b/cmake/toolchains/i686-w64-mingw32.cmake index 9ff40a1f..2954a39c 100644 --- a/cmake/toolchains/i686-w64-mingw32.cmake +++ b/cmake/toolchains/i686-w64-mingw32.cmake @@ -8,7 +8,7 @@ set(CMAKE_CXX_COMPILER i686-w64-mingw32-g++) set(CMAKE_RC_COMPILER i686-w64-mingw32-windres) # Static runtime library linking -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static -static-libgcc -static-libstdc++") # where is the target environment set(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32 /usr/i686-w64-mingw32/sys-root/mingw) diff --git a/cmake/toolchains/x86-64-w64-mingw32.cmake b/cmake/toolchains/x86-64-w64-mingw32.cmake index da631cb7..65fd9e21 100644 --- a/cmake/toolchains/x86-64-w64-mingw32.cmake +++ b/cmake/toolchains/x86-64-w64-mingw32.cmake @@ -8,7 +8,7 @@ set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) # Static runtime library linking -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static -static-libgcc -static-libstdc++") # where is the target environment set(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32) From b6ab5f0af276dfd01c353db9742ac3242ed10e27 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 10:33:02 +0200 Subject: [PATCH 37/56] Reintroduce manual resolving of MinGW runtime DLLs, including special case --- CMakeLists.txt | 22 ++++++++++++++++++++++ cmake/toolchains/i686-w64-mingw32.cmake | 3 --- cmake/toolchains/x86-64-w64-mingw32.cmake | 3 --- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 62210fb7..b7bd116f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -491,6 +491,28 @@ if(WIN32) if(ENABLE_FLUIDSYNTH MATCHES "BUNDLED") install(FILES $ DESTINATION .) endif() + + # Resolve and install MinGW runtime DLLs + if(MINGW) + foreach(DLL libgcc_s_seh-1.dll libstdc++-6.dll) + execute_process( + COMMAND ${CMAKE_C_COMPILER} -print-file-name=${DLL} + OUTPUT_VARIABLE DLL_PATH + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(EXISTS "${DLL_PATH}" AND NOT "${DLL_PATH}" STREQUAL "${DLL}") + install(FILES "${DLL_PATH}" DESTINATION .) + else() + # If -print-file-name fails, try to find it in the compiler's bin directory. + get_filename_component(COMPILER_DIR "${CMAKE_C_COMPILER}" DIRECTORY) + if(EXISTS "${COMPILER_DIR}/${DLL}") + set(DLL_PATH "${COMPILER_DIR}/${DLL}") + else() + message(WARNING "DLL '${DLL}' not resolved - it will be missing in the package") + endif() + endif() + endforeach() + endif() endif() install(FILES diff --git a/cmake/toolchains/i686-w64-mingw32.cmake b/cmake/toolchains/i686-w64-mingw32.cmake index 2954a39c..4830c985 100644 --- a/cmake/toolchains/i686-w64-mingw32.cmake +++ b/cmake/toolchains/i686-w64-mingw32.cmake @@ -7,9 +7,6 @@ set(CMAKE_C_COMPILER i686-w64-mingw32-gcc) set(CMAKE_CXX_COMPILER i686-w64-mingw32-g++) set(CMAKE_RC_COMPILER i686-w64-mingw32-windres) -# Static runtime library linking -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static -static-libgcc -static-libstdc++") - # where is the target environment set(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32 /usr/i686-w64-mingw32/sys-root/mingw) diff --git a/cmake/toolchains/x86-64-w64-mingw32.cmake b/cmake/toolchains/x86-64-w64-mingw32.cmake index 65fd9e21..d52e90a4 100644 --- a/cmake/toolchains/x86-64-w64-mingw32.cmake +++ b/cmake/toolchains/x86-64-w64-mingw32.cmake @@ -7,9 +7,6 @@ set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) -# Static runtime library linking -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static -static-libgcc -static-libstdc++") - # where is the target environment set(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32) From b8ed343eab15f929fd0a5159805794e4b3c89966 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 11:20:46 +0200 Subject: [PATCH 38/56] Fix wrong compilation target for Win32 (was still 64bit!), and clarify dependencies --- CMakeLists.txt | 37 ++++++++++------------- cmake/toolchains/i686-w64-mingw32.cmake | 10 ++++-- cmake/toolchains/x86-64-w64-mingw32.cmake | 10 ++++-- 3 files changed, 32 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b7bd116f..f22ea2a5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -491,28 +491,23 @@ if(WIN32) if(ENABLE_FLUIDSYNTH MATCHES "BUNDLED") install(FILES $ DESTINATION .) endif() +endif() - # Resolve and install MinGW runtime DLLs - if(MINGW) - foreach(DLL libgcc_s_seh-1.dll libstdc++-6.dll) - execute_process( - COMMAND ${CMAKE_C_COMPILER} -print-file-name=${DLL} - OUTPUT_VARIABLE DLL_PATH - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - if(EXISTS "${DLL_PATH}" AND NOT "${DLL_PATH}" STREQUAL "${DLL}") - install(FILES "${DLL_PATH}" DESTINATION .) - else() - # If -print-file-name fails, try to find it in the compiler's bin directory. - get_filename_component(COMPILER_DIR "${CMAKE_C_COMPILER}" DIRECTORY) - if(EXISTS "${COMPILER_DIR}/${DLL}") - set(DLL_PATH "${COMPILER_DIR}/${DLL}") - else() - message(WARNING "DLL '${DLL}' not resolved - it will be missing in the package") - endif() - endif() - endforeach() - endif() +# Toolchains may define extra libraries that should be included in the distribution. +# This is primarily for MinGW, which needs some runtime libraries along with it. +if(DEFINED TOOLCHAIN_DLL_DEPENDENCIES) + foreach(DLL ${TOOLCHAIN_DLL_DEPENDENCIES}) + execute_process( + COMMAND ${CMAKE_C_COMPILER} -print-file-name=${DLL} + OUTPUT_VARIABLE DLL_PATH + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(EXISTS "${DLL_PATH}" AND NOT "${DLL_PATH}" STREQUAL "${DLL}") + install(FILES "${DLL_PATH}" DESTINATION .) + else() + message(WARNING "DLL '${DLL}' not resolved - it will be missing in the package") + endif() + endforeach() endif() install(FILES diff --git a/cmake/toolchains/i686-w64-mingw32.cmake b/cmake/toolchains/i686-w64-mingw32.cmake index 4830c985..e0cbf7f9 100644 --- a/cmake/toolchains/i686-w64-mingw32.cmake +++ b/cmake/toolchains/i686-w64-mingw32.cmake @@ -3,10 +3,14 @@ set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_SYSTEM_PROCESSOR i686) # specify the cross compiler -set(CMAKE_C_COMPILER i686-w64-mingw32-gcc) -set(CMAKE_CXX_COMPILER i686-w64-mingw32-g++) +set(CMAKE_C_COMPILER i686-w64-mingw32-gcc-posix) +set(CMAKE_CXX_COMPILER i686-w64-mingw32-g++-posix) set(CMAKE_RC_COMPILER i686-w64-mingw32-windres) +set(CMAKE_C_FLAGS -m32) +set(CMAKE_CXX_FLAGS -m32) +set(CMAKE_EXE_LINKER_FLAGS_INIT "-m32") + # where is the target environment set(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32 /usr/i686-w64-mingw32/sys-root/mingw) @@ -19,3 +23,5 @@ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # CMake determines how to examine dependencies based on the *host* system, leading to # a `file unknown error` unless the target platform is explicitly specified. set(CMAKE_GET_RUNTIME_DEPENDENCIES_PLATFORM "windows+pe") + +set(TOOLCHAIN_DLL_DEPENDENCIES libgcc_s_dw2-1.dll libstdc++-6.dll) diff --git a/cmake/toolchains/x86-64-w64-mingw32.cmake b/cmake/toolchains/x86-64-w64-mingw32.cmake index d52e90a4..f9e38a84 100644 --- a/cmake/toolchains/x86-64-w64-mingw32.cmake +++ b/cmake/toolchains/x86-64-w64-mingw32.cmake @@ -3,10 +3,14 @@ set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_SYSTEM_PROCESSOR x86_64) # specify the cross compiler -set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) -set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) +set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc-posix) +set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++-posix) set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) +set(CMAKE_C_FLAGS -m64) +set(CMAKE_CXX_FLAGS -m64) + + # where is the target environment set(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32) @@ -19,3 +23,5 @@ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # CMake determines how to examine dependencies based on the *host* system, leading to # a `file unknown error` unless the target platform is explicitly specified. set(CMAKE_GET_RUNTIME_DEPENDENCIES_PLATFORM "windows+pe") + +set(TOOLCHAIN_DLL_DEPENDENCIES libgcc_s_seh-1.dll libstdc++-6.dll) From 97012eef4bf709275d011d05a12286113afd3d46 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 11:41:03 +0200 Subject: [PATCH 39/56] Switch back to default (non-posix) --- cmake/toolchains/i686-w64-mingw32.cmake | 6 +++--- cmake/toolchains/x86-64-w64-mingw32.cmake | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cmake/toolchains/i686-w64-mingw32.cmake b/cmake/toolchains/i686-w64-mingw32.cmake index e0cbf7f9..80aaf8b6 100644 --- a/cmake/toolchains/i686-w64-mingw32.cmake +++ b/cmake/toolchains/i686-w64-mingw32.cmake @@ -3,8 +3,8 @@ set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_SYSTEM_PROCESSOR i686) # specify the cross compiler -set(CMAKE_C_COMPILER i686-w64-mingw32-gcc-posix) -set(CMAKE_CXX_COMPILER i686-w64-mingw32-g++-posix) +set(CMAKE_C_COMPILER i686-w64-mingw32-gcc) +set(CMAKE_CXX_COMPILER i686-w64-mingw32-g++) set(CMAKE_RC_COMPILER i686-w64-mingw32-windres) set(CMAKE_C_FLAGS -m32) @@ -24,4 +24,4 @@ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # a `file unknown error` unless the target platform is explicitly specified. set(CMAKE_GET_RUNTIME_DEPENDENCIES_PLATFORM "windows+pe") -set(TOOLCHAIN_DLL_DEPENDENCIES libgcc_s_dw2-1.dll libstdc++-6.dll) +set(TOOLCHAIN_DLL_DEPENDENCIES libgcc_s_sjlj-1.dll libstdc++-6.dll) diff --git a/cmake/toolchains/x86-64-w64-mingw32.cmake b/cmake/toolchains/x86-64-w64-mingw32.cmake index f9e38a84..a0f50622 100644 --- a/cmake/toolchains/x86-64-w64-mingw32.cmake +++ b/cmake/toolchains/x86-64-w64-mingw32.cmake @@ -3,8 +3,8 @@ set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_SYSTEM_PROCESSOR x86_64) # specify the cross compiler -set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc-posix) -set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++-posix) +set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) +set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) set(CMAKE_C_FLAGS -m64) From c3742147bee02d795d7c491d832761c8f569fa52 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 11:45:27 +0200 Subject: [PATCH 40/56] Restore dwarf exception handling library reference --- cmake/toolchains/i686-w64-mingw32.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/toolchains/i686-w64-mingw32.cmake b/cmake/toolchains/i686-w64-mingw32.cmake index 80aaf8b6..9d3e528f 100644 --- a/cmake/toolchains/i686-w64-mingw32.cmake +++ b/cmake/toolchains/i686-w64-mingw32.cmake @@ -24,4 +24,4 @@ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # a `file unknown error` unless the target platform is explicitly specified. set(CMAKE_GET_RUNTIME_DEPENDENCIES_PLATFORM "windows+pe") -set(TOOLCHAIN_DLL_DEPENDENCIES libgcc_s_sjlj-1.dll libstdc++-6.dll) +set(TOOLCHAIN_DLL_DEPENDENCIES libgcc_s_dw2-1.dll libstdc++-6.dll) From efd40c80ed275476a06487573fb07a94a768829c Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 11:58:39 +0200 Subject: [PATCH 41/56] Add builds for macOS --- .github/workflows/main-build.yml | 73 +++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 25 deletions(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index e537d7e4..edcc03c4 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -7,39 +7,60 @@ permissions: jobs: build: name: ${{matrix.os}} - ${{matrix.arch}} - runs-on: ubuntu-22.04 + runs-on: ${{matrix.runner}} strategy: fail-fast: false matrix: - os: [ linux, mswin ] - arch: [ x86-64, i686 ] include: - - os: linux - arch: x86-64 - toolchain_file: 'x86-64-gcc.cmake' - extra_packages: 'gcc g++ mesa-utils mesa-common-dev xorg-dev libxrandr-dev' - - - os: linux - arch: i686 - toolchain_file: 'i686-gcc.cmake' - extra_packages: 'gcc-multilib g++-multilib mesa-utils mesa-common-dev:i386 xorg-dev libxrandr-dev' - - - os: mswin - arch: x86-64 - toolchain_file: 'x86-64-w64-mingw32.cmake' - extra_packages: 'gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64' - - - os: mswin - arch: i686 - toolchain_file: 'i686-w64-mingw32.cmake' - extra_packages: 'gcc-mingw-w64-i686 g++-mingw-w64-i686' + # Linux builds + - os: linux + arch: x86-64 + runner: ubuntu-22.04 + toolchain_file: 'x86-64-gcc.cmake' + extra_packages: 'gcc g++ mesa-utils mesa-common-dev xorg-dev libxrandr-dev' + + - os: linux + arch: i686 + runner: ubuntu-22.04 + toolchain_file: 'i686-gcc.cmake' + extra_packages: 'gcc-multilib g++-multilib mesa-utils mesa-common-dev:i386 xorg-dev libxrandr-dev' + + # Windows builds + - os: mswin + arch: x86-64 + runner: ubuntu-22.04 + toolchain_file: 'x86-64-w64-mingw32.cmake' + extra_packages: 'gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64' + + - os: mswin + arch: i686 + runner: ubuntu-22.04 + toolchain_file: 'i686-w64-mingw32.cmake' + extra_packages: 'gcc-mingw-w64-i686 g++-mingw-w64-i686' + + # macOS builds (native compilation) + - os: macos + arch: x86-64 + runner: macos-12 + + - os: macos + arch: arm64 + runner: macos-14 steps: - uses: actions/checkout@v7 - - name: Install build dependencies + + - name: Install build dependencies (Linux) + if: runner.os == 'linux' run: | sudo dpkg --add-architecture i386 sudo apt-get update sudo apt-get install -y cmake ${{ matrix.extra_packages }} + + - name: Install build dependencies (macOS) + if: runner.os == 'macos' + run: | + brew install cmake ninja sdl2 + - name: Generate build files run: > cmake @@ -47,9 +68,11 @@ jobs: -S . -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo - -DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/${{ matrix.toolchain_file }} + ${{ matrix.toolchain_file && format('-DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/{0}', matrix.toolchain_file) || '' }} + - name: Build - run: cmake --build build -j $(nproc) + run: cmake --build build -j $(sysctl -n hw.logicalcpu || nproc) + - name: Prepare distribution package run: cmake --install build --prefix dist From 39fd6b4ea61d2b32414131bb1afadc6bbbdb089f Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 12:05:39 +0200 Subject: [PATCH 42/56] Attempt to explicitly install older release of CMake --- .github/workflows/main-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index edcc03c4..74b22251 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -59,7 +59,7 @@ jobs: - name: Install build dependencies (macOS) if: runner.os == 'macos' run: | - brew install cmake ninja sdl2 + brew install cmake@3.31 ninja sdl2 - name: Generate build files run: > From 074c8b7292cc60b6df54a551dc8349afb3272d70 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 12:11:04 +0200 Subject: [PATCH 43/56] Do manual installation of CMake 3 --- .github/workflows/main-build.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index 74b22251..af080bac 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -59,7 +59,11 @@ jobs: - name: Install build dependencies (macOS) if: runner.os == 'macos' run: | - brew install cmake@3.31 ninja sdl2 + wget https://github.com/Kitware/CMake/releases/download/v3.31.12/cmake-3.31.12-macos-universal.tar.gz + tar -xzf cmake-3.31.12-macos-universal.tar.gz + sudo cp -r cmake-3.31.12-macos-universal/CMake.app /Applications/ + cmake -version + brew install ninja - name: Generate build files run: > From eebe79953df7ee0a9a96f02f2085aa9719cbf871 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 12:20:07 +0200 Subject: [PATCH 44/56] Remove preinstalled CMake before downgrading --- .github/workflows/main-build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index af080bac..c4d2e27e 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -59,6 +59,7 @@ jobs: - name: Install build dependencies (macOS) if: runner.os == 'macos' run: | + brew uninstall cmake wget https://github.com/Kitware/CMake/releases/download/v3.31.12/cmake-3.31.12-macos-universal.tar.gz tar -xzf cmake-3.31.12-macos-universal.tar.gz sudo cp -r cmake-3.31.12-macos-universal/CMake.app /Applications/ From f9be8286b047d99d501343a6a1457af16e74cc8e Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 12:20:52 +0200 Subject: [PATCH 45/56] Perform quiet download of file --- .github/workflows/main-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index c4d2e27e..1c983b73 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -60,7 +60,7 @@ jobs: if: runner.os == 'macos' run: | brew uninstall cmake - wget https://github.com/Kitware/CMake/releases/download/v3.31.12/cmake-3.31.12-macos-universal.tar.gz + wget -q https://github.com/Kitware/CMake/releases/download/v3.31.12/cmake-3.31.12-macos-universal.tar.gz tar -xzf cmake-3.31.12-macos-universal.tar.gz sudo cp -r cmake-3.31.12-macos-universal/CMake.app /Applications/ cmake -version From 24cb066ae42c6183e4f29f577f7e744174f2e7ce Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 12:25:01 +0200 Subject: [PATCH 46/56] Extend path to lookup cmake for further steps --- .github/workflows/main-build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index 1c983b73..c2d3845c 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -63,7 +63,8 @@ jobs: wget -q https://github.com/Kitware/CMake/releases/download/v3.31.12/cmake-3.31.12-macos-universal.tar.gz tar -xzf cmake-3.31.12-macos-universal.tar.gz sudo cp -r cmake-3.31.12-macos-universal/CMake.app /Applications/ - cmake -version + echo "/Applications/CMake.app/Contents/bin" >> $GITHUB_PATH + $GITHUB_PATH/cmake -version brew install ninja - name: Generate build files From 2c86b1b5d03aa0eecfcf68de0ec149dc0fdfa09c Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 12:26:25 +0200 Subject: [PATCH 47/56] Remove too eager usage of environment variable --- .github/workflows/main-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index c2d3845c..e0ff55b3 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -64,7 +64,7 @@ jobs: tar -xzf cmake-3.31.12-macos-universal.tar.gz sudo cp -r cmake-3.31.12-macos-universal/CMake.app /Applications/ echo "/Applications/CMake.app/Contents/bin" >> $GITHUB_PATH - $GITHUB_PATH/cmake -version + cmake -version brew install ninja - name: Generate build files From 2d3a57a9f4e5cfec7ba2cbea2b90712f30a77ef1 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 12:27:54 +0200 Subject: [PATCH 48/56] The current command changing GITHUB_PATH can not use it already --- .github/workflows/main-build.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index e0ff55b3..2d78c496 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -64,7 +64,6 @@ jobs: tar -xzf cmake-3.31.12-macos-universal.tar.gz sudo cp -r cmake-3.31.12-macos-universal/CMake.app /Applications/ echo "/Applications/CMake.app/Contents/bin" >> $GITHUB_PATH - cmake -version brew install ninja - name: Generate build files From 5cebf33855511ef5d8dbd308b2549b0ee499de63 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 12:32:58 +0200 Subject: [PATCH 49/56] Attempt to squash a further FluidSynth error --- CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index f22ea2a5..e375d000 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -145,6 +145,11 @@ if(ENABLE_FLUIDSYNTH MATCHES "BUNDLED") FetchContent_MakeAvailable(FluidSynth) message("FluidSynth src-dir '${FluidSynth_SOURCE_DIR}'") message("FluidSynth bin-dir '${FluidSynth_BINARY_DIR}'") + if(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 11) + # This is a necessary hack; gcc-11 warns (errors) for wrong bit assignment. + # This is the case for fluid_synth.c, for a TRUE assignment. + target_compile_options(libfluidsynth PRIVATE -Wno-error=single-bit-bitfield-constant-conversion) + endif() if(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 15) # This is a necessary hack; gcc-15 warns (errors) if a static array is initialized # with a string that exceeds its storage. This is the case for fluid_defsfont.c, From eb1f3e07ce8be13d5342c382592bcb28bd69a843 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 12:37:31 +0200 Subject: [PATCH 50/56] Change error check to be only for Apple --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e375d000..cb5b13d2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -145,8 +145,8 @@ if(ENABLE_FLUIDSYNTH MATCHES "BUNDLED") FetchContent_MakeAvailable(FluidSynth) message("FluidSynth src-dir '${FluidSynth_SOURCE_DIR}'") message("FluidSynth bin-dir '${FluidSynth_BINARY_DIR}'") - if(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 11) - # This is a necessary hack; gcc-11 warns (errors) for wrong bit assignment. + if(APPLE) + # This is a necessary hack; compiler warns (errors) for wrong bit assignment. # This is the case for fluid_synth.c, for a TRUE assignment. target_compile_options(libfluidsynth PRIVATE -Wno-error=single-bit-bitfield-constant-conversion) endif() From 763072a5c5834f11138582c444aa5a96ad2ed084 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 12:39:20 +0200 Subject: [PATCH 51/56] Remove unavailable x86-64 node for macOS --- .github/workflows/main-build.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index 2d78c496..f087fd56 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -39,10 +39,6 @@ jobs: extra_packages: 'gcc-mingw-w64-i686 g++-mingw-w64-i686' # macOS builds (native compilation) - - os: macos - arch: x86-64 - runner: macos-12 - - os: macos arch: arm64 runner: macos-14 From df5488dbe3ec8a4d1cdefdf117bd2c1ece7a088c Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 12:40:21 +0200 Subject: [PATCH 52/56] Add more error exclusions for Apple build --- CMakeLists.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cb5b13d2..fcf269ad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -146,9 +146,8 @@ if(ENABLE_FLUIDSYNTH MATCHES "BUNDLED") message("FluidSynth src-dir '${FluidSynth_SOURCE_DIR}'") message("FluidSynth bin-dir '${FluidSynth_BINARY_DIR}'") if(APPLE) - # This is a necessary hack; compiler warns (errors) for wrong bit assignment. - # This is the case for fluid_synth.c, for a TRUE assignment. - target_compile_options(libfluidsynth PRIVATE -Wno-error=single-bit-bitfield-constant-conversion) + # This is a necessary hack; compiler errors for various things. + target_compile_options(libfluidsynth PRIVATE -Wno-error=single-bit-bitfield-constant-conversion -Wno-unused-but-set-variable) endif() if(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 15) # This is a necessary hack; gcc-15 warns (errors) if a static array is initialized From 53b8dfc98ff061d7dd17391990a392a78d3fe7aa Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 12:44:15 +0200 Subject: [PATCH 53/56] Disable macOS build - it doesn't work. --- .github/workflows/main-build.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index f087fd56..e2742295 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -39,9 +39,10 @@ jobs: extra_packages: 'gcc-mingw-w64-i686 g++-mingw-w64-i686' # macOS builds (native compilation) - - os: macos - arch: arm64 - runner: macos-14 + # Disabled build because of alignment issues during linking. + #- os: macos + # arch: arm64 + # runner: macos-14 steps: - uses: actions/checkout@v7 From 2440cb20a826214631d387ce3be892e5e8b04b76 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 14:18:16 +0200 Subject: [PATCH 54/56] Include shaders in distribution package, remove license details (aligned with original) --- CMakeLists.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fcf269ad..45ee5990 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -514,9 +514,8 @@ if(DEFINED TOOLCHAIN_DLL_DEPENDENCIES) endforeach() endif() +install(DIRECTORY ${CMAKE_SOURCE_DIR}/shaders DESTINATION .) install(FILES ${CMAKE_SOURCE_DIR}/README.md - ${CMAKE_SOURCE_DIR}/LICENSE - ${CMAKE_SOURCE_DIR}/COPYING.txt DESTINATION . ) From 75a7dc10cf04b98101b1dd24b8366e2874f605d4 Mon Sep 17 00:00:00 2001 From: Christian Haas Date: Sat, 18 Jul 2026 15:18:55 +0200 Subject: [PATCH 55/56] Remove all obsolete build/run scripts --- .travis.yml | 83 ------- CMakeLists.32bit.txt | 423 --------------------------------- appveyor.yml | 94 -------- build.bat | 4 - build_deps.sh | 72 ------ build_win32.sh | 124 ---------- build_win64.sh | 107 --------- osx-linux/install_32bit_sdl.sh | 80 ------- osx-linux/install_64bit_sdl.sh | 80 ------- osx-linux/readme_osx_linux.md | 6 - osx-linux/run_linux.sh | 3 - osx-linux/run_osx.sh | 3 - windows/make.exe | Bin 270836 -> 0 bytes 13 files changed, 1079 deletions(-) delete mode 100644 .travis.yml delete mode 100644 CMakeLists.32bit.txt delete mode 100644 appveyor.yml delete mode 100644 build.bat delete mode 100755 build_deps.sh delete mode 100644 build_win32.sh delete mode 100644 build_win64.sh delete mode 100755 osx-linux/install_32bit_sdl.sh delete mode 100644 osx-linux/install_64bit_sdl.sh delete mode 100644 osx-linux/readme_osx_linux.md delete mode 100644 osx-linux/run_linux.sh delete mode 100644 osx-linux/run_osx.sh delete mode 100644 windows/make.exe diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 8f5cd7a0..00000000 --- a/.travis.yml +++ /dev/null @@ -1,83 +0,0 @@ -language: c - -notifications: - email: false - -matrix: - include: - - os: linux - dist: bionic - sudo: required - env: - - SDL2_LIB=BUNDLED - - SDL2_MIXER_LIB=BUNDLED - - FLUIDSYNTH_LIB=BUNDLED - - BITS=64 - addons: - apt: - packages: - - cmake-data cmake libglu1-mesa-dev libgl1-mesa-dev # libfluidsynth-dev libsdl2-dev libsdl2-mixer-dev - compiler: gcc - - os: linux - dist: trusty - sudo: required - env: - - SDL2_LIB=BUNDLED - - SDL2_MIXER_LIB=BUNDLED - - FLUIDSYNTH_LIB=BUNDLED - - CMAKE_LIBRARY_PATH=/usr/lib/i386-linux-gnu - - BITS=32 - before_script: - - cp ./CMakeLists.32bit.txt ./CMakeLists.txt - addons: - apt: - packages: - - cmake-data cmake libx32gcc-4.8-dev libc6-dev-i386 gcc-multilib g++-multilib libglu1-mesa-dev:i386 libgl1-mesa-dev:i386 - compiler: gcc - - os: osx - compiler: clang - env: - - SDL2_LIB=BUNDLED - - SDL2_MIXER_LIB=BUNDLED - - FLUIDSYNTH_LIB=OFF # Bundled lib failed to compile - - BITS=64 - - os: osx - compiler: gcc - env: - - SDL2_LIB=BUNDLED - - SDL2_MIXER_LIB=BUNDLED - - FLUIDSYNTH_LIB=OFF # Bundled lib failed to compile - - BITS=64 - -script: - - chmod a+rx ./osx-linux/*.sh - - sudo TRAVIS=$TRAVIS ./osx-linux/install_${BITS}bit_sdl.sh - - cmake -DENABLE_SDL2=${SDL2_LIB} -DENABLE_SOUND=${SDL2_MIXER_LIB} -DENABLE_FLUIDSYNTH=${FLUIDSYNTH_LIB} . - - make -j2 systemshock - -before_deploy: - - mkdir -p shockolate - - cp systemshock shockolate - - cp osx-linux/install_${BITS}bit_sdl.sh shockolate/install_sdl.sh - - cp osx-linux/readme_osx_linux.md shockolate - - cp osx-linux/run_$TRAVIS_OS_NAME.sh shockolate/run.sh - - cp -r shaders shockolate/ - - cp -r res shockolate/ - - export PACKAGE_NAME="shockolate-$TRAVIS_OS_NAME-${BITS}bit.tgz" - - tar zcfv $PACKAGE_NAME shockolate - - rm -r shockolate - - mkdir -p shockolate-source - - cp -r systemshock/* shockolate-source/ - - tar zcvf shockolate-source-$TRAVIS_TAG.tar.gz shockolate-source - - rm -r shockolate-source - -deploy: - provider: releases - skip_cleanup: true - overwrite: true - api_key: - secure: "M8fgLU06LQHZS7cf98dHi8bl0BPsyvQHHDWqBaiWqnOoC4XET4fYibFf9B9Ba64RYw5DqPCGbf2onYcDrrUq0cZBwbJsJoVmajKOsWiPzddAtJrk2/nle0MWtjt6OdwbHtg0dNs36QmQ7oRxrEmQaodMmnQW0PKCZOhMmT2zdU73r9ZJ0g4kkkmAAHgfLWYPkfSb9gMj0bn5BLwwGPXv9+NeDFxVG4DY4qjEqQES9tjabVSbVNHretkFCLr0rCpGDQnEZHCP3Wt5c6MoSRunZbRg0X+IwiI1xCEchw2VQFBQiKZ3D4nJIyrZ96iijUQRnnKz5aoMZXQJZQEsnTaZLM+ZbYnK6iA5KWorILdh1odFhNfUJsvWEmEGlrrIQ9qzcAJaIFFch0HRY1S8+gGOy9tEoIpr0VWNZLg8lJvkiQgQmARrt9O+4wIzXZmQnNQcU/N3nWakI68CND4UWk4xAfA6k/Mq2IWyVu477lYxEN+FcqT7EbpowovOOn7e1rutwKDUtb3jWBHZBESF5TCL/hdwdOGNITaV+ENTHbHbWvK6J+3+sCK62xG0/pqzJk3+j7R9zoDvz+htwse/hhk/F3Sa+MpaJQVqtKVD4nBlY/E7+qd3yCyXQm916V+04evjoKOqXXnOOe5d+a87OquLJ6UaynjRsq6lJY2kZ2/Irmc=" - file: "$PACKAGE_NAME" - on: - tags: true - repo: Interrupt/systemshock diff --git a/CMakeLists.32bit.txt b/CMakeLists.32bit.txt deleted file mode 100644 index 8c76b7f3..00000000 --- a/CMakeLists.32bit.txt +++ /dev/null @@ -1,423 +0,0 @@ -cmake_minimum_required(VERSION 3.1) - -project(shockolate VERSION 0.7.8) - -include(FeatureSummary) - -set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS OFF) -set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB32_PATHS ON) - -# Required for stdbool.h -set(CMAKE_C_STANDARD 99) -# For nullptr in C++ -set(CMAKE_CXX_STANDARD 11) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -m32 ") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -m32 -D__STDC_LIMIT_MACROS") - -option(ENABLE_EXAMPLES "Enable example applications" OFF) -add_feature_info(ENABLE_EXAMPLES ENABLE_EXAMPLES "Enable example application (can be broken!)") -option(ENABLE_DEBUG_BLIT "Enable debugging blitter" OFF) -add_feature_info(ENABLE_DEBUG_BLIT ENABLE_DEBUG_BLIT "Enable debugging blitter") -option(ENABLE_OPENGL "Enable OpenGL support" ON) -add_feature_info(ENABLE_OPENGL ENABLE_OPENGL "Enable OpenGL support") - -set(ENABLE_SDL2 "BUNDLED" CACHE STRING "Enable SDL2 (ON/BUNDLED, default BUNDLED)") -set_property(CACHE ENABLE_SDL2 PROPERTY STRINGS "ON" "BUNDLED") -add_feature_info(ENABLE_SDL2 ENABLE_SOUND "Enable SDL2 support") - -set(ENABLE_SOUND "BUNDLED" CACHE STRING "Enable sound support (requires SDL2_mixer) (ON/BUNDLED/OFF, default BUNDLED)") -set_property(CACHE ENABLE_SOUND PROPERTY STRINGS "ON" "BUNDLED" "OFF") -add_feature_info(ENABLE_SOUND ENABLE_SOUND "Enable sound support (requires SDL2_mixer)") - -set(ENABLE_FLUIDSYNTH "BUNDLED" CACHE STRING "Enable FluidSynth MIDI support (ON/BUNDLED/OFF, default BUNDLED)") -set_property(CACHE ENABLE_FLUIDSYNTH PROPERTY STRINGS "ON" "BUNDLED" "OFF") -add_feature_info(ENABLE_FLUIDSYNTH ENABLE_FLUIDSYNTH "Enable FluidSynth MIDI support") - -# HAAAAX!! -add_definitions(-DSVGA_SUPPORT) - -if(ENABLE_DEBUG_BLIT) - add_definitions(-DDEBUGGING_BLIT) -endif() - -add_compile_options(-fsigned-char -fno-strict-aliasing) - -# Find OpenGL -if(ENABLE_OPENGL) - find_package(OpenGL REQUIRED) - add_definitions(-DUSE_OPENGL) - if(WIN32) - list(APPEND OPENGL_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/build_ext/built_glew/include) - list(APPEND OPENGL_LIBRARIES ${CMAKE_SOURCE_DIR}/build_ext/built_glew/lib/libglew32.dll.a winmm) - endif(WIN32) -endif(ENABLE_OPENGL) - -if(ENABLE_SDL2 MATCHES "ON") - find_package(SDL2 REQUIRED) - if(SDL2_FOUND) - message(STATUS "SDL2 found: ${SDL2_INCLUDE_DIRS} ${SDL2_LIBRARIES}") - endif(SDL2_FOUND) -endif(ENABLE_SDL2 MATCHES "ON") -if(ENABLE_SDL2 MATCHES "BUNDLED") - set(SDL2_DIR ${CMAKE_SOURCE_DIR}/build_ext/built_sdl) - find_library(SDL2_LIBRARY SDL2 PATHS ${SDL2_DIR}/lib NO_DEFAULT_PATH) - find_library(SDL2MAIN_LIBRARY SDL2main PATHS ${SDL2_DIR}/lib NO_DEFAULT_PATH) - set(SDL2_INCLUDE_DIRS ${SDL2_DIR}/include/SDL2) - set(SDL2_LIBRARIES "${SDL2MAIN_LIBRARY};${SDL2_LIBRARY}") -endif(ENABLE_SDL2 MATCHES "BUNDLED") - -if(ENABLE_SOUND MATCHES "ON") - # FIXME applies only for *nix systems - find_package(PkgConfig) - pkg_check_modules(SDL2_MIXER REQUIRED SDL2_mixer>=2.0.4) - add_definitions(-DUSE_SDL_MIXER=1) -endif(ENABLE_SOUND MATCHES "ON") -if(ENABLE_SOUND MATCHES "BUNDLED") - set(SDL2_MIXER_DIR ${CMAKE_SOURCE_DIR}/build_ext/built_sdl_mixer) - set(SDL2_MIXER_INCLUDE_DIRS ${SDL2_MIXER_DIR}/include/SDL2) - find_library(SDL2_MIXER_LIBRARY SDL2_mixer PATHS ${SDL2_MIXER_DIR}/lib) - set(SDL2_MIXER_LIBRARIES ${SDL2_MIXER_LIBRARY}) - add_definitions(-DUSE_SDL_MIXER=1) -endif(ENABLE_SOUND MATCHES "BUNDLED") - -if(ENABLE_FLUIDSYNTH MATCHES "ON") - find_package(PkgConfig) - pkg_check_modules(FLUIDSYNTH REQUIRED fluidsynth) - add_definitions("-DUSE_FLUIDSYNTH=1") -endif(ENABLE_FLUIDSYNTH MATCHES "ON") -if(ENABLE_FLUIDSYNTH MATCHES "BUNDLED") - find_library(FLUIDSYNTH_LIBRARY fluidsynth PATHS ${CMAKE_SOURCE_DIR}/build_ext/fluidsynth-lite/src) - set(FLUIDSYNTH_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/build_ext/fluidsynth-lite/include) - set(FLUIDSYNTH_LIBRARIES ${FLUIDSYNTH_LIBRARY}) - add_definitions("-DUSE_FLUIDSYNTH=1") -endif(ENABLE_FLUIDSYNTH MATCHES "BUNDLED") - -include_directories( - ${SDL2_INCLUDE_DIRS} - ${SDL2_MIXER_INCLUDE_DIRS} - ${FLUIDSYNTH_INCLUDE_DIRS} - ${OPENGL_INCLUDE_DIRS} -) - -if(NOT WIN32) - # Find ALSA for Linux native MIDI - # NOTE: this seems to require having 64-bit dev pacakges installed when building - # on 64-bit OS, even when building a 32-bit binary - find_package(ALSA) - if(ALSA_FOUND) - message(STATUS "ALSA found") - include_directories(${ALSA_INCLUDE_DIRS}) - add_definitions(-DUSE_ALSA=1) - endif(ALSA_FOUND) -endif(NOT WIN32) - -# Generate version based on project version -set(PROJECT_REVERSION_STRING "") -find_package(Git) -if(GIT_FOUND) - execute_process(COMMAND ${GIT_EXECUTABLE} describe --dirty - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE git_describe_out - ERROR_VARIABLE git_describe_error - RESULT_VARIABLE git_describe_result - ) - string(REGEX MATCH "[a-z|0-9|.]*-[0-9]*-g([a-z|0-9]*)([-|a-z]*)" git_commit "${git_describe_out}") - set(git_commit ${CMAKE_MATCH_1}) - set(git_dirty ${CMAKE_MATCH_2}) - set(PROJECT_REVERSION_STRING "-g${git_commit}${git_dirty}") -endif(GIT_FOUND) - -message(STATUS "Version is ${PROJECT_VERSION}${PROJECT_REVERSION_STRING}") -configure_file("${CMAKE_SOURCE_DIR}/src/GameSrc/Headers/shockolate_version.h.in" - "${CMAKE_BINARY_DIR}/src/GameSrc/Headers/shockolate_version.h" ) - -# Configuration done. Print features -feature_summary(WHAT ENABLED_FEATURES DESCRIPTION "Enabled features:") -feature_summary(WHAT DISABLED_FEATURES DESCRIPTION "Disabled features:") - -# Sources configuration -add_subdirectory(src/Libraries/) - -set(MAC_SRC - src/MacSrc/ShockBitmap.c - src/MacSrc/InitMac.c - src/MacSrc/Shock.c - src/MacSrc/Prefs.c - src/MacSrc/MacTune.c - src/MacSrc/SDLSound.c - src/MacSrc/Modding.c - src/MacSrc/OpenGL.cc - src/MacSrc/Xmi.c - src/MusicSrc/MusicDevice.c -) - -set(GAME_SRC - src/GameSrc/ai.c - src/GameSrc/airupt.c - src/GameSrc/amap.c - src/GameSrc/amaploop.c - src/GameSrc/ammomfd.c - src/GameSrc/anim.c - src/GameSrc/archiveformat.c - src/GameSrc/audiolog.c - src/GameSrc/automap.c - src/GameSrc/bark.c - src/GameSrc/biohelp.c - src/GameSrc/cardmfd.c - src/GameSrc/citres.c - src/GameSrc/combat.c - src/GameSrc/cone.c - src/GameSrc/criterr.c - src/GameSrc/cyber.c - src/GameSrc/cybermfd.c - src/GameSrc/cybmem.c - src/GameSrc/cybrnd.c - src/GameSrc/cutsloop.c - src/GameSrc/damage.c - src/GameSrc/digifx.c - src/GameSrc/drugs.c - src/GameSrc/effect.c - src/GameSrc/email.c - src/GameSrc/faceobj.c - src/GameSrc/fixtrmfd.c - src/GameSrc/frcamera.c - src/GameSrc/frclip.c - src/GameSrc/frcompil.c - src/GameSrc/frmain.c - src/GameSrc/frobj.c - src/GameSrc/froslew.c - src/GameSrc/frpipe.c - src/GameSrc/frpts.c - src/GameSrc/frsetup.c - src/GameSrc/frtables.c - src/GameSrc/frterr.c - src/GameSrc/frutil.c - src/GameSrc/FrUtils.c - src/GameSrc/fullamap.c - src/GameSrc/fullscrn.c - src/GameSrc/gameloop.c - src/GameSrc/gameobj.c - src/GameSrc/gamesort.c - src/GameSrc/gamestrn.c - src/GameSrc/gamesys.c - src/GameSrc/gametime.c - src/GameSrc/gamewrap.c - src/GameSrc/gearmfd.c - src/GameSrc/gr2ss.c - src/GameSrc/grenades.c - src/GameSrc/hand.c - src/GameSrc/hflip.c - src/GameSrc/hkeyfunc.c - src/GameSrc/hud.c - src/GameSrc/hudobj.c - src/GameSrc/init.c - src/GameSrc/input.c - src/GameSrc/invent.c - src/GameSrc/leanmetr.c - src/GameSrc/mainloop.c - src/GameSrc/map.c - src/GameSrc/mfdfunc.c - src/GameSrc/mfdgadg.c - src/GameSrc/mfdgames.c - src/GameSrc/mfdgump.c - src/GameSrc/mfdpanel.c - src/GameSrc/minimax.c - src/GameSrc/mlimbs.c - src/GameSrc/movekeys.c - src/GameSrc/musicai.c - src/GameSrc/newai.c - src/GameSrc/newmfd.c - src/GameSrc/objapp.c - src/GameSrc/objects.c - src/GameSrc/objload.c - src/GameSrc/objprop.c - src/GameSrc/objsim.c - src/GameSrc/objuse.c - src/GameSrc/olh.c - src/GameSrc/olhscan.c - src/GameSrc/palfx.c - src/GameSrc/pathfind.c - src/GameSrc/physics.c - src/GameSrc/player.c - src/GameSrc/plotware.c - src/GameSrc/popups.c - src/GameSrc/render.c - src/GameSrc/rendtool.c - src/GameSrc/saveload.c - src/GameSrc/schedule.c - src/GameSrc/screen.c - src/GameSrc/setup.c - src/GameSrc/shodan.c - src/GameSrc/sideicon.c - src/GameSrc/sndcall.c - src/GameSrc/star.c - src/GameSrc/statics.c - src/GameSrc/status.c - src/GameSrc/target.c - src/GameSrc/textmaps.c - src/GameSrc/tickcount.c - src/GameSrc/tfdirect.c - src/GameSrc/tfutil.c - src/GameSrc/tools.c - src/GameSrc/trigger.c - src/GameSrc/view360.c - src/GameSrc/viewhelp.c - src/GameSrc/vitals.c - src/GameSrc/vmail.c - src/GameSrc/wares.c - src/GameSrc/weapons.c - src/GameSrc/wrapper.c - src/GameSrc/gamerend.c - src/GameSrc/mouselook.c -) - -include_directories( - BEFORE - src/Libraries/2D/Source - src/Libraries/3D/Source - src/Libraries/AFILE/Source - src/Libraries/DSTRUCT/Source - src/Libraries/EDMS/Source - src/Libraries/FIXPP/Source - src/Libraries/INPUT/Source - src/Libraries/PALETTE/Source - src/Libraries/RES/Source - src/Libraries/UI/Source - src/Libraries/RND/Source - src/Libraries/VOX/Source - src/Libraries/FIX/Source - src/Libraries/SND/Source - src/Libraries/H - src/Libraries/LG/Source - src/Libraries/LG/Source/LOG/src - src/Libraries/adlmidi/include - src/GameSrc/Headers - src/MacSrc - src/MusicSrc - ${CMAKE_BINARY_DIR}/src/GameSrc/Headers -) - -if(ENABLE_EXAMPLES) - -add_executable(playmov - src/Libraries/AFILE/Tests/playmov.c -) -add_executable(movinfo - src/Libraries/AFILE/Tests/movinfo.c -) - -target_link_libraries(playmov - AFILE_LIB - FIX_LIB - ${SDL2_LIBRARIES} - ${SDL2_MIXER_LIBRARIES} -) - -target_link_libraries(movinfo - AFILE_LIB - FIX_LIB -) - -add_executable(TestSimpleMain - src/Libraries/2D/TestSource/SimpleMain.c -) - -target_link_libraries(TestSimpleMain - 2D_LIB - GR_LIB - 3D_LIB - RES_LIB - FIX_LIB - LG_LIB - ${SDL2_LIBRARIES} -) - -add_executable(BoxTest - src/Libraries/3D/Tests/BoxTest.c -) - -target_link_libraries(BoxTest - 2D_LIB - GR_LIB - 3D_LIB - RES_LIB - FIX_LIB - LG_LIB - ${SDL2_LIBRARIES} -) - -add_executable(BitmapTest - src/Libraries/3D/Tests/BitmapTest.c -) - -target_link_libraries(BitmapTest - 2D_LIB - GR_LIB - 3D_LIB - RES_LIB - FIX_LIB - LG_LIB - ${SDL2_LIBRARIES} -) - -add_executable(FixTest - src/Libraries/FIX/Tests/FixTest/fixtest.c -) - -target_link_libraries(FixTest - FIX_LIB - LG_LIB -) - -endif() - -# Include magic header file, set struct packing size -add_definitions( - -include precompiled.h -) - -add_executable(systemshock - ${MAC_SRC} -) - -add_library(GAME_LIB ${GAME_SRC}) - -# MINGW additional linker options -if(MINGW) - set(WINDOWS_LIBRARIES "mingw32 -mwindows") -endif(MINGW) - -target_link_libraries(systemshock - ${WINDOWS_LIBRARIES} # Set it before any linker options! Beware WinMain@16 error!! - GAME_LIB - UI_LIB - 2D_LIB - LG_LIB - GR_LIB - 3D_LIB - RND_LIB - AFILE_LIB - DSTRUCT_LIB - FIX_LIB - INPUT_LIB - PALETTE_LIB - RES_LIB -# SND_LIB - VOX_LIB - EDMS_LIB - FIXPP_LIB - ADLMIDI_LIB - ${SDL2_LIBRARIES} - ${SDL2_MIXER_LIBRARIES} - ${FLUIDSYNTH_LIBRARIES} - ${OPENGL_LIBRARIES} - ${ALSA_LIBRARIES} -) - -# Turn on address sanitizing if wanted -set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/externals/sanitizers/cmake" ${CMAKE_MODULE_PATH}) -find_package(Sanitizers) -add_sanitizers(systemshock) - diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index cd8d0c92..00000000 --- a/appveyor.yml +++ /dev/null @@ -1,94 +0,0 @@ -# Shockolate AppVeyor configuration -# YAML format reference: https://www.appveyor.com/docs/appveyor-yml/ - -# This determines the disk image AppVeyor uses while building -# Despite its name, this image actually contains all sorts of non-VC goodies -# See https://www.appveyor.com/docs/build-environment/ for all the details -image: Visual Studio 2015 - -# Tell build_windows.sh that we're building for AppVeyor -environment: - APPVEYOR: TRUE - -platform: - - x64 - - x86 - -# Avoid rebuilding external dependencies (ie. SDL and SDL_mixer) -# Uncache build_ext if external deps change -cache: - - res/music.sf2 - - build_ext - -# Set up environment variable values for 32 and 64 bit builds - -for: - - - matrix: - only: - - platform: x86 - before_build: - - set BUILD_SCRIPT=build_win32.sh - - set ARTIFACT=systemshock-x86.zip - - set MINGW_PATH=C:\mingw-w64\i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32\bin\ - - copy CMakeLists.32bit.txt CMakeLists.txt - - - matrix: - only: - - platform: x64 - before_build: - - set BUILD_SCRIPT=build_win64.sh - - set ARTIFACT=systemshock-x64.zip - - set MINGW_PATH=C:\mingw-w64\x86_64-7.3.0-posix-seh-rt_v5-rev0\mingw64\bin\ - -# Actual build script.. -# Step 1: Git has to reside in a path without spaces because the SDL build script is weird like that. -# So we create a symlink to the real Git, remove it from PATH and add our own. -# Step 2: We need to use our own make.exe to build stuff, so we add that -# Step 3: Do the actual building - -build_script: - - mklink /D c:\git "C:\Program Files\Git" - - set PATH=%PATH:C:\Program Files (x86)\Git\bin;=% - - set PATH=c:\git\usr\bin;%PATH%;%MINGW_PATH% - - copy windows\make.exe \git\usr\bin - - set CMAKE_MAKE_PROGRAM=c:\git\usr\bin\make.exe - - sh %BUILD_SCRIPT% - - build.bat - - -# For now, we don't have any automatic tests to run -test: off - -# Once building is done, we gather all the necessary DLL files and build our ZIP file. -after_build: - - copy %MINGW_PATH%\libgcc*.dll . - - copy %MINGW_PATH%\libstd*.dll . - - copy %MINGW_PATH%\libwinpthread-1.dll . - - copy build_ext\built_sdl\bin\SDL*.dll . - - copy build_ext\built_sdl_mixer\bin\SDL*.dll . - - copy build_ext\built_glew\lib\glew32.dll . - - copy build_ext\fluidsynth-lite\src\libfluidsynth.dll . - - 7z a %ARTIFACT% systemshock.exe *.dll shaders/ res/ - -artifacts: - - path: systemshock-x86.zip - name: Shockolate (32bit) - - path: systemshock-x64.zip - name: Shockolate (64bit) - -version: '0.5.{build}' - -# Finally, we deploy the ZIP file as a GitHub release -# FIXME: How do we want to be building releases? Seems like this would be better as a manual process -# TODO: invent a better versioning scheme for the tag name - -deploy: - - provider: GitHub - release: $(appveyor_repo_tag_name) - description: 'Latest release build of Shockolate' - artifact: systemshock-x86.zip, systemshock-x64.zip - auth_token: - secure: P1kIk8rRxKAYHqDrOWf0Zf5spfR+N86E0lO8VBu99vHtECJgPLn/Z6tBmL9cxPah - on: - APPVEYOR_REPO_TAG: true diff --git a/build.bat b/build.bat deleted file mode 100644 index 5877fc9b..00000000 --- a/build.bat +++ /dev/null @@ -1,4 +0,0 @@ -@REM Initial build.bat for Appveyor - -cmake -G "Unix Makefiles" . -make -j2 systemshock diff --git a/build_deps.sh b/build_deps.sh deleted file mode 100755 index df5d1280..00000000 --- a/build_deps.sh +++ /dev/null @@ -1,72 +0,0 @@ -#!/bin/bash -set -e - -SDL_version=2.0.9 -SDL2_mixer_version=2.0.4 - -if [ -d ./build_ext/ ]; then - echo A directory named build_ext already exists. - echo Please remove it if you want to recompile. - exit -fi - -if [ ! -d ./res/ ]; then - mkdir ./res/ -fi - -mkdir ./build_ext/ -cd ./build_ext/ - -install_dir=$(pwd) - -function build_sdl { - curl -O https://www.libsdl.org/release/SDL2-${SDL_version}.tar.gz - tar xvf SDL2-${SDL_version}.tar.gz - pushd SDL2-${SDL_version} - - ./configure --prefix=${install_dir}/built_sdl - make - make install - - popd -} - -function build_sdl_mixer { - curl -O https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-${SDL2_mixer_version}.tar.gz - tar xvf SDL2_mixer-${SDL2_mixer_version}.tar.gz - pushd SDL2_mixer-${SDL2_mixer_version} - - export SDL2_CONFIG="${install_dir}/built_sdl/bin/sdl2-config" - ./configure --prefix=${install_dir}/built_sdl_mixer - make - make install - - popd -} - -function build_fluidsynth { - git clone https://github.com/EtherTyper/fluidsynth-lite.git - pushd fluidsynth-lite - sed -i 's/DLL"\ off/DLL"\ on/' CMakeLists.txt - # if building fluidsynth fails, move on without it - set +e - - #export CFLAGS="-m32" - #export CXXFLAGS="-m32" - - cmake . - cmake --build . - - # download a soundfont that's close to the Windows default everyone knows - curl -o music.sf2 http://rancid.kapsi.fi/windows.sf2 - set -e - popd -} - - -build_sdl -build_sdl_mixer -build_fluidsynth - -cd .. -mv build_ext/fluidsynth-lite/*.sf2 ./res diff --git a/build_win32.sh b/build_win32.sh deleted file mode 100644 index 568faad2..00000000 --- a/build_win32.sh +++ /dev/null @@ -1,124 +0,0 @@ -#!/bin/bash -set -e - -SDL_version=2.0.10 -SDL2_mixer_version=2.0.4 -GLEW_version=2.1.0 -CMAKE_target=Unix\ Makefiles - -# Removing the mwindows linker option lets us get console output -function remove_mwindows { - sed -i -e "s/ \-mwindows//g" Makefile -} - -function build_sdl { - curl -O https://www.libsdl.org/release/SDL2-${SDL_version}.tar.gz - tar xvf SDL2-${SDL_version}.tar.gz - pushd SDL2-${SDL_version} - - ./configure --host=x86_64-w64-mingw32 --prefix=${install_dir}/built_sdl - remove_mwindows - make - make install - - popd -} - -function build_sdl_mixer { - curl -O https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-${SDL2_mixer_version}.tar.gz - # Do not extract the Xcode subdirectory because it contains symlinks. - # They cannot be extracted on Windows because the files in the archive are in the wrong order so - # the target of the link cannot be found at the time of the extraction. - tar xf SDL2_mixer-${SDL2_mixer_version}.tar.gz --exclude=Xcode - pushd SDL2_mixer-${SDL2_mixer_version} - - ./configure --host=x86_64-w64-mingw32 --disable-sdltest --with-sdl-prefix=${install_dir}/built_sdl --prefix=${install_dir}/built_sdl_mixer - - remove_mwindows - make - make install - - popd -} - -function build_glew { - curl -O https://netcologne.dl.sourceforge.net/project/glew/glew/${GLEW_version}/glew-${GLEW_version}.tgz - tar xvf glew-${GLEW_version}.tgz - mv glew-${GLEW_version}/ built_glew/ - pushd built_glew - mingw32-make glew.lib - popd -} - -function build_fluidsynth { - git clone https://github.com/EtherTyper/fluidsynth-lite.git - pushd fluidsynth-lite - sed -i 's/DLL"\ off/DLL"\ on/' CMakeLists.txt - # if building fluidsynth fails, move on without it - set +e - cmake -G "${CMAKE_target}" . - cmake --build . - - # download a soundfont that's close to the Windows default everyone knows - curl -o music.sf2 http://rancid.kapsi.fi/windows.sf2 - set -e - popd -} - -## Actual building starts here - -if [ -d ./build_ext/ ]; then - echo A directory named build_ext already exists. - echo Please remove it if you want to recompile. - exit -fi - -if ! [ -x "$(command -v cmake)" ]; then - echo CMake is needed to install Shockolate. - echo Please download CMake from https://cmake.org/download/, - echo install it and try again in a new Git Bash window. - exit -fi - -rm -rf CMakeFiles/ -rm -rf CMakeCache.txt - -cp windows/make.exe /usr/bin/ - -if [ ! -d ./res/ ]; then -mkdir ./res/ -fi - -mkdir ./build_ext/ -cd ./build_ext/ -install_dir=`pwd -W` - -build_sdl -build_sdl_mixer -build_glew -build_fluidsynth - - -# Back to the root directory, copy required DLL files for the executable -cd .. -cp build_ext/built_sdl/bin/SDL*.dll . -cp build_ext/built_sdl_mixer/bin/SDL*.dll . -cp build_ext/built_glew/lib/*.dll . -cp build_ext/fluidsynth-lite/src/*.dll . - -# move the soundfont to the correct place if we successfully built fluidsynth -mv build_ext/fluidsynth-lite/*.sf2 ./res - -# Set up build.bat -if [[ -z "${APPVEYOR}" ]]; then - echo "Normal build" - echo "@echo off - cmake -G \"${CMAKE_target}\" . - mingw32-make systemshock" >build.bat -else - echo "Appveyor" - echo "cmake -G \"${CMAKE_target}\" . - make systemshock" >build.bat -fi - -echo "Our work here is done. Run BUILD.BAT in a Windows shell to build the actual source." diff --git a/build_win64.sh b/build_win64.sh deleted file mode 100644 index 6c6ae473..00000000 --- a/build_win64.sh +++ /dev/null @@ -1,107 +0,0 @@ -#!/bin/bash -set -e - -SDL_version=2.0.10 -SDL2_mixer_version=2.0.4 -GLEW_version=2.1.0 -CMAKE_target=Unix\ Makefiles - -# Removing the mwindows linker option lets us get console output -function remove_mwindows { - sed -i -e "s/ \-mwindows//g" Makefile -} - -function build_sdl { - curl -O https://www.libsdl.org/release/SDL2-devel-${SDL_version}-mingw.tar.gz - tar xvf SDL2-devel-${SDL_version}-mingw.tar.gz - cp -r SDL2-${SDL_version}/x86_64-w64-mingw32/ built_sdl/ -} - -function build_sdl_mixer { - curl -O https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-devel-${SDL2_mixer_version}-mingw.tar.gz - tar xf SDL2_mixer-devel-${SDL2_mixer_version}-mingw.tar.gz --exclude=Xcode - cp -r SDL2_mixer-${SDL2_mixer_version}/x86_64-w64-mingw32/ built_sdl_mixer/ -} - -function build_glew { - curl -O https://netcologne.dl.sourceforge.net/project/glew/glew/${GLEW_version}/glew-${GLEW_version}.tgz - tar xvf glew-${GLEW_version}.tgz - mv glew-${GLEW_version}/ built_glew/ - pushd built_glew - mingw32-make glew.lib - popd -} - -function build_fluidsynth { - git clone https://github.com/EtherTyper/fluidsynth-lite.git - pushd fluidsynth-lite - sed -i 's/DLL"\ off/DLL"\ on/' CMakeLists.txt - # if building fluidsynth fails, move on without it - set +e - cmake -G "${CMAKE_target}" . - cmake --build . - - # download a soundfont that's close to the Windows default everyone knows - curl -o music.sf2 http://rancid.kapsi.fi/windows.sf2 - set -e - popd -} - -## Actual building starts here - -if [ -d ./build_ext/ ]; then - echo A directory named build_ext already exists. - echo Please remove it if you want to recompile. - exit -fi - -if ! [ -x "$(command -v cmake)" ]; then - echo CMake is needed to install Shockolate. - echo Please download CMake from https://cmake.org/download/, - echo install it and try again in a new Git Bash window. - exit -fi - -rm -rf CMakeFiles/ -rm -rf CMakeCache.txt - -cp windows/make.exe /usr/bin/ - -if [ ! -d ./res/ ]; then -mkdir ./res/ -fi - -mkdir ./build_ext/ -cd ./build_ext/ -install_dir=`pwd -W` - - -build_sdl -build_sdl_mixer -build_glew -build_fluidsynth - - -# Back to the root directory, copy required DLL files for the executable -cd .. -cp build_ext/built_sdl/bin/SDL*.dll . -cp build_ext/built_sdl_mixer/bin/SDL*.dll . -cp build_ext/built_glew/lib/*.dll . -cp build_ext/fluidsynth-lite/src/*.dll . - -# move the soundfont to the correct place if we successfully built fluidsynth -mv build_ext/fluidsynth-lite/*.sf2 ./res - -# Set up build.bat -if [[ -z "${APPVEYOR}" ]]; then - echo "Normal build" - echo "@echo off - cmake -G \"${CMAKE_target}\" . - mingw32-make systemshock" >build.bat -else - echo "Appveyor" - echo "cmake -G \"${CMAKE_target}\" . - make systemshock" >build.bat -fi - -echo "Our work here is done. Run BUILD.BAT in a Windows shell to build the actual source." diff --git a/osx-linux/install_32bit_sdl.sh b/osx-linux/install_32bit_sdl.sh deleted file mode 100755 index a036a22b..00000000 --- a/osx-linux/install_32bit_sdl.sh +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env bash - -# Setting up - -set -euo pipefail - -SDL_version=2.0.9 -SDL2_mixer_version=2.0.4 - -function build_sdl { - curl -O https://www.libsdl.org/release/SDL2-${SDL_version}.tar.gz - tar xf SDL2-${SDL_version}.tar.gz - pushd SDL2-${SDL_version} - - ./configure "CFLAGS=-m32" "CXXFLAGS=-m32" "LDFLAGS=-m32" --prefix=${install_dir}/built_sdl - make -j2 - make install - - popd -} - -function build_sdl_mixer { - curl -O https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-${SDL2_mixer_version}.tar.gz - tar xf SDL2_mixer-${SDL2_mixer_version}.tar.gz - pushd SDL2_mixer-${SDL2_mixer_version} - - export SDL2_CONFIG="${install_dir}/built_sdl/bin/sdl2-config" - ./configure "CFLAGS=-m32" "CXXFLAGS=-m32" "LDFLAGS=-m32" --prefix=${install_dir}/built_sdl_mixer - make -j2 - make install - - popd -} - -function build_fluidsynth { - git clone https://github.com/EtherTyper/fluidsynth-lite.git - pushd fluidsynth-lite - - # force compilation of dynamic library - sed -i'' -e 's/DLL\"\ off/DLL\"\ on/' CMakeLists.txt - - # force 32bit compilation - sed -i'' -e 's/\${GNUCC_WARNING_FLAGS}/-m32 \${GNUCC_WARNING_FLAGS}/' CMakeLists.txt - - # if building fluidsynth fails, move on without it - set +e - cmake . - cmake --build . - - # download a soundfont that's close to the Windows default everyone knows - curl -o music.sf2 http://rancid.kapsi.fi/windows.sf2 - set -e - popd -} - - -# Actual script starts here - -if [ -d ./build_ext/ ]; then - echo A directory named build_ext already exists. - echo Please remove it if you want to recompile. - exit -fi - -mkdir ./build_ext/ -cd ./build_ext/ - -install_dir=$(pwd) - -build_fluidsynth -build_sdl -build_sdl_mixer - -cd .. - -mkdir -p ./res/ - -# move the soundfont to the correct place if we successfully built fluidsynth -for i in build_ext/fluidsynth-lite/*.sf2; do [ -f "$i" ] || break; mv $i res/; done; - diff --git a/osx-linux/install_64bit_sdl.sh b/osx-linux/install_64bit_sdl.sh deleted file mode 100644 index a0afbe78..00000000 --- a/osx-linux/install_64bit_sdl.sh +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env bash - -# Setting up - -set -euo pipefail - -SDL_version=2.0.9 -SDL2_mixer_version=2.0.4 - -function build_sdl { - curl -O https://www.libsdl.org/release/SDL2-${SDL_version}.tar.gz - tar xf SDL2-${SDL_version}.tar.gz - pushd SDL2-${SDL_version} - - ./configure --prefix=${install_dir}/built_sdl - make -j2 - make install - - popd -} - -function build_sdl_mixer { - curl -O https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-${SDL2_mixer_version}.tar.gz - tar xf SDL2_mixer-${SDL2_mixer_version}.tar.gz - pushd SDL2_mixer-${SDL2_mixer_version} - - export SDL2_CONFIG="${install_dir}/built_sdl/bin/sdl2-config" - ./configure --prefix=${install_dir}/built_sdl_mixer - make -j2 - make install - - popd -} - -function build_fluidsynth { - git clone https://github.com/EtherTyper/fluidsynth-lite.git - pushd fluidsynth-lite - - # force compilation of dynamic library - sed -i'' -e 's/DLL\"\ off/DLL\"\ on/' CMakeLists.txt - - # force 32bit compilation - # sed -i'' -e 's/\${GNUCC_WARNING_FLAGS}/-m32 \${GNUCC_WARNING_FLAGS}/' CMakeLists.txt - - # if building fluidsynth fails, move on without it - set +e - cmake . - cmake --build . - - # download a soundfont that's close to the Windows default everyone knows - curl -o music.sf2 http://rancid.kapsi.fi/windows.sf2 - set -e - popd -} - - -# Actual script starts here - -if [ -d ./build_ext/ ]; then - echo A directory named build_ext already exists. - echo Please remove it if you want to recompile. - exit -fi - -mkdir ./build_ext/ -cd ./build_ext/ - -install_dir=$(pwd) - -build_fluidsynth -build_sdl -build_sdl_mixer - -cd .. - -mkdir -p ./res/ - -# move the soundfont to the correct place if we successfully built fluidsynth -for i in build_ext/fluidsynth-lite/*.sf2; do [ -f "$i" ] || break; mv $i res/; done; - diff --git a/osx-linux/readme_osx_linux.md b/osx-linux/readme_osx_linux.md deleted file mode 100644 index 03ec735f..00000000 --- a/osx-linux/readme_osx_linux.md +++ /dev/null @@ -1,6 +0,0 @@ -Shockolate - Portable System Shock -============ - -1. Copy `res/` folder of original System Shock to this directory -2. Install SDL2, SDL2_mixer and Fluidsynth by running `./install_bit_sdl.sh` where `` is 32 or 64, depending on your system capabilities. Linux needs `sudo` for this script. -3. Run Shockolate `./run.sh` diff --git a/osx-linux/run_linux.sh b/osx-linux/run_linux.sh deleted file mode 100644 index 926fc95f..00000000 --- a/osx-linux/run_linux.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -export LD_LIBRARY_PATH="$(pwd)/lib" -./systemshock "$@" diff --git a/osx-linux/run_osx.sh b/osx-linux/run_osx.sh deleted file mode 100644 index 310c8cbc..00000000 --- a/osx-linux/run_osx.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -export DYLD_LIBRARY_PATH="$(pwd)/lib" -./systemshock "$@" diff --git a/windows/make.exe b/windows/make.exe deleted file mode 100644 index fdaef6ce0ff0d771be07571ba2fc3dfcd57b6862..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 270836 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

PhvsQ4hZb<$?^!uH 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 Date: Sat, 18 Jul 2026 15:19:02 +0200 Subject: [PATCH 56/56] update readme and separate compiling instructions --- COMPILING.md | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 63 +++++++++++++++++--------------------- 2 files changed, 113 insertions(+), 35 deletions(-) create mode 100644 COMPILING.md diff --git a/COMPILING.md b/COMPILING.md new file mode 100644 index 00000000..1d51e6c5 --- /dev/null +++ b/COMPILING.md @@ -0,0 +1,85 @@ +# Building instructions + +## What do you want to achieve? + +When you want to build the binary yourself, you typically fall into one of the following categories: +* a) You want to develop/build on your local machine, to run it on that machine. +* b) You want to cross-compile on your local machine, to run it on another architecture. +* c) You want to build all the supported formats. + +The necessary tasks of the respective categories are explained below. First, some general information. + +## General information + +### Supported environments + +The project is set up to officially support common **desktop** environments: +* Linux (32bit, 64bit) +* MS Windows (32bit, 64bit) +* ~~MacOS~~ (should be, but currently not working after the switch to Apple Silicon) + +> The emphasis on *desktop*, above, is deliberate. Only what builds by the automated build jobs +> of this project is supported. If there is a permutation of another system that isn't ensured by a +> build job, it may not work. +> +> The following describes the ideal working setup. + +### Dependencies + +* [CMake](https://cmake.org/) 3.x, with a minimum version according to `CMakeLists.txt` + > CMake 4 is no longer supporting various constructs found in some library dependencies. +* GNU compiler suite (either that from Linux or MinGW; use WSL or [MSYS2](https://www.msys2.org/)) +* Internet connection (for downloading library dependencies for bundled library dependencies) + +## How to build? + +### You want to develop/build on your local machine and run it on that machine. + +#### Simple case +``` +# 1) Download library dependencies and prepare build scripts (once, unless project structure is changed): +cmake -B build -S . +# 2) Build binary: +cmake --build build +# 3) Find the executable in the created build/ directory. +``` + +#### CMake build options + +The following CMake options can be used to customize the build process: + +| Option | Possible Values | Description | +|---------------------|------------------------|----------------------------------------------------------------------------------------------------------------------| +| `ENABLE_EXAMPLES` | **OFF** / ON | Enable example applications (can be broken!) | +| `ENABLE_DEBUG_BLIT` | **OFF** / ON | Enable debugging blitter | +| `ENABLE_OPENGL` | **ON** / OFF | Enable OpenGL support for improved graphics rendering | +| `ENABLE_SDL2` | **BUNDLED** / ON | Use system-installed SDL2 or bundled version | +| `ENABLE_SOUND` | **BUNDLED** / ON / OFF | Enable sound support (requires SDL2_mixer); ON uses system library, BUNDLED uses bundled version, OFF disables sound | +| `ENABLE_FLUIDSYNTH` | **BUNDLED** / ON / OFF | Enable FluidSynth MIDI support; ON uses system library, BUNDLED uses bundled version, OFF disables MIDI support | + +To use these options, pass them to CMake with the `-D` flag: + +```bash +cmake -B build -S . -DENABLE_OPENGL=OFF -DENABLE_SOUND=OFF +``` + +> Note that the support for system-provided libraries may be removed at a future point. +> The bundled versions are downloaded and handled by CMake in a defined version. + +### You want to cross-compile on your local machine for a different target. + +Cross-compilation is considered to be a build that targets a different architecture than what is default for your machine. +This also includes building a 32-bit variant on your 64-bit machine! + +For such cases, use and provide a [CMake toolchain file](https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html): +``` +cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE= +``` +Refer to `cmake/toolchains` subdirectory for the ones this project uses. + +### You want to build all the supported formats. + +This is essentially the work of the build pipeline. See `.github/workflows/main-build.yml` that combines all the information above. + +On a Linux system, or an MS Windows one with WSL2, you can cover at least the Linux and MS Windows binaries, +using GCC and MinGW. diff --git a/README.md b/README.md index 59b2ba0e..fe1036e9 100644 --- a/README.md +++ b/README.md @@ -1,67 +1,61 @@ -Shockolate - System Shock, but cross platform! +Shockolate - System Shock, but cross-platform! ============================ Based on the source code for PowerPC released by Night Dive Studios, Incorporated. -[![Build Status TravisCI](https://travis-ci.org/Interrupt/systemshock.svg?branch=master)](https://travis-ci.org/Interrupt/systemshock) [![Build Status AppVeyor](https://ci.appveyor.com/api/projects/status/5fmcswq8n7ni0o9j/branch/master?svg=true)](https://ci.appveyor.com/project/Interrupt/systemshock) - GENERAL NOTES ============= -Shockolate is a cross platform source port of System Shock, using SDL2. This runs well on OSX, Linux, and Windows right now, with some missing features that need reviving due to not being included in the source code that was released. +Shockolate is a cross-platform source port of System Shock, using SDL2. This runs well on Linux and Windows right now, +with some missing features that need reviving due to not being included in the source code that was released. -The end goal for this project is something like what Chocolate Doom is for Doom: an experience that closely mimics the original, but portable and with some quality of life improvements including an OpenGL renderer and mod support! +The end goal for this project is something like what Chocolate Doom is for Doom: +an experience that closely mimics the original, but portable and with some quality-of-life improvements, +including an OpenGL renderer and mod support! Join our Discord to follow along with development: https://discord.gg/m45xPan ![work so far](https://i.imgur.com/kbVWQj4.gif) -Prerequisites +Running ======= - - Original cd-rom or SS:EE assets in a `res/data` folder next to the executable - - Floppy disk assets are an older version that we can't load currently +## 1) Acquire binary +### From a prebuilt package -Running -======= +Find a list of [downloadable packages](https://github.com/Interrupt/systemshock/releases/) for Linux and Windows. +32- and 64-bit versions are available for Linux and Windows. + +### From source code + +See [COMPILING.md](COMPILING.md) in the repository. -## From a prebuilt package +## 2) Provide resources -Find a list of [downloadable packages](https://github.com/Interrupt/systemshock/releases/) for Linux, Mac and Windows. 32 and 64 bit versions are available for Linux and Windows. +### 2a) Game data +Original cd-rom or SS:EE assets in a `res/data` folder need to be next to the executable. +> Floppy disk assets are an older version that we can't load currently. -## From source code +### 2b) Music sound font (optional) +In the `res` folder, add a `.sf2` sound font file that should be used for playback. -Prerequisites: -- [CMake](https://cmake.org/download/) installed +> There is a file on the internet that's close to the Windows default everyone knows: http://rancid.kapsi.fi/windows.sf2 +> Please note that this is a file of unknown provenance. -Step 1. Build the dependencies: -* Windows: `build_win32.sh` or `build_win64.sh` (Git Bash and MinGW recommended) -* Linux/Mac: `build_deps.sh` or the CI build scripts in `osx-linux` -* Other: `build_deps.sh` +## 3) Execute binary -Step 2. Build and run the game itself ``` -cmake . -make systemshock ./systemshock ``` -The following CMake options are supported in the build process: -* `ENABLE_SDL2` - use system or bundled SDL2 (ON/BUNDLED, default BUNDLED) -* `ENABLE_SOUND` - enable sound support (requires SDL2_mixer, ON/BUNDLED/OFF, default is BUNDLED) -* `ENABLE_FLUIDSYNTH` - enable FluidSynth MIDI support (ON/BUNDLED/OFF, default is BUNDLED) -* `ENABLE_OPENGL` - enable OpenGL support (ON/OFF, default ON) - -If you find yourself needing to modify the build script for Shockolate itself, `CMakeLists.txt` is the place to look into. - - -Command line parameters -============ +### Command line parameters `-nosplash` Disables the splash screens, causes the game to start straight to the main menu Modding Support ============ -Shockolate supports loading mods and full on fan missions. Just point the executable at a mod file or folder and the game will load it in. So far mod loading supports additional `.res` and `.dat` files for resources and missions respectively. +Shockolate supports loading mods and full on fan missions. +Point the executable at a mod file or folder and the game will load it in. +So far mod loading supports additional `.res` and `.dat` files for resources and missions respectively. Run a fan mission from a folder: ``` @@ -85,4 +79,3 @@ Shockolate replaces the original game's movement with WASD controls, and uses `F * `Ctrl+G` cycles between graphics rendering modes * `Ctrl+F` to enable full screen mode * `Ctrl+D` to disable full screen mode -