@@ -53,12 +53,49 @@ jobs:
5353 restore-keys : |
5454 brew-macos-${{ runner.os }}-
5555
56+ - name : Setup vcpkg
57+ uses : lukka/run-vcpkg@v11
58+ with :
59+ vcpkgGitCommitId : ' 533a5fda5c0646d1771345fb572e759283444d5f'
60+
5661 - name : Install Dependencies
5762 run : |
5863 echo "Installing macOS build dependencies..."
59- brew install cmake ninja meson
60- cmake --version
61- ninja --version
64+
65+ # Update Homebrew to ensure fresh formulas
66+ brew update
67+
68+ # Ensure xcode-select is properly configured (needed for clang/clang++)
69+ xcode-select --install 2>/dev/null || echo "xcode-select already installed"
70+ xcode-select -p || (echo "❌ Xcode command-line tools not installed"; exit 1)
71+
72+ # Build tools
73+ brew install cmake ninja meson pkg-config
74+
75+ # FFmpeg (required by GameEngineDevice for video playback via pkg-config)
76+ brew install ffmpeg
77+
78+ # Freetype + Fontconfig (required by font rendering)
79+ brew install freetype fontconfig
80+
81+ # GLM (required by CompatLib for math, SAGE_USE_GLM)
82+ brew install glm
83+
84+ # glslang (required by DXVK Meson build to compile GLSL shaders to SPIR-V)
85+ brew install glslang
86+
87+ # OpenAL Soft (required by audio layer; provides <AL/al.h> — macOS system OpenAL framework uses <OpenAL/al.h> which is incompatible)
88+ brew install openal-soft
89+
90+ # Verify all tools are available
91+ cmake --version | head -1
92+ ninja --version | head -1
93+ meson --version | head -1
94+ pkg-config --version | head -1
95+ clang --version | head -1
96+ pkg-config --modversion libavcodec 2>/dev/null && echo "✅ FFmpeg: libavcodec available" || echo "❌ FFmpeg: libavcodec NOT found"
97+ find /opt/homebrew -name "glmConfig.cmake" 2>/dev/null | head -1 && echo "✅ GLM cmake config found" || echo "❌ GLM cmake config NOT found"
98+
6299 echo "✅ Build tools installed"
63100
64101 - name : Install Vulkan SDK
@@ -101,44 +138,91 @@ jobs:
101138 # Extract and install if valid ZIP
102139 if [ -f "$VULKAN_ZIP" ] && [ "$(stat -f%z "$VULKAN_ZIP" 2>/dev/null || echo 0)" -gt 100000000 ]; then
103140 echo "Extracting Vulkan SDK ZIP..."
104- mkdir -p /tmp/vulkan-extract
105- unzip -q "$VULKAN_ZIP" -d /tmp/vulkan-extract
106141
107- # Find the .app installer bundle
108- VULKAN_APP=$(find /tmp/vulkan-extract -name "*.app" -type d 2>/dev/null | head -1)
109- if [ -z "$VULKAN_APP" ]; then
110- echo "❌ No .app installer found in extracted ZIP"
111- ls -la /tmp/vulkan-extract/
112- VULKAN_APP=""
142+ # Verify ZIP integrity before extraction
143+ echo "Validating ZIP file integrity..."
144+ if ! unzip -t "$VULKAN_ZIP" > /dev/null 2>&1; then
145+ echo "❌ ZIP file is corrupted"
146+ unzip -t "$VULKAN_ZIP" || true
147+ rm -f "$VULKAN_ZIP"
148+ VULKAN_SDK=""
113149 else
114- echo "Found installer: $VULKAN_APP"
115- INSTALLER="$VULKAN_APP/Contents/MacOS/InstallVulkan"
150+ echo "✅ ZIP file is valid"
151+
152+ # List ZIP contents for debugging
153+ echo "ZIP contents:"
154+ unzip -l "$VULKAN_ZIP" | head -20
155+
156+ # Extract with verbose output (not quiet)
157+ mkdir -p /tmp/vulkan-extract
158+ unzip -o "$VULKAN_ZIP" -d /tmp/vulkan-extract
159+
160+ # List extracted contents
161+ echo "Extracted structure:"
162+ find /tmp/vulkan-extract -type f -o -type d | head -30
116163
117- if [ ! -f "$INSTALLER" ]; then
118- echo "❌ Installer not found at $INSTALLER"
119- ls -la "$VULKAN_APP/Contents/MacOS/"
120- VULKAN_APP=""
164+ # Strategy 1: Look for .app bundle (primary)
165+ VULKAN_APP=$(find /tmp/vulkan-extract -name "*.app" -type d 2>/dev/null | head -1)
166+ if [ -n "$VULKAN_APP" ]; then
167+ INSTALLER="$VULKAN_APP/Contents/MacOS/vulkansdk-macOS-1.4.341.1"
168+ if [ -f "$INSTALLER" ]; then
169+ echo "Found .app bundle installer: $INSTALLER"
170+ VULKAN_EXECUTABLE="$INSTALLER"
171+ else
172+ echo "⚠️ .app bundle found but executable not at expected path"
173+ ls -la "$VULKAN_APP/Contents/MacOS/" || true
174+ VULKAN_EXECUTABLE=""
175+ fi
121176 else
177+ echo "⚠️ No .app bundle found"
178+ fi
179+
180+ # Strategy 2: Look for direct executable if no .app found
181+ if [ -z "$VULKAN_EXECUTABLE" ]; then
182+ VULKAN_EXECUTABLE=$(find /tmp/vulkan-extract -name "vulkansdk-macOS-*" -type f -executable 2>/dev/null | head -1)
183+ if [ -n "$VULKAN_EXECUTABLE" ]; then
184+ echo "Found direct executable: $VULKAN_EXECUTABLE"
185+ else
186+ # Try non-executable variant
187+ VULKAN_EXECUTABLE=$(find /tmp/vulkan-extract -name "vulkansdk-macOS-*" -type f 2>/dev/null | head -1)
188+ if [ -n "$VULKAN_EXECUTABLE" ]; then
189+ echo "Found executable (making executable): $VULKAN_EXECUTABLE"
190+ chmod +x "$VULKAN_EXECUTABLE"
191+ fi
192+ fi
193+ fi
194+
195+ # Execute installer if found
196+ if [ -n "$VULKAN_EXECUTABLE" ] && [ -f "$VULKAN_EXECUTABLE" ]; then
122197 INSTALL_TARGET="$HOME/VulkanSDK/1.4.341.1"
123198 echo "Running Vulkan SDK installer to $INSTALL_TARGET..."
124- "$INSTALLER " \
199+ "$VULKAN_EXECUTABLE " \
125200 --root "$INSTALL_TARGET" \
126201 --accept-licenses \
127202 --default-answer \
128203 --confirm-command install
129- fi
130-
131- INSTALL_STATUS=$?
132- if [ $INSTALL_STATUS -eq 0 ]; then
133- VULKAN_SDK="$INSTALL_TARGET"
134- echo "✅ Vulkan SDK installed to $VULKAN_SDK"
204+ INSTALL_STATUS=$?
205+
206+ if [ $INSTALL_STATUS -eq 0 ]; then
207+ # Normalize to platform subdirectory (CMake FindVulkan expects VULKAN_SDK/lib, not VULKAN_SDK/macOS/lib)
208+ if [ -d "$INSTALL_TARGET/macOS" ]; then
209+ VULKAN_SDK="$INSTALL_TARGET/macOS"
210+ else
211+ VULKAN_SDK="$INSTALL_TARGET"
212+ fi
213+ echo "✅ Vulkan SDK installed to $INSTALL_TARGET"
214+ echo "✅ Normalized VULKAN_SDK to: $VULKAN_SDK"
215+ else
216+ echo "❌ Installer failed with status $INSTALL_STATUS"
217+ VULKAN_SDK=""
218+ fi
135219 else
136- echo "❌ Installer failed with status $INSTALL_STATUS "
220+ echo "❌ No installer found "
137221 VULKAN_SDK=""
138222 fi
223+
224+ rm -rf /tmp/vulkan-extract "$VULKAN_ZIP"
139225 fi
140-
141- rm -rf /tmp/vulkan-extract "$VULKAN_ZIP"
142226 else
143227 echo "⚠️ Vulkan SDK versioned download/validation failed; trying Homebrew fallback"
144228 fi
@@ -159,8 +243,17 @@ jobs:
159243
160244 # Set environment variables for downstream steps
161245 if [ -z "$VULKAN_SDK" ] || [ ! -d "$VULKAN_SDK" ]; then
162- # Last resort: search for any installed SDK
163- VULKAN_SDK="$(find $HOME/VulkanSDK -maxdepth 1 -type d 2>/dev/null | head -1)"
246+ # Last resort: search for any installed SDK, prefer macOS subdir
247+ for candidate in $(find $HOME/VulkanSDK -maxdepth 2 -type d -name "macOS" 2>/dev/null); do
248+ VULKAN_SDK="$candidate"
249+ break
250+ done
251+ fi
252+
253+ # Normalize: if VULKAN_SDK points to version root (has macOS subdir), use macOS subdir
254+ if [ -d "$VULKAN_SDK/macOS" ] && [ -f "$VULKAN_SDK/macOS/lib/libvulkan.dylib" ]; then
255+ VULKAN_SDK="$VULKAN_SDK/macOS"
256+ echo "Normalized VULKAN_SDK to platform subdirectory"
164257 fi
165258
166259 if [ -z "$VULKAN_SDK" ] || [ ! -d "$VULKAN_SDK" ]; then
@@ -175,17 +268,23 @@ jobs:
175268 if [ -f "$VULKAN_SDK/lib/libMoltenVK.dylib" ]; then
176269 echo "✅ MoltenVK found at $VULKAN_SDK/lib/libMoltenVK.dylib"
177270 else
178- echo "⚠️ MoltenVK not found at expected location; build may still work if system Vulkan is available "
271+ echo "⚠️ MoltenVK not found at $VULKAN_SDK/lib/libMoltenVK.dylib "
179272 echo "Checking for alternate locations..."
180- find "$VULKAN_SDK" -name "libMoltenVK*" 2>/dev/null | head -5 || echo "(none found)"
273+ find "$(dirname $ VULKAN_SDK) " -name "libMoltenVK*" 2>/dev/null | head -5 || echo "(none found)"
181274 fi
182275
183276 - name : Configure CMake (macOS)
184277 env :
185278 VULKAN_SDK : ${{ env.VULKAN_SDK }}
279+ VCPKG_ROOT : ${{ env.VCPKG_ROOT }}
280+ VCPKG_DEFAULT_TRIPLET : arm64-osx
281+ CC : clang
282+ CXX : clang++
186283 run : |
187284 mkdir -p logs
188285 echo "VULKAN_SDK=$VULKAN_SDK"
286+ echo "CC=$CC"
287+ echo "CXX=$CXX"
189288 cmake --preset ${{ inputs.preset }} 2>&1 | tee logs/configure_macos.log
190289 CONFIG_STATUS=${PIPESTATUS[0]}
191290 if [ $CONFIG_STATUS -eq 0 ]; then echo "✅ CMake configuration complete"; else echo "❌ CMake configuration failed"; exit 1; fi
@@ -272,10 +371,15 @@ jobs:
272371 [ -f "$f" ] && cp -v "$f" "${RUNTIME_DIR}/lib/" || true
273372 done
274373
275- # MoltenVK dylib from Vulkan SDK
276- if [ -f "${{ env.VULKAN_SDK }}/lib/libMoltenVK.dylib" ]; then
277- echo " Copying MoltenVK..."
374+ # MoltenVK dylib from Vulkan SDK (check both primary and fallback paths)
375+ if [ -f "${{ env.VULKAN_SDK }}/macOS/lib/libMoltenVK.dylib" ]; then
376+ echo " Copying MoltenVK from macOS/lib..."
377+ cp -v "${{ env.VULKAN_SDK }}/macOS/lib/libMoltenVK.dylib" "${RUNTIME_DIR}/lib/" || true
378+ elif [ -f "${{ env.VULKAN_SDK }}/lib/libMoltenVK.dylib" ]; then
379+ echo " Copying MoltenVK from lib..."
278380 cp -v "${{ env.VULKAN_SDK }}/lib/libMoltenVK.dylib" "${RUNTIME_DIR}/lib/" || true
381+ else
382+ echo " ⚠️ MoltenVK dylib not found in Vulkan SDK"
279383 fi
280384
281385 echo " Copying run.sh wrapper from scripts..."
0 commit comments