[Libvir] MinGW patch

Richard W.M. Jones rjones at redhat.com
Thu Apr 17 19:04:59 UTC 2008


I got about 95% of the way towards compiling on MinGW using the MinGW
cross-compiler from http://mirzam.it.vu.nl/mingw/.  Attached are some
fairly non-controversial patches which fix some of the problems I
found.  Build notes follow below.

Rich.

----------------------------------------------------------------------

Install the MinGW cross-compiler.

Compile and install the following packages:

  (1) libgpg-error
  (2) libgcrypt
  (3) gnutls
  (4) libxml2
  (5) PortableXDR

I'm building into a local area.  Most of them will compile straight
with:

  CFLAGS="-I$HOME/win32/include" \
  LDFLAGS="-L$HOME/win32/lib" \
  ./configure --host=i386-mingw32 --prefix=$HOME/win32
  make
  make install

GnuTLS (3) is troublesome.  I ended up using version 1.6.3, upgrading
the gnulib packages in the gl/ subdirectory, and doing a bit of
bug-fixing on the Makefile.am files (mainly just making sure my custom
LDFLAGS gets through everywhere).

Then build libvirt + attached patch:

  PKG_CONFIG_PATH=$HOME/win32/lib/pkgconfig \
  CFLAGS="-I$HOME/win32/include" \
  LDFLAGS="-L$HOME/win32/lib" \
  ./configure --host=i386-mingw32 --prefix=$HOME/win32 \
    --without-xen --without-qemu --without-libvirtd \
    --without-sasl --without-python
  make

[Currently it fails when linking virsh because of the usual weirdness
in libtool]

-- 
Richard Jones, Emerging Technologies, Red Hat  http://et.redhat.com/~rjones
virt-top is 'top' for virtual machines.  Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://et.redhat.com/~rjones/virt-top
-------------- next part --------------
Index: configure.in
===================================================================
RCS file: /data/cvs/libvirt/configure.in,v
retrieving revision 1.139
diff -u -r1.139 configure.in
--- configure.in	8 Apr 2008 16:45:57 -0000	1.139
+++ configure.in	17 Apr 2008 18:55:05 -0000
@@ -81,6 +81,13 @@
 	       [test "x$ac_cv_path_RPCGEN" != "xno" &&
 	        $ac_cv_path_RPCGEN -t </dev/null >/dev/null 2>&1])
 
+dnl pthread?
+AC_CHECK_HEADER(pthread.h,
+	AC_CHECK_LIB(pthread,pthread_join,[
+		AC_DEFINE([HAVE_LIBPTHREAD],[],[Define if pthread (-lpthread)])
+		AC_DEFINE([HAVE_PTHREAD_H],[],[Define if <pthread.h>])
+	]))
+
 dnl Miscellaneous external programs.
 AC_PATH_PROG(RM, rm, /bin/rm)
 AC_PATH_PROG(MV, mv, /bin/mv)
@@ -301,7 +308,7 @@
 if test "x$with_libxml" = "xno" ; then
     AC_MSG_CHECKING(for libxml2 libraries >= $LIBXML_REQUIRED)
     AC_MSG_ERROR(libxml2 >= $LIBXML_REQUIRED is required for libvirt)
-elif test "x$with_libxml"  = "x" -a "x$PKG_CONFIG" = "x" ; then
+elif test "x$with_libxml" = "x" -a "x$PKG_CONFIG" != "x" ; then
     PKG_CHECK_MODULES(LIBXML, libxml-2.0 >= $LIBXML_REQUIRED, [LIBXML_FOUND=yes], [LIBXML_FOUND=no])
 fi
 if test "$LIBXML_FOUND" = "no" ; then
@@ -356,7 +363,8 @@
   AC_CHECK_LIB(gnutls, gnutls_handshake,
     [],
     [AC_MSG_ERROR(
-       [You must install the GnuTLS library in order to compile and run libvirt])])
+       [You must install the GnuTLS library in order to compile and run libvirt])],
+    [-lgcrypt])
   GNUTLS_LIBS=$LIBS
   LIBS="$old_libs"
 fi
Index: src/Makefile.am
===================================================================
RCS file: /data/cvs/libvirt/src/Makefile.am,v
retrieving revision 1.76
diff -u -r1.76 Makefile.am
--- src/Makefile.am	10 Apr 2008 07:30:53 -0000	1.76
+++ src/Makefile.am	17 Apr 2008 18:55:15 -0000
@@ -61,17 +61,21 @@
 		openvz_driver.c openvz_driver.h			\
 		lxc_driver.c lxc_driver.h			\
 		lxc_conf.c lxc_conf.h				\
-		lxc_container.c lxc_container.h				\
+		lxc_container.c lxc_container.h			\
                 nodeinfo.h nodeinfo.c                           \
-		storage_conf.h storage_conf.c			\
-		storage_driver.h storage_driver.c		\
-		storage_backend.h storage_backend.c		\
-		storage_backend_fs.h storage_backend_fs.c	\
 		util.c util.h
 
 SERVER_SOURCES =						\
 		../qemud/remote_protocol.c ../qemud/remote_protocol.h
 
+if WITH_LIBVIRTD
+
+CLIENT_SOURCES += 						\
+		storage_conf.h storage_conf.c			\
+		storage_driver.h storage_driver.c		\
+		storage_backend.h storage_backend.c		\
+		storage_backend_fs.h storage_backend_fs.c
+
 if WITH_STORAGE_LVM
 CLIENT_SOURCES += storage_backend_logical.h storage_backend_logical.c
 else
@@ -90,7 +94,7 @@
 EXTRA_DIST += storage_backend_disk.h storage_backend_disk.c
 endif
 
-
+endif
 
 
 libvirt_la_SOURCES = $(CLIENT_SOURCES) $(SERVER_SOURCES)
@@ -130,12 +134,14 @@
 virsh_CFLAGS = $(COVERAGE_CFLAGS) $(READLINE_CFLAGS)
 
 if WITH_STORAGE_DISK
+if WITH_LIBVIRTD
 libexec_PROGRAMS = libvirt_parthelper
 
 libvirt_parthelper_SOURCES = parthelper.c
 libvirt_parthelper_LDFLAGS = $(WARN_CFLAGS) $(COVERAGE_LDCFLAGS)
 libvirt_parthelper_LDADD = $(LIBPARTED_LIBS)
 libvirt_parthelper_CFLAGS =  $(LIBPARTED_CFLAGS)
+endif
 else
 EXTRA_DIST += parthelper.c
 endif
Index: src/hash.c
===================================================================
RCS file: /data/cvs/libvirt/src/hash.c,v
retrieving revision 1.36
diff -u -r1.36 hash.c
--- src/hash.c	10 Apr 2008 16:53:29 -0000	1.36
+++ src/hash.c	17 Apr 2008 18:55:16 -0000
@@ -25,7 +25,10 @@
 #include <libxml/threads.h>
 #include "internal.h"
 #include "hash.h"
+
+#if HAVE_PTHREAD_H
 #include <pthread.h>
+#endif
 
 #define MAX_HASH_LEN 8
 
@@ -713,7 +716,9 @@
     if (ret->storageVols == NULL)
         goto failed;
 
+#if HAVE_LIBPTHREAD
     pthread_mutex_init(&ret->lock, NULL);
+#endif
 
     ret->refs = 1;
     return(ret);
@@ -729,7 +734,9 @@
         if (ret->storageVols != NULL)
             virHashFree(ret->storageVols, (virHashDeallocator) virStorageVolFreeName);
 
+#if HAVE_LIBPTHREAD
         pthread_mutex_destroy(&ret->lock);
+#endif
         free(ret);
     }
     return(NULL);
@@ -762,8 +769,10 @@
 
     free(conn->name);
 
+#if HAVE_LIBPTHREAD
     pthread_mutex_unlock(&conn->lock);
     pthread_mutex_destroy(&conn->lock);
+#endif
     free(conn);
 }
 
@@ -784,7 +793,9 @@
         virHashError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
         return(-1);
     }
+#if HAVE_LIBPTHREAD
     pthread_mutex_lock(&conn->lock);
+#endif
     DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs);
     conn->refs--;
     refs = conn->refs;
@@ -793,7 +804,9 @@
         /* Already unlocked mutex */
         return (0);
     }
+#if HAVE_LIBPTHREAD
     pthread_mutex_unlock(&conn->lock);
+#endif
     return (refs);
 }
 
@@ -818,7 +831,9 @@
         virHashError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
         return(NULL);
     }
+#if HAVE_LIBPTHREAD
     pthread_mutex_lock(&conn->lock);
+#endif
 
     /* TODO search by UUID first as they are better differenciators */
 
@@ -849,11 +864,15 @@
         conn->refs++;
     }
     ret->refs++;
+#if HAVE_LIBPTHREAD
     pthread_mutex_unlock(&conn->lock);
+#endif
     return(ret);
 
  error:
+#if HAVE_LIBPTHREAD
     pthread_mutex_unlock(&conn->lock);
+#endif
     if (ret != NULL) {
         free(ret->name );
         free(ret);
@@ -900,7 +919,9 @@
         return;
     }
 
+#if HAVE_LIBPTHREAD
     pthread_mutex_unlock(&conn->lock);
+#endif
 }
 
 
@@ -921,7 +942,9 @@
         virHashError(domain->conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
         return(-1);
     }
+#if HAVE_LIBPTHREAD
     pthread_mutex_lock(&domain->conn->lock);
+#endif
     DEBUG("unref domain %p %s %d", domain, domain->name, domain->refs);
     domain->refs--;
     refs = domain->refs;
@@ -931,7 +954,9 @@
         return (0);
     }
 
+#if HAVE_LIBPTHREAD
     pthread_mutex_unlock(&domain->conn->lock);
+#endif
     return (refs);
 }
 
@@ -956,7 +981,9 @@
         virHashError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
         return(NULL);
     }
+#if HAVE_LIBPTHREAD
     pthread_mutex_lock(&conn->lock);
+#endif
 
     /* TODO search by UUID first as they are better differenciators */
 
@@ -986,11 +1013,15 @@
         conn->refs++;
     }
     ret->refs++;
+#if HAVE_LIBPTHREAD
     pthread_mutex_unlock(&conn->lock);
+#endif
     return(ret);
 
  error:
+#if HAVE_LIBPTHREAD
     pthread_mutex_unlock(&conn->lock);
+#endif
     if (ret != NULL) {
         free(ret->name );
         free(ret);
@@ -1037,7 +1068,9 @@
         return;
     }
 
+#if HAVE_LIBPTHREAD
     pthread_mutex_unlock(&conn->lock);
+#endif
 }
 
 
@@ -1058,7 +1091,9 @@
         virHashError(network->conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
         return(-1);
     }
+#if HAVE_LIBPTHREAD
     pthread_mutex_lock(&network->conn->lock);
+#endif
     DEBUG("unref network %p %s %d", network, network->name, network->refs);
     network->refs--;
     refs = network->refs;
@@ -1068,7 +1103,9 @@
         return (0);
     }
 
+#if HAVE_LIBPTHREAD
     pthread_mutex_unlock(&network->conn->lock);
+#endif
     return (refs);
 }
 
@@ -1094,7 +1131,9 @@
         virHashError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
         return(NULL);
     }
+#if HAVE_LIBPTHREAD
     pthread_mutex_lock(&conn->lock);
+#endif
 
     /* TODO search by UUID first as they are better differenciators */
 
@@ -1124,11 +1163,15 @@
         conn->refs++;
     }
     ret->refs++;
+#if HAVE_LIBPTHREAD
     pthread_mutex_unlock(&conn->lock);
+#endif
     return(ret);
 
 error:
+#if HAVE_LIBPTHREAD
     pthread_mutex_unlock(&conn->lock);
+#endif
     if (ret != NULL) {
         free(ret->name);
         free(ret);
@@ -1171,7 +1214,9 @@
         return;
     }
 
+#if HAVE_LIBPTHREAD
     pthread_mutex_unlock(&conn->lock);
+#endif
 }
 
 
@@ -1192,7 +1237,9 @@
         virHashError(pool->conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
         return(-1);
     }
+#if HAVE_LIBPTHREAD
     pthread_mutex_lock(&pool->conn->lock);
+#endif
     DEBUG("unref pool %p %s %d", pool, pool->name, pool->refs);
     pool->refs--;
     refs = pool->refs;
@@ -1202,7 +1249,9 @@
         return (0);
     }
 
+#if HAVE_LIBPTHREAD
     pthread_mutex_unlock(&pool->conn->lock);
+#endif
     return (refs);
 }
 
@@ -1229,7 +1278,9 @@
         virHashError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
         return(NULL);
     }
+#if HAVE_LIBPTHREAD
     pthread_mutex_lock(&conn->lock);
+#endif
 
     ret = (virStorageVolPtr) virHashLookup(conn->storageVols, key);
     if (ret == NULL) {
@@ -1261,11 +1312,15 @@
         conn->refs++;
     }
     ret->refs++;
+#if HAVE_LIBPTHREAD
     pthread_mutex_unlock(&conn->lock);
+#endif
     return(ret);
 
 error:
+#if HAVE_LIBPTHREAD
     pthread_mutex_unlock(&conn->lock);
+#endif
     if (ret != NULL) {
         free(ret->name);
         free(ret->pool);
@@ -1310,7 +1365,9 @@
         return;
     }
 
+#if HAVE_LIBPTHREAD
     pthread_mutex_unlock(&conn->lock);
+#endif
 }
 
 
@@ -1331,7 +1388,9 @@
         virHashError(vol->conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
         return(-1);
     }
+#if HAVE_LIBPTHREAD
     pthread_mutex_lock(&vol->conn->lock);
+#endif
     DEBUG("unref vol %p %s %d", vol, vol->name, vol->refs);
     vol->refs--;
     refs = vol->refs;
@@ -1341,6 +1400,8 @@
         return (0);
     }
 
+#if HAVE_LIBPTHREAD
     pthread_mutex_unlock(&vol->conn->lock);
+#endif
     return (refs);
 }
Index: src/internal.h
===================================================================
RCS file: /data/cvs/libvirt/src/internal.h,v
retrieving revision 1.67
diff -u -r1.67 internal.h
--- src/internal.h	10 Apr 2008 16:54:54 -0000	1.67
+++ src/internal.h	17 Apr 2008 18:55:16 -0000
@@ -195,7 +195,9 @@
      * count of any virDomain/virNetwork object associated with
      * this connection
      */
+#if HAVE_LIBPTHREAD
     pthread_mutex_t lock;
+#endif
     virHashTablePtr domains;  /* hash table for known domains */
     virHashTablePtr networks; /* hash table for known domains */
     virHashTablePtr storagePools;/* hash table for known storage pools */
Index: src/storage_driver.c
===================================================================
RCS file: /data/cvs/libvirt/src/storage_driver.c,v
retrieving revision 1.4
diff -u -r1.4 storage_driver.c
--- src/storage_driver.c	10 Apr 2008 16:53:29 -0000	1.4
+++ src/storage_driver.c	17 Apr 2008 18:55:17 -0000
@@ -26,7 +26,9 @@
 #include <stdio.h>
 #include <unistd.h>
 #include <sys/types.h>
+#if HAVE_PWD_H
 #include <pwd.h>
+#endif
 #include <errno.h>
 #include <string.h>
 
Index: src/util.c
===================================================================
RCS file: /data/cvs/libvirt/src/util.c,v
retrieving revision 1.31
diff -u -r1.31 util.c
--- src/util.c	10 Apr 2008 16:54:54 -0000	1.31
+++ src/util.c	17 Apr 2008 18:55:18 -0000
@@ -33,7 +33,9 @@
 #include <errno.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#if HAVE_SYS_WAIT_H
 #include <sys/wait.h>
+#endif
 #include <string.h>
 #include <ctype.h>
 


More information about the libvir-list mailing list