diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 537519acf..ed2508ddb 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -13,7 +13,7 @@ jobs: steps: - name: Get number of CPU cores - uses: SimenB/github-actions-cpu-cores@v1 + uses: SimenB/github-actions-cpu-cores@v2 id: cpu-cores - uses: actions/checkout@v4 @@ -49,50 +49,108 @@ jobs: run: | cmake --build build_${{ matrix.profile }} --parallel ${{ steps.cpu-cores.outputs.count }} - wasm: + make: strategy: - # Concurrent builds currently broken: - # https://github.com/mymindstorm/setup-emsdk/issues/20 matrix: - emsdk: [ "2.0.12" ] #, "3.1.8", "3.1.51" ] - profile: [ "rel" ] #, "dbg" ] + include: + - name: web + fte_target: web + make_targets: "gl-rel" + os: ubuntu-latest + - name: linux64 + fte_target: linux64 + make_targets: "m-rel sv-rel qtv-rel qcc-rel" + os: ubuntu-latest + packages: "libasound2-dev libgl-dev libegl1-mesa-dev libwayland-dev libxcursor-dev libxi-dev libxkbcommon-dev libxrandr-dev libxss-dev" + - name: win32 + fte_target: win32 + make_targets: "m-rel sv-rel qcc-rel" + os: ubuntu-latest + packages: "binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686" + - name: win64 + fte_target: win64 + make_targets: "m-rel sv-rel qcc-rel" + os: ubuntu-latest + packages: "binutils-mingw-w64-x86-64 gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64" + - name: macos-arm64 + fte_target: SDL2 + make_targets: "gl-rel sv-rel qcc-rel" + args: "ARCH=arm STRIPFLAGS=" + packages: "sdl2" + os: macos-latest - runs-on: ubuntu-latest + name: make-${{ matrix.name }} + runs-on: ${{ matrix.os }} + timeout-minutes: 30 steps: - name: Get number of CPU cores - uses: SimenB/github-actions-cpu-cores@v1 + uses: SimenB/github-actions-cpu-cores@v2 id: cpu-cores - uses: actions/checkout@v4 - - uses: mymindstorm/setup-emsdk@v13 + - name: Extract versions + run: grep 'VER=' engine/Makefile | tee makelibs_versions + + - uses: actions/cache@v4 + id: cache with: - version: ${{ matrix.emsdk }} - actions-cache-folder: "emsdk-cache-${{ matrix.emsdk }}" + path: engine/libs-* + key: ${{ runner.os }}-${{ matrix.fte_target }}-${{ hashFiles('makelibs_versions') }} + + - uses: mymindstorm/setup-emsdk@v14 + with: + version: "2.0.12" + actions-cache-folder: "emsdk-cache-2.0.12" + cache-key: "emsdk-2.0.12" + if: matrix.fte_target == 'web' - name: Verify emscripten run: emcc -v + if: matrix.fte_target == 'web' + + - name: Install dependencies (linux) + run: sudo apt-get -qq update && sudo apt-get -qq install --no-install-recommends ${{ matrix.packages }} + if: matrix.packages != '' && matrix.os == 'ubuntu-latest' + + - name: Install dependencies (macos) + run: brew install ${{ matrix.packages }} + if: matrix.packages != '' && matrix.os == 'macos-latest' - name: Build dependencies working-directory: engine - run: | - make -j ${{ steps.cpu-cores.outputs.count }} makelibs FTE_TARGET=web + run: make FTE_TARGET=${{ matrix.fte_target }} makelibs ${{ matrix.args }} + if: steps.cache.outputs.cache-hit != 'true' - - name: Build wasm + - uses: ammaraskar/gcc-problem-matcher@0.3.0 + + - name: Build ${{ matrix.name }} working-directory: engine run: | - # Currently fails to build - sed -r -i '/define Q3(CLIENT|SERVER)/d' common/config_fteqw.h + make -j ${{ steps.cpu-cores.outputs.count }} FTE_TARGET=${{ matrix.fte_target }} ${{ matrix.make_targets }} ${{ matrix.args }} LINK_EZHUD=1 LINK_OPENSSL=1 - make -j ${{ steps.cpu-cores.outputs.count }} FTE_TARGET=web web-${{ matrix.profile }} + - name: Attach macOS docs + run: | + cat < engine/release/fte_macos.txt + To allow executables to run issue for example: + chmod +x fteqw-glsdl2 + xattr -d com.apple.quarantine fteqw-glsdl2 + + If you don't have SDL2 installed, run: + brew install sdl2 + EOF + if: matrix.os == 'macos-latest' + + - name: Get version + id: version + run: echo "short_sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT - name: Upload artifacts uses: actions/upload-artifact@v4 with: - name: fteqw-web-${{ matrix.profile }}-em${{ matrix.emsdk }} + name: fteqw-${{ matrix.name }}-${{ steps.version.outputs.short_sha }} path: | - engine/*/ftewebgl.js - engine/*/ftewebgl.html - engine/*/ftewebgl.wasm + engine/release/fte* + !engine/release/*.db compression-level: 9 diff --git a/engine/Makefile b/engine/Makefile index c692c009a..77db7042d 100644 --- a/engine/Makefile +++ b/engine/Makefile @@ -27,7 +27,7 @@ CC?=gcc WINDRES?=windres STRIP?=strip -STRIPFLAGS=--strip-unneeded --remove-section=.comment +STRIPFLAGS?=--strip-unneeded --remove-section=.comment VISIBILITY_FLAGS=-fvisibility=hidden #just assume this for sanities sake. disable only for compilers that error. CPUOPTIMIZATIONS=-Os @@ -1084,7 +1084,7 @@ ifeq (1,$(LINK_EZHUD)) hud_editor.o endif ifeq (1,$(LINK_OPENSSL)) - ifeq (1,$(shell $(PKGCONFIG) --version-atleast 3 openssl && echo 1)) #must exist... and if its not openssl3 then its not gpl3-compatible so refuse to use it. + ifeq (1,$(shell $(PKGCONFIG) --atleast-version 3 openssl && echo 1)) #must exist... and if its not openssl3 then its not gpl3-compatible so refuse to use it. VPATH := $(VPATH) : $(BASE_DIR)/../plugins ALL_CFLAGS+=-DSTATIC_OPENSSL #let the plugins code know it needs to add the appropriate entry. COMMON_OBJS += \ @@ -2347,10 +2347,11 @@ $(BASE_DIR)/libs-$(ARCH)/SDL2-$(SDL2VER)/x86_64-w64-mingw32/bin/sdl2-config: $(B AR?=$(ARCH)-ar -CONFIGARGS+= -host=$(ARCH) --enable-shared=no CC="$(CC)" +CONFIGARGS+= --host=$(ARCH) --enable-shared=no CC="$(CC)" CONFIGARGS:= $(CONFIGARGS) #--disable-silent-rules OPUSCONFIGARGS=$(CONFIGARGS) +SPEEXDSPCONFIGARGS=$(CONFIGARGS) TOOLOVERRIDES+=CFLAGS="$$CFLAGS -Os" TOOLCONGIGUREOVERRIDES=$(TOOLOVERRIDES) @@ -2358,8 +2359,9 @@ TOOLMAKEOVERRIDES=$(TOOLOVERRIDES) ifeq (web,$(FTE_TARGET)) TOOLCONFIGUREOVERRIDES=emconfigure TOOLMAKEOVERRIDES=emmake - OPUSCONFIGARGS=--disable-rtcd --disable-hardening --enable-stack-protector=no --enable-shared=no - CONFIGARGS=--enable-shared=no + OPUSCONFIGARGS=--disable-rtcd --disable-hardening --enable-stack-protector=no --enable-shared=no --host=none + SPEEXDSPCONFIGARGS=--disable-neon --host=none + CONFIGARGS=--enable-shared=no --host=none endif @@ -2400,7 +2402,7 @@ libs-$(ARCH)/libspeex.a: libs-$(ARCH)/libspeexdsp.a: test -f speexdsp-$(SPEEXDSPVER).tar.gz || wget http://downloads.xiph.org/releases/speex/speexdsp-$(SPEEXDSPVER).tar.gz - test -f libs-$(ARCH)/libspeexdsp.a || (mkdir -p libs-$(ARCH)/speex && cd libs-$(ARCH) && tar -xvzf ../speexdsp-$(SPEEXDSPVER).tar.gz && cd speexdsp-$(SPEEXDSPVER) && CFLAGS="$(CFLAGS) -Os" $(TOOLCONFIGUREOVERRIDES) ./configure $(CONFIGARGS) && $(TOOLMAKEOVERRIDES) $(MAKE) && cp libspeexdsp/.libs/libspeexdsp.a ../ && cp -r include/speex/*.h ../speex/) + test -f libs-$(ARCH)/libspeexdsp.a || (mkdir -p libs-$(ARCH)/speex && cd libs-$(ARCH) && tar -xvzf ../speexdsp-$(SPEEXDSPVER).tar.gz && cd speexdsp-$(SPEEXDSPVER) && CFLAGS="$(CFLAGS) -Os" $(TOOLCONFIGUREOVERRIDES) ./configure $(SPEEXDSPCONFIGARGS) && $(TOOLMAKEOVERRIDES) $(MAKE) && cp libspeexdsp/.libs/libspeexdsp.a ../ && cp -r include/speex/*.h ../speex/) libs-$(ARCH)/libfreetype.a libs-$(ARCH)/ft2build.h: libs-$(ARCH)/libpng.a libs-$(ARCH)/libpng.pc test -f freetype-$(FREETYPEVER).tar.gz || wget https://download-mirror.savannah.gnu.org/releases/freetype/freetype-$(FREETYPEVER).tar.gz diff --git a/engine/common/plugin.c b/engine/common/plugin.c index 4ab83438b..846a9b7bd 100644 --- a/engine/common/plugin.c +++ b/engine/common/plugin.c @@ -27,7 +27,7 @@ static struct plugin_s *q3plug; #include "../engine/common/com_phys_ode.c" #endif -#ifdef STATIC_EZHUD //if its statically linked and loading by default then block it by default and let configs reenable it. The defaults must be maintained for deltaing configs to work, yet they're defective and should never be used in that default configuration +#if defined(HAVE_CLIENT) && defined(STATIC_EZHUD) //if its statically linked and loading by default then block it by default and let configs reenable it. The defaults must be maintained for deltaing configs to work, yet they're defective and should never be used in that default configuration cvar_t plug_sbar = CVARD("plug_sbar", "0", "Controls whether plugins are allowed to draw the hud, rather than the engine (when allowed by csqc). This is typically used to permit the ezhud plugin without needing to bother unloading it.\n=0: never use hud plugins.\n&1: Use hud plugins in deathmatch.\n&2: Use hud plugins in singleplayer/coop.\n=3: Always use hud plugins (when loaded)."); #else cvar_t plug_sbar = CVARD("plug_sbar", "3", "Controls whether plugins are allowed to draw the hud, rather than the engine (when allowed by csqc). This is typically used to permit the ezhud plugin without needing to bother unloading it.\n=0: never use hud plugins.\n&1: Use hud plugins in deathmatch.\n&2: Use hud plugins in singleplayer/coop.\n=3: Always use hud plugins (when loaded)."); @@ -37,7 +37,9 @@ cvar_t plug_loaddefault = CVARD("plug_loaddefault", "1", "0: Load plugins only v extern qboolean Plug_Q3_Init(void); extern qboolean Plug_Bullet_Init(void); extern qboolean Plug_ODE_Init(void); +#if defined(HAVE_CLIENT) && defined(STATIC_EZHUD) extern qboolean Plug_EZHud_Init(void); +#endif extern qboolean Plug_OpenSSL_Init(void); static struct { @@ -58,7 +60,7 @@ static struct #ifdef STATIC_OPENSSL {"openssl_internal", Plug_OpenSSL_Init}, #endif -#ifdef STATIC_EZHUD +#if defined(HAVE_CLIENT) && defined(STATIC_EZHUD) {"EZHud_internal", Plug_EZHud_Init}, #endif #ifdef STATIC_Q3 diff --git a/plugins/Makefile b/plugins/Makefile index ac1cc100c..71e882b78 100644 --- a/plugins/Makefile +++ b/plugins/Makefile @@ -3,7 +3,7 @@ ifeq ($(FTE_TARGET),win32) PLUG_NATIVE_EXT=_x86.dll PLUG_LDFLAGS= -static-libgcc - PLUG_LDFLAGS_ZLIB=-L../engine/libs/mingw-libs -lzlib + PLUG_LDFLAGS_ZLIB=-L../engine/libs/mingw-libs -lz BITS=32 PLUG_LDFLAGS_DL= CMAKERULES=$(OUT_DIR)/toolchain_$(FTE_TARGET).cmake