@@ -91,8 +91,6 @@ const buildIphoneSimulator = async () => {
9191 exec ( 'xcodebuild -sdk iphonesimulator -arch x86_64 -configuration Release -project ReactNativeBabylon.xcodeproj -scheme BabylonNative build CODE_SIGNING_ALLOWED=NO' , 'iOS/Build' ) ;
9292} ;
9393
94- const buildIOS = gulp . series ( makeXCodeProj , buildIphoneOS , buildIphoneSimulator ) ;
95- const buildIOSRNTA = gulp . series ( makeXCodeProjRNTA , buildIphoneOS , buildIphoneSimulator ) ;
9694
9795const buildAndroid = async ( ) => {
9896 const basekitBuildProp = basekitBuild ? "-PBASEKIT_BUILD=1" : "" ;
@@ -235,6 +233,68 @@ const createIOSUniversalLibs = async () => {
235233 libs . map ( lib => exec ( `lipo -create iOS/Build/Release-iphoneos/${ lib } iOS/Build/Release-iphonesimulator/${ lib } -output ${ assemblediOSAndroidDir } /ios/libs/${ lib } ` ) ) ;
236234} ;
237235
236+ const createXCFrameworks = async ( ) => {
237+ if ( fs . existsSync ( '../Modules/@babylonjs/react-native-iosandroid/ios/libs/' ) ) {
238+ console . log ( 'XCFrameworks already exist, skipping creation. If you want to recreate them, delete the ios/libs directory in the react-native-iosandroid module.' ) ;
239+ return ;
240+ }
241+
242+ const PLATFORMS_MAP = {
243+ 'iphoneos' : [ 'arm64' ] ,
244+ 'iphonesimulator' : [ 'x86_64' , 'arm64' ] ,
245+ } ;
246+
247+ // Build static libraries for each platform
248+ Object . keys ( PLATFORMS_MAP ) . forEach ( platform => {
249+ const archs = PLATFORMS_MAP [ platform ] ;
250+ archs . forEach ( arch => {
251+ const outputDir = `iOS/Build/${ platform } -${ arch } ` ;
252+ shelljs . mkdir ( '-p' , outputDir ) ;
253+ const buildCommand = `xcodebuild -sdk ${ platform } -arch ${ arch } -configuration Release -project ReactNativeBabylon.xcodeproj -scheme BabylonNative build CODE_SIGNING_ALLOWED=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES` ;
254+ exec ( buildCommand , 'iOS/Build' ) ;
255+ exec ( `mv iOS/Build/Release-${ platform } /*.a ${ outputDir } ` ) ;
256+ exec ( `rm -rf iOS/Build/Release-${ platform } ` ) ;
257+ } ) ;
258+ } ) ;
259+
260+ // Get the list of libraries
261+ const libs = await readdirAsync ( `iOS/Build/iphoneos-arm64` ) ;
262+
263+ // Merge multi arch libraries into single libraries for platform with multiple archs
264+ Object . keys ( PLATFORMS_MAP ) . forEach ( platform => {
265+ const archs = PLATFORMS_MAP [ platform ] ;
266+ if ( archs . length === 1 ) {
267+ // Copy the single arch library to the output directory
268+ const outputDir = `${ assemblediOSAndroidDir } /ios/libs/${ platform } ` ;
269+ shelljs . mkdir ( '-p' , outputDir ) ;
270+ exec ( `cp -r iOS/Build/${ platform } -${ archs [ 0 ] } /*.a ${ outputDir } ` ) ;
271+ return
272+ }
273+
274+ const outputDir = `${ assemblediOSAndroidDir } /ios/libs/${ platform } ` ;
275+ shelljs . mkdir ( '-p' , outputDir ) ;
276+ libs . forEach ( lib => {
277+ let params = ""
278+ archs . forEach ( arch => {
279+ params += ` iOS/Build/${ platform } -${ arch } /${ lib } `
280+ } ) ;
281+ exec ( `lipo -create ${ params } -output ${ outputDir } /${ lib } ` ) ;
282+ } ) ;
283+ } ) ;
284+
285+ // Create xcframework for each library
286+ libs . forEach ( lib => {
287+ const params = Object . keys ( PLATFORMS_MAP ) . map ( platform => ` -library ${ assemblediOSAndroidDir } /ios/libs/${ platform } /${ lib } ` ) . join ( '' ) ;
288+ const outputDir = `${ assemblediOSAndroidDir } /ios/libs/` ;
289+ const libName = lib . split ( '.' ) [ 0 ] ;
290+ exec ( `xcodebuild -create-xcframework ${ params } -output ${ outputDir } /${ libName } .xcframework` ) ;
291+ } ) ;
292+
293+ shelljs . mkdir ( '-p' , '../Modules/@babylonjs/react-native-iosandroid/ios/libs' ) ;
294+ exec ( `cp -r ${ assemblediOSAndroidDir } /ios/libs/*.xcframework ../Modules/@babylonjs/react-native-iosandroid/ios/libs/` ) ;
295+ exec ( `rm -rf ${ assemblediOSAndroidDir } /ios/libs` ) ;
296+ } ;
297+
238298const copyAndroidFiles = async ( ) => {
239299 await new Promise ( resolve => {
240300 gulp . src ( `${ basekitPackagePath } Android/build.gradle` )
@@ -621,6 +681,8 @@ const patchPackageVersion = async () => {
621681
622682const copyFiles = gulp . parallel ( copyIOSAndroidCommonFiles , copyIOSFiles , copyAndroidFiles ) ;
623683
684+ const buildIOS = gulp . series ( makeXCodeProj , buildIphoneOS , buildIphoneSimulator ) ;
685+ const buildIOSRNTA = gulp . series ( makeXCodeProjRNTA , createXCFrameworks ) ;
624686const buildTS = gulp . series ( patchPackageVersion , copyCommonFiles , copySharedFiles , buildTypeScript , validateAssembled ) ;
625687const buildIOSAndroid = gulp . series ( patchPackageVersion , buildIOS , buildAndroid , createIOSUniversalLibs , copyFiles , validateAssemblediOSAndroid ) ;
626688const build = gulp . series ( buildIOSAndroid , switchToBaseKit , buildIOSAndroid ) ;
@@ -635,6 +697,7 @@ exports.buildIOSRNTA = buildIOSRNTA;
635697exports . buildAndroid = buildAndroid ;
636698exports . buildAndroidRNTA = buildAndroidRNTA ;
637699exports . createIOSUniversalLibs = createIOSUniversalLibs ;
700+ exports . createXCFrameworks = createXCFrameworks ;
638701exports . copyFiles = copyFiles ;
639702
640703exports . clean = clean ;
0 commit comments