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 // Update codegen folder to our customized folder 22f194f574SWojciech Kozyra { 23f194f574SWojciech Kozyra paths: './ReactAndroid/build.gradle', 24f194f574SWojciech Kozyra find: /"REACT_GENERATED_SRC_DIR=.+?",/, 25f194f574SWojciech Kozyra replaceWith: `"REACT_GENERATED_SRC_DIR=${versionedReactNativeRoot}",`, 26f194f574SWojciech Kozyra }, 27f194f574SWojciech Kozyra // Add generated java to sourceSets 28f194f574SWojciech Kozyra { 29f194f574SWojciech Kozyra paths: './ReactAndroid/build.gradle', 30f194f574SWojciech Kozyra find: /(\bsrcDirs = \["src\/main\/java",.+)(\])/, 31f194f574SWojciech Kozyra replaceWith: `$1, "${path.join(versionedReactNativeRoot, 'codegen')}/java"$2`, 32f194f574SWojciech Kozyra }, 33f194f574SWojciech Kozyra // Disable codegen plugin 34f194f574SWojciech Kozyra { 35f194f574SWojciech Kozyra paths: './ReactAndroid/build.gradle', 36f194f574SWojciech Kozyra find: /(\bid\("com\.facebook\.react"\)$)/m, 37f194f574SWojciech Kozyra replaceWith: '// $1', 38f194f574SWojciech Kozyra }, 39f194f574SWojciech Kozyra { 40f194f574SWojciech Kozyra paths: './ReactAndroid/build.gradle', 41f194f574SWojciech Kozyra find: /(^react {[^]+?\n\})/m, 42f194f574SWojciech Kozyra replaceWith: '/* $1 */', 43f194f574SWojciech Kozyra }, 44f194f574SWojciech Kozyra { 45f194f574SWojciech Kozyra paths: './ReactAndroid/build.gradle', 46*5ff37293SKudo Chien find: /(\b(preBuild\.)?dependsOn\("generateCodegenArtifactsFromSchema"\))/g, 47f194f574SWojciech Kozyra replaceWith: '// $1', 48f194f574SWojciech Kozyra }, 49f194f574SWojciech Kozyra { 50f194f574SWojciech Kozyra paths: './ReactAndroid/build.gradle', 51*5ff37293SKudo Chien find: 'new File(buildDir, "generated/source/codegen/jni/").absolutePath', 52*5ff37293SKudo Chien replaceWith: '"../codegen/jni/"', 53*5ff37293SKudo Chien }, 54*5ff37293SKudo Chien { 55*5ff37293SKudo Chien paths: './ReactAndroid/build.gradle', 56f194f574SWojciech Kozyra find: /(externalNativeBuild\s*\{)([\s\S]*?)(\}\s)/g, 57f194f574SWojciech Kozyra replaceWith: (_, p1, p2, p3) => 58f194f574SWojciech Kozyra [ 59f194f574SWojciech Kozyra p1, 60f194f574SWojciech Kozyra transformString( 61f194f574SWojciech Kozyra p2, 62f194f574SWojciech Kozyra JniLibNames.map((lib: string) => ({ 63f194f574SWojciech Kozyra find: new RegExp(`"${escapeRegExp(lib)}"`, 'g'), 64f194f574SWojciech Kozyra replaceWith: `"${lib}_${abiVersion}"`, 65f194f574SWojciech Kozyra })) 66f194f574SWojciech Kozyra ), 67f194f574SWojciech Kozyra p3, 68f194f574SWojciech Kozyra ].join(''), 69f194f574SWojciech Kozyra }, 70*5ff37293SKudo Chien { 71*5ff37293SKudo Chien paths: './ReactAndroid/build.gradle', 72*5ff37293SKudo Chien find: /( prefab\s*\{)([\s\S]*?)(^ \}\s)/gm, 73*5ff37293SKudo Chien replaceWith: (_, p1, p2, p3) => 74*5ff37293SKudo Chien [ 75*5ff37293SKudo Chien p1, 76*5ff37293SKudo Chien transformString( 77*5ff37293SKudo Chien p2, 78*5ff37293SKudo Chien JniLibNames.map((lib: string) => ({ 79*5ff37293SKudo Chien find: new RegExp(`\\b${escapeRegExp(lib)}\\s+?\\{`, 'g'), 80*5ff37293SKudo Chien replaceWith: `${lib}_${abiVersion} {`, 81*5ff37293SKudo Chien })) 82*5ff37293SKudo Chien ), 83*5ff37293SKudo Chien p3, 84*5ff37293SKudo Chien ].join(''), 85*5ff37293SKudo Chien }, 86f194f574SWojciech Kozyra ...packagesToRename.map((pkg: string) => ({ 87f194f574SWojciech Kozyra paths: ['./ReactCommon/**/*.{java,h,cpp}', './ReactAndroid/src/main/**/*.{java,h,cpp}'], 88f194f574SWojciech Kozyra find: new RegExp(`${escapeRegExp(pathFromPkg(pkg))}`, 'g'), 89f194f574SWojciech Kozyra replaceWith: `${abiVersion}/${pathFromPkg(pkg)}`, 90f194f574SWojciech Kozyra })), 91f194f574SWojciech Kozyra ...reactNativeCmakeTransforms(abiVersion), 92f194f574SWojciech Kozyra { 93f194f574SWojciech Kozyra paths: './ReactAndroid/hermes-engine/build.gradle', 94f194f574SWojciech Kozyra find: 'libraryName "libhermes"', 95f194f574SWojciech Kozyra replaceWith: `libraryName "libhermes_${abiVersion}"`, 96f194f574SWojciech Kozyra }, 97f194f574SWojciech Kozyra { 98f194f574SWojciech Kozyra paths: './ReactAndroid/hermes-engine/build.gradle', 99f194f574SWojciech Kozyra find: /(prefab {\s+libhermes)/, 100f194f574SWojciech Kozyra replaceWith: `$1_${abiVersion}`, 101f194f574SWojciech Kozyra }, 102f194f574SWojciech Kozyra { 103f194f574SWojciech Kozyra paths: './ReactAndroid/hermes-engine/build.gradle', 104f194f574SWojciech Kozyra find: 'targets "libhermes"', 105f194f574SWojciech Kozyra replaceWith: `targets "libhermes_${abiVersion}"`, 106f194f574SWojciech Kozyra }, 107f194f574SWojciech Kozyra ...[...JniLibNames, 'fb', 'fbjni'].map((libName) => ({ 108f194f574SWojciech Kozyra paths: '*.java', 109f194f574SWojciech Kozyra find: new RegExp(`SoLoader.loadLibrary\\\("${escapeRegExp(libName)}"\\\)`), 110f194f574SWojciech Kozyra replaceWith: `SoLoader.loadLibrary("${libName}_${abiVersion}")`, 111f194f574SWojciech Kozyra })), 112a9719cfdSKudo Chien // add HERMES_ENABLE_DEBUGGER for libhermes-executor-release.so 113a9719cfdSKudo Chien { 114a9719cfdSKudo Chien paths: './ReactAndroid/hermes-engine/build.gradle', 115a9719cfdSKudo Chien find: /-DHERMES_ENABLE_DEBUGGER=False/, 116a9719cfdSKudo Chien replaceWith: '-DHERMES_ENABLE_DEBUGGER=True', 117a9719cfdSKudo Chien }, 118a9719cfdSKudo Chien { 119*5ff37293SKudo Chien paths: './ReactAndroid/hermes-engine/build.gradle', 120*5ff37293SKudo Chien find: /\b((configureBuildForHermes|prepareHeadersForPrefab)\.dependsOn\(unzipHermes\))/g, 121*5ff37293SKudo Chien replaceWith: '// $1', 122*5ff37293SKudo Chien }, 123*5ff37293SKudo Chien { 124a9719cfdSKudo Chien paths: './ReactCommon/hermes/executor/CMakeLists.txt', 125a9719cfdSKudo Chien find: /\bdebug (hermes-inspector_)/g, 126a9719cfdSKudo Chien replaceWith: '$1', 127a9719cfdSKudo Chien }, 128a9719cfdSKudo Chien { 129a9719cfdSKudo Chien paths: './ReactCommon/hermes/executor/CMakeLists.txt', 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 { 134*5ff37293SKudo 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 }, 138*5ff37293SKudo Chien { 139*5ff37293SKudo Chien // workaround build dependency issue to explicitly link hermes_executor_common to hermes_executor 140*5ff37293SKudo Chien // originally, it's hermes_inspector -> hermes_executor_common -> hermes_executor 141*5ff37293SKudo Chien paths: './ReactAndroid/src/main/jni/react/hermes/reactexecutor/CMakeLists.txt', 142*5ff37293SKudo Chien find: /^(\s+hermes_executor_common.*)$/m, 143*5ff37293SKudo Chien replaceWith: `$1\n hermes_inspector_${abiVersion}`, 144*5ff37293SKudo 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) => ({ 154f194f574SWojciech Kozyra paths: ['**/*.{java,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