Skip to content

Commit 931d8dc

Browse files
Merge branch 'master' of https://github.com/babylonjs/BabylonReactNative into rnta071
# Conflicts: # .github/workflows/pr.yml # Package/gulpfile.js
2 parents 335c8b6 + d729185 commit 931d8dc

File tree

5 files changed

+106
-44
lines changed

5 files changed

+106
-44
lines changed

.github/workflows/pr.yml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,14 @@ jobs:
111111
with:
112112
name: 'Assembled-BaseKit-${{ matrix.platform }}${{ matrix.react-native-version }}'
113113
path: Package/Assembled-BaseKit-iOSAndroid
114-
114+
- name: Cache XCFrameworks
115+
uses: actions/cache@v2
116+
if: ${{ matrix.platform == 'ios' }}
117+
with:
118+
path: Modules/@babylonjs/react-native-iosandroid/ios/libs
119+
key: ${{ runner.os }}-xcframeworks-${{ github.sha }}
120+
restore-keys: |
121+
${{ runner.os }}-xcframeworks
115122
- name: Upload APK
116123
uses: actions/upload-artifact@v4
117124
if: ${{ matrix.platform == 'android' }}

Apps/BRNPlayground/postinstall.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ function postInstall() {
3232
if (os.platform() === "darwin") {
3333
iosCMake();
3434
35+
exec("npm install && npx gulp buildIOSRNTA", {
36+
cwd: "../../Package",
37+
});
38+
3539
console.log(chalk.black.bgCyan("Installing iOS pods..."));
3640
exec("pod install", { cwd: "ios" });
3741
}*/

Modules/@babylonjs/react-native-iosandroid/.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ DerivedData
2727
*.ipa
2828
*.xcuserstate
2929
project.xcworkspace
30+
ios/libs
3031

3132
# Android/IntelliJ
3233
#
@@ -51,4 +52,4 @@ CMakeCache.txt
5152
cmake_install.cmake
5253
ReactNativeBabylon.xcodeproj
5354
*.tgz
54-
jsi
55+
jsi

Modules/@babylonjs/react-native-iosandroid/react-native-babylon.podspec

Lines changed: 26 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ require "json"
22

33
package = JSON.parse(File.read(File.join(__dir__, "package.json")))
44

5+
# This Podspec is used for local development
6+
57
Pod::Spec.new do |s|
68
s.name = "react-native-babylon"
79
s.version = package["version"]
@@ -17,47 +19,32 @@ Pod::Spec.new do |s|
1719
s.requires_arc = true
1820
s.xcconfig = { 'USER_HEADER_SEARCH_PATHS' => '$(inherited) ${PODS_TARGET_SRCROOT}/shared ${PODS_TARGET_SRCROOT}/../react-native/shared' }
1921

20-
s.libraries = 'astc-encoder',
21-
'etc1',
22-
'etc2',
23-
'nvtt',
24-
'squish',
25-
'pvrtc',
26-
'iqa',
27-
'edtaa3',
28-
'tinyexr',
29-
'BabylonNative',
30-
'bgfx',
31-
'bimg',
32-
'bx',
33-
'Canvas',
34-
'GenericCodeGen',
35-
'glslang',
36-
'glslang-default-resource-limits',
37-
'Graphics',
38-
'jsRuntime',
39-
'OGLCompiler',
40-
'OSDependent',
41-
'MachineIndependent',
42-
'napi',
43-
'NativeCamera',
44-
'NativeCapture',
45-
'NativeEngine',
46-
'NativeInput',
47-
'NativeOptimizations',
48-
'NativeTracing',
49-
'NativeXR',
50-
'SPIRV',
51-
'spirv-cross-core',
52-
'spirv-cross-msl',
53-
'tinyexr',
54-
'UrlLib',
55-
'Window',
56-
'XMLHttpRequest',
57-
'xr'
22+
s.vendored_frameworks = "ios/libs/*.xcframework"
5823

5924
s.frameworks = "MetalKit", "ARKit"
6025

61-
s.dependency "React"
26+
# install_modules_dependencies has been defined in RN 0.70
27+
# This check ensure that the library can work on older versions of RN
28+
if defined?(install_modules_dependencies)
29+
install_modules_dependencies(s)
30+
else
31+
s.dependency "React-Core"
32+
33+
# Don't install the dependencies when we run `pod install` in the old architecture.
34+
if new_arch_enabled then
35+
s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1"
36+
s.pod_target_xcconfig = {
37+
"HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\"",
38+
"OTHER_CPLUSPLUSFLAGS" => "-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1",
39+
"CLANG_CXX_LANGUAGE_STANDARD" => "c++17"
40+
}
41+
s.dependency "React-Codegen"
42+
s.dependency "RCT-Folly"
43+
s.dependency "RCTRequired"
44+
s.dependency "RCTTypeSafety"
45+
s.dependency "ReactCommon/turbomodule/core"
46+
s.dependency "React-RCTFabric"
47+
end
48+
end
6249
end
6350

Package/gulpfile.js

Lines changed: 66 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
108105
const 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+
263322
const 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

698757
const copyFilesiOS = gulp.parallel(copyIOSAndroidCommonFiles, copyIOSFiles);
699758

759+
const buildIOS = gulp.series(makeXCodeProj, buildIphoneOS, buildIphoneSimulator);
760+
const buildIOSRNTA = gulp.series(makeXCodeProjRNTA, createXCFrameworks, buildIphoneOSRNTA, buildIphoneSimulatorRNTA);
761+
700762
const buildTS = gulp.series(patchPackageVersion, copyCommonFiles, copySharedFiles, buildTypeScript, validateAssembled);
701763
const buildIOSAndroid = gulp.series(patchPackageVersion, buildIOS, buildAndroid, createIOSUniversalLibs, copyFiles, validateAssemblediOSAndroid);
702764

@@ -722,6 +784,7 @@ exports.buildRNTAandroid = buildRNTAandroid;
722784
exports.buildRNTAios = buildRNTAios;
723785

724786
exports.createIOSUniversalLibs = createIOSUniversalLibs;
787+
exports.createXCFrameworks = createXCFrameworks;
725788
exports.copyFiles = copyFiles;
726789

727790
exports.clean = clean;

0 commit comments

Comments
 (0)