@@ -102,9 +102,6 @@ const buildIphoneSimulatorRNTA = async () => {
102102 //exec('xcodebuild -sdk iphonesimulator -arch x86_64 -configuration Release -workspace BRNPlayground.xcworkspace -scheme ReactTestApp build CODE_SIGNING_ALLOWED=NO -archivePath ./playgroundSimulator.xcarchive archive', '../Apps/BRNPlayground/ios/Build');
103103} ;
104104
105- const buildIOS = gulp . series ( makeXCodeProj , buildIphoneOS , buildIphoneSimulator ) ;
106- const buildIOSRNTA = gulp . series ( makeXCodeProjRNTA , buildIphoneOSRNTA , buildIphoneSimulatorRNTA ) ;
107-
108105const buildAndroid = async ( ) => {
109106 const basekitBuildProp = basekitBuild ? "-PBASEKIT_BUILD=1" : "" ;
110107 exec ( `./gradlew babylonjs_react-native:assembleRelease --stacktrace --info ${ basekitBuildProp } ` , '../Apps/Playground/Playground/android' ) ;
@@ -260,6 +257,68 @@ const createIOSUniversalLibs = async () => {
260257 libs . map ( lib => exec ( `lipo -create iOS/Build/Release-iphoneos/${ lib } iOS/Build/Release-iphonesimulator/${ lib } -output ${ assemblediOSAndroidDir } /ios/libs/${ lib } ` ) ) ;
261258} ;
262259
260+ const createXCFrameworks = async ( ) => {
261+ if ( fs . existsSync ( '../Modules/@babylonjs/react-native-iosandroid/ios/libs/' ) ) {
262+ console . log ( 'XCFrameworks already exist, skipping creation. If you want to recreate them, delete the ios/libs directory in the react-native-iosandroid module.' ) ;
263+ return ;
264+ }
265+
266+ const PLATFORMS_MAP = {
267+ 'iphoneos' : [ 'arm64' ] ,
268+ 'iphonesimulator' : [ 'x86_64' , 'arm64' ] ,
269+ } ;
270+
271+ // Build static libraries for each platform
272+ Object . keys ( PLATFORMS_MAP ) . forEach ( platform => {
273+ const archs = PLATFORMS_MAP [ platform ] ;
274+ archs . forEach ( arch => {
275+ const outputDir = `iOS/Build/${ platform } -${ arch } ` ;
276+ shelljs . mkdir ( '-p' , outputDir ) ;
277+ const buildCommand = `xcodebuild -sdk ${ platform } -arch ${ arch } -configuration Release -project ReactNativeBabylon.xcodeproj -scheme BabylonNative build CODE_SIGNING_ALLOWED=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES` ;
278+ exec ( buildCommand , 'iOS/Build' ) ;
279+ exec ( `mv iOS/Build/Release-${ platform } /*.a ${ outputDir } ` ) ;
280+ exec ( `rm -rf iOS/Build/Release-${ platform } ` ) ;
281+ } ) ;
282+ } ) ;
283+
284+ // Get the list of libraries
285+ const libs = await readdirAsync ( `iOS/Build/iphoneos-arm64` ) ;
286+
287+ // Merge multi arch libraries into single libraries for platform with multiple archs
288+ Object . keys ( PLATFORMS_MAP ) . forEach ( platform => {
289+ const archs = PLATFORMS_MAP [ platform ] ;
290+ if ( archs . length === 1 ) {
291+ // Copy the single arch library to the output directory
292+ const outputDir = `${ assemblediOSAndroidDir } /ios/libs/${ platform } ` ;
293+ shelljs . mkdir ( '-p' , outputDir ) ;
294+ exec ( `cp -r iOS/Build/${ platform } -${ archs [ 0 ] } /*.a ${ outputDir } ` ) ;
295+ return
296+ }
297+
298+ const outputDir = `${ assemblediOSAndroidDir } /ios/libs/${ platform } ` ;
299+ shelljs . mkdir ( '-p' , outputDir ) ;
300+ libs . forEach ( lib => {
301+ let params = ""
302+ archs . forEach ( arch => {
303+ params += ` iOS/Build/${ platform } -${ arch } /${ lib } `
304+ } ) ;
305+ exec ( `lipo -create ${ params } -output ${ outputDir } /${ lib } ` ) ;
306+ } ) ;
307+ } ) ;
308+
309+ // Create xcframework for each library
310+ libs . forEach ( lib => {
311+ const params = Object . keys ( PLATFORMS_MAP ) . map ( platform => ` -library ${ assemblediOSAndroidDir } /ios/libs/${ platform } /${ lib } ` ) . join ( '' ) ;
312+ const outputDir = `${ assemblediOSAndroidDir } /ios/libs/` ;
313+ const libName = lib . split ( '.' ) [ 0 ] ;
314+ exec ( `xcodebuild -create-xcframework ${ params } -output ${ outputDir } /${ libName } .xcframework` ) ;
315+ } ) ;
316+
317+ shelljs . mkdir ( '-p' , '../Modules/@babylonjs/react-native-iosandroid/ios/libs' ) ;
318+ exec ( `cp -r ${ assemblediOSAndroidDir } /ios/libs/*.xcframework ../Modules/@babylonjs/react-native-iosandroid/ios/libs/` ) ;
319+ exec ( `rm -rf ${ assemblediOSAndroidDir } /ios/libs` ) ;
320+ } ;
321+
263322const copyAndroidFiles = async ( ) => {
264323 await new Promise ( resolve => {
265324 gulp . src ( `${ basekitPackagePath } Android/build.gradle` )
@@ -697,6 +756,9 @@ const copyFiles = gulp.parallel(copyIOSAndroidCommonFiles, copyIOSFiles, copyAnd
697756
698757const copyFilesiOS = gulp . parallel ( copyIOSAndroidCommonFiles , copyIOSFiles ) ;
699758
759+ const buildIOS = gulp . series ( makeXCodeProj , buildIphoneOS , buildIphoneSimulator ) ;
760+ const buildIOSRNTA = gulp . series ( makeXCodeProjRNTA , createXCFrameworks , buildIphoneOSRNTA , buildIphoneSimulatorRNTA ) ;
761+
700762const buildTS = gulp . series ( patchPackageVersion , copyCommonFiles , copySharedFiles , buildTypeScript , validateAssembled ) ;
701763const buildIOSAndroid = gulp . series ( patchPackageVersion , buildIOS , buildAndroid , createIOSUniversalLibs , copyFiles , validateAssemblediOSAndroid ) ;
702764
@@ -722,6 +784,7 @@ exports.buildRNTAandroid = buildRNTAandroid;
722784exports . buildRNTAios = buildRNTAios ;
723785
724786exports . createIOSUniversalLibs = createIOSUniversalLibs ;
787+ exports . createXCFrameworks = createXCFrameworks ;
725788exports . copyFiles = copyFiles ;
726789
727790exports . clean = clean ;
0 commit comments