cmakeModuleTarget function
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';
}