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) => ({ 81*71ea6032SKudo Chien paths: [ 82*71ea6032SKudo Chien './ReactCommon/**/*.{java,kt,h,cpp}', 83*71ea6032SKudo Chien './ReactAndroid/src/main/**/*.{java,kt,h,cpp}', 84*71ea6032SKudo 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) => ({ 105*71ea6032SKudo 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 { 126a9719cfdSKudo Chien paths: './ReactCommon/hermes/executor/CMakeLists.txt', 127a9719cfdSKudo Chien find: /if\(\${CMAKE_BUILD_TYPE} MATCHES Debug\)(\n\s*target_compile_options)/g, 128a9719cfdSKudo Chien replaceWith: 'if(true)$1', 129a9719cfdSKudo Chien }, 130a9719cfdSKudo Chien { 1315ff37293SKudo Chien paths: './ReactAndroid/src/main/jni/react/hermes/reactexecutor/CMakeLists.txt', 132a9719cfdSKudo Chien find: '$<$<CONFIG:Debug>:-DHERMES_ENABLE_DEBUGGER=1>', 133a9719cfdSKudo Chien replaceWith: '-DHERMES_ENABLE_DEBUGGER=1', 134a9719cfdSKudo Chien }, 1355ff37293SKudo Chien { 1365ff37293SKudo Chien // workaround build dependency issue to explicitly link hermes_executor_common to hermes_executor 1375ff37293SKudo Chien // originally, it's hermes_inspector -> hermes_executor_common -> hermes_executor 1385ff37293SKudo Chien paths: './ReactAndroid/src/main/jni/react/hermes/reactexecutor/CMakeLists.txt', 1395ff37293SKudo Chien find: /^(\s+hermes_executor_common.*)$/m, 1405ff37293SKudo Chien replaceWith: `$1\n hermes_inspector_${abiVersion}`, 1415ff37293SKudo Chien }, 142f194f574SWojciech Kozyra ], 143f194f574SWojciech Kozyra }; 144f194f574SWojciech Kozyra} 145f194f574SWojciech Kozyra 146f194f574SWojciech Kozyraexport function codegenTransforms(abiVersion: string): FileTransforms { 147f194f574SWojciech Kozyra return { 148f194f574SWojciech Kozyra path: [], 149f194f574SWojciech Kozyra content: [ 150f194f574SWojciech Kozyra ...packagesToRename.map((pkg: string) => ({ 151*71ea6032SKudo Chien paths: ['**/*.{java,kt,h,cpp}'], 152f194f574SWojciech Kozyra find: new RegExp(`${escapeRegExp(pathFromPkg(pkg))}`, 'g'), 153f194f574SWojciech Kozyra replaceWith: `${abiVersion}/${pathFromPkg(pkg)}`, 154f194f574SWojciech Kozyra })), 155f194f574SWojciech Kozyra ...reactNativeCmakeTransforms(abiVersion), 156f194f574SWojciech Kozyra ], 157f194f574SWojciech Kozyra }; 158f194f574SWojciech Kozyra} 159f194f574SWojciech Kozyra 160f194f574SWojciech Kozyrafunction reactNativeCmakeTransforms(abiVersion: string): FileTransform[] { 161f194f574SWojciech Kozyra const libNames = JniLibNames.map((lib: string): string => 162f194f574SWojciech Kozyra lib.startsWith('lib') ? lib.slice(3) : lib 163f194f574SWojciech Kozyra ).filter((lib: string) => !['fbjni'].includes(lib)); 164f194f574SWojciech Kozyra libNames.push('${HERMES_TARGET_NAME}'); // variable used in hermes-executor CMakeLists.txt 165f194f574SWojciech Kozyra libNames.push('hermes-engine::libhermes'); 166f194f574SWojciech Kozyra 167f194f574SWojciech Kozyra return [ 168f194f574SWojciech Kozyra ...baseCmakeTransforms(abiVersion, libNames).map((transform: StringTransform) => ({ 169f194f574SWojciech Kozyra paths: 'CMakeLists.txt', 170f194f574SWojciech Kozyra ...transform, 171f194f574SWojciech Kozyra })), 172f194f574SWojciech Kozyra { 173f194f574SWojciech Kozyra paths: 'CMakeLists.txt', 1746239b2d0SKudo Chien find: 'add_react_build_subdir(generated/source/codegen/jni)', 175f194f574SWojciech Kozyra replaceWith: 'add_react_android_subdir(../codegen/jni)', 176f194f574SWojciech Kozyra }, 177f194f574SWojciech Kozyra { 178f194f574SWojciech Kozyra paths: 'CMakeLists.txt', 179f194f574SWojciech Kozyra find: /libhermes\.so/g, 180f194f574SWojciech Kozyra replaceWith: `libhermes_${abiVersion}.so`, 181f194f574SWojciech Kozyra }, 182f194f574SWojciech Kozyra ]; 183f194f574SWojciech Kozyra} 184f194f574SWojciech Kozyra 185f194f574SWojciech Kozyraexport function hermesTransforms(abiVersion: string): StringTransform[] { 186f194f574SWojciech Kozyra return [ 187f194f574SWojciech Kozyra { 188f194f574SWojciech Kozyra find: /OUTPUT_NAME hermes/g, 189f194f574SWojciech Kozyra replaceWith: `OUTPUT_NAME hermes_${abiVersion}`, 190f194f574SWojciech Kozyra }, 191f194f574SWojciech Kozyra { 192f194f574SWojciech Kozyra find: /libhermes/g, 193f194f574SWojciech Kozyra replaceWith: `libhermes_${abiVersion}`, 194f194f574SWojciech Kozyra }, 195f194f574SWojciech Kozyra { 196f194f574SWojciech Kozyra find: /jsi/g, 197f194f574SWojciech Kozyra replaceWith: `jsi_${abiVersion}`, 198f194f574SWojciech Kozyra }, 199f194f574SWojciech Kozyra ]; 200f194f574SWojciech Kozyra} 201