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);
// 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';
}