-
Notifications
You must be signed in to change notification settings - Fork 0
build functional mythic-crossover-24.0.7 #4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
8e15608
3c55ea9
3a9a82e
750b713
5986c36
d9c00d5
ea2f9bf
3534051
f154f9e
f648c5f
6df9c3e
6c8dc09
0bfe39c
12314ce
ff5d28b
03f8c50
f4617df
6dfb014
4fb6f4d
7e0ee2e
44097f2
d25aceb
f4551af
bafb47e
f5c73e1
043bada
2f30389
7d0d0f2
7fc925f
f5d20f2
8e249f4
17a0100
e6ca751
68c22a7
d25e59e
5bfa99a
89a58f8
028f6eb
8b3230e
1569b5c
de6a0e7
70bba2a
c694ebc
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,161 @@ | ||
| #!/bin/zsh | ||
|
|
||
| # this is a script created for Mythic to bundle its dependencies' dylibs and copy them to the appropriate location. | ||
|
|
||
| set -e | ||
|
|
||
| # Output directory (can be overridden via environment variable) | ||
| ENGINE_DIR="${ENGINE_DIR:-Engine/wine}" | ||
| BREW_PREFIX=$(brew --prefix) | ||
|
|
||
| # List of GStreamer plugins to bundle, minus the 'libgst' prefix | ||
| GSTREAMER_PLUGINS=( | ||
| applemedia | ||
| asf | ||
| audioconvert | ||
| audioparsers | ||
| audioresample | ||
| avi | ||
| coreelements | ||
| debug | ||
| deinterlace | ||
| id3demux | ||
| isomp4 | ||
| libav | ||
| opengl | ||
| playback | ||
| typefindfunctions | ||
| videoconvertscale | ||
| videofilter | ||
| videoparsersbad | ||
| wavparse | ||
| ) | ||
|
|
||
| # list of keg-only formulae and their main dylib names | ||
| BUNDLE_LIBS=( | ||
| molten-vk:libMoltenVK | ||
| sdl2:libSDL2-2.0.0 | ||
| freetype:libfreetype | ||
| gnutls:libgnutls | ||
| libpng:libpng16 | ||
| libtiff:libtiff | ||
| libpcap:libpcap | ||
| jpeg:libjpeg | ||
| libffi:libffi | ||
| ) | ||
|
|
||
| typeset -A seen_dylibs | ||
| typeset -a all_dylibs | ||
|
|
||
| get_lib_path() { | ||
| local formula="$1" libname="$2" | ||
| local prefix=$(brew --prefix "$formula" 2>/dev/null) || return 1 | ||
| find "$prefix/lib" -maxdepth 1 -name "${libname}*.dylib" -type f 2>/dev/null | head -1 | ||
| } | ||
|
|
||
| resolve_rpath() { | ||
| local name="${1#@rpath/}" | ||
|
|
||
| # Check main lib dir first | ||
| [[ -f "${BREW_PREFIX}/lib/${name}" ]] && { echo "${BREW_PREFIX}/lib/${name}"; return; } | ||
|
|
||
| # Search keg-only formula lib dirs | ||
| for entry in "${BUNDLE_LIBS[@]}"; do | ||
| local formula="${entry%%:*}" | ||
| local lib_path="$(brew --prefix "$formula" 2>/dev/null)/lib/${name}" | ||
| [[ -f "$lib_path" ]] && { echo "$lib_path"; return; } | ||
| done | ||
| } | ||
|
|
||
| normalize_path() { | ||
| python3 -c "import os; print(os.path.realpath('$1'))" 2>/dev/null || echo "$1" | ||
| } | ||
|
|
||
| find_dependencies() { | ||
| local dylib="$1" | ||
| local norm=$(normalize_path "$dylib") | ||
|
|
||
| [[ -n "${seen_dylibs[$norm]}" ]] && return | ||
| seen_dylibs[$norm]=1 | ||
| all_dylibs+=("$dylib") | ||
|
|
||
| local -a queue=("$dylib") | ||
|
|
||
| while [[ ${#queue[@]} -gt 0 ]]; do | ||
| local current="${queue[1]}" | ||
| queue=("${queue[@]:1}") | ||
|
|
||
| for ref in $(otool -L "$current" 2>/dev/null | tail -n +2 | awk '/^\t/ {print $1}' | grep '\.dylib'); do | ||
| [[ "$ref" == /usr/lib/* || "$ref" == /System/* ]] && continue | ||
| [[ "$ref" == @loader_path/* || "$ref" == @executable_path/* ]] && continue | ||
|
|
||
| [[ "$ref" == @rpath/* ]] && { ref=$(resolve_rpath "$ref"); [[ -z "$ref" ]] && continue; } | ||
|
|
||
| norm=$(normalize_path "$ref") | ||
| [[ -z "${seen_dylibs[$norm]}" ]] && { | ||
| seen_dylibs[$norm]=1 | ||
| all_dylibs+=("$ref") | ||
| queue+=("$ref") | ||
| } | ||
| done | ||
| done | ||
| } | ||
|
|
||
| fix_install_names() { | ||
| local file="$1" prefix="$2" | ||
| chmod u+w "$file" | ||
| install_name_tool -id "${prefix}$(basename "$file")" "$file" 2>/dev/null || true | ||
|
|
||
| otool -L "$file" | grep -v "$file" | awk '{print $1}' | while read -r lib_path; do | ||
| [[ "$lib_path" != /usr/lib* && "$lib_path" != /System/* ]] && \ | ||
| install_name_tool -change "$lib_path" "${prefix}${lib_path##*/}" "$file" 2>/dev/null || true | ||
| done | ||
| codesign -fs- "$file" 2>/dev/null || true | ||
| } | ||
|
|
||
| copy_dylib() { | ||
| local lib="$1" dest_dir="${ENGINE_DIR}/lib" prefix="@loader_path/" | ||
|
|
||
| [[ "$lib" == *"/gstreamer-1.0/"* ]] && { dest_dir="${ENGINE_DIR}/lib/gstreamer-1.0"; prefix="@loader_path/../"; } | ||
|
|
||
| local dest="${dest_dir}/$(basename "$lib")" | ||
| mkdir -p "$dest_dir" | ||
| [[ -f "$dest" ]] && return 0 | ||
|
|
||
| cp -L "$lib" "$dest" | ||
| fix_install_names "$dest" "$prefix" | ||
| } | ||
|
|
||
| main() { | ||
| local gst_prefix=$(brew --prefix gstreamer) | ||
|
|
||
| echo "=== Processing GStreamer plugins ===" | ||
| for plugin in "${GSTREAMER_PLUGINS[@]}"; do | ||
| local lib_path="${gst_prefix}/lib/gstreamer-1.0/libgst${plugin}.dylib" | ||
| [[ -f "$lib_path" ]] && find_dependencies "$lib_path" || echo "Warning: $plugin not found" | ||
| done | ||
|
|
||
| echo "=== Processing libraries ===" | ||
| for entry in "${BUNDLE_LIBS[@]}"; do | ||
| local formula="${entry%%:*}" libname="${entry#*:}" | ||
| local lib_path=$(get_lib_path "$formula" "$libname") | ||
| [[ -n "$lib_path" ]] && find_dependencies "$lib_path" || echo "Warning: $formula not found" | ||
| done | ||
|
|
||
| echo "=== Copying ${#all_dylibs[@]} dylibs ===" | ||
| for dylib in "${all_dylibs[@]}"; do copy_dylib "$dylib"; done | ||
|
|
||
| [[ -d "${gst_prefix}/lib/gstreamer-1.0/include" ]] && { | ||
| mkdir -p "${ENGINE_DIR}/lib/gstreamer-1.0" | ||
| cp -a "${gst_prefix}/lib/gstreamer-1.0/include" "${ENGINE_DIR}/lib/gstreamer-1.0/" | ||
| } | ||
|
|
||
| echo "=== Fixing Wine .so files ===" | ||
| for so in "${ENGINE_DIR}"/lib/wine/x86_64-unix/*.so(N); do | ||
| otool -L "$so" 2>/dev/null | grep -q "/usr/local\|/opt/homebrew" && fix_install_names "$so" "@rpath/" | ||
| done | ||
|
|
||
| echo "=== Done: ${#all_dylibs[@]} dylibs bundled ===" | ||
| } | ||
|
|
||
| main "$@" |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,203 @@ | ||
| name: Build Mythic Engine (wine-crossover 9.0) | ||
|
|
||
| on: | ||
| push: | ||
| pull_request: | ||
|
|
||
| env: | ||
| MACOSX_DEPLOYMENT_TARGET: 10.15 | ||
| SDKROOT: /Library/Developer/CommandLineTools/SDKs/MacOSX12.3.sdk | ||
| TOOLCHAINS: com.applex.dt.toolchain.Xcode13 # from gcenx | ||
|
|
||
| PATH: /usr/local/bin:/usr/local/opt/bison/bin:/usr/bin:/bin:/usr/sbin:/sbin | ||
|
|
||
| CPATH: /usr/local/include | ||
| LIBRARY_PATH: /usr/local/lib | ||
|
|
||
| # mingw-w64 cross-compilers | ||
| i386_CC: i686-w64-mingw32-gcc | ||
| x86_64_CC: x86_64-w64-mingw32-gcc | ||
| i386_LD: i686-w64-mingw32-ld | ||
| x86_64_LD: x86_64-w64-mingw32-ld | ||
|
|
||
| # compiler and linker flags | ||
| CFLAGS: -O2 -Wno-deprecated-declarations -Wno-unguarded-availability | ||
| CXXFLAGS: -O2 -Wno-deprecated-declarations -Wno-unguarded-availability | ||
| CROSSCFLAGS: -O2 -Wno-error=incompatible-pointer-types -Wno-error=int-conversion -Wno-deprecated-declarations | ||
| CPPFLAGS: -I/usr/local/opt/libpcap/include | ||
| LDFLAGS: -Wl,-headerpad_max_install_names -Wl,-rpath,@loader_path/../../ -Wl,-rpath,@loader_path/../../external -Wl,-rpath,/usr/local/lib -L/usr/local/opt/libpcap/lib | ||
|
|
||
| PKG_CONFIG_PATH: /usr/local/opt/libpcap/lib/pkgconfig | ||
|
|
||
| # wine configure overrides | ||
| ac_cv_lib_soname_MoltenVK: libMoltenVK.dylib | ||
| ac_cv_lib_soname_vulkan: "" | ||
|
|
||
| concurrency: | ||
| group: ${{ github.workflow }}-${{ github.ref_name }} | ||
| cancel-in-progress: true | ||
|
|
||
| jobs: | ||
| build: | ||
| runs-on: macos-15-intel | ||
|
|
||
| steps: | ||
| - uses: actions/checkout@v5 | ||
| with: | ||
| path: src | ||
|
|
||
| - name: download & add Xcode 13 toolchain | ||
| run: | | ||
| sudo mkdir -p /Library/Developer/Toolchains | ||
| curl -fL https://dl.getmythic.app/engine/toolchains/Xcode13.xctoolchain.tar.xz \ | ||
| | sudo tar -xJ -C /Library/Developer/Toolchains | ||
|
|
||
| - name: download & add macOS 12.3 SDK | ||
| run: | | ||
| sudo mkdir -p /Library/Developer/CommandLineTools/SDKs | ||
| curl -fL https://github.com/Gcenx/macos-sdk/releases/download/12.3/MacOSX12.3.tar.bz2 \ | ||
| | sudo tar -xj -C /Library/Developer/CommandLineTools/SDKs | ||
|
|
||
| # ensure that when updating dependencies, the dylib bundler script is also updated | ||
| - name: install build & runtime dependencies | ||
| run: | | ||
| brew install bison \ | ||
| freetype \ | ||
| pkg-config \ | ||
| gettext \ | ||
| gnutls \ | ||
| gstreamer \ | ||
| gst-plugins-base \ | ||
| gst-plugins-good \ | ||
| jpeg \ | ||
| libpng \ | ||
| libtiff \ | ||
| libffi \ | ||
| libpcap \ | ||
| sdl2 \ | ||
| molten-vk \ | ||
| winetricks | ||
|
|
||
| # install mingw-w64 v12.0.0_1 from local formula w/ tap | ||
| # required, this version requires binutils 2.43.1 or older | ||
| brew tap-new local/mingw-w64 | ||
| cp src/external/dependencies/mingw-w64.rb \ | ||
| "$(brew --repo local/mingw-w64)/Formula/mingw-w64.rb" | ||
|
|
||
| brew install local/mingw-w64/mingw-w64 | ||
|
|
||
| - name: create build directory | ||
| run: mkdir build | ||
|
|
||
| - name: configure wine | ||
| working-directory: build | ||
| run: | | ||
| ../src/configure \ | ||
| --prefix= \ | ||
| --disable-tests \ | ||
| --enable-archs=i386,x86_64 \ | ||
| --with-mingw \ | ||
| --without-alsa \ | ||
| --without-capi \ | ||
| --with-coreaudio \ | ||
| --with-cups \ | ||
| --without-dbus \ | ||
| --without-fontconfig \ | ||
| --with-freetype \ | ||
| --with-gettext \ | ||
| --without-gettextpo \ | ||
| --without-gphoto \ | ||
| --with-gnutls \ | ||
| --without-gssapi \ | ||
| --with-gstreamer \ | ||
| --without-krb5 \ | ||
| --without-netapi \ | ||
| --with-opencl \ | ||
| --with-opengl \ | ||
| --without-oss \ | ||
| --with-pcap \ | ||
| --with-pthread \ | ||
| --without-pulse \ | ||
| --without-sane \ | ||
| --with-sdl \ | ||
| --without-udev \ | ||
| --with-unwind \ | ||
| --without-usb \ | ||
| --without-v4l2 \ | ||
| --with-vulkan \ | ||
| --without-x | ||
|
|
||
| - name: build wine | ||
| working-directory: build | ||
| run: make -j$(sysctl -n hw.ncpu) | ||
|
|
||
| - name: create install directory | ||
| run: mkdir install | ||
|
|
||
| - name: install wine | ||
| working-directory: build | ||
| run: make install-lib DESTDIR=${{ github.workspace }}/install | ||
|
|
||
| - name: add wine64 as an executable wrapper for backward compatibility | ||
| working-directory: install/bin | ||
| run: | | ||
| cat > wine64 << 'EOF' | ||
| #!/usr/bin/env bash | ||
|
|
||
| # this is a wrapper created for Mythic to forward `wine64` calls to `wine`. | ||
| # for older versions of Mythic, which expected a wine64 binary to be present. | ||
|
|
||
| set -e | ||
| DIR="$(cd "$(dirname "$0")" && pwd)" | ||
| exec "$DIR/wine" "$@" | ||
| EOF | ||
|
|
||
| chmod +x wine64 | ||
|
|
||
| - name: install wine mono | ||
| working-directory: install/share/wine | ||
| run: | | ||
| mkdir -p mono | ||
| curl -fL https://github.com/wine-mono/wine-mono/releases/download/wine-mono-8.1.0/wine-mono-8.1.0-x86.tar.xz \ | ||
| | tar -xJ -C mono | ||
|
|
||
| - name: install wine gecko | ||
| working-directory: install/share/wine | ||
| run: | | ||
| mkdir -p gecko | ||
| curl -fL https://dl.winehq.org/wine/wine-gecko/2.47.4/wine-gecko-2.47.4-x86.tar.xz \ | ||
| | tar -xJ -C gecko | ||
|
|
||
| - name: create Engine directory | ||
| run: mkdir Engine | ||
|
|
||
| - name: copy build artifacts | ||
| run: | | ||
| mkdir -p Engine/wine | ||
| ditto --rsrc install Engine/wine | ||
|
|
||
| - name: copy externals | ||
| run: | | ||
| # copy dxvk binaries | ||
| mkdir -p Engine/dxvk | ||
| ditto src/external/dxvk-* Engine/dxvk/ | ||
|
|
||
| # copy gptk libraries | ||
| ditto src/external/gptk-*/redist/lib/ Engine/wine/lib/ | ||
|
|
||
| - name: bundle dylib dependencies | ||
| run: | | ||
| chmod +x src/.github/dylib_bundler.zsh | ||
| ENGINE_DIR=Engine/wine src/.github/dylib_bundler.zsh | ||
|
|
||
| - name: copy engine properties file | ||
| run: cp -R src/Mythic/Properties.plist Engine/ | ||
|
|
||
| - name: compress engine artifact | ||
| run: tar -cf Engine.tar.xz -C Engine --use-compress-program="xz -9 -T0" . | ||
|
|
||
| - name: upload engine artifact | ||
| uses: actions/upload-artifact@v5 | ||
| with: | ||
| name: Engine | ||
| path: Engine.tar.xz | ||
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,18 @@ | ||||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||||
| <plist version="1.0"> | ||||||
| <dict> | ||||||
| <key>version</key> | ||||||
| <array/> | ||||||
|
Comment on lines
+5
to
+6
|
||||||
| <key>version</key> | |
| <array/> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Corrected spelling of 'applex' to 'apple' in the toolchain identifier.