diff --git a/dart_filament/hook/build.dart b/dart_filament/hook/build.dart index bc728c98..5a0b2a00 100644 --- a/dart_filament/hook/build.dart +++ b/dart_filament/hook/build.dart @@ -20,9 +20,11 @@ void main(List args) async { // However, if for some reason you need to debug a Filament-specific issue, // you can build your own debug libraries, copy to the native/lib/android/debug folder, then change the following to "debug". libDir += "release"; + } else if (platform == "windows") { + libDir += "x86_64/mdd"; } - if (platform == "android" || platform == "windows") { + if (platform == "android") { if (!config.dryRun) { final archExtension = switch (config.targetArchitecture) { Architecture.arm => "armeabi-v7a", @@ -48,37 +50,63 @@ void main(List args) async { ]); final libs = [ - "-lfilament", - "-lbackend", - "-lfilameshio", - "-lviewer", - "-lfilamat", - "-lgeometry", - "-lutils", - "-lfilabridge", - "-lgltfio_core", - "-lfilament-iblprefilter", - "-limage", - "-limageio", - "-ltinyexr", - "-lgltfio_core", - "-lfilaflat", - "-ldracodec", - "-libl", - "-lktxreader", - "-lpng", - "-lz", - "-lstb", - "-luberzlib", - "-lsmol-v", - "-luberarchive", - "-lzstd", - "-lstdc++", - "-lbasis_transcoder" + "filament", + "backend", + "filameshio", + "viewer", + "filamat", + "geometry", + "utils", + "filabridge", + "gltfio_core", + "filament-iblprefilter", + "image", + "imageio", + "tinyexr", + "gltfio_core", + "filaflat", + "dracodec", + "ibl", + "ktxreader", + "png", + "z", + "stb", + "uberzlib", + "smol-v", + "uberarchive", + "zstd", + "basis_transcoder" ]; + final linkWith = []; + + if (platform == "windows") { + linkWith.addAll(libs.map((lib) => "$libDir/$lib.lib")); + linkWith.addAll(["$libDir/bluevk.lib", "$libDir/bluegl.lib"]); + linkWith.addAll([ + "gdi32.lib", + "user32.lib", + "shell32.lib", + "opengl32.lib", + "dwmapi.lib", + "comctl32.lib" + ]); + } else { + libs.add("stdc++"); + } + final flags = []; + final defines = {}; var frameworks = []; + if (platform != "windows") { + flags.addAll(['-std=c++17']); + } else { + defines["WIN32"] = "1"; + defines["_DEBUG"] = "1"; + defines["_DLL"] = "1"; + flags.addAll(["/std:c++20", "/MDd"]); + } + if (platform == "ios") { frameworks.addAll([ 'Foundation', @@ -96,9 +124,9 @@ void main(List args) async { 'Cocoa', "Metal", ]); - libs.addAll(["-lbluegl", "-lbluevk"]); + libs.addAll(["bluegl", "bluevk"]); } else if (platform == "android") { - libs.addAll(["-lGLESv3", "-lEGL", "-lbluevk", "-ldl", "-landroid"]); + libs.addAll(["GLESv3", "EGL", "bluevk", "dl", "android"]); } frameworks = frameworks.expand((f) => ["-framework", f]).toList(); @@ -109,41 +137,72 @@ void main(List args) async { assetName: 'dart_filament.dart', sources: sources, includes: ['native/include', 'native/include/filament'], + defines: defines, + linkWith: linkWith, flags: [ - '-std=c++17', if (platform == "macos") '-mmacosx-version-min=13.0', if (platform == "ios") '-mios-version-min=13.0', + ...flags, ...frameworks, - ...libs, + if (platform != "windows") ...libs.map((lib) => "-l$lib"), "-L$libDir", ], dartBuildFiles: ['hook/build.dart'], ); + await cbuilder.run( - buildConfig: config, - buildOutput: output, + config: config, + output: output, logger: Logger('') ..level = Level.ALL ..onRecord.listen((record) => print(record.message)), ); - if (!config.dryRun && config.targetOS == OS.android) { - final archExtension = switch (config.targetArchitecture) { - Architecture.arm => "arm-linux-androideabi", - Architecture.arm64 => "aarch64-linux-android", - Architecture.x64 => "x86_64-linux-android", - Architecture.ia32 => "i686-linux-android", - _ => throw FormatException('Invalid') - }; - var ndkRoot = File(config.cCompiler.compiler!.path).parent.parent.path; - var stlPath = - File("$ndkRoot/sysroot/usr/lib/${archExtension}/libc++_shared.so"); - output.addAsset(NativeCodeAsset( - package: "dart_filament", - name: "libc++_shared.so", - linkMode: DynamicLoadingBundled(), - os: config.targetOS, - file: stlPath.uri, - architecture: config.targetArchitecture)); + if (config.targetOS == OS.android) { + if (!config.dryRun) { + final archExtension = switch (config.targetArchitecture) { + Architecture.arm => "arm-linux-androideabi", + Architecture.arm64 => "aarch64-linux-android", + Architecture.x64 => "x86_64-linux-android", + Architecture.ia32 => "i686-linux-android", + _ => throw FormatException('Invalid') + }; + var ndkRoot = File(config.cCompiler.compiler!.path).parent.parent.path; + var stlPath = + File("$ndkRoot/sysroot/usr/lib/${archExtension}/libc++_shared.so"); + output.addAsset(NativeCodeAsset( + package: "dart_filament", + name: "libc++_shared.so", + linkMode: DynamicLoadingBundled(), + os: config.targetOS, + file: stlPath.uri, + architecture: config.targetArchitecture)); + } + } + if (config.targetOS == "windows") { + final packageName = config.packageName; + final allAssets = [ + DataAsset( + package: packageName, + name: 'unused_asset', + file: config.packageRoot.resolve('assets/unused_asset.json'), + ), + DataAsset( + package: packageName, + name: 'used_asset', + file: config.packageRoot.resolve('assets/used_asset.json'), + ) + ]; + output.addAssets(allAssets, linkInPackage: packageName); + output.addAsset( + NativeCodeAsset( + package: "dart_filament", + name: "dart_filament.dll", + linkMode: DynamicLoadingBundled(), + os: config.targetOS, + file: Uri.file( + config.outputDirectory.toFilePath() + "/dart_filament.dll"), + architecture: config.targetArchitecture), + linkInPackage: config.packageName); } }); }