55 branches : [ master ]
66 pull_request :
77 branches : [ master ]
8+ workflow_dispatch :
89
910jobs :
1011 build :
3132 cc : ' gcc'
3233 cxx : ' g++'
3334
35+ - displayTargetName : ' Linux i686'
36+ artifact : ' virtualjaguar_libretro.so'
37+ os : ubuntu-latest
38+ cc : ' gcc -m32'
39+ cxx : ' g++ -m32'
40+ multilib : true
41+
3442 # macOS
3543 - displayTargetName : ' macOS arm64 (Clang)'
3644 artifact : ' virtualjaguar_libretro.dylib'
@@ -45,13 +53,52 @@ jobs:
4553 cc : ' gcc'
4654 cxx : ' g++'
4755 shell : ' msys2 {0}'
56+ msystem : ' MINGW64'
57+ msys2_packages : ' mingw-w64-x86_64-gcc make'
58+
59+ - displayTargetName : ' Windows i686 (MSYS2)'
60+ artifact : ' virtualjaguar_libretro.dll'
61+ os : windows-latest
62+ cc : ' gcc'
63+ cxx : ' g++'
64+ shell : ' msys2 {0}'
65+ msystem : ' MINGW32'
66+ msys2_packages : ' mingw-w64-i686-gcc make'
4867
4968 # Emscripten (WebAssembly)
5069 - displayTargetName : ' Emscripten (WASM)'
5170 artifact : ' virtualjaguar_libretro_emscripten.bc'
5271 os : ubuntu-latest
5372 emscripten : true
5473
74+ # Android NDK (arm64-v8a)
75+ - displayTargetName : ' Android arm64-v8a'
76+ artifact : ' libs/arm64-v8a/libretro.so'
77+ os : ubuntu-latest
78+ android : true
79+ android_abi : ' arm64-v8a'
80+
81+ # Android NDK (armeabi-v7a)
82+ - displayTargetName : ' Android armeabi-v7a'
83+ artifact : ' libs/armeabi-v7a/libretro.so'
84+ os : ubuntu-latest
85+ android : true
86+ android_abi : ' armeabi-v7a'
87+
88+ # iOS
89+ - displayTargetName : ' iOS arm64'
90+ artifact : ' virtualjaguar_libretro_ios.dylib'
91+ os : macos-latest
92+ make_platform : ' ios-arm64'
93+ cross : true
94+
95+ # tvOS
96+ - displayTargetName : ' tvOS arm64'
97+ artifact : ' virtualjaguar_libretro_tvos.dylib'
98+ os : macos-latest
99+ make_platform : ' tvos-arm64'
100+ cross : true
101+
55102 name : build-${{ matrix.config.displayTargetName }}
56103 runs-on : ${{ matrix.config.os }}
57104
@@ -62,45 +109,68 @@ jobs:
62109 steps :
63110 - uses : actions/checkout@v4
64111
112+ - name : Install multilib
113+ if : matrix.config.multilib
114+ run : |
115+ sudo dpkg --add-architecture i386
116+ sudo apt-get update
117+ sudo apt-get install -y gcc-multilib g++-multilib
118+
65119 - name : Set up MSYS2
66120 if : runner.os == 'Windows'
67121 uses : msys2/setup-msys2@v2
68122 with :
69- msystem : MINGW64
123+ msystem : ${{ matrix.config.msystem || ' MINGW64' }}
70124 update : false
71- install : >-
72- mingw-w64-x86_64-gcc
73- make
125+ install : ${{ matrix.config.msys2_packages || 'mingw-w64-x86_64-gcc make' }}
74126
75127 - name : Set up Emscripten
76128 if : matrix.config.emscripten
77129 uses : mymindstorm/setup-emsdk@v14
78130
131+ - name : Set up Android NDK
132+ if : matrix.config.android
133+ uses : nttld/setup-ndk@v1
134+ id : setup-ndk
135+ with :
136+ ndk-version : r26d
137+
79138 - name : Build
80- if : ${{ !matrix.config.emscripten }}
81- run : make -j4 CC=${{ matrix.config.cc }} CXX=${{ matrix.config.cxx }}
139+ if : ${{ !matrix.config.emscripten && !matrix.config.android && !matrix.config.make_platform }}
140+ run : make -j4 CC="${{ matrix.config.cc }}" CXX="${{ matrix.config.cxx }}"
141+
142+ - name : Build (platform)
143+ if : matrix.config.make_platform
144+ run : make -j4 platform=${{ matrix.config.make_platform }}
82145
83146 - name : Build (Emscripten)
84147 if : matrix.config.emscripten
85148 run : emmake make -j4 platform=emscripten
86149
150+ - name : Build (Android NDK)
151+ if : matrix.config.android
152+ run : |
153+ ${{ steps.setup-ndk.outputs.ndk-path }}/ndk-build \
154+ APP_ABI=${{ matrix.config.android_abi }} -j4
155+
87156 - name : Run SIMD blitter tests
88- if : ${{ !matrix.config.emscripten }}
157+ if : ${{ !matrix.config.emscripten && !matrix.config.android && !matrix.config.cross }}
89158 run : |
90159 ARCH=$(uname -m)
160+ CC="${{ matrix.config.cc }}"
91161 case "$ARCH" in
92162 x86_64|i686|i386) SIMD_SRC=src/blitter_simd_sse2.c; EXTRA="-msse2" ;;
93163 aarch64|arm64) SIMD_SRC=src/blitter_simd_neon.c; EXTRA="" ;;
94164 *) SIMD_SRC=src/blitter_simd_scalar.c; EXTRA="" ;;
95165 esac
96166
97167 echo "==> Testing ${SIMD_SRC}..."
98- ${{ matrix.config.cc }} -O2 -Wall ${EXTRA} -I src \
168+ $CC -O2 -Wall ${EXTRA} -I src \
99169 -o test_blitter_simd test/test_blitter_simd.c ${SIMD_SRC}
100170 ./test_blitter_simd
101171
102172 echo "==> Cross-checking against scalar..."
103- ${{ matrix.config.cc }} -O2 -Wall -I src \
173+ $CC -O2 -Wall -I src \
104174 -o test_blitter_scalar test/test_blitter_simd.c src/blitter_simd_scalar.c
105175 ./test_blitter_scalar
106176
@@ -110,3 +180,32 @@ jobs:
110180 name : ${{ matrix.config.displayTargetName }}
111181 path : ${{ matrix.config.artifact }}
112182 if-no-files-found : error
183+
184+ c89-lint :
185+ name : C89 compliance check
186+ runs-on : ubuntu-latest
187+ steps :
188+ - uses : actions/checkout@v4
189+
190+ - name : Check for declaration-after-statement
191+ run : |
192+ echo "==> Checking C89 compliance (catches MSVC C89 errors)..."
193+ FAILED=0
194+ for f in libretro.c src/*.c; do
195+ # Skip machine-generated files
196+ case "$f" in
197+ src/m68000/*|src/jag*bios*.c|src/jagstub*bios.c|src/blitter_simd_neon.c|src/blitter_simd_sse2.c) continue ;;
198+ esac
199+ if ! gcc -fsyntax-only -std=gnu89 \
200+ -Werror=declaration-after-statement \
201+ -I. -Isrc -Isrc/m68000 -Ilibretro-common/include \
202+ -D__LIBRETRO__ -DINLINE="inline" \
203+ "$f" 2>&1; then
204+ FAILED=1
205+ fi
206+ done
207+ if [ "$FAILED" = "1" ]; then
208+ echo "::error::C89 compliance check failed — mid-block declarations found"
209+ exit 1
210+ fi
211+ echo "==> All files pass C89 declaration check"
0 commit comments