4978ba4c3004ecd38f270107fbb344f647110f32
[libguestfs.git] / configure.ac
1 # libguestfs
2 # Copyright (C) 2009-2011 Red Hat Inc.
3 #
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 2 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 # The major, minor, and release fields MUST be numbers.  Packagers can
19 # add extra information using --with-extra="..." which may be any
20 # freeform string.
21 m4_define([libguestfs_major],   [1])
22 m4_define([libguestfs_minor],   [10])
23 m4_define([libguestfs_release], [12])
24
25 AC_INIT([libguestfs],libguestfs_major.libguestfs_minor.libguestfs_release)
26 AC_CONFIG_AUX_DIR([build-aux])
27 AM_INIT_AUTOMAKE([foreign])
28
29 m4_ifndef([AM_SILENT_RULES], [m4_define([AM_SILENT_RULES],[])])
30 AM_SILENT_RULES([yes]) # make --enable-silent-rules the default.
31
32 AC_CONFIG_MACRO_DIR([m4])
33
34 dnl Stable or unstable version?
35 AC_MSG_CHECKING([if this is a stable or unstable branch of libguestfs])
36 AS_IF([test "$((libguestfs_minor % 2))" -eq 0 ],[
37             AC_MSG_RESULT([stable])
38        ],[
39             AC_MSG_RESULT([unstable])
40             AC_MSG_NOTICE([
41 ***
42 This is a development version of libguestfs. Some APIs may be unstable
43 until they appear in a stable release of libguestfs (at which point
44 the C API and ABI is guaranteed to remain stable forever).  For
45 more information about stable and development branches of libguestfs
46 please see the section "LIBGUESTFS VERSION NUMBERS" in guestfs(3).
47 ***])
48        ])
49
50 dnl Extra string, a freeform string defined by packagers.
51 AC_ARG_WITH([extra],
52   [AS_HELP_STRING([--with-extra],
53                   [extra version string (for use by packagers)])],
54   [libguestfs_extra="$withval"],
55   [libguestfs_extra=]
56 )
57
58 AC_MSG_NOTICE([libguestfs version libguestfs_major.libguestfs_minor.libguestfs_release$libguestfs_extra])
59
60 dnl Split up the version string.
61 AC_DEFINE([PACKAGE_VERSION_MAJOR],[libguestfs_major],[Major version number])
62 AC_DEFINE([PACKAGE_VERSION_MINOR],[libguestfs_minor],[Minor version number])
63 AC_DEFINE([PACKAGE_VERSION_RELEASE],[libguestfs_release],[Release number])
64 AC_DEFINE_UNQUOTED([PACKAGE_VERSION_EXTRA],["$libguestfs_extra"],[Extra version string])
65
66 dnl Early gnulib initialization.
67 gl_EARLY
68 gl_INIT
69
70 AC_PROG_LIBTOOL
71
72 dnl Check for basic C environment.
73 AC_PROG_CC_STDC
74 AC_PROG_INSTALL
75 AC_PROG_CPP
76
77 AC_ARG_ENABLE([gcc-warnings],
78   [AS_HELP_STRING([--enable-gcc-warnings],
79                   [turn on lots of GCC warnings (for developers)])],
80   [case $enableval in
81      yes|no) ;;
82      *)      AC_MSG_ERROR([bad value $enableval for gcc-warnings option]) ;;
83    esac
84    gl_gcc_warnings=$enableval],
85   [gl_gcc_warnings=no]
86 )
87
88 if test "$gl_gcc_warnings" = yes; then
89   gl_WARN_ADD([-Werror], [WERROR_CFLAGS])
90   AC_SUBST([WERROR_CFLAGS])
91
92   nw=
93   # This, $nw, is the list of warnings we disable.
94   nw="$nw -Wdeclaration-after-statement" # too useful to forbid
95   nw="$nw -Waggregate-return"       # anachronistic
96   nw="$nw -Wc++-compat"             # We don't care about C++ compilers
97   nw="$nw -Wundef"                  # Warns on '#if GNULIB_FOO' etc in gnulib
98   nw="$nw -Wtraditional"            # Warns on #elif which we use often
99   nw="$nw -Wcast-qual"              # Too many warnings for now
100   nw="$nw -Wconversion"             # Too many warnings for now
101   nw="$nw -Wsystem-headers"         # Don't let system headers trigger warnings
102   nw="$nw -Wsign-conversion"        # Too many warnings for now
103   nw="$nw -Wtraditional-conversion" # Too many warnings for now
104   nw="$nw -Wunreachable-code"       # Too many warnings for now
105   nw="$nw -Wpadded"                 # Our structs are not padded
106   nw="$nw -Wredundant-decls"        # openat.h declares e.g., mkdirat
107   nw="$nw -Wlogical-op"             # any use of fwrite provokes this
108   nw="$nw -Wvla"                    # two warnings in mount.c
109   # things I might fix soon:
110   nw="$nw -Wmissing-format-attribute" # daemon.h's asprintf_nowarn
111   nw="$nw -Winline"                 # daemon.h's asprintf_nowarn
112   nw="$nw -Wshadow"                 # numerous, plus we're not unanimous
113   nw="$nw -Wunsafe-loop-optimizations" # just a warning that an optimization
114                                     # was not possible, safe to ignore
115   nw="$nw -Wpacked"                 # Allow attribute((packed)) on structs
116   nw="$nw -Wlong-long"              # Allow long long since it's required
117                                     # by Python, Ruby and xstrtoll.
118   nw="$nw -Wstack-protector"        # Don't warn about stack-protector
119                                     # failures (seen on Ubuntu).
120
121   gl_MANYWARN_ALL_GCC([ws])
122   gl_MANYWARN_COMPLEMENT([ws], [$ws], [$nw])
123   for w in $ws; do
124     gl_WARN_ADD([$w])
125   done
126   gl_WARN_ADD([-Wno-unused-parameter]) # stubs.c
127   gl_WARN_ADD([-Wno-jump-misses-init]) # stubs.c
128   gl_WARN_ADD([-Wno-unused-variable]) # FIXME: only temporary, for guestfs_protocol.c, etc
129
130   # In spite of excluding -Wlogical-op above, it is enabled, as of
131   # gcc 4.5.0 20090517, and it provokes warnings in cat.c, dd.c, truncate.c
132   gl_WARN_ADD([-Wno-logical-op])
133
134   # Work around warning in src/inspect.c.  This seems to be a bug in gcc 4.5.1.
135   gl_WARN_ADD([-Wno-strict-overflow])
136
137   gl_WARN_ADD([-fdiagnostics-show-option])
138
139   AC_SUBST([WARN_CFLAGS])
140
141   AC_DEFINE([lint], [1], [Define to 1 if the compiler is checking for lint.])
142   AC_DEFINE([_FORTIFY_SOURCE], [2],
143     [enable compile-time and run-time bounds-checking, and some warnings])
144   AC_DEFINE([GNULIB_PORTCHECK], [1], [enable some gnulib portability checks])
145 fi
146
147 AC_C_PROTOTYPES
148 test "x$U" != "x" && AC_MSG_ERROR([Compiler not ANSI compliant])
149
150 AM_PROG_CC_C_O
151
152 dnl Work out how to specify the linker script to the linker.
153 VERSION_SCRIPT_FLAGS=-Wl,--version-script=
154 `/usr/bin/ld --help 2>&1 | grep -- --version-script >/dev/null` || \
155     VERSION_SCRIPT_FLAGS="-Wl,-M -Wl,"
156 AC_SUBST(VERSION_SCRIPT_FLAGS)
157
158 dnl Check support for 64 bit file offsets.
159 AC_SYS_LARGEFILE
160
161 dnl Check sizeof long.
162 AC_CHECK_SIZEOF([long])
163
164 dnl Define a C symbol for the host CPU architecture.
165 AC_DEFINE_UNQUOTED([host_cpu],["$host_cpu"],[Host architecture.])
166
167 dnl Headers.
168 AC_CHECK_HEADERS([errno.h sys/types.h sys/un.h sys/wait.h sys/socket.h endian.h byteswap.h])
169
170 dnl Functions.
171 AC_CHECK_FUNCS([futimens posix_fallocate])
172
173 dnl Build the daemon?
174 AC_MSG_CHECKING([if we should build the daemon])
175 AC_ARG_ENABLE([daemon],
176         [AS_HELP_STRING([--enable-daemon],
177           [enable building the daemon @<:@default=yes@:>@])],
178         [],
179         [enable_daemon=yes])
180 AM_CONDITIONAL([ENABLE_DAEMON],[test "x$enable_daemon" = "xyes"])
181 AC_MSG_RESULT([$enable_daemon])
182
183 dnl Build the appliance?
184 AC_MSG_CHECKING([if we should build the appliance])
185 AC_ARG_ENABLE([appliance],
186         [AS_HELP_STRING([--enable-appliance],
187           [enable building the appliance @<:@default=yes@:>@])],
188         [],
189         [enable_appliance=yes])
190 AM_CONDITIONAL([ENABLE_APPLIANCE],[test "x$enable_appliance" = "xyes"])
191 AC_MSG_RESULT([$enable_appliance])
192
193 if test "x$enable_appliance" = "xyes"; then
194     dnl Check for febootstrap >= 3.0
195     AC_CHECK_PROG([FEBOOTSTRAP],
196                   [febootstrap],[febootstrap],[no])
197     test "x$FEBOOTSTRAP" = "xno" &&
198         AC_MSG_ERROR([febootstrap must be installed])
199     dnl febootstrap 2.x did not support the --version parameter
200     $FEBOOTSTRAP --version >&AS_MESSAGE_LOG_FD 2>&1 ||
201         AC_MSG_ERROR([febootstrap >= 3.0 must be installed, your version is too old])
202
203     dnl Pass a febootstrap --yum-config option.
204     AC_MSG_CHECKING([if user requested febootstrap --yum-config option])
205     AC_ARG_WITH([febootstrap-yum-config],
206         [AS_HELP_STRING([--with-febootstrap-yum-config=FILE],
207           [pass febootstrap --yum-config option @<:@default=no@:>@])],
208         [FEBOOTSTRAP_YUM_CONFIG="$withval"],
209         [FEBOOTSTRAP_YUM_CONFIG=no])
210     AC_MSG_RESULT([$FEBOOTSTRAP_YUM_CONFIG])
211     AC_SUBST([FEBOOTSTRAP_YUM_CONFIG])
212
213     dnl Which distro?
214     dnl
215     dnl This used to be Very Important but is now just used to select
216     dnl which packages to install in the appliance, since the package
217     dnl names vary slightly across distros.  (See
218     dnl appliance/packagelist.in and appliance/excludelist.in)
219     AC_MSG_CHECKING([which Linux distro for package names])
220     DISTRO=REDHAT
221     if test -f /etc/debian_version; then
222         DISTRO=DEBIAN
223         if grep -q 'DISTRIB_ID=Ubuntu' /etc/lsb-release 2>&AS_MESSAGE_LOG_FD; then
224             DISTRO=UBUNTU
225         fi
226     fi
227     if test -f /etc/arch-release; then
228         DISTRO=ARCHLINUX
229     fi
230     AC_MSG_RESULT([$DISTRO])
231     AC_SUBST([DISTRO])
232 fi
233
234 dnl Check for rpcgen and XDR library.  rpcgen is optional.
235 AC_CHECK_PROG([RPCGEN],[rpcgen],[rpcgen],[no])
236 AM_CONDITIONAL([HAVE_RPCGEN],[test "x$RPCGEN" != "xno"])
237 AC_CHECK_LIB([portablexdr],[xdrmem_create],[],[
238         AC_SEARCH_LIBS([xdrmem_create],[rpc xdr nsl])
239         ])
240
241 dnl Check for cpio which isn't in the default Pardus install amazingly.
242 AC_CHECK_PROG([CPIO],[cpio],[cpio],[no])
243 test "x$CPIO" = "xno" &&
244      AC_MSG_ERROR([cpio must be installed])
245
246 dnl Check for gperf.
247 AC_CHECK_PROG([GPERF],[gperf],[gperf],[no])
248 test "x$GPERF" = "xno" &&
249      AC_MSG_ERROR([gperf must be installed])
250
251 dnl Check for pod2man, pod2text, pod2html.
252 AC_CHECK_PROG([POD2MAN],[pod2man],[pod2man],[no])
253 test "x$POD2MAN" = "xno" &&
254      AC_MSG_ERROR([pod2man must be installed])
255 AC_CHECK_PROG([POD2TEXT],[pod2text],[pod2text],[no])
256 test "x$POD2TEXT" = "xno" &&
257      AC_MSG_ERROR([pod2text must be installed])
258 AC_CHECK_PROG([POD2HTML],[pod2html],[pod2html],[no])
259 test "x$POD2HTML" = "xno" &&
260      AC_MSG_ERROR([pod2html must be installed])
261
262 dnl Check if pod2man, pod2text take --stderr and -u options (not in RHEL 5).
263 AC_MSG_CHECKING([if pod2man takes --stderr option])
264 if "$POD2MAN" --stderr >&AS_MESSAGE_LOG_FD 2>&1; then
265     AC_MSG_RESULT([yes])
266     POD2_STDERR_OPTION="--stderr"
267 else
268     AC_MSG_RESULT([no])
269     POD2_STDERR_OPTION=""
270 fi
271 AC_SUBST([POD2_STDERR_OPTION])
272
273 AC_MSG_CHECKING([if pod2man takes -u option])
274 if "$POD2MAN" -u >&AS_MESSAGE_LOG_FD 2>&1; then
275     AC_MSG_RESULT([yes])
276     POD2_UTF8_OPTION="-u"
277 else
278     AC_MSG_RESULT([no])
279     POD2_UTF8_OPTION=""
280 fi
281 AC_SUBST([POD2_UTF8_OPTION])
282
283 dnl Check for genisoimage.
284 AC_PATH_PROGS([GENISOIMAGE],[genisoimage],[no],
285         [$PATH$PATH_SEPARATOR/usr/sbin$PATH_SEPARATOR/sbin])
286 test "x$GENISOIMAGE" = "xno" && AC_MSG_ERROR([genisoimage must be installed])
287
288 dnl Check for optional xmllint.
289 AC_CHECK_PROG([XMLLINT],[xmllint],[xmllint],[no])
290 AM_CONDITIONAL([HAVE_XMLLINT],[test "x$XMLLINT" != "xno"])
291
292 dnl po4a for translating man pages and POD files (optional).
293 AC_CHECK_PROG([PO4A],[po4a],[po4a],[no])
294 AM_CONDITIONAL([HAVE_PO4A], [test "x$PO4A" != "xno"])
295
296 dnl Check for db_dump, db_load (optional).
297 AC_CHECK_PROGS([DB_DUMP],
298                [db_dump db4_dump db4.8_dump db4.7_dump db4.6_dump],[no])
299 AC_CHECK_PROGS([DB_LOAD],
300                [db_load db4_load db4.8_load db4.7_load db4.6_load],[no])
301 if test "x$DB_DUMP" != "xno"; then
302     AC_DEFINE_UNQUOTED([DB_DUMP],["$DB_DUMP"],[Name of db_dump program.])
303 fi
304 if test "x$DB_LOAD" != "xno"; then
305     AC_DEFINE_UNQUOTED([DB_LOAD],["$DB_LOAD"],[Name of db_load program.])
306 fi
307
308 dnl Check for QEMU for running binaries on this $host_cpu, fall
309 dnl back to basic 'qemu'.  Allow the user to override it.
310 default_qemu="qemu-kvm kvm qemu-system-$host_cpu qemu"
311 AC_ARG_WITH([qemu],
312         [AS_HELP_STRING([--with-qemu],
313           [set default QEMU binary @<:@default=[qemu-kvm] qemu-system-<host> qemu@:>@])],
314         [],
315         [with_qemu="$default_qemu"])
316 AC_PATH_PROGS([QEMU],[$with_qemu],[no],
317         [$PATH$PATH_SEPARATOR/usr/sbin$PATH_SEPARATOR/sbin$PATH_SEPARATOR/usr/libexec])
318 test "x$QEMU" = "xno" && AC_MSG_ERROR([qemu must be installed])
319 AC_DEFINE_UNQUOTED([QEMU],["$QEMU"],[Location of qemu binary.])
320
321 dnl Check that the chosen qemu has virtio-serial support.
322 if test "x$vmchannel_test" != "xno"; then
323     AC_MSG_CHECKING([that $QEMU -help works])
324     if $QEMU -help >&AS_MESSAGE_LOG_FD 2>&1; then
325         AC_MSG_RESULT([yes])
326     else
327         AC_MSG_RESULT([no])
328         AC_MSG_FAILURE(
329 [$QEMU -help: command failed.
330
331 This could be a very old version of qemu, or qemu might not be
332 working.
333 ])
334     fi
335
336     dnl qemu 0.15 was released with broken support for '-machine',
337     dnl requiring you to add the machine type: '-machine pc,[...]'.
338     dnl The problem is that 'pc' is only applicable for PC-like
339     dnl hardware, so we cannot do this as a general solution.  Since
340     dnl qemu 0.15, this problem has been fixed so now the default
341     dnl machine type is chosen (qemu commit 2645c6dcaf6ea2a51a).
342     dnl
343     dnl We need to work out if this qemu is the broken version, so we
344     dnl can add 'pc' just for this broken version.
345     dnl
346     dnl Note that old qemu didn't support the '-machine' option at all.
347     dnl
348     dnl We use the -kernel option for testing this, because this option
349     dnl is processed very late, after qemu has set up the machine.
350     AC_MSG_CHECKING([for broken '-machine accel=tcg' option in $QEMU])
351     LC_ALL=C $QEMU -nographic -machine accel=tcg -kernel /NO_SUCH_FILE \
352              > config1.tmp 2>&1
353     LC_ALL=C $QEMU -nographic -machine pc,accel=tcg -kernel /NO_SUCH_FILE \
354              > config2.tmp 2>&1
355     if cmp -s config1.tmp config2.tmp; then
356         AC_MSG_RESULT([no])
357     else
358         AC_MSG_RESULT([yes])
359         AC_DEFINE([QEMU_MACHINE_TYPE_IS_BROKEN],[1],[qemu -machine accel=tcg option is broken (in qemu 0.15 only)])
360     fi
361     rm config1.tmp config2.tmp
362
363     dnl See if the '-machine [pc,]accel=tcg' option is required in
364     dnl order to run the virtio-serial test below.  This happens when
365     dnl we run qemu-kvm inside a VM without forcing TCG:
366     dnl
367     dnl   Could not access KVM kernel module: No such file or directory
368     dnl   failed to initialize KVM: No such file or directory
369     dnl   No accelerator found!
370     AC_MSG_CHECKING([if -machine @<:@pc,@:>@accel=tcg option is required to test virtio-serial feature])
371     if $QEMU -nographic -device \? >/dev/null 2>&1; then
372         :
373     elif $QEMU -machine accel=tcg -nographic -device \? >/dev/null 2>&1; then
374         QEMU_EXTRA_OPTIONS_FOR_TEST="-machine accel=tcg"
375     elif $QEMU -machine pc,accel=tcg -nographic -device \? >/dev/null 2>&1; then
376         QEMU_EXTRA_OPTIONS_FOR_TEST="-machine pc,accel=tcg"
377     # else nothing ... it'll fail below.
378     fi
379     AC_MSG_RESULT([$QEMU_EXTRA_OPTIONS_FOR_TEST])
380
381     AC_MSG_CHECKING([for virtio-serial support in $QEMU])
382     if $QEMU $QEMU_EXTRA_OPTIONS_FOR_TEST -nographic -device \? 2>&1 | grep -sq virtio-serial; then
383         AC_MSG_RESULT([yes])
384     else
385         AC_MSG_RESULT([no])
386         AC_MSG_FAILURE(
387 [I did not find virtio-serial support in
388 $QEMU.
389
390 virtio-serial support in qemu or KVM is essential for libguestfs
391 to operate.
392
393 Usually this means that you have to install a newer version of qemu
394 and/or KVM.  Please read the relevant section in the README file for
395 more information about this.
396
397 You can override this test by setting the environment variable
398 vmchannel_test=no  However if you don't have the right support
399 in your qemu, then this just delays the pain.
400
401 If I am using the wrong qemu or you want to compile qemu from source
402 and install it in another location, then you should configure with
403 the --with-qemu option.
404 ])
405     fi
406 fi
407
408 dnl Set default drive interface used by the guestfs_add_drive_opts call
409 dnl ('-drive ...,if=...' option to qemu).
410 dnl
411 dnl If you encounter performance problems with virtio (RHBZ#509383)
412 dnl then try '--with-drive-if=ide'.
413 AC_ARG_WITH([drive-if],
414         [AS_HELP_STRING([--with-drive-if],
415           [set default driver (ide|scsi|virtio) @<:@default=virtio@:>@])],
416         [],
417         [with_drive_if=virtio])
418 AC_DEFINE_UNQUOTED([DRIVE_IF],["$with_drive_if"],[Default drive interface.])
419
420 dnl Set interface used by the network.  Normally you should
421 dnl leave this at the default (virtio-net-pci) but you can use the
422 dnl alternative (ne2k_pci) because of bugs in virtio networking
423 dnl eg. https://bugzilla.redhat.com/show_bug.cgi?id=516022
424 AC_ARG_WITH([net-if],
425         [AS_HELP_STRING([--with-net-if],
426           [set default net driver (virtio-net-pci|ne2k_pci) @<:@default=virtio-net-pci@:>@])],
427         [],
428         [with_net_if=virtio-net-pci])
429 AC_DEFINE_UNQUOTED([NET_IF],["$with_net_if"],[Default network interface.])
430
431 dnl Enable packet dumps when in verbose mode.  This generates lots
432 dnl of debug info, only useful for people debugging the RPC mechanism.
433 AC_ARG_ENABLE([packet-dump],
434         [AS_HELP_STRING([--enable-packet-dump],
435           [enable packet dumps in verbose mode @<:@default=no@:>@])],
436         [AC_DEFINE([ENABLE_PACKET_DUMP],[1],[Enable packet dumps in verbose mode.])],
437         [])
438
439 dnl Readline.
440 AC_ARG_WITH([readline],
441     [AS_HELP_STRING([--with-readline],
442         [support fancy command line editing @<:@default=check@:>@])],
443     [],
444     [with_readline=check])
445
446 LIBREADLINE=
447 AS_IF([test "x$with_readline" != xno],
448     [AC_CHECK_LIB([readline], [main],
449         [AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"])
450          AC_DEFINE([HAVE_LIBREADLINE], [1],
451                    [Define if you have libreadline])
452         ],
453         [if test "x$with_readline" != xcheck; then
454          AC_MSG_FAILURE(
455              [--with-readline was given, but test for readline failed])
456          fi
457         ], -lncurses)
458      old_LIBS="$LIBS"
459      LIBS="$LIBS $LIBREADLINE"
460      AC_CHECK_FUNCS([append_history completion_matches rl_completion_matches])
461      LIBS="$old_LIBS"
462     ])
463
464 dnl For i18n.
465 AM_GNU_GETTEXT([external])
466
467 dnl libmagic (highly recommended)
468 AC_CHECK_LIB([magic],[magic_file],
469         [AC_CHECK_HEADER([magic.h],
470                 [AC_SUBST([MAGIC_LIBS], ["-lmagic"])
471                  AC_DEFINE([HAVE_LIBMAGIC],[1],[libmagic found at compile time.])
472                 ], [])
473         ],
474         [AC_MSG_WARN([libmagic not found, some core features will be disabled])])
475
476 dnl Check for PCRE (highly recommended)
477 PKG_CHECK_MODULES([PCRE], [libpcre],
478         [AC_SUBST([PCRE_CFLAGS])
479          AC_SUBST([PCRE_LIBS])
480          AC_DEFINE([HAVE_PCRE],[1],[PCRE found at compile time.])
481         ],
482         [AC_MSG_WARN([PCRE not found, some core features will be disabled])])
483
484 dnl libvirt (highly recommended)
485 PKG_CHECK_MODULES([LIBVIRT], [libvirt],
486         [AC_SUBST([LIBVIRT_CFLAGS])
487          AC_SUBST([LIBVIRT_LIBS])
488          AC_DEFINE([HAVE_LIBVIRT],[1],[libvirt found at compile time.])
489         ],
490         [AC_MSG_WARN([libvirt not found, some core features will be disabled])])
491 AM_CONDITIONAL([HAVE_LIBVIRT],[test "x$LIBVIRT_LIBS" != "x"])
492
493 dnl libxml2 (highly recommended)
494 PKG_CHECK_MODULES([LIBXML2], [libxml-2.0],
495         [AC_SUBST([LIBXML2_CFLAGS])
496          AC_SUBST([LIBXML2_LIBS])
497          AC_DEFINE([HAVE_LIBXML2],[1],[libxml2 found at compile time.])
498         ],
499         [AC_MSG_WARN([libxml2 not found, some core features will be disabled])])
500 AM_CONDITIONAL([HAVE_LIBXML2],[test "x$LIBXML2_LIBS" != "x"])
501
502 dnl libconfig (highly recommended)
503 PKG_CHECK_MODULES([LIBCONFIG], [libconfig],
504         [AC_SUBST([LIBCONFIG_CFLAGS])
505          AC_SUBST([LIBCONFIG_LIBS])
506          AC_DEFINE([HAVE_LIBCONFIG],[1],[libconfig found at compile time.])
507         ],
508         [AC_MSG_WARN([libconfig not found, some features will be disabled])])
509 AM_CONDITIONAL([HAVE_LIBCONFIG],[test "x$LIBCONFIG_LIBS" != "x"])
510
511 dnl hivex library (highly recommended)
512 dnl This used to be a part of libguestfs, but was spun off into its
513 dnl own separate upstream project in libguestfs 1.0.85.
514 PKG_CHECK_MODULES([HIVEX], [hivex],
515         [AC_SUBST([HIVEX_CFLAGS])
516          AC_SUBST([HIVEX_LIBS])
517          AC_DEFINE([HAVE_HIVEX],[1],[hivex library found at compile time.])
518         ],
519         [AC_MSG_WARN([hivex not found, some core features will be disabled])])
520 AM_CONDITIONAL([HAVE_HIVEX],[test "x$HIVEX_LIBS" != "x"])
521
522 dnl FUSE is optional to build the FUSE module.
523 AC_ARG_ENABLE([fuse],
524         AS_HELP_STRING([--disable-fuse], [Disable FUSE (guestmount) support]),
525         [],
526         [enable_fuse=yes])
527 AS_IF([test "x$enable_fuse" != "xno"],
528         [PKG_CHECK_MODULES([FUSE],[fuse],,[
529                 enable_fuse=no
530                 AC_MSG_WARN([FUSE library and headers are missing, so optional FUSE module won't be built])])])
531 AM_CONDITIONAL([HAVE_FUSE],[test "x$enable_fuse" != "xno"])
532
533 dnl Check for OCaml (optional, for OCaml bindings).
534 OCAMLC=no
535 OCAMLFIND=no
536 AC_ARG_ENABLE([ocaml],
537         AS_HELP_STRING([--disable-ocaml], [Disable OCaml language bindings]),
538         [],
539         [enable_ocaml=yes])
540 AS_IF([test "x$enable_ocaml" != "xno"],
541         [dnl OCAMLC and OCAMLFIND have to be unset first, otherwise
542          dnl AC_CHECK_TOOL (inside AC_PROG_OCAML) will not look.
543          OCAMLC=
544          OCAMLFIND=
545          AC_PROG_OCAML
546          AC_PROG_FINDLIB
547
548          AS_IF([test "x$OCAMLC" != "xno" && test "x$OCAMLFIND" != "xno"],
549                 [AC_CHECK_OCAML_PKG([pcre])])
550         ])
551 AM_CONDITIONAL([HAVE_OCAML],
552                [test "x$OCAMLC" != "xno" && test "x$OCAMLFIND" != "xno"])
553 AM_CONDITIONAL([HAVE_OCAML_PCRE],
554                [test "x$OCAMLC" != "xno" && test "x$OCAMLFIND" != "xno" && test "x$OCAML_PKG_pcre" != "xno"])
555
556 dnl Check for Perl (optional, for Perl bindings).
557 PERL=no
558 AC_ARG_ENABLE([perl],
559         AS_HELP_STRING([--disable-perl], [Disable Perl language bindings]),
560         [],
561         [enable_perl=yes])
562 AS_IF([test "x$enable_perl" != "xno"],
563         [
564         PERL=
565         AC_CHECK_PROG([PERL],[perl],[perl],[no])
566
567         dnl Check for Perl modules that must be present to compile and
568         dnl test the Perl bindings.
569         missing_perl_modules=no
570         for pm in Test::More ExtUtils::MakeMaker; do
571             AC_MSG_CHECKING([for $pm])
572             if ! perl -M$pm -e1 >&AS_MESSAGE_LOG_FD 2>&1; then
573                 AC_MSG_RESULT([no])
574                 missing_perl_modules=yes
575             else
576                 AC_MSG_RESULT([yes])
577             fi
578         done
579         if test "x$missing_perl_modules" = "xyes"; then
580             AC_MSG_WARN([some Perl modules required to compile or test the Perl bindings are missing])
581         fi
582         ])
583 AM_CONDITIONAL([HAVE_PERL],
584     [test "x$PERL" != "xno" && test "x$missing_perl_modules" != "xyes"])
585
586 dnl Check for Python (optional, for Python bindings).
587 PYTHON_PREFIX=
588 PYTHON_VERSION=
589 PYTHON_INCLUDEDIR=
590 PYTHON_INSTALLDIR=
591
592 AC_ARG_ENABLE([python],
593         AS_HELP_STRING([--disable-python], [Disable Python language bindings]),
594         [],
595         [enable_python=yes])
596 AS_IF([test "x$enable_python" != "xno"],
597         [
598         AC_CHECK_PROG([PYTHON],[python],[python],[no])
599
600         if test "x$PYTHON" != "xno"; then
601             AC_MSG_CHECKING([Python prefix])
602             PYTHON_PREFIX=`$PYTHON -c "import sys; print (sys.prefix)"`
603             AC_MSG_RESULT([$PYTHON_PREFIX])
604
605             AC_MSG_CHECKING([Python version])
606             PYTHON_VERSION=`$PYTHON -c "import sys; print (sys.version[[0:3]])"`
607             AC_MSG_RESULT([$PYTHON_VERSION])
608
609             for d in \
610                 $PYTHON_PREFIX/include/python$PYTHON_VERSION \
611                 /usr/include/python$PYTHON_VERSION \
612                 /usr/local/include/python$PYTHON_VERSION
613             do
614                 AC_MSG_CHECKING([Python.h in $d])
615                 if test -r "$d/Python.h"; then
616                     AC_MSG_RESULT([found])
617                     PYTHON_INCLUDEDIR=$d
618                     break
619                 fi
620                 AC_MSG_RESULT([not found])
621             done
622             if test "x$PYTHON_INCLUDEDIR" = "x"; then
623                 AC_MSG_WARN([Python include directory not found])
624             fi
625
626             AC_ARG_WITH([python-installdir],
627                         [AS_HELP_STRING([--with-python-installdir],
628                                         [directory to install python modules @<:@default=check@:>@])],
629                         [PYTHON_INSTALLDIR="$withval"
630                         AC_MSG_NOTICE([Python install dir $PYTHON_INSTALLDIR])],
631                         [PYTHON_INSTALLDIR=check])
632
633             if test "x$PYTHON_INSTALLDIR" = "xcheck"; then
634                 PYTHON_INSTALLDIR=
635                 for d in \
636                     $PYTHON_PREFIX/lib64/python$PYTHON_VERSION/site-packages \
637                     $PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages \
638                     /usr/lib64/python$PYTHON_VERSION/site-packages \
639                     /usr/lib/python$PYTHON_VERSION/site-packages \
640                     /usr/local/lib/python$PYTHON_VERSION/site-packages
641                 do
642                     AC_MSG_CHECKING([for $d])
643                     if test -d "$d"; then
644                         AC_MSG_RESULT([found])
645                         PYTHON_INSTALLDIR=$d
646                         break
647                     fi
648                     AC_MSG_RESULT([not found])
649                 done
650                 if test "x$PYTHON_INSTALLDIR" = "x"; then
651                     AC_MSG_WARN([Python site-packages directory not found])
652                 fi
653             fi
654
655             old_LIBS="$LIBS"
656             LIBS="$LIBS -lpython$PYTHON_VERSION"
657             AC_CHECK_FUNCS([PyCapsule_New])
658             LIBS="$old_LIBS"
659         fi
660
661         AC_SUBST(PYTHON_PREFIX)
662         AC_SUBST(PYTHON_VERSION)
663         AC_SUBST(PYTHON_INCLUDEDIR)
664         AC_SUBST(PYTHON_INSTALLDIR)
665         ])
666 AM_CONDITIONAL([HAVE_PYTHON],
667     [test "x$PYTHON" != "xno" && test "x$PYTHON_INCLUDEDIR" != "x" && test "x$PYTHON_INSTALLDIR" != "x"])
668
669 dnl Check for Ruby and rake (optional, for Ruby bindings).
670 AC_ARG_ENABLE([ruby],
671         AS_HELP_STRING([--disable-ruby], [Disable Ruby language bindings]),
672         [],
673         [enable_ruby=yes])
674 AS_IF([test "x$enable_ruby" != "xno"],
675         [
676         AC_CHECK_LIB([ruby],[ruby_init],[HAVE_LIBRUBY=1],[HAVE_LIBRUBY=0])
677         AC_CHECK_PROG([RAKE],[rake],[rake],[no])
678         ])
679 AM_CONDITIONAL([HAVE_RUBY],
680     [test "x$RAKE" != "xno" && test -n "$HAVE_LIBRUBY"])
681
682 dnl Check for Java.
683 AC_ARG_WITH(java_home,
684     [AS_HELP_STRING([--with-java-home],
685         [specify path to JDK directory @<:@default=check@:>@])],
686     [],
687     [with_java_home=check])
688
689 if test "x$with_java_home" != "xno"; then
690     if test "x$with_java_home" != "xyes" && test "x$with_java_home" != "xcheck"
691     then
692         # Reject unsafe characters in $JAVA_HOME
693         jh_lf='
694 '
695         case $JAVA_HOME in
696           *[\\\"\#\$\&\'\`$jh_lf\ \     ]*)
697             AC_MSG_FAILURE([unsafe \$JAVA_HOME directory (use --with-java-home=no to disable Java support)]);;
698         esac
699         if test -d "$with_java_home"; then
700             JAVA_HOME="$with_java_home"
701         else
702             AC_MSG_FAILURE([$with_java_home is not a directory (use --with-java-home=no to disable Java support)])
703         fi
704     fi
705
706     if test "x$JAVA_HOME" = "x"; then
707         # Look for Java in some likely locations.
708         for d in \
709             /usr/lib/jvm/java \
710             /usr/lib/jvm/java-6-openjdk
711         do
712             if test -d $d && test -f $d/bin/java; then
713                 JAVA_HOME=$d
714                 break
715             fi
716         done
717     fi
718
719     if test "x$JAVA_HOME" != "x"; then
720         AC_MSG_CHECKING(for JDK in $JAVA_HOME)
721         if test ! -x "$JAVA_HOME/bin/java"; then
722             AC_MSG_ERROR([missing $JAVA_HOME/bin/java binary (use --with-java-home=no to disable Java support)])
723         else
724             JAVA="$JAVA_HOME/bin/java"
725         fi
726         if test ! -x "$JAVA_HOME/bin/javac"; then
727             AC_MSG_ERROR([missing $JAVA_HOME/bin/javac binary])
728         else
729             JAVAC="$JAVA_HOME/bin/javac"
730         fi
731         if test ! -x "$JAVA_HOME/bin/javah"; then
732             AC_MSG_ERROR([missing $JAVA_HOME/bin/javah binary])
733         else
734             JAVAH="$JAVA_HOME/bin/javah"
735         fi
736         if test ! -x "$JAVA_HOME/bin/javadoc"; then
737             AC_MSG_ERROR([missing $JAVA_HOME/bin/javadoc binary])
738         else
739             JAVADOC="$JAVA_HOME/bin/javadoc"
740         fi
741         if test ! -x "$JAVA_HOME/bin/jar"; then
742             AC_MSG_ERROR([missing $JAVA_HOME/bin/jar binary])
743         else
744             JAR="$JAVA_HOME/bin/jar"
745         fi
746         java_version=`$JAVA -version 2>&1 | grep "java version"`
747         AC_MSG_RESULT(found $java_version in $JAVA_HOME)
748
749         dnl Find jni.h.
750         AC_MSG_CHECKING([for jni.h])
751         if test -f "$JAVA_HOME/include/jni.h"; then
752             JNI_CFLAGS="-I$JAVA_HOME/include"
753         else
754             if test "`find $JAVA_HOME -name jni.h`" != ""; then
755                 head=`find $JAVA_HOME -name jni.h | tail -1`
756                 dir=`dirname "$head"`
757                 JNI_CFLAGS="-I$dir"
758             else
759                 AC_MSG_FAILURE([missing jni.h header file])
760             fi
761         fi
762         AC_MSG_RESULT([$JNI_CFLAGS])
763
764         dnl Find jni_md.h.
765         AC_MSG_CHECKING([for jni_md.h])
766         case "$build_os" in
767         *linux*) system="linux" ;;
768         *SunOS*) system="solaris" ;;
769         *cygwin*) system="win32" ;;
770         *) system="$build_os" ;;
771         esac
772         if test -f "$JAVA_HOME/include/$system/jni_md.h"; then
773             JNI_CFLAGS="$JNI_CFLAGS -I$JAVA_HOME/include/$system"
774         else
775             if test "`find $JAVA_HOME -name jni_md.h`" != ""; then
776                 head=`find $JAVA_HOME -name jni_md.h | tail -1`
777                 dir=`dirname "$head"`
778                 JNI_CFLAGS="$JNI_CFLAGS -I$dir"
779             else
780                 AC_MSG_FAILURE([missing jni_md.h header file])
781             fi
782         fi
783         AC_MSG_RESULT([$JNI_CFLAGS])
784
785         dnl Need extra version flag?
786         AC_MSG_CHECKING([extra javac flags])
787         JAVAC_FLAGS=
788         javac_version=`$JAVAC -version 2>&1`
789         case "$javac_version" in
790         *Eclipse*)
791             JAVAC_FLAGS="-source 1.5" ;;
792         esac
793         AC_MSG_RESULT([$JAVAC_FLAGS])
794
795         dnl Where to install jarfiles.
796         dnl XXX How to make it configurable?
797         JAR_INSTALL_DIR=\${prefix}/share/java
798         JNI_INSTALL_DIR=\${libdir}
799
800         dnl JNI version.
801         jni_major_version=`echo "$VERSION" | awk -F. '{print $1}'`
802         jni_minor_version=`echo "$VERSION" | awk -F. '{print $2}'`
803         jni_micro_version=`echo "$VERSION" | awk -F. '{print $3}'`
804         JNI_VERSION_INFO=`expr "$jni_major_version" + "$jni_minor_version"`":$jni_micro_version:$jni_minor_version"
805     fi
806 fi
807
808 AC_SUBST(JAVA_HOME)
809 AC_SUBST(JAVA)
810 AC_SUBST(JAVAC)
811 AC_SUBST(JAVAH)
812 AC_SUBST(JAVADOC)
813 AC_SUBST(JAR)
814 AC_SUBST(JNI_CFLAGS)
815 AC_SUBST(JAVAC_FLAGS)
816 AC_SUBST(JAR_INSTALL_DIR)
817 AC_SUBST(JNI_INSTALL_DIR)
818 AC_SUBST(JNI_VERSION_INFO)
819
820 AM_CONDITIONAL([HAVE_JAVA],[test -n "$JAVAC"])
821
822 dnl Check for Haskell (GHC).
823 GHC=no
824 AC_ARG_ENABLE([haskell],
825         AS_HELP_STRING([--disable-haskell], [Disable Haskell language bindings]),
826         [],
827         [enable_haskell=yes])
828 AS_IF([test "x$enable_haskell" != "xno"],
829         [
830         GHC=
831         AC_CHECK_PROG([GHC],[ghc],[ghc],[no])
832         ])
833 AM_CONDITIONAL([HAVE_HASKELL],
834     [test "x$GHC" != "xno"])
835
836 dnl PHP
837 PHP=no
838 AC_ARG_ENABLE([php],
839         AS_HELP_STRING([--disable-php], [Disable PHP language bindings]),
840         [],
841         [enable_php=yes])
842 AS_IF([test "x$enable_php" != "xno"],
843         [
844         PHP=
845         AC_CHECK_PROG([PHP],[php],[php],[no])
846         AC_CHECK_PROG([PHPIZE],[phpize],[phpize],[no])
847         ])
848 AM_CONDITIONAL([HAVE_PHP], [test "x$PHP" != "xno" && test "x$PHPIZE" != "xno"])
849
850 dnl Check for Perl modules needed by Perl virt tools (virt-df, etc.)
851 AS_IF([test "x$PERL" != "xno"],
852         [
853         missing_perl_modules=no
854         for pm in Pod::Usage Getopt::Long Sys::Virt Data::Dumper Locale::TextDomain Win::Hivex Win::Hivex::Regedit String::ShellQuote; do
855             AC_MSG_CHECKING([for $pm])
856             if ! $PERL -M$pm -e1 >&AS_MESSAGE_LOG_FD 2>&1; then
857                 AC_MSG_RESULT([no])
858                 missing_perl_modules=yes
859             else
860                 AC_MSG_RESULT([yes])
861             fi
862         done
863         if test "x$missing_perl_modules" = "xyes"; then
864             AC_MSG_WARN([some Perl modules required to compile the Perl virt-* tools are missing])
865         fi
866         ])
867
868 AM_CONDITIONAL([HAVE_TOOLS],
869     [test "x$PERL" != "xno" && test "x$missing_perl_modules" != "xyes"])
870
871 dnl Library versioning.
872 MAX_PROC_NR=`cat $srcdir/src/MAX_PROC_NR`
873 AC_SUBST(MAX_PROC_NR)
874
875 dnl Replace libtool with a wrapper that clobbers dependency_libs in *.la files
876 dnl http://lists.fedoraproject.org/pipermail/devel/2010-November/146343.html
877 LIBTOOL='bash $(top_srcdir)/libtool-kill-dependency_libs.sh $(top_builddir)/libtool'
878 AC_SUBST([LIBTOOL])
879
880 dnl Run in subdirs.
881 if test "x$enable_daemon" = "xyes"; then
882     AC_CONFIG_SUBDIRS([daemon])
883 fi
884
885 dnl Produce output files.
886 AC_CONFIG_HEADERS([config.h])
887 dnl http://www.mail-archive.com/automake@gnu.org/msg10204.html
888 AC_CONFIG_FILES([podwrapper.sh],
889                 [chmod +x podwrapper.sh])
890 AC_CONFIG_FILES([Makefile
891                  appliance/Makefile
892                  capitests/Makefile
893                  cat/Makefile
894                  caution/Makefile
895                  csharp/Makefile
896                  debian/changelog
897                  df/Makefile
898                  examples/Makefile
899                  fish/Makefile
900                  fuse/Makefile
901                  generator/Makefile
902                  gnulib/lib/Makefile
903                  gnulib/tests/Makefile
904                  haskell/Makefile
905                  images/Makefile
906                  inspector/Makefile
907                  java/Makefile
908                  libguestfs.pc
909                  ocaml/META
910                  ocaml/Makefile
911                  ocaml/examples/Makefile
912                  perl/Makefile
913                  perl/Makefile.PL
914                  perl/examples/Makefile
915                  php/Makefile
916                  po-docs/Makefile
917                  po-docs/ja/Makefile
918                  po-docs/uk/Makefile
919                  po/Makefile.in
920                  python/Makefile
921                  python/examples/Makefile
922                  regressions/Makefile
923                  rescue/Makefile
924                  resize/Makefile
925                  ruby/Makefile
926                  ruby/Rakefile
927                  ruby/examples/Makefile
928                  src/Makefile
929                  test-tool/Makefile
930                  tools/Makefile])
931 AC_OUTPUT
932
933 dnl Produce summary.
934 echo
935 echo
936 echo "------------------------------------------------------------"
937 echo "Thank you for downloading $PACKAGE_STRING"
938 echo
939 echo "This is how we have configured the optional components for you today:"
940 echo
941 echo    "Daemon .............................. $enable_daemon"
942 echo    "Appliance ........................... $enable_appliance"
943 echo    "QEMU ................................ $QEMU"
944 echo -n "OCaml bindings ...................... "
945 if test "x$HAVE_OCAML_TRUE" = "x"; then echo "yes"; else echo "no"; fi
946 echo -n "Perl bindings ....................... "
947 if test "x$HAVE_PERL_TRUE" = "x"; then echo "yes"; else echo "no"; fi
948 echo -n "Python bindings ..................... "
949 if test "x$HAVE_PYTHON_TRUE" = "x"; then echo "yes"; else echo "no"; fi
950 echo -n "Ruby bindings ....................... "
951 if test "x$HAVE_RUBY_TRUE" = "x"; then echo "yes"; else echo "no"; fi
952 echo -n "Java bindings ....................... "
953 if test "x$HAVE_JAVA_TRUE" = "x"; then echo "yes"; else echo "no"; fi
954 echo -n "Haskell bindings .................... "
955 if test "x$HAVE_HASKELL_TRUE" = "x"; then echo "yes"; else echo "no"; fi
956 echo -n "PHP bindings ........................ "
957 if test "x$HAVE_PHP_TRUE" = "x"; then echo "yes"; else echo "no"; fi
958 echo    "guestfish and C virt tools .......... yes"
959 echo -n "Perl virt tools ..................... "
960 if test "x$HAVE_TOOLS_TRUE" = "x"; then echo "yes"; else echo "no"; fi
961 echo -n "virt-resize ......................... "
962 if test "x$HAVE_OCAML_TRUE" = "x" && test "x$HAVE_OCAML_PCRE_TRUE" = "x"; then echo "yes"; else echo "no"; fi
963 echo "FUSE filesystem ..................... $enable_fuse"
964 echo
965 echo "If any optional component is configured 'no' when you expected 'yes'"
966 echo "then you should check the preceeding messages."
967 echo
968 echo "Please report bugs back to the mailing list:"
969 echo "http://www.redhat.com/mailman/listinfo/libguestfs"
970 echo
971 echo "Next you should type 'make' to build the package,"
972 echo "then 'make check' to run the tests."
973 echo "------------------------------------------------------------"