diff --git a/.github/workflows/macos_export.yml b/.github/workflows/macos_export.yml new file mode 100644 index 0000000..40cc9bd --- /dev/null +++ b/.github/workflows/macos_export.yml @@ -0,0 +1,162 @@ +name: MacOS Export + +on: [push] + +env: + CARGO_TERM_COLOR: always + RUSTFLAGS: -Dwarnings + CARGO_INCREMENTAL: 0 + PROJECT_NAME: Godot Spike + WORKING_DIRECTORY: godot + IOS_APPLE_ID_USERNAME: ${{ secrets.IOS_APPLE_ID_USERNAME }} + IOS_APPLE_ID_PASSWORD: ${{ secrets.IOS_APPLE_ID_PASSWORD }} + + BUILD_CERTIFICATE_BASE64: ${{ secrets.IOS_BUILD_CERTIFICATE_BASE64 }} + P12_PASSWORD: ${{ secrets.P12_PASSWORD }} + BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }} + KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} + +jobs: + export-macos: + runs-on: macos-latest + steps: + - uses: actions/checkout@v4 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true + components: rustfmt, clippy + - uses: rui314/setup-mold@v1 + - uses: chickensoft-games/setup-godot@v1 + name: Setup Godot + with: + version: 4.2.2 + include-templates: true + use-dotnet: false + - uses: Swatinem/rust-cache@v2 + with: + workspaces: "rust -> target" + cache-all-crates: "true" + + - name: Install just + run: cargo install just + + - name: just Check + run: just --version + + - name: Godot Check + run: | + godot --version + + - name: Godot Export + run: | + set -x + touch godot/.godot/extension_list.cfg + echo "res://rust.gdextension" >> godot/.godot/extension_list.cfg + just macos-release + + export-ios: + runs-on: macos-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/checkout@v2 + + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true + components: rustfmt, clippy + - uses: rui314/setup-mold@v1 + - uses: chickensoft-games/setup-godot@v1 + name: Setup Godot + with: + version: 4.2.2 + include-templates: true + use-dotnet: false + - uses: Swatinem/rust-cache@v2 + with: + workspaces: "rust -> target" + cache-all-crates: "true" + + - name: Install just + run: cargo install just + + - name: just Check + run: just --version + + - name: Godot Check + run: | + godot --version + + - name: Generate dummy Xcode project + run: | + xcodeproj --help + mkdir DummyProject.xcodeproj + touch DummyProject.xcodeproj/project.pbxproj + echo '{ + archiveVersion = 1; + classes = { + }; + objectVersion = 52; + objects = { + + /* Begin PBXBuildFile section */ + /* End PBXBuildFile section */ + + /* Begin PBXFileReference section */ + /* End PBXFileReference section */ + + /* Begin PBXGroup section */ + /* End PBXGroup section */ + + /* Begin PBXNativeTarget section */ + /* End PBXNativeTarget section */ + + /* Begin PBXProject section */ + /* End PBXProject section */ + + /* Begin XCBuildConfiguration section */ + /* End XCBuildConfiguration section */ + + /* Begin XCConfigurationList section */ + /* End XCConfigurationList section */ + }; + rootObject = fa34a281-c6e9-4544-8eed-20a321786ea9 /* Project object */; + }' > DummyProject.xcodeproj/project.pbxproj + + - name: Godot Export + run: | + set -x + touch godot/.godot/extension_list.cfg + echo "res://rust.gdextension" >> godot/.godot/extension_list.cfg + + # create variables + CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12 + PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision + KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db + + # import certificate and provisioning profile from secrets + echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode -o $CERTIFICATE_PATH + echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode -o $PP_PATH + + # create temporary keychain + security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH + security set-keychain-settings -lut 21600 $KEYCHAIN_PATH + security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH + + # import certificate to keychain + security import $CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH + security list-keychain -d user -s $KEYCHAIN_PATH + + # apply provisioning profile + mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles + cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles + ls + cat DummyProject.xcodeproj/project.pbxproj + xcrun xcodebuild -allowProvisioningUpdates -project DummyProject.xcodeproj \ + -scheme DummyProject -destination generic/platform=iOS \ + -authenticationKeyID ${{ secrets.IOS_APPLE_ID_USERNAME }} \ + -authenticationKeyIssuerID ${{ secrets.IOS_APPLE_ID_USERNAME }} + + just setup-ios + just ios-debug diff --git a/export/macos/.gitkeep b/export/macos/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/godot/rust.gdextension b/godot/rust.gdextension index bc7aa54..d78f2ae 100644 --- a/godot/rust.gdextension +++ b/godot/rust.gdextension @@ -12,3 +12,7 @@ android.debug.arm64 = "res://../rust/target/aarch64-linux-android/debug/libgo android.release.arm64 = "res://../rust/target/aarch64-linux-android/release/libgodot_plugin.so" windows.debug.x86_64 = "res://../rust/target/x86_64-pc-windows-msvc/debug/godot_plugin.dll" windows.release.x86_64 = "res://../rust/target/x86_64-pc-windows-msvc/release/godot_plugin.dll" +macos.debug.arm64 = "res://../rust/target/debug/libgodot_plugin.dylib" +macos.release.arm64 = "res://../rust/target/release/libgodot_plugin.dylib" +ios.debug.arm64 = "res://../rust/target/aarch64-apple-ios/debug/libgodot_plugin.dylib" +ios.release.arm64 = "res://../rust/target/aarch64-apple-ios/release/libgodot_plugin.dylib" diff --git a/justfile b/justfile index e30eb0a..d555037 100644 --- a/justfile +++ b/justfile @@ -56,19 +56,20 @@ windows-release: [macos] macos-debug: - {{rustdir}} cargo build + {{rustdir}} cargo build {{godotdir}} godot --headless --export-debug "macOS" "../export/macos/Godot Spike.dmg" [macos] macos-release: - {{rustdir}} cargo build --release - {{godotdir}} godot --headless --export-release "macOS" "../export/macos/Godot Spike.dmg" + {{rustdir}} cargo build + {{rustdir}} cargo build --release + {{godotdir}} godot --headless --export-release "macOS" "../export/macos/Godot Spike.dmg" [macos] ios-debug: - # NOTE: can only work on MacOS with xcode + {{rustdir}} cargo build {{rustdir}} cargo build --target aarch64-apple-ios - {{godotdir}} godot --headless --export-debug "iOS" "../export/ios/Godot Spike.ipa" + {{godotdir}} godot --headless --import --export-debug "iOS" "../export/ios/Godot Spike.ipa" [macos] ios-release: @@ -82,7 +83,6 @@ setup: just _setup-verify-dependencies _setup-precommit _setup-rust setup-{{os()}} # ------------------------------------------------- -# Execute to verify if all dependencies are installed _setup-verify-dependencies: @ {{message}} "Verifying all required programs are installed...\nAll programs need to be in \$PATH!" rustup --version @@ -106,7 +106,7 @@ setup-windows: rustup target add x86_64-pc-windows-gnu [macos] -setup-macos: +setup-ios: @ {{message}} "Installing Rust tools for iOS builds..." rustup target add aarch64-apple-ios cargo install cargo-lipo