[libvirt] [PATCH] Fix API docs for header file re-organization

Nehal J Wani nehaljw.kkd1 at gmail.com
Mon Nov 17 23:18:32 UTC 2014


On Wed, Nov 12, 2014 at 8:30 PM, Daniel P. Berrange <berrange at redhat.com> wrote:
> The API docs generators were broken by the header file
> re-organization. Specifically
>
>  * html/libvirt-libvirt.html was empty (and should be deleted)
>  * Makefile.am didn't install html/libvirt-libvirt-*.html
>  * hvsupport.html was mostly empty
>  * sitemap.html.in didn't list the new html/*.html files
> ---
>  docs/Makefile.am     |  17 +++++++--
>  docs/apibuild.py     |   1 -
>  docs/hvsupport.pl    | 101 +++++++++++++++++++++++++++++----------------------
>  docs/sitemap.html.in |  48 ++++++++++++++++++++++--
>  4 files changed, 115 insertions(+), 52 deletions(-)
>
> diff --git a/docs/Makefile.am b/docs/Makefile.am
> index 9de3406..910bfef 100644
> --- a/docs/Makefile.am
> +++ b/docs/Makefile.am
> @@ -25,9 +25,20 @@ DOC_SOURCE_DIR=../src
>
>  DEVHELP_DIR=$(datadir)/gtk-doc/html/libvirt
>
> -apihtml =                      \
> -  html/index.html              \
> -  html/libvirt-libvirt.html    \
> +apihtml =                                      \
> +  html/index.html                              \
> +  html/libvirt-libvirt-domain.html             \
> +  html/libvirt-libvirt-domain-snapshot.html    \
> +  html/libvirt-libvirt-event.html              \
> +  html/libvirt-libvirt-host.html               \
> +  html/libvirt-libvirt.html                    \
> +  html/libvirt-libvirt-interface.html          \
> +  html/libvirt-libvirt-network.html            \
> +  html/libvirt-libvirt-nodedev.html            \
> +  html/libvirt-libvirt-nwfilter.html           \
> +  html/libvirt-libvirt-secret.html             \
> +  html/libvirt-libvirt-storage.html            \
> +  html/libvirt-libvirt-stream.html             \
>    html/libvirt-virterror.html
>
>  apipng =       \
> diff --git a/docs/apibuild.py b/docs/apibuild.py
> index 797a7a5..7549a63 100755
> --- a/docs/apibuild.py
> +++ b/docs/apibuild.py
> @@ -21,7 +21,6 @@ debugsym=None
>  # C parser analysis code
>  #
>  included_files = {
> -  "libvirt.h": "header with general libvirt API definitions",
>    "libvirt-domain.h": "header with general libvirt API definitions",
>    "libvirt-domain-snapshot.h": "header with general libvirt API definitions",
>    "libvirt-event.h": "header with general libvirt API definitions",
> diff --git a/docs/hvsupport.pl b/docs/hvsupport.pl
> index 6d8ed9c..96720eb 100755
> --- a/docs/hvsupport.pl
> +++ b/docs/hvsupport.pl
> @@ -12,7 +12,17 @@ my $srcdir = shift @ARGV;
>  my $symslibvirt = "$srcdir/libvirt_public.syms";
>  my $symsqemu = "$srcdir/libvirt_qemu.syms";
>  my $symslxc = "$srcdir/libvirt_lxc.syms";
> -my $drivertable = "$srcdir/driver.h";
> +my @drivertable = (
> +    "$srcdir/driver-hypervisor.h",
> +    "$srcdir/driver-interface.h",
> +    "$srcdir/driver-network.h",
> +    "$srcdir/driver-nodedev.h",
> +    "$srcdir/driver-nwfilter.h",
> +    "$srcdir/driver-secret.h",
> +    "$srcdir/driver-state.h",
> +    "$srcdir/driver-storage.h",
> +    "$srcdir/driver-stream.h",
> +    );
>
>  my %groupheaders = (
>      "virHypervisorDriver" => "Hypervisor APIs",
> @@ -182,41 +192,44 @@ $apis{virDomainMigrateConfirm3Params} = "1.1.0";
>  # and driver struct fields. This lets us later match
>  # update the driver impls with the public APis.
>
> -open FILE, "<$drivertable"
> -    or die "cannot read $drivertable: $!";
> -
>  # Group name -> hash of APIs { fields -> api name }
>  my %groups;
>  my $ingrp;
> -while (defined($line = <FILE>)) {
> -    if ($line =~ /struct _(vir\w*Driver)/) {
> -        my $grp = $1;
> -        if ($grp ne "virStateDriver" &&
> -            $grp ne "virStreamDriver") {
> -            $ingrp = $grp;
> -            $groups{$ingrp} = { apis => {}, drivers => {} };
> -        }
> -    } elsif ($ingrp) {
> -        if ($line =~ /^\s*vir(?:Drv)(\w+)\s+(\w+);\s*$/) {
> -            my $field = $2;
> -            my $name = $1;
> -
> -            my $api;
> -            if (exists $apis{"vir$name"}) {
> -                $api = "vir$name";
> -            } elsif ($name =~ /\w+(Open|Close)/) {
> -                next;
> -            } else {
> -                die "driver $name does not have a public API";
> +foreach my $drivertable (@drivertable) {
> +    open FILE, "<$drivertable"
> +        or die "cannot read $drivertable: $!";
> +
> +    while (defined($line = <FILE>)) {
> +        if ($line =~ /struct _(vir\w*Driver)/) {
> +            my $grp = $1;
> +            if ($grp ne "virStateDriver" &&
> +                $grp ne "virStreamDriver") {
> +                $ingrp = $grp;
> +                warn "[$ingrp]";
> +                $groups{$ingrp} = { apis => {}, drivers => {} };
> +            }
> +        } elsif ($ingrp) {
> +            if ($line =~ /^\s*vir(?:Drv)(\w+)\s+(\w+);\s*$/) {
> +                my $field = $2;
> +                my $name = $1;
> +
> +                my $api;
> +                if (exists $apis{"vir$name"}) {
> +                    $api = "vir$name";
> +                } elsif ($name =~ /\w+(Open|Close)/) {
> +                    next;
> +                } else {
> +                    die "driver $name does not have a public API";
> +                }
> +                $groups{$ingrp}->{apis}->{$field} = $api;
> +            } elsif ($line =~ /};/) {
> +                $ingrp = undef;
>              }
> -            $groups{$ingrp}->{apis}->{$field} = $api;
> -        } elsif ($line =~ /};/) {
> -            $ingrp = undef;
>          }
>      }
> -}
>
> -close FILE;
> +    close FILE;
> +}
>
>
>  # Finally, we read all the primary driver files and extract
> @@ -290,43 +303,43 @@ foreach my $src (@srcs) {
>  # have a bit of manual fixup todo with the per-driver versioning
>  # and support matrix
>
> -$groups{virDriver}->{apis}->{"openAuth"} = "virConnectOpenAuth";
> -$groups{virDriver}->{apis}->{"openReadOnly"} = "virConnectOpenReadOnly";
> -$groups{virDriver}->{apis}->{"domainMigrate"} = "virDomainMigrate";
> +$groups{virHypervisorDriver}->{apis}->{"openAuth"} = "virConnectOpenAuth";
> +$groups{virHypervisorDriver}->{apis}->{"openReadOnly"} = "virConnectOpenReadOnly";
> +$groups{virHypervisorDriver}->{apis}->{"domainMigrate"} = "virDomainMigrate";
>
>  my $openAuthVers = (0 * 1000 * 1000) + (4 * 1000) + 0;
>
> -foreach my $drv (keys %{$groups{"virDriver"}->{drivers}}) {
> -    my $openVersStr = $groups{"virDriver"}->{drivers}->{$drv}->{"connectOpen"};
> +foreach my $drv (keys %{$groups{"virHypervisorDriver"}->{drivers}}) {
> +    my $openVersStr = $groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"connectOpen"};
>      my $openVers;
>      if ($openVersStr =~ /(\d+)\.(\d+)\.(\d+)/) {
>          $openVers = ($1 * 1000 * 1000) + ($2 * 1000) + $3;
>      }
>
>      # virConnectOpenReadOnly always matches virConnectOpen version
> -    $groups{"virDriver"}->{drivers}->{$drv}->{"connectOpenReadOnly"} =
> -        $groups{"virDriver"}->{drivers}->{$drv}->{"connectOpen"};
> +    $groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"connectOpenReadOnly"} =
> +        $groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"connectOpen"};
>
>      # virConnectOpenAuth is always 0.4.0 if the driver existed
>      # before this time, otherwise it matches the version of
>      # the driver's virConnectOpen entry
>      if ($openVersStr eq "Y" ||
>          $openVers >= $openAuthVers) {
> -        $groups{"virDriver"}->{drivers}->{$drv}->{"connectOpenAuth"} = $openVersStr;
> +        $groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"connectOpenAuth"} = $openVersStr;
>      } else {
> -        $groups{"virDriver"}->{drivers}->{$drv}->{"connectOpenAuth"} = "0.4.0";
> +        $groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"connectOpenAuth"} = "0.4.0";
>      }
>  }
>
>
>  # Another special case for the virDomainCreateLinux which was replaced
>  # with virDomainCreateXML
> -$groups{virDriver}->{apis}->{"domainCreateLinux"} = "virDomainCreateLinux";
> +$groups{virHypervisorDriver}->{apis}->{"domainCreateLinux"} = "virDomainCreateLinux";
>
>  my $createAPIVers = (0 * 1000 * 1000) + (0 * 1000) + 3;
>
> -foreach my $drv (keys %{$groups{"virDriver"}->{drivers}}) {
> -    my $createVersStr = $groups{"virDriver"}->{drivers}->{$drv}->{"domainCreateXML"};
> +foreach my $drv (keys %{$groups{"virHypervisorDriver"}->{drivers}}) {
> +    my $createVersStr = $groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"domainCreateXML"};
>      next unless defined $createVersStr;
>      my $createVers;
>      if ($createVersStr =~ /(\d+)\.(\d+)\.(\d+)/) {
> @@ -338,9 +351,9 @@ foreach my $drv (keys %{$groups{"virDriver"}->{drivers}}) {
>      # the driver's virCreateXML entry
>      if ($createVersStr eq "Y" ||
>          $createVers >= $createAPIVers) {
> -        $groups{"virDriver"}->{drivers}->{$drv}->{"domainCreateLinux"} = $createVersStr;
> +        $groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"domainCreateLinux"} = $createVersStr;
>      } else {
> -        $groups{"virDriver"}->{drivers}->{$drv}->{"domainCreateLinux"} = "0.0.3";
> +        $groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"domainCreateLinux"} = "0.0.3";
>      }
>  }
>
> @@ -367,7 +380,7 @@ in.
>
>  EOF
>
> -foreach my $grp (sort { $a cmp $b } keys %groups) {
> +    foreach my $grp (sort { $a cmp $b } keys %groups) {
>      print "<h2><a name=\"$grp\">", $groupheaders{$grp}, "</a></h2>\n";
>      print <<EOF;
>  <table class="top_table">
> diff --git a/docs/sitemap.html.in b/docs/sitemap.html.in
> index 1e91869..fad5358 100644
> --- a/docs/sitemap.html.in
> +++ b/docs/sitemap.html.in
> @@ -291,12 +291,52 @@
>              -->
>              <ul>
>                <li>
> -                <a href="html/libvirt-libvirt.html">libvirt</a>
> -                <span>core interfaces for the libvirt library</span>
> +                <a href="html/libvirt-libvirt-domain.html">Domain</a>
> +                <span>domain APIs for the libvirt library</span>
>                </li>
>                <li>
> -                <a href="html/libvirt-virterror.html">virterror</a>
> -                <span>error handling interfaces for the libvirt library</span>
> +                <a href="html/libvirt-libvirt-domain-snapshot.html">Domain snapshot</a>
> +                <span>domain snapshot APIs for the libvirt library</span>
> +              </li>
> +              <li>
> +                <a href="html/libvirt-virterror.html">Error</a>
> +                <span>error handling APIs for the libvirt library</span>
> +              </li>
> +              <li>
> +                <a href="html/libvirt-libvirt-event.html">Event</a>
> +                <span>event APIs for the libvirt library</span>
> +              </li>
> +              <li>
> +                <a href="html/libvirt-libvirt-host.html">Host</a>
> +                <span>host APIs for the libvirt library</span>
> +              </li>
> +              <li>
> +                <a href="html/libvirt-libvirt-interface.html">Interface</a>
> +                <span>interface APIs for the libvirt library</span>
> +              </li>
> +              <li>
> +                <a href="html/libvirt-libvirt-network.html">Network</a>
> +                <span>network APIs for the libvirt library</span>
> +              </li>
> +              <li>
> +                <a href="html/libvirt-libvirt-nodedev.html">Node device</a>
> +                <span>node device APIs for the libvirt library</span>
> +              </li>
> +              <li>
> +                <a href="html/libvirt-libvirt-nwfilter.html">Network filter</a>
> +                <span>network filter APIs for the libvirt library</span>
> +              </li>
> +              <li>
> +                <a href="html/libvirt-libvirt-secret.html">Secret</a>
> +                <span>secret APIs for the libvirt library</span>
> +              </li>
> +              <li>
> +                <a href="html/libvirt-libvirt-storage.html">Storage</a>
> +                <span>storage APIs for the libvirt library</span>
> +              </li>
> +              <li>
> +                <a href="html/libvirt-libvirt-stream.html">Stream</a>
> +                <span>stream APIs for the libvirt library</span>
>                </li>
>                <li>
>                  <a href="hvsupport.html">Driver support</a>
> --
> 2.1.0
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list

Make rpm fails with error:

  GEN      devhelp/libvirt-libvirt.html
cp: cannot stat './html/libvirt-libvirt.html': No such file or directory
make[3]: *** [distdir] Error 1

I guess, references of libvirt-libvirt.html were not removed from
docs/Makefile.am

Following patch fixes it (But I am not sure if it is the right way to go):

diff --git a/docs/Makefile.am b/docs/Makefile.am
index 910bfef..5485ee9 100644
--- a/docs/Makefile.am
+++ b/docs/Makefile.am
@@ -31,7 +31,6 @@ apihtml =                    \
   html/libvirt-libvirt-domain-snapshot.html    \
   html/libvirt-libvirt-event.html        \
   html/libvirt-libvirt-host.html        \
-  html/libvirt-libvirt.html            \
   html/libvirt-libvirt-interface.html        \
   html/libvirt-libvirt-network.html        \
   html/libvirt-libvirt-nodedev.html        \
@@ -51,7 +50,6 @@ devhelphtml =            \
   devhelp/libvirt.devhelp    \
   devhelp/index.html        \
   devhelp/general.html        \
-  devhelp/libvirt-libvirt.html    \
   devhelp/libvirt-virterror.html

 css =         \
@@ -269,7 +267,6 @@ $(addprefix $(srcdir)/,$(devhelphtml)):
$(srcdir)/libvirt-api.xml $(devhelpxsl)


 python_generated_files = \
-        $(srcdir)/html/libvirt-libvirt.html \
         $(srcdir)/html/libvirt-libvirt-lxc.html \
         $(srcdir)/html/libvirt-libvirt-qemu.html \
         $(srcdir)/html/libvirt-virterror.html \


-- 
Nehal J Wani




More information about the libvir-list mailing list