From 5c6440894bb2ed6338a313dd31f72eecb22e9888 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Sat, 24 Jan 2026 13:44:16 +0000 Subject: [PATCH] working build scripts --- hook/build.dart | 28 ++++++-- lib/controllers/client_controller.dart | 23 ++----- lib/helpers/extensions/gomuks_buffer.dart | 29 ++++---- lib/main.dart | 1 - scripts/generate.dart | 83 ++++++----------------- scripts/generate.sh | 9 +++ 6 files changed, 75 insertions(+), 98 deletions(-) create mode 100755 scripts/generate.sh diff --git a/hook/build.dart b/hook/build.dart index e693a03..88e8fb2 100644 --- a/hook/build.dart +++ b/hook/build.dart @@ -1,8 +1,11 @@ +import "dart:io"; import "package:hooks/hooks.dart"; import "package:code_assets/code_assets.dart"; -import "package:path/path.dart"; Future main(List args) => build(args, (input, output) async { + final buildDir = input.packageRoot.resolve("build/"); + if (await File(buildDir.resolve("lock").toFilePath()).exists()) return; + final targetOS = input.config.code.targetOS; String libFileName; switch (targetOS) { @@ -19,16 +22,29 @@ Future main(List args) => build(args, (input, output) async { throw UnsupportedError("Unsupported OS: $targetOS"); } - final generatedFile = join("src", "third_party", "gomuks.g.dart"); + final gomuksBuildDir = buildDir.resolve("gomuks/"); + final libFile = gomuksBuildDir.resolve(libFileName); + + print("Building Gomuks shared library $libFileName..."); + final result = await Process.run("go", [ + "build", + "-o", + libFile.path, + "-buildmode=c-shared", + ], workingDirectory: gomuksBuildDir.resolve("source/pkg/ffi/").toFilePath()); + + if (result.exitCode != 0) { + throw Exception("Failed to build Gomuks shared library\n${result.stderr}"); + } + + final generatedFile = "src/third_party/gomuks.g.dart"; output.assets.code.add( CodeAsset( package: "nexus", name: generatedFile, linkMode: DynamicLoadingBundled(), - file: input.packageRoot.resolve(join("build", "gomuks", libFileName)), + file: libFile, ), ); - output.dependencies.add( - input.packageRoot.resolve(join("lib", generatedFile)), - ); + output.dependencies.add(input.packageRoot.resolve("lib/$generatedFile")); }); diff --git a/lib/controllers/client_controller.dart b/lib/controllers/client_controller.dart index 2599d7d..78d2058 100644 --- a/lib/controllers/client_controller.dart +++ b/lib/controllers/client_controller.dart @@ -46,23 +46,14 @@ class ClientController extends Notifier { return handle; } - (int requestId, Map response) sendCommand( - String command, - Map data, - ) { - final responsePtr = calloc(); - try { - final requestId = GomuksSubmitCommand( - state, - command.toNativeUtf8().cast(), - data.toGomuksBuffer(), - responsePtr, - ); + void sendCommand(String command, Map data) { + // final response = GomuksSubmitCommand( + // state, + // command.toNativeUtf8().cast(), + // data.toGomuksBuffer(), + // ); - return (requestId, responsePtr.ref.toJson()); - } finally { - calloc.free(responsePtr); - } + // return response.buf; TODO } static final provider = NotifierProvider( diff --git a/lib/helpers/extensions/gomuks_buffer.dart b/lib/helpers/extensions/gomuks_buffer.dart index 5de7eab..c4c97f5 100644 --- a/lib/helpers/extensions/gomuks_buffer.dart +++ b/lib/helpers/extensions/gomuks_buffer.dart @@ -6,6 +6,11 @@ import "package:ffi/ffi.dart"; import "package:nexus/src/third_party/gomuks.g.dart"; extension GomuksBufferToJson on GomuksBorrowedBuffer { + Uint8List toBytes() { + if (base == nullptr || length <= 0) return Uint8List(0); + return base.asTypedList(length); + } + Map toJson() { final bytes = toBytes(); if (bytes.isEmpty) return {}; @@ -14,21 +19,21 @@ extension GomuksBufferToJson on GomuksBorrowedBuffer { } extension JsonToGomuksBuffer on Map { - GomuksBuffer toGomuksBuffer() { - final jsonString = json.encode(this); - final bytes = utf8.encode(jsonString); + // GomuksBorrowedBuffer toGomuksBuffer() { + // final jsonString = json.encode(this); + // final bytes = utf8.encode(jsonString); - final dataPtr = calloc(bytes.length); - dataPtr.asTypedList(bytes.length).setAll(0, bytes); + // final dataPtr = calloc(bytes.length); + // dataPtr.asTypedList(bytes.length).setAll(0, bytes); - final bufPtr = calloc(); - bufPtr.ref.base = dataPtr; - bufPtr.ref.length = bytes.length; + // final bufPtr = calloc(); + // bufPtr.ref.base = dataPtr; + // bufPtr.ref.length = bytes.length; - final bufByValue = bufPtr.ref; + // final bufByValue = bufPtr.ref; - calloc.free(bufPtr); + // calloc.free(bufPtr); - return bufByValue; - } + // return bufByValue; + // } } diff --git a/lib/main.dart b/lib/main.dart index 4fbc6ef..c97ef3e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -105,7 +105,6 @@ class App extends ConsumerWidget { "username": "quadradical", "password": "Quadmarad1!", }); - debugPrint("$response"); return Placeholder(); }, // .betterWhen( diff --git a/scripts/generate.dart b/scripts/generate.dart index 427df3f..04b7c4d 100644 --- a/scripts/generate.dart +++ b/scripts/generate.dart @@ -3,79 +3,36 @@ import "package:ffigen/ffigen.dart"; import "package:path/path.dart"; void main(List args) async { - final buildDir = Directory.fromUri( - Platform.script.resolve(join("..", "build", "gomuks")), + final repoDir = Directory.fromUri( + Platform.script.resolve("../build/gomuks/source"), ); - if (!await buildDir.exists()) await buildDir.create(recursive: true); + if (await repoDir.exists()) await repoDir.delete(recursive: true); + await repoDir.create(recursive: true); - final repoDir = Directory(join(buildDir.path, "source")); + print("Cloning Gomuks repository..."); + final cloneResult = await Process.run("git", [ + "clone", + "--branch", + "tulir/ffi", + "--depth", + "1", + "https://mau.dev/gomuks/gomuks", + repoDir.path, + ]); - var skipBuild = args.contains("--skip"); - - final generatedSourcePath = join("src", "third_party", "gomuks.g.dart"); - final generatedLibPath = Platform.script.resolve( - join("..", "lib", generatedSourcePath), - ); - final bindingsFile = File(generatedLibPath.toFilePath()); - - if (await bindingsFile.exists() && await repoDir.exists()) { - final result = await Process.run("git", [ - "fetch", - "--dry-run", - ], workingDirectory: repoDir.path); - - if ((result.stdout as String).trim().isEmpty) { - skipBuild = true; - } - } - - if (!skipBuild) { - if (await repoDir.exists()) await repoDir.delete(recursive: true); - - print("Cloning Gomuks repository..."); - final cloneResult = await Process.run("git", [ - "clone", - "--branch", - "tulir/ffi", - "--depth", - "1", - "https://mau.dev/gomuks/gomuks", - repoDir.path, - ]); - - if (cloneResult.exitCode != 0) { - throw Exception( - "Failed to clone Gomuks repository: \n${cloneResult.stderr}", - ); - } - - for (final name in ["libgomuks.so", "libgomuks.dylib", "libgomuks.dll"]) { - final libFile = File(join(buildDir.path, name)); - - print("Building Gomuks shared library $name..."); - final result = await Process.run("go", [ - "build", - "-o", - libFile.path, - "-buildmode=c-shared", - ], workingDirectory: join(repoDir.path, "pkg/ffi")); - - if (result.exitCode != 0) { - throw Exception( - "Failed to build Gomuks shared library\n${result.stderr}", - ); - } - } + if (cloneResult.exitCode != 0) { + throw Exception( + "Failed to clone Gomuks repository: \n${cloneResult.stderr}", + ); } print("Generating FFI Bindings..."); - final packageRoot = Platform.script.resolve("../"); FfiGenerator( output: Output( - dartFile: packageRoot.resolve("lib/src/third_party/gomuks.g.dart"), + dartFile: Platform.script.resolve("../lib/src/third_party/gomuks.g.dart"), ), headers: Headers( - entryPoints: [File(join(buildDir.path, "libgomuks.h")).uri], + entryPoints: [File(join(repoDir.path, "pkg", "ffi", "ffi.h")).uri], compilerOptions: ["--no-warnings"], ), functions: Functions.includeAll, diff --git a/scripts/generate.sh b/scripts/generate.sh new file mode 100755 index 0000000..faafd29 --- /dev/null +++ b/scripts/generate.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +pushd "$(dirname "$(readlink -f "$0")")"/.. || exit + +mkdir -p build +touch build/lock +dart scripts/generate.dart +rm build/lock + +popd || exit \ No newline at end of file