From e5c5f7ee408363b70459ba6d7f7f9537f5a84962 Mon Sep 17 00:00:00 2001 From: Mikael Hermansson Date: Fri, 24 Jan 2025 13:18:53 +0100 Subject: [PATCH] [godot] Fix various issues with GDExtension on Apple platforms --- spine-godot/Info.ios.plist | 24 ++++++ spine-godot/Info.macos.plist | 26 ++++++ spine-godot/SConstruct | 40 ++++++++- spine-godot/build/build-extension.sh | 85 +------------------ spine-godot/spine_godot_extension.gdextension | 50 +++++------ 5 files changed, 113 insertions(+), 112 deletions(-) create mode 100644 spine-godot/Info.ios.plist create mode 100644 spine-godot/Info.macos.plist diff --git a/spine-godot/Info.ios.plist b/spine-godot/Info.ios.plist new file mode 100644 index 000000000..84d3d2bb3 --- /dev/null +++ b/spine-godot/Info.ios.plist @@ -0,0 +1,24 @@ + + + + + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + FMWK + CFBundleExecutable + ${BUNDLE_LIBRARY} + CFBundleName + ${BUNDLE_NAME} + CFBundleIdentifier + ${BUNDLE_IDENTIFIER} + CFBundleVersion + ${BUNDLE_VERSION} + CFBundleShortVersionString + ${BUNDLE_VERSION} + MinimumOSVersion + ${MIN_IOS_VERSION} + DTPlatformName + iphoneos + + diff --git a/spine-godot/Info.macos.plist b/spine-godot/Info.macos.plist new file mode 100644 index 000000000..6be9410ac --- /dev/null +++ b/spine-godot/Info.macos.plist @@ -0,0 +1,26 @@ + + + + + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + FMWK + CFBundleExecutable + ${BUNDLE_LIBRARY} + CFBundleName + ${BUNDLE_NAME} + CFBundleIdentifier + ${BUNDLE_IDENTIFIER} + CFBundleVersion + ${BUNDLE_VERSION} + CFBundleShortVersionString + ${BUNDLE_VERSION} + LSMinimumSystemVersion + ${MIN_MACOS_VERSION} + CFBundleSupportedPlatforms + + MacOSX + + + diff --git a/spine-godot/SConstruct b/spine-godot/SConstruct index 1e405f98f..ee775d51a 100644 --- a/spine-godot/SConstruct +++ b/spine-godot/SConstruct @@ -112,12 +112,13 @@ if env["target"] in ["editor", "template_debug"]: except AttributeError: print("Not including class reference as we're targeting a pre-4.3 baseline.") -file = "{}{}{}".format(libname, env["suffix"], env["SHLIBSUFFIX"]) +file = "lib{}{}{}".format(libname, env["suffix"], env["SHLIBSUFFIX"]) filepath = "" if env["platform"] == "macos" or env["platform"] == "ios": - filepath = "{}.framework/".format(env["platform"]) - file = "{}.{}.{}".format(libname, env["platform"], env["target"]) + filepath = "lib{}.{}.{}.framework/".format(libname, env["platform"], env["target"]) + file = "lib{}.{}.{}".format(libname, env["platform"], env["target"]) + env.Append(LINKFLAGS=["-Wl,-install_name,@rpath/{}{}".format(filepath, file)]) libraryfile = "bin/{}/{}{}".format(env["platform"], filepath, file) library = env.SharedLibrary( @@ -125,9 +126,40 @@ library = env.SharedLibrary( source=sources, ) -copy = env.InstallAs("{}/bin/{}/{}lib{}".format(projectdir, env["platform"], filepath, file), library) +if env["platform"] == "macos" or env["platform"] == "ios": + plist_subst = { + "${BUNDLE_LIBRARY}": file, + "${BUNDLE_NAME}": "spine-godot", + "${BUNDLE_IDENTIFIER}": "com.esotericsoftware.spine.spine-godot", + "${BUNDLE_VERSION}": "4.2.0", # TODO: Get the proper version from somewhere. Note that this must be three integers. + "${MIN_MACOS_VERSION}": "10.12", + "${MIN_IOS_VERSION}": "12.0" + } + if env["platform"] == "macos": + plist_file = "bin/macos/{}Resources/Info.plist".format(filepath) + plist = env.Substfile( + target=plist_file, + source="Info.macos.plist", + SUBST_DICT=plist_subst + ) + elif env["platform"] == "ios": + plist_file = "bin/ios/{}Info.plist".format(filepath) + plist = env.Substfile( + target=plist_file, + source="Info.ios.plist", + SUBST_DICT=plist_subst + ) + + env.Depends(library, plist) + +copy = env.InstallAs("{}/{}".format(projectdir, libraryfile), library) default_args = [library, copy] + +if env["platform"] == "macos" or env["platform"] == "ios": + copy_plist = env.InstallAs("{}/{}".format(projectdir, plist_file), plist_file) + default_args.append(copy_plist) + if localEnv.get("compiledb", False): default_args += [compilation_db] Default(*default_args) \ No newline at end of file diff --git a/spine-godot/build/build-extension.sh b/spine-godot/build/build-extension.sh index 253064b74..b392891bc 100755 --- a/spine-godot/build/build-extension.sh +++ b/spine-godot/build/build-extension.sh @@ -57,87 +57,7 @@ echo "CPUS: $cpus" pushd .. -if [ "$raw_platform" == "ios" ]; then - BINDIR="example-v4-extension/bin/ios" - mkdir -p $BINDIR - - # Step 1: Build simulator binaries - echo "Building for iOS simulator..." - scons -j $cpus $options $platform target=template_debug arch=universal ios_simulator=yes - mv $BINDIR/ios.framework/libspine_godot.ios.template_debug $BINDIR/libspine_godot.ios.template_debug.simulator.a - - scons -j $cpus $options $platform target=template_release arch=universal ios_simulator=yes - mv $BINDIR/ios.framework/libspine_godot.ios.template_release $BINDIR/libspine_godot.ios.template_release.simulator.a - - # Step 2: Build device binaries - echo "Building for iOS device..." - scons -j $cpus $options $platform target=template_debug arch=arm64 ios_simulator=no - mv $BINDIR/ios.framework/libspine_godot.ios.template_debug $BINDIR/libspine_godot.ios.template_debug.a - - scons -j $cpus $options $platform target=template_release arch=arm64 ios_simulator=no - mv $BINDIR/ios.framework/libspine_godot.ios.template_release $BINDIR/libspine_godot.ios.template_release.a - - # Step 3: Create xcframeworks - echo "Creating xcframeworks..." - - xcodebuild -create-xcframework \ - -library $BINDIR/libspine_godot.ios.template_debug.a \ - -library $BINDIR/libspine_godot.ios.template_debug.simulator.a \ - -output $BINDIR/libspine_godot.ios.template_debug.xcframework - - xcodebuild -create-xcframework \ - -library $BINDIR/libspine_godot.ios.template_release.a \ - -library $BINDIR/libspine_godot.ios.template_release.simulator.a \ - -output $BINDIR/libspine_godot.ios.template_release.xcframework - - # Cleanup intermediate files - rm -f $BINDIR/*.a - rm -rf $BINDIR/ios.framework - -elif [ "$raw_platform" == "macos" ]; then - BINDIR="example-v4-extension/bin/macos/macos.framework" - TMPDIR="example-v4-extension/bin/macos/tmp" - mkdir -p $BINDIR $TMPDIR - - # Build x86_64 binaries - echo "Building for macOS x86_64..." - scons -j $cpus $options $platform target=editor arch=x86_64 - mv $BINDIR/libspine_godot.macos.editor $TMPDIR/libspine_godot.macos.editor.x86_64 - scons -j $cpus $options $platform target=template_debug arch=x86_64 - mv $BINDIR/libspine_godot.macos.template_debug $TMPDIR/libspine_godot.macos.template_debug.x86_64 - scons -j $cpus $options $platform target=template_release arch=x86_64 - mv $BINDIR/libspine_godot.macos.template_release $TMPDIR/libspine_godot.macos.template_release.x86_64 - - # Build arm64 binaries - echo "Building for macOS arm64..." - scons -j $cpus $options $platform target=editor arch=arm64 - mv $BINDIR/libspine_godot.macos.editor $TMPDIR/libspine_godot.macos.editor.arm64 - scons -j $cpus $options $platform target=template_debug arch=arm64 - mv $BINDIR/libspine_godot.macos.template_debug $TMPDIR/libspine_godot.macos.template_debug.arm64 - scons -j $cpus $options $platform target=template_release arch=arm64 - mv $BINDIR/libspine_godot.macos.template_release $TMPDIR/libspine_godot.macos.template_release.arm64 - - # Create universal binaries - echo "Creating universal binaries..." - lipo -create \ - $TMPDIR/libspine_godot.macos.editor.x86_64 \ - $TMPDIR/libspine_godot.macos.editor.arm64 \ - -output $BINDIR/libspine_godot.macos.editor - - lipo -create \ - $TMPDIR/libspine_godot.macos.template_debug.x86_64 \ - $TMPDIR/libspine_godot.macos.template_debug.arm64 \ - -output $BINDIR/libspine_godot.macos.template_debug - - lipo -create \ - $TMPDIR/libspine_godot.macos.template_release.x86_64 \ - $TMPDIR/libspine_godot.macos.template_release.arm64 \ - -output $BINDIR/libspine_godot.macos.template_release - - # Cleanup intermediate files - rm -rf $TMPDIR - -elif [ "$raw_platform" == "web" ]; then +if [ "$raw_platform" == "web" ]; then BINDIR="example-v4-extension/bin/web" mkdir -p $BINDIR @@ -150,10 +70,9 @@ elif [ "$raw_platform" == "web" ]; then echo "Building web without threads..." scons -j $cpus $options $platform target=template_debug threads=no scons -j $cpus $options $platform target=template_release threads=no - else # Normal build process for other platforms - if [ "$raw_platform" != "android" ] && [ "$raw_platform" != "web" ]; then + if [ "$raw_platform" != "android" ] && [ "$raw_platform" != "ios" ] && [ "$raw_platform" != "web" ]; then scons -j $cpus $options $platform target=editor fi scons -j $cpus $options $platform target=template_debug diff --git a/spine-godot/spine_godot_extension.gdextension b/spine-godot/spine_godot_extension.gdextension index 8b263ce23..7a986d2a8 100644 --- a/spine-godot/spine_godot_extension.gdextension +++ b/spine-godot/spine_godot_extension.gdextension @@ -5,36 +5,36 @@ compatibility_minimum = "4.1" [libraries] -macos.editor = "res://bin/macos/macos.framework/libspine_godot.macos.editor" -macos.debug = "res://bin/macos/macos.framework/libspine_godot.macos.template_debug" -macos.release = "res://bin/macos/macos.framework/libspine_godot.macos.template_release" +macos.editor = "macos/libspine_godot.macos.editor.framework" +macos.debug = "macos/libspine_godot.macos.template_debug.framework" +macos.release = "macos/libspine_godot.macos.template_release.framework" -ios.debug = "res://bin/ios/ios.framework/libspine_godot.ios.template_debug.xcframework" -ios.release = "res://bin/ios/ios.framework/libspine_godot.ios.template_release.xcframework" +ios.debug = "ios/libspine_godot.ios.template_debug.framework" +ios.release = "ios/libspine_godot.ios.template_release.framework" -windows.editor.x86_64 = "res://bin/windows/libspine_godot.windows.editor.x86_64.dll" -windows.debug.x86_64 = "res://bin/windows/libspine_godot.windows.template_debug.x86_64.dll" -windows.release.x86_64 = "res://bin/windows/libspine_godot.windows.template_release.x86_64.dll" +windows.editor.x86_64 = "windows/libspine_godot.windows.editor.x86_64.dll" +windows.debug.x86_64 = "windows/libspine_godot.windows.template_debug.x86_64.dll" +windows.release.x86_64 = "windows/libspine_godot.windows.template_release.x86_64.dll" -linux.editor.x86_64 = "res://bin/linux/libspine_godot.linux.editor.x86_64.so" -linux.debug.x86_64 = "res://bin/linux/libspine_godot.linux.template_debug.x86_64.so" -linux.release.x86_64 = "res://bin/linux/libspine_godot.linux.template_release.x86_64.so" +linux.editor.x86_64 = "linux/libspine_godot.linux.editor.x86_64.so" +linux.debug.x86_64 = "linux/libspine_godot.linux.template_debug.x86_64.so" +linux.release.x86_64 = "linux/libspine_godot.linux.template_release.x86_64.so" -linux.editor.arm64 = "res://bin/linux/libspine_godot.linux.editor.arm64.so" -linux.debug.arm64 = "res://bin/linux/libspine_godot.linux.template_debug.arm64.so" -linux.release.arm64 = "res://bin/linux/libspine_godot.linux.template_release.arm64.so" +linux.editor.arm64 = "linux/libspine_godot.linux.editor.arm64.so" +linux.debug.arm64 = "linux/libspine_godot.linux.template_debug.arm64.so" +linux.release.arm64 = "linux/libspine_godot.linux.template_release.arm64.so" -linux.editor.rv64 = "res://bin/linux/libspine_godot.linux.editor.rv64.so" -linux.debug.rv64 = "res://bin/linux/libspine_godot.linux.template_debug.rv64.so" -linux.release.rv64 = "res://bin/linux/libspine_godot.linux.template_release.rv64.so" +linux.editor.rv64 = "linux/libspine_godot.linux.editor.rv64.so" +linux.debug.rv64 = "linux/libspine_godot.linux.template_debug.rv64.so" +linux.release.rv64 = "linux/libspine_godot.linux.template_release.rv64.so" -android.debug.x86_64 = "res://bin/android/libspine_godot.android.template_debug.x86_64.so" -android.release.x86_64 = "res://bin/android/libspine_godot.android.template_release.x86_64.so" +android.debug.x86_64 = "android/libspine_godot.android.template_debug.x86_64.so" +android.release.x86_64 = "android/libspine_godot.android.template_release.x86_64.so" -android.debug.arm64 = "res://bin/android/libspine_godot.android.template_debug.arm64.so" -android.release.arm64 = "res://bin/android/libspine_godot.android.template_release.arm64.so" +android.debug.arm64 = "android/libspine_godot.android.template_debug.arm64.so" +android.release.arm64 = "android/libspine_godot.android.template_release.arm64.so" -web.debug.threads.wasm32 = "res://bin/web/libgdexample.web.template_debug.wasm32.wasm" -web.release.threads.wasm32 = "res://bin/web/libgdexample.web.template_release.wasm32.wasm" -web.debug.wasm32 = "res://bin/web/libgdexample.web.template_debug.wasm32.nothreads.wasm" -web.release.wasm32 = "res://bin/web/libgdexample.web.template_release.wasm32.nothreads.wasm" \ No newline at end of file +web.debug.threads.wasm32 = "web/libgdexample.web.template_debug.wasm32.wasm" +web.release.threads.wasm32 = "web/libgdexample.web.template_release.wasm32.wasm" +web.debug.wasm32 = "web/libgdexample.web.template_debug.wasm32.nothreads.wasm" +web.release.wasm32 = "web/libgdexample.web.template_release.wasm32.nothreads.wasm" \ No newline at end of file