diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateAutolinkingNewArchitecturesFileTask.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateAutolinkingNewArchitecturesFileTask.kt index 4c36c8a39fbe9f..4750f5385a0903 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateAutolinkingNewArchitecturesFileTask.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateAutolinkingNewArchitecturesFileTask.kt @@ -32,9 +32,9 @@ abstract class GenerateAutolinkingNewArchitecturesFileTask : DefaultTask() { fun taskAction() { val model = JsonUtils.fromAutolinkingConfigJson(autolinkInputFile.get().asFile) - val packages = filterAndroidPackages(model) - val cmakeFileContent = generateCmakeFileContent(packages) - val cppFileContent = generateCppFileContent(packages) + val dependenciesWithNames = filterAndroidPackagesWithNames(model) + val cmakeFileContent = generateCmakeFileContent(dependenciesWithNames) + val cppFileContent = generateCppFileContent(dependenciesWithNames.map { it.second }) val outputDir = generatedOutputDirectory.get().asFile outputDir.mkdirs() @@ -43,49 +43,69 @@ abstract class GenerateAutolinkingNewArchitecturesFileTask : DefaultTask() { File(outputDir, H_FILENAME).apply { writeText(hTemplate) } } - internal fun filterAndroidPackages( + internal fun filterAndroidPackagesWithNames( model: ModelAutolinkingConfigJson? - ): List = - model?.dependencies?.values?.mapNotNull { it.platforms?.android } ?: emptyList() + ): List> { + return model?.dependencies?.entries + ?.mapNotNull { (name, depValue) -> + depValue.platforms?.android?.let { android -> name to android } + } ?: emptyList() + } internal fun generateCmakeFileContent( - packages: List + dependenciesWithNames: List> ): String { val libraryIncludes = - packages.joinToString("\n") { dep -> + dependenciesWithNames.joinToString("\n") { (depName, dep) -> var addDirectoryString = "" val libraryName = dep.libraryName val cmakeListsPath = dep.cmakeListsPath val cxxModuleCMakeListsPath = dep.cxxModuleCMakeListsPath - if (libraryName != null && cmakeListsPath != null) { - // If user provided a custom cmakeListsPath, let's honor it. - val nativeFolderPath = sanitizeCmakeListsPath(cmakeListsPath) - addDirectoryString += - "add_subdirectory(\"$nativeFolderPath\" ${libraryName}_autolinked_build)" - } - if (cxxModuleCMakeListsPath != null) { - // If user provided a custom cxxModuleCMakeListsPath, let's honor it. - val nativeFolderPath = sanitizeCmakeListsPath(cxxModuleCMakeListsPath) - addDirectoryString += - "\nadd_subdirectory(\"$nativeFolderPath\" ${libraryName}_cxxmodule_autolinked_build)" + + if (dep.hasCodegenPrefab) { + addDirectoryString += "find_package($depName CONFIG REQUIRED)" + } else { + if (libraryName != null && cmakeListsPath != null) { + val nativeFolderPath = sanitizeCmakeListsPath(cmakeListsPath) + addDirectoryString += + "add_subdirectory(\"$nativeFolderPath\" ${libraryName}_autolinked_build)" + } + + if (cxxModuleCMakeListsPath != null) { + val nativeFolderPath = sanitizeCmakeListsPath(cxxModuleCMakeListsPath) + addDirectoryString += + "\nadd_subdirectory(\"$nativeFolderPath\" ${libraryName}_cxxmodule_autolinked_build)" + } } addDirectoryString } val libraryModules = - packages.joinToString("\n ") { dep -> + dependenciesWithNames.joinToString("\n ") { (depName, dep) -> var autolinkedLibraries = "" - if (dep.libraryName != null) { - autolinkedLibraries += "$CODEGEN_LIB_PREFIX${dep.libraryName}" - } - if (dep.cxxModuleCMakeListsModuleName != null) { - autolinkedLibraries += "\n${dep.cxxModuleCMakeListsModuleName}" + if (!dep.hasCodegenPrefab) { + if (dep.libraryName != null) { + autolinkedLibraries += "$CODEGEN_LIB_PREFIX${dep.libraryName}" + } + if (dep.cxxModuleCMakeListsModuleName != null) { + autolinkedLibraries += "\n${dep.cxxModuleCMakeListsModuleName}" + } } autolinkedLibraries } + val prefabModules = + dependenciesWithNames.joinToString("\n ") { (depName, dep) -> + var prefabLibraries = "" + if (dep.hasCodegenPrefab) { + prefabLibraries += "$depName::$CODEGEN_LIB_PREFIX${dep.libraryName}" + } + prefabLibraries + } + return CMAKE_TEMPLATE.replace("{{ libraryIncludes }}", libraryIncludes) .replace("{{ libraryModules }}", libraryModules) + .replace("{{ prefabModules }}", prefabModules) } internal fun generateCppFileContent( @@ -178,6 +198,10 @@ abstract class GenerateAutolinkingNewArchitecturesFileTask : DefaultTask() { set(AUTOLINKED_LIBRARIES {{ libraryModules }} ) + + set(PREFAB_LIBRARIES + {{ prefabModules }} + ) """ .trimIndent() diff --git a/packages/gradle-plugin/shared/src/main/kotlin/com/facebook/react/model/ModelAutolinkingDependenciesPlatformAndroidJson.kt b/packages/gradle-plugin/shared/src/main/kotlin/com/facebook/react/model/ModelAutolinkingDependenciesPlatformAndroidJson.kt index 947f0f3f229355..f70ac001c1f136 100644 --- a/packages/gradle-plugin/shared/src/main/kotlin/com/facebook/react/model/ModelAutolinkingDependenciesPlatformAndroidJson.kt +++ b/packages/gradle-plugin/shared/src/main/kotlin/com/facebook/react/model/ModelAutolinkingDependenciesPlatformAndroidJson.kt @@ -20,4 +20,5 @@ data class ModelAutolinkingDependenciesPlatformAndroidJson( val cxxModuleHeaderName: String? = null, val dependencyConfiguration: String? = null, val isPureCxxDependency: Boolean? = null, + val hasCodegenPrefab: Boolean = false, ) diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleJniH.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleJniH.js index 0d0ee29bcffc02..4fe0463ace89c5 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleJniH.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleJniH.js @@ -77,7 +77,7 @@ file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/$ add_library( react_codegen_${targetName} - OBJECT + SHARED \${react_codegen_SRCS} ) diff --git a/packages/react-native/ReactAndroid/cmake-utils/ReactNative-application.cmake b/packages/react-native/ReactAndroid/cmake-utils/ReactNative-application.cmake index baa0fefa95ec0b..04768d4975cc96 100644 --- a/packages/react-native/ReactAndroid/cmake-utils/ReactNative-application.cmake +++ b/packages/react-native/ReactAndroid/cmake-utils/ReactNative-application.cmake @@ -92,7 +92,7 @@ target_compile_options(common_flags INTERFACE ${folly_FLAGS}) # If project is on RN CLI v9, then we can use the following lines to link against the autolinked 3rd party libraries. if(EXISTS ${PROJECT_BUILD_DIR}/generated/autolinking/src/main/jni/Android-autolinking.cmake) include(${PROJECT_BUILD_DIR}/generated/autolinking/src/main/jni/Android-autolinking.cmake) - target_link_libraries(${CMAKE_PROJECT_NAME} ${AUTOLINKED_LIBRARIES}) + target_link_libraries(${CMAKE_PROJECT_NAME} ${AUTOLINKED_LIBRARIES} ${PREBUILT_LIBRARIES}) foreach(autolinked_library ${AUTOLINKED_LIBRARIES}) target_link_libraries(${autolinked_library} common_flags) endforeach()