Combine my recent work on improving the generated Go output with
Tage's work on using a canonical formatter for Rust. If gofmt is
available during the build, then the generated .go files will now use
TAB indents and have proper columnar alignment; if it is not
available, the project still compiles.
Signed-off-by: Eric Blake <eblake(a)redhat.com>
---
Followup to this earlier series:
https://listman.redhat.com/archives/libguestfs/2023-July/032133.html
I still need to fold in the 'make check' verification of non-generated
.go files, plus Dan's idea of enabling CI coverage...
configure.ac | 1 +
generator/config.mli | 1 +
generator/utils.mli | 1 +
generator/config.ml.in | 3 ++-
generator/generator.ml | 15 ++++++++++-----
generator/utils.ml | 12 +++++++++++-
6 files changed, 26 insertions(+), 7 deletions(-)
diff --git a/configure.ac b/configure.ac
index 3e8b9142..b475dccf 100644
--- a/configure.ac
+++ b/configure.ac
@@ -596,6 +596,7 @@ AC_ARG_ENABLE([golang],
[enable_golang=yes])
AS_IF([test "x$enable_golang" != "xno"],[
AC_CHECK_PROG([GOLANG],[go],[go],[no])
+ AC_CHECK_PROG([GOFMT],[gofmt],[gofmt],[no])
AS_IF([test "x$GOLANG" != "xno"],[
AC_MSG_CHECKING([if $GOLANG is usable])
AS_IF([ (
diff --git a/generator/config.mli b/generator/config.mli
index 5f1a46a6..22c61dad 100644
--- a/generator/config.mli
+++ b/generator/config.mli
@@ -17,4 +17,5 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*)
+val gofmt : string
val rustfmt : string
diff --git a/generator/utils.mli b/generator/utils.mli
index d97d43ac..9f7824b2 100644
--- a/generator/utils.mli
+++ b/generator/utils.mli
@@ -54,6 +54,7 @@ val
(** Type of code formatter. *)
type formatter =
+ | Gofmt
| Rustfmt
(** Redirect stdout to a file. Possibly formatting the code. *)
diff --git a/generator/config.ml.in b/generator/config.ml.in
index 7ac5237c..48d0d4a4 100644
--- a/generator/config.ml.in
+++ b/generator/config.ml.in
@@ -18,4 +18,5 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*)
-let rustfmt = "@RUSTFMT@"
+let gofmt = "@GOFMT@"
+let rustfmt = "@RUSTFMT@"
diff --git a/generator/generator.ml b/generator/generator.ml
index c62b0c4f..8c9a585b 100644
--- a/generator/generator.ml
+++ b/generator/generator.ml
@@ -57,10 +57,15 @@ let
output_to "ocaml/NBD.ml" OCaml.generate_ocaml_nbd_ml;
output_to "ocaml/nbd-c.c" OCaml.generate_ocaml_nbd_c;
- output_to "golang/bindings.go" GoLang.generate_golang_bindings_go;
- output_to "golang/closures.go" GoLang.generate_golang_closures_go;
- output_to "golang/wrappers.go" GoLang.generate_golang_wrappers_go;
+ output_to ~formatter:(Some Gofmt) "golang/bindings.go"
+ GoLang.generate_golang_bindings_go;
+ output_to ~formatter:(Some Gofmt) "golang/closures.go"
+ GoLang.generate_golang_closures_go;
+ output_to ~formatter:(Some Gofmt) "golang/wrappers.go"
+ GoLang.generate_golang_wrappers_go;
output_to "golang/wrappers.h" GoLang.generate_golang_wrappers_h;
- output_to ~formatter:(Some Rustfmt) "rust/libnbd-sys/src/generated.rs"
RustSys.generate_rust_sys_bindings;
- output_to ~formatter:(Some Rustfmt) "rust/src/bindings.rs"
Rust.generate_rust_bindings;
+ output_to ~formatter:(Some Rustfmt) "rust/libnbd-sys/src/generated.rs"
+ RustSys.generate_rust_sys_bindings;
+ output_to ~formatter:(Some Rustfmt) "rust/src/bindings.rs"
+ Rust.generate_rust_bindings;
diff --git a/generator/utils.ml b/generator/utils.ml
index 3302b309..443ac6df 100644
--- a/generator/utils.ml
+++ b/generator/utils.ml
@@ -420,6 +420,7 @@ let
| i -> failwithf "%s: failed with error code %d" cmd i
type formatter =
+ | Gofmt
| Rustfmt
let output_to ?(formatter = None) filename k =
@@ -431,6 +432,15 @@ let
close_out c;
chan := NoOutput;
(match formatter with
+ | Some Gofmt ->
+ if Config.gofmt <> "no" then (
+ let cmd = sprintf "%s -w %s" Config.gofmt filename_new in
+ match system cmd with
+ | WEXITED 0 -> ()
+ | WEXITED i -> failwithf "gofmt failed with exit code %d" i
+ | WSIGNALED i | WSTOPPED i ->
+ failwithf "gofmt was killed or stopped by signal %d" i
+ )
| Some Rustfmt ->
if Config.rustfmt <> "no" then (
let cmd = sprintf "%s %s" Config.rustfmt filename_new in
@@ -439,7 +449,7 @@ let
| WEXITED i -> failwithf "rustfmt failed with exit code %d" i
| WSIGNALED i | WSTOPPED i ->
failwithf "rustfmt was killed or stopped by signal %d" i
- );
+ )
| None -> ());
(* Is the new file different from the current file? *)
if Sys.file_exists filename && files_equal filename filename_new then
--
2.41.0