@@ -91,8 +91,6 @@ const buildIphoneSimulator = async () => {
91
91
exec ( 'xcodebuild -sdk iphonesimulator -arch x86_64 -configuration Release -project ReactNativeBabylon.xcodeproj -scheme BabylonNative build CODE_SIGNING_ALLOWED=NO' , 'iOS/Build' ) ;
92
92
} ;
93
93
94
- const buildIOS = gulp . series ( makeXCodeProj , buildIphoneOS , buildIphoneSimulator ) ;
95
- const buildIOSRNTA = gulp . series ( makeXCodeProjRNTA , buildIphoneOS , buildIphoneSimulator ) ;
96
94
97
95
const buildAndroid = async ( ) => {
98
96
const basekitBuildProp = basekitBuild ? "-PBASEKIT_BUILD=1" : "" ;
@@ -235,6 +233,68 @@ const createIOSUniversalLibs = async () => {
235
233
libs . map ( lib => exec ( `lipo -create iOS/Build/Release-iphoneos/${ lib } iOS/Build/Release-iphonesimulator/${ lib } -output ${ assemblediOSAndroidDir } /ios/libs/${ lib } ` ) ) ;
236
234
} ;
237
235
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
+
238
298
const copyAndroidFiles = async ( ) => {
239
299
await new Promise ( resolve => {
240
300
gulp . src ( `${ basekitPackagePath } Android/build.gradle` )
@@ -621,6 +681,8 @@ const patchPackageVersion = async () => {
621
681
622
682
const copyFiles = gulp . parallel ( copyIOSAndroidCommonFiles , copyIOSFiles , copyAndroidFiles ) ;
623
683
684
+ const buildIOS = gulp . series ( makeXCodeProj , buildIphoneOS , buildIphoneSimulator ) ;
685
+ const buildIOSRNTA = gulp . series ( makeXCodeProjRNTA , createXCFrameworks ) ;
624
686
const buildTS = gulp . series ( patchPackageVersion , copyCommonFiles , copySharedFiles , buildTypeScript , validateAssembled ) ;
625
687
const buildIOSAndroid = gulp . series ( patchPackageVersion , buildIOS , buildAndroid , createIOSUniversalLibs , copyFiles , validateAssemblediOSAndroid ) ;
626
688
const build = gulp . series ( buildIOSAndroid , switchToBaseKit , buildIOSAndroid ) ;
@@ -635,6 +697,7 @@ exports.buildIOSRNTA = buildIOSRNTA;
635
697
exports . buildAndroid = buildAndroid ;
636
698
exports . buildAndroidRNTA = buildAndroidRNTA ;
637
699
exports . createIOSUniversalLibs = createIOSUniversalLibs ;
700
+ exports . createXCFrameworks = createXCFrameworks ;
638
701
exports . copyFiles = copyFiles ;
639
702
640
703
exports . clean = clean ;
0 commit comments