generateCMakeContent function
Generates the full content of a fresh src/CMakeLists.txt.
pluginName is the main plugin library name. moduleLibs are additional
module library names. nitroNativePath is the resolved path to
packages/nitro/src/native. moduleInfos drives per-module C++ decisions.
Implementation
String generateCMakeContent(
String pluginName,
List<String> moduleLibs,
String nitroNativePath, {
List<({String lib, String module, bool isNativeCpp, bool isAndroidCpp})>? moduleInfos,
}) {
final mainInfo = moduleInfos?.firstWhere(
(m) => m.lib == pluginName,
orElse: () => (lib: pluginName, module: pluginName, isNativeCpp: false, isAndroidCpp: false),
);
final mainClassName = _toPascalCase(mainInfo?.module ?? pluginName);
// Android C++: embed in add_library; Linux-only C++: guard with if(NOT ANDROID).
final mainImplInLib =
(mainInfo?.isNativeCpp == true && mainInfo?.isAndroidCpp == true)
? ' "Hybrid$mainClassName.cpp"\n'
: '';
final mainAndroidGuard =
(mainInfo?.isNativeCpp == true && mainInfo?.isAndroidCpp != true)
? 'if(NOT ANDROID)\n target_sources($pluginName PRIVATE "Hybrid$mainClassName.cpp")\nendif()\n'
: '';
final buf = 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 "$nitroNativePath")')
..writeln()
..writeln('add_library($pluginName SHARED')
..write(mainImplInLib)
..writeln(' "$pluginName.cpp"')
..writeln(' "\${CMAKE_CURRENT_SOURCE_DIR}/../lib/src/generated/cpp/$pluginName.bridge.g.cpp"')
..writeln(' "dart_api_dl.c"')
..writeln(')')
..write(mainAndroidGuard)
..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) continue;
final info = moduleInfos?.firstWhere(
(m) => m.lib == lib,
orElse: () => (lib: lib, module: lib, isNativeCpp: false, isAndroidCpp: false),
);
buf.write(cmakeModuleTarget(
lib,
isCpp: info?.isNativeCpp ?? false,
isAndroidCpp: info?.isAndroidCpp ?? false,
));
}
return buf.toString();
}