Sort the structs when generating code.  Since the structs are
logically indepedent of each other, this should have no effect except
to make generated files list the structs in a different order.

However this also fixes the following build problem:

  File "convert_linux.ml", line 322, characters 43-50:
  Error: This expression has type G.stat = Guestfs.stat
    but an expression was expected of type G.dirent = Guestfs.dirent

It turns out the OCaml bindings don't like the fact that we have
two structs with a common field name (dirent.ino and stat.ino).

In OCaml < 4.01, this means that any attempt to reference stat.ino
would fail because dirent.ino appears second in the file, overriding
stat.ino.

In OCaml >= 4.01 the compiler now uses some disambiguation rules based
on the known types to resolve this problem.

See:

http://ocaml.org/releases/4.01.0.html
http://www.lexifi.com/blog/type-based-selection-label-and-constructors
http://www.lexifi.com/blog/ocaml-extensions-lexifi-overidding-record-labels-and-constructors
---
 generator/structs.ml |  8 ++++++--
 gobject/Makefile.inc | 48 ++++++++++++++++++++++++------------------------
 2 files changed, 30 insertions(+), 26 deletions(-)

diff --git a/generator/structs.ml b/generator/structs.ml
index 1bc6e08..65c78b2 100644
--- a/generator/structs.ml
+++ b/generator/structs.ml
@@ -382,6 +382,10 @@ let camel_name_of_struct name = (lookup_struct 
name).s_camel_name
 
 let cols_of_struct name = (lookup_struct name).s_cols
 
-let external_structs = List.filter (fun x -> not x.s_internal) structs
+let compare_structs { s_name = n1 } { s_name = n2 } = compare n1 n2
 
-let internal_structs = List.filter (fun x -> x.s_internal) structs
+let external_structs =
+  List.sort compare_structs (List.filter (fun x -> not x.s_internal) structs)
+
+let internal_structs =
+  List.sort compare_structs (List.filter (fun x -> x.s_internal) structs)
diff --git a/gobject/Makefile.inc b/gobject/Makefile.inc
index 3b567a2..ed1ff3b 100644
--- a/gobject/Makefile.inc
+++ b/gobject/Makefile.inc
@@ -23,26 +23,26 @@ guestfs_gobject_headers= \
   include/guestfs-gobject.h \
   include/guestfs-gobject/session.h \
   include/guestfs-gobject/tristate.h \
+  include/guestfs-gobject/struct-application.h \
+  include/guestfs-gobject/struct-application2.h \
+  include/guestfs-gobject/struct-btrfssubvolume.h \
+  include/guestfs-gobject/struct-dirent.h \
+  include/guestfs-gobject/struct-hivex_node.h \
+  include/guestfs-gobject/struct-hivex_value.h \
+  include/guestfs-gobject/struct-inotify_event.h \
   include/guestfs-gobject/struct-int_bool.h \
+  include/guestfs-gobject/struct-isoinfo.h \
+  include/guestfs-gobject/struct-lvm_lv.h \
   include/guestfs-gobject/struct-lvm_pv.h \
   include/guestfs-gobject/struct-lvm_vg.h \
-  include/guestfs-gobject/struct-lvm_lv.h \
+  include/guestfs-gobject/struct-mdstat.h \
+  include/guestfs-gobject/struct-partition.h \
   include/guestfs-gobject/struct-stat.h \
   include/guestfs-gobject/struct-statvfs.h \
-  include/guestfs-gobject/struct-dirent.h \
+  include/guestfs-gobject/struct-utsname.h \
   include/guestfs-gobject/struct-version.h \
   include/guestfs-gobject/struct-xattr.h \
-  include/guestfs-gobject/struct-inotify_event.h \
-  include/guestfs-gobject/struct-partition.h \
-  include/guestfs-gobject/struct-application.h \
-  include/guestfs-gobject/struct-application2.h \
-  include/guestfs-gobject/struct-isoinfo.h \
-  include/guestfs-gobject/struct-mdstat.h \
-  include/guestfs-gobject/struct-btrfssubvolume.h \
   include/guestfs-gobject/struct-xfsinfo.h \
-  include/guestfs-gobject/struct-utsname.h \
-  include/guestfs-gobject/struct-hivex_node.h \
-  include/guestfs-gobject/struct-hivex_value.h \
   include/guestfs-gobject/optargs-add_domain.h \
   include/guestfs-gobject/optargs-add_drive.h \
   include/guestfs-gobject/optargs-add_drive_scratch.h \
@@ -100,26 +100,26 @@ guestfs_gobject_headers= \
 guestfs_gobject_sources= \
   src/session.c \
   src/tristate.c \
+  src/struct-application.c \
+  src/struct-application2.c \
+  src/struct-btrfssubvolume.c \
+  src/struct-dirent.c \
+  src/struct-hivex_node.c \
+  src/struct-hivex_value.c \
+  src/struct-inotify_event.c \
   src/struct-int_bool.c \
+  src/struct-isoinfo.c \
+  src/struct-lvm_lv.c \
   src/struct-lvm_pv.c \
   src/struct-lvm_vg.c \
-  src/struct-lvm_lv.c \
+  src/struct-mdstat.c \
+  src/struct-partition.c \
   src/struct-stat.c \
   src/struct-statvfs.c \
-  src/struct-dirent.c \
+  src/struct-utsname.c \
   src/struct-version.c \
   src/struct-xattr.c \
-  src/struct-inotify_event.c \
-  src/struct-partition.c \
-  src/struct-application.c \
-  src/struct-application2.c \
-  src/struct-isoinfo.c \
-  src/struct-mdstat.c \
-  src/struct-btrfssubvolume.c \
   src/struct-xfsinfo.c \
-  src/struct-utsname.c \
-  src/struct-hivex_node.c \
-  src/struct-hivex_value.c \
   src/optargs-add_domain.c \
   src/optargs-add_drive.c \
   src/optargs-add_drive_scratch.c \
-- 
1.9.0

_______________________________________________
Libguestfs mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libguestfs

Reply via email to