generateCMake function

void generateCMake(
  1. String pluginName,
  2. List<String> moduleLibs,
  3. String nitroNativePath, {
  4. String baseDir = '.',
  5. List<ModuleInfo>? moduleInfos,
})

Implementation

void generateCMake(String pluginName, List<String> moduleLibs, String nitroNativePath, {String baseDir = '.', List<ModuleInfo>? moduleInfos}) {
  final nitroValue = nitroNativePathExists(r'${CMAKE_CURRENT_SOURCE_DIR}/../../packages/nitro/src/native', p.join(baseDir, 'src'))
      ? r'${CMAKE_CURRENT_SOURCE_DIR}/../../packages/nitro/src/native'
      : nitroNativePath.replaceAll(r'\', '/');
  final sb = StringBuffer()
    ..writeln('cmake_minimum_required(VERSION 3.10)')
    ..writeln('project(${pluginName}_library VERSION 0.0.1 LANGUAGES C CXX)')
    ..writeln()
    ..writeln('set(CMAKE_CXX_STANDARD 17)')
    ..writeln('set(CMAKE_CXX_STANDARD_REQUIRED ON)')
    ..writeln()
    ..writeln('set(NITRO_NATIVE "$nitroValue")')
    ..writeln()
    ..writeln('add_library($pluginName SHARED')
    ..writeln('  "$pluginName.cpp"')
    ..writeln('  "\${CMAKE_CURRENT_SOURCE_DIR}/../lib/src/generated/cpp/$pluginName.bridge.g.cpp"')
    ..writeln('  "dart_api_dl.c"')
    ..writeln(')')
    ..writeln('target_include_directories($pluginName PRIVATE')
    ..writeln('  "\${CMAKE_CURRENT_SOURCE_DIR}"')
    ..writeln('  "\${CMAKE_CURRENT_SOURCE_DIR}/../lib/src/generated/cpp"')
    ..writeln('  "\${NITRO_NATIVE}"')
    ..writeln(')')
    ..writeln('target_compile_definitions($pluginName PUBLIC DART_SHARED_LIB)')
    ..writeln('if(ANDROID)')
    ..writeln('  target_link_libraries($pluginName PRIVATE android log)')
    ..writeln('  target_link_options($pluginName PRIVATE "-Wl,-z,max-page-size=16384")')
    ..writeln('elseif(WIN32)')
    ..writeln('  target_link_libraries($pluginName PRIVATE dbghelp)')
    ..writeln('elseif(UNIX AND NOT APPLE)')
    ..writeln('  target_link_libraries($pluginName PRIVATE dl pthread)')
    ..writeln('endif()');
  for (final lib in moduleLibs) {
    if (lib != pluginName) {
      final info = moduleInfos?.firstWhere(
        (m) => m.lib == lib,
        orElse: () => ModuleInfo(lib: lib, module: lib, isCpp: false),
      );
      sb.write(_cmakeModuleTarget(lib, isCpp: info?.isNativeCpp ?? false));
    }
  }
  File(p.join(baseDir, 'src', 'CMakeLists.txt')).writeAsStringSync(sb.toString());
}