Files
react-native/packages/react-native/scripts/ios-prebuild/setup.js
T
Riccardo CipolleschiandFacebook GitHub Bot 32b2f98814 Use capital letters for Debug and Release (#51920)
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51920

Introduce the BuildFlavor typeand refactor the build scripts to use 'Debug' and 'Release'.

For iOS we always use capitalized Debug and Release and it will make it easier to work with CI too.

## Changelog:
[Internal] -

Reviewed By: cortinico

Differential Revision: D76338034

fbshipit-source-id: ae1acc740b47692ec5eee94c897b49a0e1673b93
2025-06-11 04:48:54 -07:00

199 lines
6.5 KiB
JavaScript

/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow
* @format
*/
/*:: import type {BuildFlavor} from './types'; */
const {prepareHermesArtifactsAsync} = require('./hermes');
const {
prepareReactNativeDependenciesArtifactsAsync,
} = require('./reactNativeDependencies');
const {createFolderIfNotExists, createLogger} = require('./utils');
const {execSync} = require('child_process');
const fs = require('fs');
const path = require('path');
async function setup(
root /*:string*/,
buildFolder /*: string */,
currentVersion /*: string */,
buildType /*: BuildFlavor */,
) {
const prebuildLog = createLogger('prebuild');
createFolderIfNotExists(buildFolder);
// Create the hard links folder
const linksFolder = path.resolve(buildFolder, 'headers');
createFolderIfNotExists(linksFolder);
/**
* Creates a hard link from one path to another. For each subfolder
* in the source path, it creates a link in the target path with an
* underscore prefix.
*/
const link = (fromPath /*:string*/, includePath /*:?string*/) => {
const source = path.resolve(root, fromPath);
const target = path.resolve(linksFolder, includePath ?? fromPath);
createFolderIfNotExists(target);
let linkedFiles = 0;
// get subfolders in source - make sure we only copy folders with header files
const entries = fs.readdirSync(source, {withFileTypes: true});
if (
entries.some(
dirent =>
dirent.isFile() &&
(String(dirent.name).endsWith('.h') ||
String(dirent.name).endsWith('.hpp')),
)
) {
// Create link for all header files (*.h, *.hpp) in the source directory
entries.forEach(entry => {
const entryName = String(entry.name);
if (entry.isFile() && /\.(h|hpp)$/.test(entryName)) {
const sourceFile = path.join(source, entryName);
const targetFile = path.join(target, entryName);
// Skip if the file already exists
if (fs.existsSync(targetFile)) {
return;
}
try {
fs.linkSync(sourceFile, targetFile);
linkedFiles++;
} catch (e) {
console.error(
`Failed to create link for ${sourceFile} to ${targetFile}: ${e}`,
);
}
}
});
}
if (linkedFiles > 0) {
prebuildLog(
`Linked ${path.relative(root, source)}${path.relative(root, target)}`,
);
}
const subfolders = entries
.filter(dirent => dirent.isDirectory())
.filter(dirent => dirent.name !== '__tests__')
.filter(dirent => dirent.name !== 'tests')
.filter(dirent => dirent.name !== 'platform')
.map(dirent => dirent.name);
// Create links for subfolders
subfolders.forEach(folder => {
link(path.join(fromPath, String(folder)), includePath);
});
};
// HERMES ARTIFACTS
await prepareHermesArtifactsAsync(currentVersion, buildType);
await prepareReactNativeDependenciesArtifactsAsync(currentVersion, buildType);
// CODEGEN
const codegenPath = path.join(root, '.build/codegen');
createFolderIfNotExists(codegenPath);
const command = `node scripts/generate-codegen-artifacts -p "${root}" -o "${codegenPath}" -t ios`;
execSync(command, {stdio: 'inherit'});
// LINKING
prebuildLog('Linking header files...');
link('Libraries/WebSocket/', 'React');
link('React/Base', 'React');
link('React/Base/Surface', 'React');
link('React/CxxBridge', 'React');
link('React/CxxModule', 'React');
link('React/CxxUtils', 'React');
link('React/DevSupport', 'React');
link('React/Inspector', 'React');
link('React/I18n', 'React');
link('React/Views', 'React');
link('React/CoreModules', 'React');
link('React/Modules', 'React');
link('React/Fabric', 'React');
link('React/Profiler', 'React');
link('React/CoreModules', 'React');
link('React/Runtime', 'React');
link('React/Views/ScrollView', 'React');
link('React/Views/RefreshControl', 'React');
link('Libraries/Text', 'React');
link('Libraries/AppDelegate');
link('ReactApple/Libraries/RCTFoundation/RCTDeprecation/Exported', 'React');
link(
'ReactApple/Libraries/RCTFoundation/RCTDeprecation/Exported',
'RCTDeprecation',
);
link('Libraries/Required', 'RCTRequired');
link('Libraries/TypeSafety', 'RCTTypeSafety');
link('Libraries/Text', 'React');
link('Libraries/Image', 'React');
link('Libraries/Network', 'React');
link('Libraries/Blob', 'React');
link('Libraries/NativeAnimation', 'React');
link('Libraries/LinkingIOS', 'React');
link('Libraries/Settings', 'React');
link('Libraries/PushNotificationIOS', 'React');
link('Libraries/Settings', 'React');
link('Libraries/Vibration', 'React');
link('ReactCommon/hermes', 'reacthermes');
link('ReactCommon/hermes', 'jsireact');
link(
'ReactCommon/react/renderer/imagemanager',
'react/renderer/imagemanager',
);
link('ReactCommon/yoga/Yoga', 'ReactCommon/yoga/Yoga');
link('ReactCommon/callinvoker', 'ReactCommon');
link('ReactCommon/react/renderer/componentregistry');
link('ReactCommon/react/renderer/core');
link('ReactCommon/react/bridging');
link('ReactCommon/react/timing');
link('ReactCommon/react/utils');
link('ReactCommon/react/debug');
link('ReactCommon/react/renderer/debug');
link('ReactCommon/react/featureflags');
link('ReactCommon/react/renderer/graphics');
link(
'ReactCommon/react/renderer/graphics/platform/ios',
'ReactCommon/react/renderer/graphics',
);
link('ReactCommon/react/nativemodule/core', 'ReactCommon');
link('ReactCommon/react/nativemodule/core/platform/ios', 'ReactCommon');
link('ReactCommon/react/utils/platform/ios', 'ReactCommon/react/utils');
link('ReactCommon/react/runtime');
link('ReactCommon/react/runtime/platform/ios', 'ReactCommon/react/runtime');
link('ReactCommon/jsitooling/react/runtime', 'ReactCommon/react/runtime');
link('ReactCommon/react/renderer/components/legacyviewmanagerinterop');
link('ReactCommon/react/renderer/components/view');
link(
'ReactCommon/react/renderer/components/view/platform/cxx',
'ReactCommon/react/renderer/components/view',
);
link('ReactCommon/react/renderer/mounting');
link('ReactCommon/react/renderer/attributedstring');
link('ReactCommon/runtimeexecutor/ReactCommon', 'ReactCommon');
link('ReactCommon/jsinspector-modern');
link('ReactCommon/cxxreact');
link('.build/codegen/build/generated/ios', 'ReactCodegen');
}
module.exports = {
setup,
};