cmakeModuleTarget function

String cmakeModuleTarget(
  1. String lib, {
  2. bool isCpp = false,
  3. bool isAndroidCpp = false,
})

Returns the CMake target block for a secondary module library.

lib is the snake_case library name. isCpp true when android/linux uses direct C++ for this module. isAndroidCpp true only when android uses C++ directly — when false and isCpp is true, HybridXxx.cpp is wrapped in if(NOT ANDROID) so Android Kotlin builds skip the C++ impl stub.

Implementation

String cmakeModuleTarget(String lib, {bool isCpp = false, bool isAndroidCpp = false}) {
  final className = _toPascalCase(lib);
  // Android C++: embed impl in add_library; Linux-only C++: guard with if(NOT ANDROID).
  final implInLib = (isCpp && isAndroidCpp) ? '\n  "Hybrid$className.cpp"' : '';
  final androidGuard = (isCpp && !isAndroidCpp)
      ? 'if(NOT ANDROID)\n  target_sources($lib PRIVATE "Hybrid$className.cpp")\nendif()\n'
      : '';
  return '\nadd_library($lib SHARED\n'
      '  "\${CMAKE_CURRENT_SOURCE_DIR}/../lib/src/generated/cpp/$lib.bridge.g.cpp"'
      '$implInLib\n'
      '  "dart_api_dl.c"\n'
      ')\n'
      '$androidGuard'
      'target_include_directories($lib PRIVATE\n'
      '  "\${CMAKE_CURRENT_SOURCE_DIR}"\n'
      '  "\${CMAKE_CURRENT_SOURCE_DIR}/../lib/src/generated/cpp"\n'
      '  "\${NITRO_NATIVE}"\n'
      ')\n'
      'set_target_properties($lib PROPERTIES OUTPUT_NAME "$lib")\n'
      'target_compile_definitions($lib PUBLIC DART_SHARED_LIB)\n'
      'if(ANDROID)\n'
      '  target_link_libraries($lib PRIVATE android log)\n'
      '  target_link_options($lib PRIVATE "-Wl,-z,max-page-size=16384")\n'
      'elseif(WIN32)\n'
      '  target_link_libraries($lib PRIVATE dbghelp)\n'
      'elseif(UNIX AND NOT APPLE)\n'
      '  target_link_libraries($lib PRIVATE dl pthread)\n'
      'endif()\n';
}