-
Notifications
You must be signed in to change notification settings - Fork 932
Description
Description
The dependencyConfig function in packages/cli-config-android/src/config/index.ts sets an incorrect default value for cmakeListsPath that applies to all dependencies, including pure C++ TurboModules. This causes build failures in host applications when the default path doesn't exist.
Current Behavior
The code currently sets cmakeListsPath to a hardcoded default path without considering whether the module is a pure C++ dependency:
// packages/cli-config-android/src/config/index.ts (lines 168-170)
let cmakeListsPath = userConfig.cmakeListsPath
? path.join(sourceDir, userConfig.cmakeListsPath)
: path.join(sourceDir, 'build/generated/source/codegen/jni/CMakeLists.txt');Problem: This default path assumes all modules use Codegen and generate files to build/generated/source/codegen/jni/. However, for pure C++ TurboModules that don't use Codegen or use a custom output directory, this path does not exist.
Additional Evidence from React Native Gradle Plugin Source Code:
I've reviewed the React Native Gradle Plugin source code at react-native/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateAutolinkingNewArchitecturesFileTask.kt:
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)"
}Key Finding: For pure C++ TurboModules, cmakeListsPath and cxxModuleCMakeListsPath should be mutually exclusive. Only one of them should be set:
- cmakeListsPath: For Codegen-generated CMakeLists.txt (regular TurboModules)
- cxxModuleCMakeListsPath: For custom CMakeLists.txt (pure C++ TurboModules)
However, the current CLI implementation always sets cmakeListsPath to a default value, even for pure C++ TurboModules. This results in both paths being set simultaneously, which is incorrect and may cause unexpected behavior during the autolinking process.
Proposed Fix
// packages/cli-config-android/src/config/index.ts
let cmakeListsPath: string | null;
if (userConfig.cmakeListsPath !== undefined) {
// User explicitly configured it (including null)
cmakeListsPath = userConfig.cmakeListsPath
? path.join(sourceDir, userConfig.cmakeListsPath)
: null;
} else {
// Apply default only for non-pure-C++ modules
cmakeListsPath = isPureCxxDependency
? null // Pure C++ modules don't need Codegen CMakeLists.txt by default
: path.join(sourceDir, 'build/generated/source/codegen/jni/CMakeLists.txt');
}