linkWindowsCppImplStubs function
Creates Windows-specific C++ impl stub files for modules that target
windows: WindowsNativeImpl.cpp. These stubs live in windows/src/ so
windows/CMakeLists.txt can reference them via a relative path.
Implementation
void linkWindowsCppImplStubs(List<ModuleInfo> moduleInfos, {String baseDir = '.'}) {
final libDir = Directory(p.join(baseDir, 'lib'));
final specFiles = libDir.existsSync() ? libDir.listSync(recursive: true).whereType<File>().where((f) => f.path.endsWith('.native.dart')).toList() : <File>[];
final windowsCppLibs = specFiles.where(isWindowsCppModule).map((f) {
final stem = p.basename(f.path).replaceAll(RegExp(r'\.native\.dart$'), '');
return extractLibNameFromSpec(f) ?? stem;
}).toSet();
for (final m in moduleInfos.where((m) => m.isCpp && windowsCppLibs.contains(m.lib))) {
final className = _toPascalCase(m.lib);
final winSrcDir = Directory(p.join(baseDir, 'windows', 'src'))..createSync(recursive: true);
final stubFile = File(p.join(winSrcDir.path, 'Hybrid$className.cpp'));
if (stubFile.existsSync()) continue;
stubFile.writeAsStringSync(
'// Hybrid$className — WindowsNativeImpl.cpp implementation.\n'
'// Generated by nitrogen link. Fill in the method bodies.\n'
'#include "../../lib/src/generated/cpp/${m.lib}.native.g.h"\n'
'\n'
'#include <string>\n'
'\n'
'class Hybrid${className}Impl final : public Hybrid$className {\n'
'public:\n'
' // TODO: implement all pure-virtual methods declared in Hybrid$className\n'
'};\n'
'\n'
'// MSVC static-initializer auto-registration (no __attribute__((constructor)) on Windows).\n'
'namespace {\n'
' struct _AutoRegister {\n'
' _AutoRegister() { ${m.lib}_register_impl(new Hybrid${className}Impl()); }\n'
' };\n'
' static _AutoRegister _auto_register_instance;\n'
'}\n',
);
}
}