[Libguestfs] The issue about code coverage for libguestfs

Yongkui Guo yoguo at redhat.com
Fri Sep 1 08:28:52 UTC 2017


----- Original Message -----
> On Thu, Aug 31, 2017 at 05:45:38AM -0400, Yongkui Guo wrote:
> > Hi,
> > 
> > I tried to do code coverage testing for libguestfs with gcov.
> > 
> > The steps are shown as follows:
> > 1. Download and install the source package(libguestfs-1.36.5-1.el7.src.rpm)
> 
> Probably best to try building this from git instead of using RPMs, so
> we can get the changes working upstream first.  Make sure to read this
> page first:
> 
>   http://libguestfs.org/guestfs-building.1.html

I will read it later. And I need to think about how to do code coverage in this way. Thanks.

> 
> > +CFLAGS="-fprofile-arcs -ftest-coverage -g -O0"; export CFLAGS
> > +LDFLAGS="-fprofile-arcs -ftest-coverage -lgcov"; export LDFLAGS
> 
> > +sed -i 's/^CFLAGS = -fprofile-arcs -ftest-coverage -g -O0/CFLAGS = /g'
> > /home/mockbuild/rpmbuild/BUILD/libguestfs-1.36.5/ocaml/Makefile
> 
> > ../libmlguestfs.a(libguestfsocaml_a-utils.o): In function
> > `guestfs_int_string_is_valid':
> > utils.c:(.text+0xb99): undefined reference to `c_isalpha'
> > utils.c:(.text+0xbbf): undefined reference to `c_isdigit'
> 
> I suppose that we need to link the OCaml bindings to -lgnu, which
> your patch attempts:
> 
> > +libguestfsocaml_a_LIBADD = \
> > +	$(top_builddir)/gnulib/lib/libgnu.la
> > +
> 
> ... but the problem is that libguestfsocaml.a isn't really used for
> anything.  See the comment in the same Makefile.am:
> 
>   # Build the C part into a library, so that automake handles the C
>   # compilation step for us.  Note that we don't directly use this
>   # library; we link with the object files that it generates.
>   noinst_LIBRARIES = libguestfsocaml.a
> 
> You'll need to change all the places where
> $(libguestfsocaml_a_OBJECTS) is used instead, eg something like this
> untested change:
> 
>  stamp-mlguestfs: libguestfsocaml.a $(guestfs_cmm)
>          $(OCAMLMKLIB) -o mlguestfs \
>            $(libguestfsocaml_a_OBJECTS) guestfs.cmo \
>            $(LDFLAGS) \
>            $(LTLIBINTL) \
> -         -L../lib/.libs -lguestfs
> +         -L../lib/.libs -lguestfs \
> +         -L../gnulib/lib/.libs -lgnu
>  if HAVE_OCAMLOPT
>          $(OCAMLMKLIB) -o mlguestfs \
>            $(libguestfsocaml_a_OBJECTS) guestfs.cmx \
>            $(LDFLAGS) \
>            $(LTLIBINTL) \
> -         -L../lib/.libs -lguestfs
> +         -L../lib/.libs -lguestfs \
> +         -L../gnulib/lib/.libs -lgnu
>  endif
>          touch $@

I added the above changes as a patch. But it failed with the following error:
---------------------------------------------------------
...
ocamlmklib -o mlguestfs \
  libguestfsocaml_a-guestfs-c.o libguestfsocaml_a-guestfs-c-actions.o libguestfsocaml_a-guestfs-c-errnos.o ../common/utils/libguestfsocaml_a-utils.o guestfs.cmo \
  -Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld \
   \
  -L../lib/.libs -lguestfs \
         -L../gnulib/lib/.libs -lgnu
Unknown option -Wl,-z,relro
Unknown option -specs=/usr/lib/rpm/redhat/redhat-hardened-ld
ocamlmklib -o mlguestfs \
  libguestfsocaml_a-guestfs-c.o libguestfsocaml_a-guestfs-c-actions.o libguestfsocaml_a-guestfs-c-errnos.o ../common/utils/libguestfsocaml_a-utils.o guestfs.cmx \
  -Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld \
   \
  -L../lib/.libs -lguestfs \
         -L../gnulib/lib/.libs -lgnu
Unknown option -Wl,-z,relro
Unknown option -specs=/usr/lib/rpm/redhat/redhat-hardened-ld
touch stamp-mlguestfs
make[2]: Leaving directory `/home/mockbuild/rpmbuild/BUILD/libguestfs-1.36.5/ocaml'
Making all in ocaml/examples
make[2]: Entering directory `/home/mockbuild/rpmbuild/BUILD/libguestfs-1.36.5/ocaml/examples'
ocamlfind ocamlopt -cclib -L../../lib/.libs -package unix -linkpkg \
          -warn-error A -I .. mlguestfs.cmxa create_disk.ml -o create_disk
ocamlfind ocamlopt -cclib -L../../lib/.libs -package unix -linkpkg \
          -warn-error A -I .. mlguestfs.cmxa debug_logging.ml -o debug_logging
/usr/bin/ld: cannot find -lgnu
collect2: error: ld returned 1 exit status
--------------------------------------------------------- 

Then I removed the '-lgnu' option. The error was still the same as before:

---------------------------------------------------------
...
ocamlmklib -o mlguestfs \
  libguestfsocaml_a-guestfs-c.o libguestfsocaml_a-guestfs-c-actions.o libguestfsocaml_a-guestfs-c-errnos.o ../common/utils/libguestfsocaml_a-utils.o guestfs.cmo \
  -fprofile-arcs -ftest-coverage -lgcov \
   \
  -L../lib/.libs -lguestfs \
          -L../gnulib/lib/.libs 
Unknown option -fprofile-arcs
Unknown option -ftest-coverage
ocamlmklib -o mlguestfs \
  libguestfsocaml_a-guestfs-c.o libguestfsocaml_a-guestfs-c-actions.o libguestfsocaml_a-guestfs-c-errnos.o ../common/utils/libguestfsocaml_a-utils.o guestfs.cmx \
  -fprofile-arcs -ftest-coverage -lgcov \
   \
  -L../lib/.libs -lguestfs \
          -L../gnulib/lib/.libs 
Unknown option -fprofile-arcs
Unknown option -ftest-coverage
touch stamp-mlguestfs
Warning: Element Unix.error not found
make[2]: Leaving directory `/home/mockbuild/rpmbuild/BUILD/libguestfs-1.36.5/ocaml'
Making all in ocaml/examples
make[2]: Entering directory `/home/mockbuild/rpmbuild/BUILD/libguestfs-1.36.5/ocaml/examples'
ocamlfind ocamlopt -cclib -L../../lib/.libs -package unix -linkpkg \
          -warn-error A -I .. mlguestfs.cmxa create_disk.ml -o create_disk
ocamlfind ocamlopt -cclib -L../../lib/.libs -package unix -linkpkg \
          -warn-error A -I .. mlguestfs.cmxa debug_logging.ml -o debug_logging
../libmlguestfs.a(libguestfsocaml_a-utils.o): In function `guestfs_int_string_is_valid':
utils.c:(.text+0xb99): undefined reference to `c_isalpha'
utils.c:(.text+0xbbf): undefined reference to `c_isdigit'
collect2: error: ld returned 1 exit status
File "caml_startup", line 1:
Error: Error during linking
make[2]: *** [debug_logging] Error 2
make[2]: *** Waiting for unfinished jobs....
../libmlguestfs.a(libguestfsocaml_a-utils.o): In function `guestfs_int_string_is_valid':
utils.c:(.text+0xb99): undefined reference to `c_isalpha'
utils.c:(.text+0xbbf): undefined reference to `c_isdigit'
collect2: error: ld returned 1 exit status
File "caml_startup", line 1:
Error: Error during linking
make[2]: *** [create_disk] Error 2
make[2]: Leaving directory `/home/mockbuild/rpmbuild/BUILD/libguestfs-1.36.5/ocaml/examples'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/mockbuild/rpmbuild/BUILD/libguestfs-1.36.5'
make: *** [all] Error 2
error: Bad exit status from /var/tmp/rpm-tmp.FM2viv (%build)
--------------------------------------------------------- 


Best wishes
Yongkui Guo
IRC: yoguo
Tel: 15010777318




More information about the Libguestfs mailing list