Compilar y Empaquetar para macOS #48
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Compilar y Empaquetar para macOS | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| architecture: | |
| description: 'Arquitectura a compilar' | |
| required: true | |
| default: 'both' | |
| type: choice | |
| options: | |
| - arm64 | |
| - x86_64 | |
| - both | |
| jobs: | |
| build-arm64: | |
| if: ${{ github.event.inputs.architecture == 'arm64' || github.event.inputs.architecture == 'both' }} | |
| runs-on: macos-14 | |
| steps: | |
| - name: Clonar repositorio Trinity | |
| uses: actions/checkout@v4 | |
| with: | |
| path: 'trinity' | |
| - name: Clonar Manifiesto de mcpelauncher | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: 'minecraft-linux/mcpelauncher-manifest' | |
| ref: 'qt6' | |
| submodules: 'recursive' | |
| path: 'mcpelauncher' | |
| - name: Clonar mcpe-extract (Codeberg) | |
| run: git clone https://codeberg.org/javiercplus/mcpe-extract.git | |
| - name: Clonar mcpelauncher-mac-bin (Librerías puente) | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: 'minecraft-linux/mcpelauncher-mac-bin' | |
| path: 'mac-bin' | |
| - name: Preparar ANGLE (ARM64) | |
| run: | | |
| mkdir -p external_libs/angle_extracted | |
| curl -L "https://huggingface.co/datasets/ccoffee20/macos/resolve/main/angle-macos-latest-11.0-arm64-tar.zip" -o angle.zip | |
| unzip angle.zip -d external_libs/angle_extracted | |
| cd external_libs/angle_extracted | |
| find . -name "*.tar.xz" -exec tar -xf {} \; | |
| - name: Instalar Homebrew y dependencias (Nativo ARM64) | |
| run: | | |
| eval "$(/opt/homebrew/bin/brew shellenv)" | |
| brew update | |
| # CORREGIDO: Nombres correctos de las fórmulas de Qt | |
| brew install cmake ninja qt@6 qtsvg qtvirtualkeyboard libzip libpng pkg-config openssl@3 rustup | |
| brew link --force qt@6 | |
| brew link --force rustup | |
| rustup default stable | |
| - name: Compilar Trinity (ARM64) | |
| run: | | |
| eval "$(/opt/homebrew/bin/brew shellenv)" | |
| cd trinity | |
| mkdir -p build && cd build | |
| cmake .. \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -G Ninja \ | |
| -DCMAKE_PREFIX_PATH="$(brew --prefix qt@6)" \ | |
| -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 \ | |
| -DCMAKE_OSX_ARCHITECTURES=arm64 \ | |
| -DCMAKE_INSTALL_RPATH="@executable_path/../Frameworks" \ | |
| -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON \ | |
| -DMACOSX_RPATH=ON \ | |
| -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ | |
| -DCMAKE_POLICY_DEFAULT_CMP0169=OLD \ | |
| -Wno-dev | |
| cmake --build . --parallel $(sysctl -n hw.ncpu) | |
| - name: Compilar mcpelauncher (ARM64) | |
| run: | | |
| eval "$(/opt/homebrew/bin/brew shellenv)" | |
| export PATH="/opt/homebrew/opt/rustup/bin:$HOME/.cargo/bin:$PATH" | |
| cd mcpelauncher | |
| wget https://huggingface.co/datasets/ccoffee20/trinity-installer/resolve/main/patch.sh | |
| bash patch.sh | |
| mkdir -p build && cd build | |
| OPENSSL_DIR="$(brew --prefix openssl@3)" | |
| export PKG_CONFIG_PATH="${OPENSSL_DIR}/lib/pkgconfig:${PKG_CONFIG_PATH}" | |
| export CXXFLAGS="-I${OPENSSL_DIR}/include ${CXXFLAGS}" | |
| export LDFLAGS="-L${OPENSSL_DIR}/lib ${LDFLAGS}" | |
| cmake .. \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -G Ninja \ | |
| -DCMAKE_PREFIX_PATH="$(brew --prefix qt@6);${OPENSSL_DIR}" \ | |
| -DCMAKE_INSTALL_RPATH="@executable_path/../Frameworks" \ | |
| -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON \ | |
| -DMACOSX_RPATH=ON \ | |
| -DJNI_USE_JNIVM=ON \ | |
| -DGAMEWINDOW_SYSTEM=SDL3 \ | |
| -DBUILD_WEBVIEW=OFF \ | |
| -DBUILD_UI=OFF \ | |
| -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 \ | |
| -DCMAKE_OSX_ARCHITECTURES=arm64 \ | |
| -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ | |
| -DCMAKE_POLICY_DEFAULT_CMP0169=OLD \ | |
| -DCMAKE_POLICY_DEFAULT_CMP0074=NEW \ | |
| -DOPENSSL_ROOT_DIR="${OPENSSL_DIR}" \ | |
| -Wno-dev | |
| cmake --build . --parallel $(sysctl -n hw.ncpu) | |
| - name: Compilar mcpe-extract (ARM64) | |
| run: | | |
| eval "$(/opt/homebrew/bin/brew shellenv)" | |
| cd mcpe-extract | |
| mkdir -p build && cd build | |
| cmake .. \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -G Ninja \ | |
| -DCMAKE_INSTALL_RPATH="@executable_path/../Frameworks" \ | |
| -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON \ | |
| -DMACOSX_RPATH=ON \ | |
| -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 \ | |
| -DCMAKE_OSX_ARCHITECTURES=arm64 \ | |
| -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ | |
| -DCMAKE_POLICY_DEFAULT_CMP0169=OLD | |
| cmake --build . --parallel $(sysctl -n hw.ncpu) | |
| - name: Crear Application Bundle Profesional (ARM64) | |
| run: | | |
| eval "$(/opt/homebrew/bin/brew shellenv)" | |
| mkdir -p dist/Trinity.app/Contents/{MacOS,Frameworks,Resources} | |
| mkdir -p dist/Trinity.app/Contents/Resources/mcpelauncher/lib/native/arm64-v8a | |
| mkdir -p dist/Trinity.app/Contents/Resources/mcpelauncher/lib/arm64-v8a | |
| mkdir -p dist/Trinity.app/Contents/Frameworks/mvk-angle | |
| # 1. Copiar binarios | |
| cp mcpelauncher/build/mcpelauncher-client/mcpelauncher-client dist/Trinity.app/Contents/MacOS/ | |
| cp mcpe-extract/build/mcpelauncher-extract dist/Trinity.app/Contents/MacOS/ | |
| cp trinity/build/app/trinity dist/Trinity.app/Contents/MacOS/trinity-bin | |
| # 2. Modificar rpaths | |
| cd dist/Trinity.app/Contents/MacOS | |
| for BINARY in trinity-bin mcpelauncher-client mcpelauncher-extract; do | |
| if [ -f "$BINARY" ]; then | |
| while IFS= read -r rpath; do | |
| install_name_tool -delete_rpath "$rpath" "$BINARY" 2>/dev/null || true | |
| done < <(otool -l "$BINARY" | grep -A2 LC_RPATH | grep path | awk '{print $2}') | |
| install_name_tool -add_rpath "@executable_path/../Frameworks" "$BINARY" | |
| install_name_tool -add_rpath "@loader_path/../Frameworks" "$BINARY" | |
| install_name_tool -add_rpath "@executable_path/../Resources/mcpelauncher/lib/native/arm64-v8a" "$BINARY" | |
| fi | |
| done | |
| cd ../../../.. | |
| # 3. Copiar ANGLE (Solo archivos necesarios, excluyendo código fuente y .o) | |
| find external_libs/angle_extracted -name "libEGL.dylib" -exec cp {} dist/Trinity.app/Contents/Frameworks/mvk-angle/ \; | |
| find external_libs/angle_extracted -name "libGLESv2.dylib" -exec cp {} dist/Trinity.app/Contents/Frameworks/mvk-angle/ \; | |
| find external_libs/angle_extracted -name "libMoltenVK.dylib" -exec cp {} dist/Trinity.app/Contents/Frameworks/mvk-angle/ \; | |
| find external_libs/angle_extracted -name "MoltenVK_icd.json" -exec cp {} dist/Trinity.app/Contents/Frameworks/mvk-angle/ \; | |
| # 4. Crear Info.plist TEMPORAL apuntando a trinity-bin para que macdeployqt lo analice | |
| cat <<EOF > dist/Trinity.app/Contents/Info.plist | |
| <?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>CFBundleExecutable</key> | |
| <string>trinity-bin</string> | |
| <key>CFBundleIdentifier</key> | |
| <string>com.trench.trinity.launcher</string> | |
| <key>CFBundleName</key> | |
| <string>Trinity</string> | |
| <key>CFBundleDisplayName</key> | |
| <string>Trinity Launcher</string> | |
| <key>CFBundleIconFile</key> | |
| <string>AppIcon</string> | |
| <key>CFBundleShortVersionString</key> | |
| <string>1.0.0</string> | |
| <key>CFBundleVersion</key> | |
| <string>1.0.0.0</string> | |
| <key>LSMinimumSystemVersion</key> | |
| <string>11.0</string> | |
| <key>NSHighResolutionCapable</key> | |
| <true/> | |
| </dict> | |
| </plist> | |
| EOF | |
| # 5. Ejecutar macdeployqt (ya no se crean enlaces manuales; ahora encuentra todo automáticamente) | |
| cd dist | |
| $(brew --prefix qt@6)/bin/macdeployqt Trinity.app \ | |
| -executable=Trinity.app/Contents/MacOS/mcpelauncher-client \ | |
| -executable=Trinity.app/Contents/MacOS/mcpelauncher-extract \ | |
| -always-overwrite -verbose=1 | |
| cd .. | |
| # 6. Copiar librerías de mac-bin | |
| cp mac-bin/lib/native/arm64-v8a/libfmod*.dylib dist/Trinity.app/Contents/Resources/mcpelauncher/lib/native/arm64-v8a/ | |
| cp mac-bin/lib/arm64-v8a/*.so dist/Trinity.app/Contents/Resources/mcpelauncher/lib/arm64-v8a/ | |
| # 7. Crear launcher en C | |
| cat << 'EOF' > trinity_launcher.c | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #include <unistd.h> | |
| #include <libgen.h> | |
| #include <mach-o/dyld.h> | |
| #include <sys/param.h> | |
| int main(int argc, char *argv[]) { | |
| char exec_path[MAXPATHLEN]; | |
| uint32_t size = sizeof(exec_path); | |
| if (_NSGetExecutablePath(exec_path, &size) != 0) { | |
| fprintf(stderr, "Error: No se pudo obtener la ruta del ejecutable\n"); | |
| return 1; | |
| } | |
| char *dir = dirname(exec_path); | |
| char trinity_bin_path[MAXPATHLEN]; | |
| snprintf(trinity_bin_path, sizeof(trinity_bin_path), "%s/trinity-bin", dir); | |
| char bundle_path[MAXPATHLEN]; | |
| snprintf(bundle_path, sizeof(bundle_path), "%s/../..", dir); | |
| setenv("ANGLE_DEFAULT_PLATFORM", "metal", 1); | |
| setenv("QT_MAC_WANTS_LAYER", "1", 1); | |
| setenv("QT_AUTO_SCREEN_SCALE_FACTOR", "1", 1); | |
| char resources_path[MAXPATHLEN]; | |
| snprintf(resources_path, sizeof(resources_path), "%s/Resources/mcpelauncher", bundle_path); | |
| setenv("MCPELAUNCHER_RESOURCES", resources_path, 1); | |
| char frameworks_path[MAXPATHLEN]; | |
| snprintf(frameworks_path, sizeof(frameworks_path), "%s/Frameworks", bundle_path); | |
| const char *existing_dyld = getenv("DYLD_FALLBACK_LIBRARY_PATH"); | |
| char new_dyld_path[MAXPATHLEN]; | |
| if (existing_dyld && strlen(existing_dyld) > 0) { | |
| snprintf(new_dyld_path, sizeof(new_dyld_path), "%s:%s", frameworks_path, existing_dyld); | |
| } else { | |
| snprintf(new_dyld_path, sizeof(new_dyld_path), "%s", frameworks_path); | |
| } | |
| setenv("DYLD_FALLBACK_LIBRARY_PATH", new_dyld_path, 1); | |
| char **new_argv = malloc((argc + 1) * sizeof(char *)); | |
| new_argv[0] = trinity_bin_path; | |
| for (int i = 1; i < argc; i++) { | |
| new_argv[i] = argv[i]; | |
| } | |
| new_argv[argc] = NULL; | |
| execvp(trinity_bin_path, new_argv); | |
| perror("Error al ejecutar trinity-bin"); | |
| free(new_argv); | |
| return 1; | |
| } | |
| EOF | |
| # 8. Compilar el launcher en C | |
| clang -arch arm64 -mmacosx-version-min=11.0 -O2 -o dist/Trinity.app/Contents/MacOS/trinity trinity_launcher.c | |
| # 9. Actualizar Info.plist para que apunte al launcher | |
| /usr/libexec/PlistBuddy -c "Set :CFBundleExecutable trinity" dist/Trinity.app/Contents/Info.plist | |
| # 10. Copiar icono | |
| cp trinity/resources/branding/com.trench.trinity.launcher.icns dist/Trinity.app/Contents/Resources/AppIcon.icns | |
| # 11. Limpiar atributos extendidos y firmar | |
| xattr -cr dist/Trinity.app | |
| cd dist | |
| codesign --force --deep --sign - --timestamp=none Trinity.app | |
| hdiutil create -volname "Trinity Launcher" -srcfolder Trinity.app -ov -format UDZO Trinity-arm64.dmg | |
| cd .. | |
| - name: Subir artefacto a GitHub Actions | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: Trinity-macOS-ARM64 | |
| path: dist/Trinity-arm64.dmg | |
| - name: Subir a Hugging Face | |
| env: | |
| HF_TOKEN: ${{ secrets.HF_TOKEN }} | |
| run: | | |
| pip3 install huggingface_hub --break-system-packages | |
| hf upload ccoffee20/macos dist/Trinity-arm64.dmg --repo-type dataset --token $HF_TOKEN | |
| build-x86_64: | |
| if: ${{ github.event.inputs.architecture == 'x86_64' || github.event.inputs.architecture == 'both' }} | |
| runs-on: macos-15-intel | |
| steps: | |
| - name: Clonar repositorio Trinity | |
| uses: actions/checkout@v4 | |
| with: | |
| path: "trinity" | |
| - name: Clonar Manifiesto de mcpelauncher | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: "minecraft-linux/mcpelauncher-manifest" | |
| ref: "qt6" | |
| submodules: "recursive" | |
| path: "mcpelauncher" | |
| - name: Clonar mcpe-extract (Codeberg) | |
| run: git clone https://codeberg.org/javiercplus/mcpe-extract.git | |
| - name: Clonar mcpelauncher-mac-bin (Librerías puente) | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: "minecraft-linux/mcpelauncher-mac-bin" | |
| path: "mac-bin" | |
| - name: Preparar ANGLE (x86_64) | |
| run: | | |
| mkdir -p external_libs/angle_extracted | |
| curl -L "https://huggingface.co/datasets/ccoffee20/macos/resolve/main/anglex86_64.tar" -o angle.tar | |
| tar -xvf angle.tar -C external_libs/angle_extracted | |
| - name: Instalar Homebrew (Intel) y dependencias | |
| run: | | |
| # CORREGIDO: Homebrew ya está instalado en el runner, solo actualizar | |
| eval "$(/usr/local/bin/brew shellenv)" | |
| brew update | |
| # CORREGIDO: Nombres correctos de las fórmulas de Qt | |
| brew install cmake ninja qt@6 qtsvg qtvirtualkeyboard libzip libpng pkg-config openssl@3 rustup | |
| brew link --force qt@6 | |
| brew link --force rustup | |
| rustup default stable | |
| - name: Compilar Trinity (x86_64) | |
| run: | | |
| eval "$(/usr/local/bin/brew shellenv)" | |
| cd trinity | |
| mkdir -p build && cd build | |
| cmake .. \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -G Ninja \ | |
| -DCMAKE_PREFIX_PATH="$(brew --prefix qt@6)" \ | |
| -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15 \ | |
| -DCMAKE_OSX_ARCHITECTURES=x86_64 \ | |
| -DCMAKE_INSTALL_RPATH="@executable_path/../Frameworks" \ | |
| -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON \ | |
| -DMACOSX_RPATH=ON \ | |
| -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ | |
| -DCMAKE_POLICY_DEFAULT_CMP0169=OLD \ | |
| -Wno-dev | |
| cmake --build . --parallel $(sysctl -n hw.ncpu) | |
| - name: Compilar mcpelauncher (x86_64) | |
| run: | | |
| eval "$(/usr/local/bin/brew shellenv)" | |
| export PATH="/usr/local/opt/rustup/bin:$HOME/.cargo/bin:$PATH" | |
| cd mcpelauncher | |
| wget https://huggingface.co/datasets/ccoffee20/trinity-installer/resolve/main/patch.sh | |
| bash patch.sh | |
| mkdir -p build && cd build | |
| OPENSSL_DIR="$(brew --prefix openssl@3)" | |
| # CORREGIDO: No es necesario 'arch -x86_64' en un runner Intel nativo | |
| cmake .. \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -G Ninja \ | |
| -DCMAKE_PREFIX_PATH="$(brew --prefix qt@6);$(brew --prefix openssl@3)" \ | |
| -DCMAKE_INSTALL_RPATH="@executable_path/../Frameworks" \ | |
| -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON \ | |
| -DMACOSX_RPATH=ON \ | |
| -DJNI_USE_JNIVM=ON \ | |
| -DGAMEWINDOW_SYSTEM=SDL3 \ | |
| -DBUILD_WEBVIEW=OFF \ | |
| -DBUILD_UI=OFF \ | |
| -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15 \ | |
| -DCMAKE_OSX_ARCHITECTURES=x86_64 \ | |
| -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ | |
| -DCMAKE_POLICY_DEFAULT_CMP0169=OLD \ | |
| -DCMAKE_POLICY_DEFAULT_CMP0074=NEW \ | |
| -DOPENSSL_ROOT_DIR="$OPENSSL_DIR" \ | |
| -DOPENSSL_INCLUDE_DIR="$OPENSSL_DIR/include" \ | |
| -DOPENSSL_CRYPTO_LIBRARY="$OPENSSL_DIR/lib/libcrypto.dylib" \ | |
| -DOPENSSL_SSL_LIBRARY="$OPENSSL_DIR/lib/libssl.dylib" \ | |
| -Wno-dev | |
| cmake --build . --parallel $(sysctl -n hw.ncpu) | |
| - name: Compilar mcpe-extract (x86_64) | |
| run: | | |
| eval "$(/usr/local/bin/brew shellenv)" | |
| cd mcpe-extract | |
| mkdir -p build && cd build | |
| cmake .. \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -G Ninja \ | |
| -DCMAKE_INSTALL_RPATH="@executable_path/../Frameworks" \ | |
| -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON \ | |
| -DMACOSX_RPATH=ON \ | |
| -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15 \ | |
| -DCMAKE_OSX_ARCHITECTURES=x86_64 \ | |
| -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ | |
| -DCMAKE_POLICY_DEFAULT_CMP0169=OLD | |
| cmake --build . --parallel $(sysctl -n hw.ncpu) | |
| - name: Crear Application Bundle Profesional (x86_64) | |
| run: | | |
| eval "$(/usr/local/bin/brew shellenv)" | |
| mkdir -p dist/Trinity.app/Contents/{MacOS,Frameworks,Resources} | |
| mkdir -p dist/Trinity.app/Contents/Resources/mcpelauncher/lib/native/x86_64 | |
| mkdir -p dist/Trinity.app/Contents/Resources/mcpelauncher/lib/x86_64 | |
| # 1. Copiar binarios | |
| cp mcpelauncher/build/mcpelauncher-client/mcpelauncher-client dist/Trinity.app/Contents/MacOS/ | |
| cp mcpe-extract/build/mcpelauncher-extract dist/Trinity.app/Contents/MacOS/ | |
| cp trinity/build/app/trinity dist/Trinity.app/Contents/MacOS/trinity-bin | |
| # 2. Modificar rpaths | |
| cd dist/Trinity.app/Contents/MacOS | |
| for BINARY in trinity-bin mcpelauncher-client mcpelauncher-extract; do | |
| if [ -f "$BINARY" ]; then | |
| while IFS= read -r rpath; do | |
| install_name_tool -delete_rpath "$rpath" "$BINARY" 2>/dev/null || true | |
| done < <(otool -l "$BINARY" | grep -A2 LC_RPATH | grep path | awk '{print $2}') | |
| install_name_tool -add_rpath "@executable_path/../Frameworks" "$BINARY" | |
| install_name_tool -add_rpath "@loader_path/../Frameworks" "$BINARY" | |
| install_name_tool -add_rpath "@executable_path/../Resources/mcpelauncher/lib/native/x86_64" "$BINARY" | |
| fi | |
| done | |
| cd ../../../.. | |
| # 3. Copiar ANGLE (Solo archivos necesarios, excluyendo código fuente y .o) | |
| find external_libs/angle_extracted -name "libEGL.dylib" -exec cp {} dist/Trinity.app/Contents/Frameworks/mvk-angle/ \; | |
| find external_libs/angle_extracted -name "libGLESv2.dylib" -exec cp {} dist/Trinity.app/Contents/Frameworks/mvk-angle/ \; | |
| find external_libs/angle_extracted -name "libMoltenVK.dylib" -exec cp {} dist/Trinity.app/Contents/Frameworks/mvk-angle/ \; | |
| find external_libs/angle_extracted -name "MoltenVK_icd.json" -exec cp {} dist/Trinity.app/Contents/Frameworks/mvk-angle/ \; | |
| # 4. Crear Info.plist TEMPORAL | |
| cat <<EOF > dist/Trinity.app/Contents/Info.plist | |
| <?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>CFBundleExecutable</key> | |
| <string>trinity-bin</string> | |
| <key>CFBundleIdentifier</key> | |
| <string>com.trench.trinity.launcher</string> | |
| <key>CFBundleName</key> | |
| <string>Trinity</string> | |
| <key>CFBundleDisplayName</key> | |
| <string>Trinity Launcher</string> | |
| <key>CFBundleIconFile</key> | |
| <string>AppIcon</string> | |
| <key>CFBundleShortVersionString</key> | |
| <string>1.0.0</string> | |
| <key>CFBundleVersion</key> | |
| <string>1.0.0.0</string> | |
| <key>LSMinimumSystemVersion</key> | |
| <string>10.15</string> | |
| <key>NSHighResolutionCapable</key> | |
| <true/> | |
| </dict> | |
| </plist> | |
| EOF | |
| # 5. Ejecutar macdeployqt | |
| cd dist | |
| $(brew --prefix qt@6)/bin/macdeployqt Trinity.app \ | |
| -executable=Trinity.app/Contents/MacOS/mcpelauncher-client \ | |
| -executable=Trinity.app/Contents/MacOS/mcpelauncher-extract \ | |
| -always-overwrite -verbose=1 | |
| cd .. | |
| # 6. Copiar librerías de mac-bin | |
| cp mac-bin/lib/native/x86_64/libfmod*.dylib dist/Trinity.app/Contents/Resources/mcpelauncher/lib/native/x86_64/ | |
| cp mac-bin/lib/x86_64/*.so dist/Trinity.app/Contents/Resources/mcpelauncher/lib/x86_64/ | |
| # 7. Crear launcher en C (idéntico al de ARM64) | |
| cat << 'EOF' > trinity_launcher.c | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #include <unistd.h> | |
| #include <libgen.h> | |
| #include <mach-o/dyld.h> | |
| #include <sys/param.h> | |
| int main(int argc, char *argv[]) { | |
| char exec_path[MAXPATHLEN]; | |
| uint32_t size = sizeof(exec_path); | |
| if (_NSGetExecutablePath(exec_path, &size) != 0) { | |
| fprintf(stderr, "Error: No se pudo obtener la ruta del ejecutable\n"); | |
| return 1; | |
| } | |
| char *dir = dirname(exec_path); | |
| char trinity_bin_path[MAXPATHLEN]; | |
| snprintf(trinity_bin_path, sizeof(trinity_bin_path), "%s/trinity-bin", dir); | |
| char bundle_path[MAXPATHLEN]; | |
| snprintf(bundle_path, sizeof(bundle_path), "%s/../..", dir); | |
| setenv("ANGLE_DEFAULT_PLATFORM", "metal", 1); | |
| setenv("QT_MAC_WANTS_LAYER", "1", 1); | |
| setenv("QT_AUTO_SCREEN_SCALE_FACTOR", "1", 1); | |
| char resources_path[MAXPATHLEN]; | |
| snprintf(resources_path, sizeof(resources_path), "%s/Resources/mcpelauncher", bundle_path); | |
| setenv("MCPELAUNCHER_RESOURCES", resources_path, 1); | |
| char frameworks_path[MAXPATHLEN]; | |
| snprintf(frameworks_path, sizeof(frameworks_path), "%s/Frameworks", bundle_path); | |
| const char *existing_dyld = getenv("DYLD_FALLBACK_LIBRARY_PATH"); | |
| char new_dyld_path[MAXPATHLEN]; | |
| if (existing_dyld && strlen(existing_dyld) > 0) { | |
| snprintf(new_dyld_path, sizeof(new_dyld_path), "%s:%s", frameworks_path, existing_dyld); | |
| } else { | |
| snprintf(new_dyld_path, sizeof(new_dyld_path), "%s", frameworks_path); | |
| } | |
| setenv("DYLD_FALLBACK_LIBRARY_PATH", new_dyld_path, 1); | |
| char **new_argv = malloc((argc + 1) * sizeof(char *)); | |
| new_argv[0] = trinity_bin_path; | |
| for (int i = 1; i < argc; i++) { | |
| new_argv[i] = argv[i]; | |
| } | |
| new_argv[argc] = NULL; | |
| execvp(trinity_bin_path, new_argv); | |
| perror("Error al ejecutar trinity-bin"); | |
| free(new_argv); | |
| return 1; | |
| } | |
| EOF | |
| # 8. Compilar el launcher en C | |
| clang -arch x86_64 -mmacosx-version-min=10.15 -O2 -o dist/Trinity.app/Contents/MacOS/trinity trinity_launcher.c | |
| # 9. Actualizar Info.plist para que apunte al launcher | |
| /usr/libexec/PlistBuddy -c "Set :CFBundleExecutable trinity" dist/Trinity.app/Contents/Info.plist | |
| # 10. Copiar icono | |
| cp trinity/resources/branding/com.trench.trinity.launcher.icns dist/Trinity.app/Contents/Resources/AppIcon.icns | |
| # 11. Limpiar atributos extendidos y firmar | |
| xattr -cr dist/Trinity.app | |
| cd dist | |
| codesign --force --deep --sign - --timestamp=none Trinity.app | |
| hdiutil create -volname "Trinity Launcher" -srcfolder Trinity.app -ov -format UDZO Trinity-x86_64.dmg | |
| cd .. | |
| - name: Subir artefacto a GitHub Actions | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: Trinity-macOS-x86_64 | |
| path: dist/Trinity-x86_64.dmg | |
| - name: Subir a Hugging Face | |
| env: | |
| HF_TOKEN: ${{ secrets.HF_TOKEN }} | |
| run: | | |
| pip3 install huggingface_hub --break-system-packages | |
| hf upload ccoffee20/macos dist/Trinity-x86_64.dmg --repo-type dataset --token $HF_TOKEN |