1f194f574SWojciech Kozyraimport escapeRegExp from 'lodash/escapeRegExp'; 2f194f574SWojciech Kozyraimport path from 'path'; 3f194f574SWojciech Kozyra 4f194f574SWojciech Kozyraimport { transformString } from '../../Transforms'; 5f194f574SWojciech Kozyraimport { FileTransform, FileTransforms, StringTransform } from '../../Transforms.types'; 6f194f574SWojciech Kozyraimport { baseCmakeTransforms } from './cmakeTransforms'; 7f194f574SWojciech Kozyraimport { JniLibNames } from './libraries'; 8f194f574SWojciech Kozyraimport { packagesToRename } from './packagesConfig'; 9f194f574SWojciech Kozyra 10f194f574SWojciech Kozyrafunction pathFromPkg(pkg: string): string { 11f194f574SWojciech Kozyra return pkg.replace(/\./g, '/'); 12f194f574SWojciech Kozyra} 13f194f574SWojciech Kozyra 14f194f574SWojciech Kozyraexport function reactNativeTransforms( 15f194f574SWojciech Kozyra versionedReactNativeRoot: string, 16f194f574SWojciech Kozyra abiVersion: string 17f194f574SWojciech Kozyra): FileTransforms { 18f194f574SWojciech Kozyra return { 19f194f574SWojciech Kozyra path: [], 20f194f574SWojciech Kozyra content: [ 21f194f574SWojciech Kozyra // Add generated java to sourceSets 22f194f574SWojciech Kozyra { 23f194f574SWojciech Kozyra paths: './ReactAndroid/build.gradle', 24f194f574SWojciech Kozyra find: /(\bsrcDirs = \["src\/main\/java",.+)(\])/, 25f194f574SWojciech Kozyra replaceWith: `$1, "${path.join(versionedReactNativeRoot, 'codegen')}/java"$2`, 26f194f574SWojciech Kozyra }, 27f194f574SWojciech Kozyra // Disable codegen plugin 28f194f574SWojciech Kozyra { 29f194f574SWojciech Kozyra paths: './ReactAndroid/build.gradle', 30f194f574SWojciech Kozyra find: /(\bid\("com\.facebook\.react"\)$)/m, 31f194f574SWojciech Kozyra replaceWith: '// $1', 32f194f574SWojciech Kozyra }, 33f194f574SWojciech Kozyra { 34f194f574SWojciech Kozyra paths: './ReactAndroid/build.gradle', 35f194f574SWojciech Kozyra find: /(^react {[^]+?\n\})/m, 36f194f574SWojciech Kozyra replaceWith: '/* $1 */', 37f194f574SWojciech Kozyra }, 38f194f574SWojciech Kozyra { 39f194f574SWojciech Kozyra paths: './ReactAndroid/build.gradle', 405ff37293SKudo Chien find: /(\b(preBuild\.)?dependsOn\("generateCodegenArtifactsFromSchema"\))/g, 41f194f574SWojciech Kozyra replaceWith: '// $1', 42f194f574SWojciech Kozyra }, 43f194f574SWojciech Kozyra { 44f194f574SWojciech Kozyra paths: './ReactAndroid/build.gradle', 455ff37293SKudo Chien find: 'new File(buildDir, "generated/source/codegen/jni/").absolutePath', 465ff37293SKudo Chien replaceWith: '"../codegen/jni/"', 475ff37293SKudo Chien }, 485ff37293SKudo Chien { 495ff37293SKudo Chien paths: './ReactAndroid/build.gradle', 50f194f574SWojciech Kozyra find: /(externalNativeBuild\s*\{)([\s\S]*?)(\}\s)/g, 51f194f574SWojciech Kozyra replaceWith: (_, p1, p2, p3) => 52f194f574SWojciech Kozyra [ 53f194f574SWojciech Kozyra p1, 54f194f574SWojciech Kozyra transformString( 55f194f574SWojciech Kozyra p2, 56f194f574SWojciech Kozyra JniLibNames.map((lib: string) => ({ 57f194f574SWojciech Kozyra find: new RegExp(`"${escapeRegExp(lib)}"`, 'g'), 58f194f574SWojciech Kozyra replaceWith: `"${lib}_${abiVersion}"`, 59f194f574SWojciech Kozyra })) 60f194f574SWojciech Kozyra ), 61f194f574SWojciech Kozyra p3, 62f194f574SWojciech Kozyra ].join(''), 63f194f574SWojciech Kozyra }, 645ff37293SKudo Chien { 655ff37293SKudo Chien paths: './ReactAndroid/build.gradle', 665ff37293SKudo Chien find: /( prefab\s*\{)([\s\S]*?)(^ \}\s)/gm, 675ff37293SKudo Chien replaceWith: (_, p1, p2, p3) => 685ff37293SKudo Chien [ 695ff37293SKudo Chien p1, 705ff37293SKudo Chien transformString( 715ff37293SKudo Chien p2, 725ff37293SKudo Chien JniLibNames.map((lib: string) => ({ 735ff37293SKudo Chien find: new RegExp(`\\b${escapeRegExp(lib)}\\s+?\\{`, 'g'), 745ff37293SKudo Chien replaceWith: `${lib}_${abiVersion} {`, 755ff37293SKudo Chien })) 765ff37293SKudo Chien ), 775ff37293SKudo Chien p3, 785ff37293SKudo Chien ].join(''), 795ff37293SKudo Chien }, 80f194f574SWojciech Kozyra ...packagesToRename.map((pkg: string) => ({ 8171ea6032SKudo Chien paths: [ 8271ea6032SKudo Chien './ReactCommon/**/*.{java,kt,h,cpp}', 8371ea6032SKudo Chien './ReactAndroid/src/main/**/*.{java,kt,h,cpp}', 8471ea6032SKudo Chien ], 85f194f574SWojciech Kozyra find: new RegExp(`${escapeRegExp(pathFromPkg(pkg))}`, 'g'), 86f194f574SWojciech Kozyra replaceWith: `${abiVersion}/${pathFromPkg(pkg)}`, 87f194f574SWojciech Kozyra })), 88f194f574SWojciech Kozyra ...reactNativeCmakeTransforms(abiVersion), 89f194f574SWojciech Kozyra { 90f194f574SWojciech Kozyra paths: './ReactAndroid/hermes-engine/build.gradle', 91f194f574SWojciech Kozyra find: 'libraryName "libhermes"', 92f194f574SWojciech Kozyra replaceWith: `libraryName "libhermes_${abiVersion}"`, 93f194f574SWojciech Kozyra }, 94f194f574SWojciech Kozyra { 95f194f574SWojciech Kozyra paths: './ReactAndroid/hermes-engine/build.gradle', 96f194f574SWojciech Kozyra find: /(prefab {\s+libhermes)/, 97f194f574SWojciech Kozyra replaceWith: `$1_${abiVersion}`, 98f194f574SWojciech Kozyra }, 99f194f574SWojciech Kozyra { 100f194f574SWojciech Kozyra paths: './ReactAndroid/hermes-engine/build.gradle', 101f194f574SWojciech Kozyra find: 'targets "libhermes"', 102f194f574SWojciech Kozyra replaceWith: `targets "libhermes_${abiVersion}"`, 103f194f574SWojciech Kozyra }, 104f194f574SWojciech Kozyra ...[...JniLibNames, 'fb', 'fbjni'].map((libName) => ({ 10571ea6032SKudo Chien paths: '*.{java,kt}', 106f194f574SWojciech Kozyra find: new RegExp(`SoLoader.loadLibrary\\\("${escapeRegExp(libName)}"\\\)`), 107f194f574SWojciech Kozyra replaceWith: `SoLoader.loadLibrary("${libName}_${abiVersion}")`, 108f194f574SWojciech Kozyra })), 109a9719cfdSKudo Chien // add HERMES_ENABLE_DEBUGGER for libhermes-executor-release.so 110a9719cfdSKudo Chien { 111a9719cfdSKudo Chien paths: './ReactAndroid/hermes-engine/build.gradle', 112a9719cfdSKudo Chien find: /-DHERMES_ENABLE_DEBUGGER=False/, 113a9719cfdSKudo Chien replaceWith: '-DHERMES_ENABLE_DEBUGGER=True', 114a9719cfdSKudo Chien }, 115a9719cfdSKudo Chien { 1165ff37293SKudo Chien paths: './ReactAndroid/hermes-engine/build.gradle', 1175ff37293SKudo Chien find: /\b((configureBuildForHermes|prepareHeadersForPrefab)\.dependsOn\(unzipHermes\))/g, 1185ff37293SKudo Chien replaceWith: '// $1', 1195ff37293SKudo Chien }, 1205ff37293SKudo Chien { 121a9719cfdSKudo Chien paths: './ReactCommon/hermes/executor/CMakeLists.txt', 122a9719cfdSKudo Chien find: /\bdebug (hermes-inspector_)/g, 123a9719cfdSKudo Chien replaceWith: '$1', 124a9719cfdSKudo Chien }, 125a9719cfdSKudo Chien { 126*5064f84bSKudo Chien paths: [ 127*5064f84bSKudo Chien './ReactCommon/hermes/executor/CMakeLists.txt', 128*5064f84bSKudo Chien './ReactCommon/hermes/inspector/CMakeLists.txt', 129*5064f84bSKudo Chien ], 130a9719cfdSKudo Chien find: /if\(\${CMAKE_BUILD_TYPE} MATCHES Debug\)(\n\s*target_compile_options)/g, 131a9719cfdSKudo Chien replaceWith: 'if(true)$1', 132a9719cfdSKudo Chien }, 133a9719cfdSKudo Chien { 1345ff37293SKudo Chien paths: './ReactAndroid/src/main/jni/react/hermes/reactexecutor/CMakeLists.txt', 135a9719cfdSKudo Chien find: '$<$<CONFIG:Debug>:-DHERMES_ENABLE_DEBUGGER=1>', 136a9719cfdSKudo Chien replaceWith: '-DHERMES_ENABLE_DEBUGGER=1', 137a9719cfdSKudo Chien }, 1385ff37293SKudo Chien { 1395ff37293SKudo Chien // workaround build dependency issue to explicitly link hermes_executor_common to hermes_executor 1405ff37293SKudo Chien // originally, it's hermes_inspector -> hermes_executor_common -> hermes_executor 1415ff37293SKudo Chien paths: './ReactAndroid/src/main/jni/react/hermes/reactexecutor/CMakeLists.txt', 1425ff37293SKudo Chien find: /^(\s+hermes_executor_common.*)$/m, 1435ff37293SKudo Chien replaceWith: `$1\n hermes_inspector_${abiVersion}`, 1445ff37293SKudo Chien }, 145f194f574SWojciech Kozyra ], 146f194f574SWojciech Kozyra }; 147f194f574SWojciech Kozyra} 148f194f574SWojciech Kozyra 149f194f574SWojciech Kozyraexport function codegenTransforms(abiVersion: string): FileTransforms { 150f194f574SWojciech Kozyra return { 151f194f574SWojciech Kozyra path: [], 152f194f574SWojciech Kozyra content: [ 153f194f574SWojciech Kozyra ...packagesToRename.map((pkg: string) => ({ 15471ea6032SKudo Chien paths: ['**/*.{java,kt,h,cpp}'], 155f194f574SWojciech Kozyra find: new RegExp(`${escapeRegExp(pathFromPkg(pkg))}`, 'g'), 156f194f574SWojciech Kozyra replaceWith: `${abiVersion}/${pathFromPkg(pkg)}`, 157f194f574SWojciech Kozyra })), 158f194f574SWojciech Kozyra ...reactNativeCmakeTransforms(abiVersion), 159f194f574SWojciech Kozyra ], 160f194f574SWojciech Kozyra }; 161f194f574SWojciech Kozyra} 162f194f574SWojciech Kozyra 163f194f574SWojciech Kozyrafunction reactNativeCmakeTransforms(abiVersion: string): FileTransform[] { 164f194f574SWojciech Kozyra const libNames = JniLibNames.map((lib: string): string => 165f194f574SWojciech Kozyra lib.startsWith('lib') ? lib.slice(3) : lib 166f194f574SWojciech Kozyra ).filter((lib: string) => !['fbjni'].includes(lib)); 167f194f574SWojciech Kozyra libNames.push('${HERMES_TARGET_NAME}'); // variable used in hermes-executor CMakeLists.txt 168f194f574SWojciech Kozyra libNames.push('hermes-engine::libhermes'); 169f194f574SWojciech Kozyra 170f194f574SWojciech Kozyra return [ 171f194f574SWojciech Kozyra ...baseCmakeTransforms(abiVersion, libNames).map((transform: StringTransform) => ({ 172f194f574SWojciech Kozyra paths: 'CMakeLists.txt', 173f194f574SWojciech Kozyra ...transform, 174f194f574SWojciech Kozyra })), 175f194f574SWojciech Kozyra { 176f194f574SWojciech Kozyra paths: 'CMakeLists.txt', 1776239b2d0SKudo Chien find: 'add_react_build_subdir(generated/source/codegen/jni)', 178f194f574SWojciech Kozyra replaceWith: 'add_react_android_subdir(../codegen/jni)', 179f194f574SWojciech Kozyra }, 180f194f574SWojciech Kozyra { 181f194f574SWojciech Kozyra paths: 'CMakeLists.txt', 182f194f574SWojciech Kozyra find: /libhermes\.so/g, 183f194f574SWojciech Kozyra replaceWith: `libhermes_${abiVersion}.so`, 184f194f574SWojciech Kozyra }, 185f194f574SWojciech Kozyra ]; 186f194f574SWojciech Kozyra} 187f194f574SWojciech Kozyra 188f194f574SWojciech Kozyraexport function hermesTransforms(abiVersion: string): StringTransform[] { 189f194f574SWojciech Kozyra return [ 190f194f574SWojciech Kozyra { 191f194f574SWojciech Kozyra find: /OUTPUT_NAME hermes/g, 192f194f574SWojciech Kozyra replaceWith: `OUTPUT_NAME hermes_${abiVersion}`, 193f194f574SWojciech Kozyra }, 194f194f574SWojciech Kozyra { 195f194f574SWojciech Kozyra find: /libhermes/g, 196f194f574SWojciech Kozyra replaceWith: `libhermes_${abiVersion}`, 197f194f574SWojciech Kozyra }, 198f194f574SWojciech Kozyra { 199f194f574SWojciech Kozyra find: /jsi/g, 200f194f574SWojciech Kozyra replaceWith: `jsi_${abiVersion}`, 201f194f574SWojciech Kozyra }, 202f194f574SWojciech Kozyra ]; 203f194f574SWojciech Kozyra} 204