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);
  // Impl file is always added via a separate target_sources call below (not
  // inlined into add_library's file list) so it can be overridden per-caller
  // via NITRO_IMPL_SRC — see _implSourcesBlock. Android C++: unguarded
  // (compiled on every platform this target builds for). Linux-only C++:
  // guarded with if(NOT ANDROID) so Android Kotlin builds skip it.
  final implSources = isCpp ? _implSourcesBlock(lib, className, unguarded: isAndroidCpp) : '';
  return '\nadd_library($lib SHARED\n'
      '  "\${CMAKE_CURRENT_SOURCE_DIR}/../lib/src/generated/cpp/$lib.bridge.g.cpp"\n'
      '  "dart_api_dl.c"\n'
      ')\n'
      '$implSources'
      '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';
}