linkCMake function

void linkCMake(
  1. String pluginName,
  2. List<String> moduleLibs,
  3. String nitroNativePath, {
  4. String baseDir = '.',
})

Implementation

void linkCMake(String pluginName, List<String> moduleLibs, String nitroNativePath, {String baseDir = '.'}) {
  createSharedHeaders(nitroNativePath, baseDir: baseDir);
  final cmakeFile = File(p.join(baseDir, 'src', 'CMakeLists.txt'));
  if (!cmakeFile.existsSync()) {
    generateCMake(pluginName, moduleLibs, nitroNativePath, baseDir: baseDir);
    return;
  }
  var content = cmakeFile.readAsStringSync();
  bool modified = false;
  const defaultCmakeNitro = r'${CMAKE_CURRENT_SOURCE_DIR}/../../packages/nitro/src/native';
  final desiredNitroValue = nitroNativePathExists(defaultCmakeNitro, p.join(baseDir, 'src')) ? defaultCmakeNitro : nitroNativePath.replaceAll(r'\', '/');
  final nitroNativeSetLine = 'set(NITRO_NATIVE "$desiredNitroValue")';
  if (!content.contains('NITRO_NATIVE')) {
    content = '$nitroNativeSetLine\n\n$content';
    modified = true;
  } else {
    final staleMatch = RegExp(r'set\(NITRO_NATIVE\s+"([^"]+)"\)').firstMatch(content);
    if (staleMatch != null && !nitroNativePathExists(staleMatch.group(1)!, p.join(baseDir, 'src')) && staleMatch.group(1) != desiredNitroValue) {
      content = content.replaceFirst(staleMatch.group(0)!, nitroNativeSetLine);
      modified = true;
    }
  }
  if (!content.contains(r'${NITRO_NATIVE}')) {
    content = content.replaceFirst('target_include_directories($pluginName PRIVATE', 'target_include_directories($pluginName PRIVATE\n  "\${NITRO_NATIVE}"');
    modified = true;
  }
  if (!content.contains('dart_api_dl.c')) {
    content = content.replaceFirst('add_library($pluginName SHARED', 'add_library($pluginName SHARED\n  "dart_api_dl.c"');
    modified = true;
  }
  for (final lib in moduleLibs) {
    if (lib != pluginName && !content.contains('add_library($lib ')) {
      content += _cmakeModuleTarget(lib);
      modified = true;
    }
  }
  if (modified) cmakeFile.writeAsStringSync(content);
}