Check for febootstrap-to-initramfs --files option.
[libguestfs.git] / configure.ac
1 # libguestfs
2 # Copyright (C) 2009 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 AC_INIT([libguestfs],[1.0.45])
19 AM_INIT_AUTOMAKE
20
21 AC_CONFIG_MACRO_DIR([m4])
22
23 AC_PROG_LIBTOOL
24
25 dnl Check for basic C environment.
26 AC_PROG_CC_STDC
27 AC_PROG_INSTALL
28 AC_PROG_CPP
29
30 AC_C_PROTOTYPES
31 test "x$U" != "x" && AC_MSG_ERROR([Compiler not ANSI compliant])
32
33 AM_PROG_CC_C_O
34
35 dnl Check support for 64 bit file offsets.
36 AC_SYS_LARGEFILE
37
38 dnl Check sizeof long.
39 AC_CHECK_SIZEOF([long])
40
41 dnl Headers.
42 AC_CHECK_HEADERS([errno.h sys/types.h sys/un.h sys/wait.h sys/socket.h])
43
44 dnl Check for rpcgen and XDR library.  rpcgen is optional.
45 AC_CHECK_PROG([RPCGEN],[rpcgen],[rpcgen],[no])
46 AM_CONDITIONAL([HAVE_RPCGEN],[test "x$RPCGEN" != "xno"])
47 AC_CHECK_LIB([portablexdr],[xdrmem_create],[],[
48         AC_SEARCH_LIBS([xdrmem_create],[rpc xdr nsl])
49         ])
50
51 dnl Check for pod2man and pod2text.
52 AC_CHECK_PROG([POD2MAN],[pod2man],[pod2man],[no])
53 test "x$POD2MAN" = "xno" &&
54      AC_MSG_ERROR([pod2man must be installed])
55 AC_CHECK_PROG([POD2TEXT],[pod2text],[pod2text],[no])
56 test "x$POD2TEXT" = "xno" &&
57      AC_MSG_ERROR([pod2text must be installed])
58
59 dnl Check for mksquashfs.
60 AC_PATH_PROGS([MKSQUASHFS],[mksquashfs],[no],
61         [$PATH$PATH_SEPARATOR/usr/sbin$PATH_SEPARATOR/sbin])
62 test "x$MKSQUASHFS" = "xno" && AC_MSG_ERROR([mksquashfs must be installed])
63
64 dnl Check for QEMU for running binaries on this $host_cpu, fall
65 dnl back to basic 'qemu'.  Allow the user to override it.
66 default_qemu="qemu-kvm qemu-system-$host_cpu qemu"
67 AC_ARG_WITH([qemu],
68         [AS_HELP_STRING([--with-qemu],
69           [set default QEMU binary @<:@default=[qemu-kvm] qemu-system-<host> qemu@:>@])],
70         [],
71         [with_qemu="$default_qemu"])
72 AC_PATH_PROGS([QEMU],[$with_qemu],[no],
73         [$PATH$PATH_SEPARATOR/usr/sbin$PATH_SEPARATOR/sbin])
74 test "x$QEMU" = "xno" && AC_MSG_ERROR([qemu must be installed])
75 AC_DEFINE_UNQUOTED([QEMU],["$QEMU"],[Location of qemu binary.])
76
77 dnl Check that the chosen qemu has vmchannel support.
78 dnl http://lists.gnu.org/archive/html/qemu-devel/2009-02/msg01042.html
79 if test "x$vmchannel_test" != "xno"; then
80     AC_MSG_CHECKING([for vmchannel support in $QEMU])
81     vmchannelout=`$QEMU -net channel /dev/zero 2>&1 ||:`
82     echo "vmchannel test command output: $vmchannelout" >&AS_MESSAGE_LOG_FD
83     if ! echo $vmchannelout | grep -sq "vmchannel wrong port number" ; then
84         AC_MSG_RESULT([no])
85         AC_MSG_FAILURE(
86 [I did not find vmchannel support in $QEMU.
87
88 vmchannel support is vital for libguestfs to operate.  You need a version
89 of qemu >= 0.10, or the following patch backported to earlier versions:
90
91 http://lists.gnu.org/archive/html/qemu-devel/2009-02/msg01042.html
92
93 You can override this test by setting the environment variable
94 vmchannel_test=no  However if you don't have vmchannel support
95 in your qemu, then this just delays the pain.
96
97 If I am using the wrong qemu or you want to compile qemu from source
98 and install it in another location, then you should configure with
99 the --with-qemu option.
100 ])
101     fi
102     AC_MSG_RESULT([yes])
103 fi
104
105 dnl Check for febootstrap etc.
106 AC_CHECK_PROG([FEBOOTSTRAP],
107         [febootstrap],[febootstrap],[no])
108 test "x$FEBOOTSTRAP" = "xno" && \
109      AC_MSG_ERROR([febootstrap must be installed])
110 AC_CHECK_PROG([FEBOOTSTRAP_RUN],
111         [febootstrap-run],[febootstrap-run],[no])
112 test "x$FEBOOTSTRAP_RUN" = "xno" && \
113      AC_MSG_ERROR([febootstrap-run must be installed])
114 AC_CHECK_PROG([FEBOOTSTRAP_INSTALL],
115         [febootstrap-install],[febootstrap-install],[no])
116 test "x$FEBOOTSTRAP_INSTALL" = "xno" && \
117      AC_MSG_ERROR([febootstrap-install must be installed])
118 AC_CHECK_PROG([FEBOOTSTRAP_MINIMIZE],
119         [febootstrap-minimize],[febootstrap-minimize],[no])
120 test "x$FEBOOTSTRAP_MINIMIZE" = "xno" && \
121      AC_MSG_ERROR([febootstrap-minimize must be installed])
122 AC_CHECK_PROG([FEBOOTSTRAP_TO_INITRAMFS],
123         [febootstrap-to-initramfs],[febootstrap-to-initramfs],[no])
124 test "x$FEBOOTSTRAP_TO_INITRAMFS" = "xno" && \
125      AC_MSG_ERROR([febootstrap-to-initramfs must be installed])
126
127 dnl Check we have fakechroot >= 2.9 (it's an indirect requirement
128 dnl of febootstrap, but old versions will fail with yum).
129 AC_CHECK_PROG([FAKECHROOT],
130         [fakechroot],[fakechroot],[no])
131 test "x$FAKECHROOT" = "xno" && \
132     AC_MSG_ERROR([fakechroot must be installed])
133
134 AC_MSG_CHECKING([fakechroot version])
135 fakechroot_version=`$FAKECHROOT --version | awk '{print $3}'`
136 if test -z "$fakechroot_version"; then
137     AC_MSG_RESULT([failed])
138     AC_MSG_WARN([fakechroot --version command failed, proceeding anyway])
139 else
140     AC_MSG_RESULT([$fakechroot_version])
141     fakechroot_major=`echo $fakechroot_version | awk -F. '{print $1}'`
142     fakechroot_minor=`echo $fakechroot_version | awk -F. '{print $2}'`
143     if test "$fakechroot_major" -lt 2 -o \
144             \( "$fakechroot_major" -eq 2 -a "$fakechroot_minor" -lt 9 \); then
145         AC_MSG_ERROR([fakechroot version must be >= 2.9])
146     fi
147 fi
148
149 dnl --with-repo to specify a Fedora repository.
150 AC_ARG_WITH([repo],
151         [AS_HELP_STRING([--with-repo],
152           [set name of Fedora repository @<:@default=fedora-11@:>@])],
153         [],
154         [with_repo=fedora-11])
155 REPO="$with_repo"
156 AC_SUBST(REPO)
157 AC_DEFINE_UNQUOTED([REPO],["$REPO"],[Name of Fedora repository.])
158
159 AC_DEFINE_UNQUOTED([host_cpu],["$host_cpu"],[Host architecture.])
160
161 dnl --with-updates to specify a Fedora updates repository.
162 AC_ARG_WITH([updates],
163         [AS_HELP_STRING([--with-updates],
164           [set name of Fedora updates repository @<:@default=updates-released-f11@:>@])],
165         [],
166         [with_updates=updates-released-f11])
167 UPDATES="$with_updates"
168 AC_SUBST(UPDATES)
169 AC_DEFINE_UNQUOTED([UPDATES],["$UPDATES"],[Name of Fedora updates repository.])
170
171 AC_DEFINE_UNQUOTED([host_cpu],["$host_cpu"],[Host architecture.])
172
173 dnl --with-mirror to specify a local Fedora mirror.
174 AC_ARG_WITH([mirror],
175         [AS_HELP_STRING([--with-mirror],
176           [set URI of a local Fedora mirror])],
177         [],
178         [with_mirror=])
179 MIRROR="$with_mirror"
180 AC_SUBST(MIRROR)
181
182 dnl Build the supermin appliance?  Please see README file before
183 dnl enabling this option.
184 AC_ARG_ENABLE([supermin],
185         [AS_HELP_STRING([--enable-supermin],
186           [enable supermin appliance (see README) @<:@default=no@:>@])],
187         [],
188         [enable_supermin=no])
189 AM_CONDITIONAL([SUPERMIN],[test "x$enable_supermin" = "xyes"])
190
191 if test "x$enable_supermin" = "xyes"; then
192     dnl Check febootstrap-to-initramfs accepts the --files option
193     dnl (febootstrap >= 2.2).
194     AC_MSG_CHECKING([for --files support in $FEBOOTSTRAP_TO_INITRAMFS])
195     out=`$FEBOOTSTRAP_TO_INITRAMFS 2>&1 ||:`
196     echo "febootstrap_to_initramfs test command output: $out" >&AS_MESSAGE_LOG_FD
197     if ! echo $out | grep -sq -- "--files" ; then
198         AC_MSG_RESULT([no])
199         AC_MSG_FAILURE(
200 [febootstrap-to-initramfs does not support the --files option.
201
202 To build the supermin appliance, you need to upgrade to the latest
203 version of febootstrap.
204 ])
205     fi
206     AC_MSG_RESULT([yes])
207 fi
208
209 dnl Readline.
210 AC_ARG_WITH([readline],
211     [AS_HELP_STRING([--with-readline],
212         [support fancy command line editing @<:@default=check@:>@])],
213     [],
214     [with_readline=check])
215
216 LIBREADLINE=
217 AS_IF([test "x$with_readline" != xno],
218     [AC_CHECK_LIB([readline], [main],
219         [AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"])
220          AC_DEFINE([HAVE_LIBREADLINE], [1],
221                    [Define if you have libreadline])
222         ],
223         [if test "x$with_readline" != xcheck; then
224          AC_MSG_FAILURE(
225              [--with-readline was given, but test for readline failed])
226          fi
227         ], -lncurses)])
228
229 dnl For i18n.
230 AM_GNU_GETTEXT([external])
231 AM_GNU_GETTEXT_VERSION([0.14])
232
233 dnl Check for OCaml (optional, for OCaml bindings).
234 AC_PROG_OCAML
235 AC_PROG_FINDLIB
236 AM_CONDITIONAL([HAVE_OCAML],[test "x$OCAMLC" != "xno" -a "x$OCAMLFIND" != "xno"])
237
238 dnl Check for Perl (optional, for Perl bindings).
239 dnl XXX This isn't quite right, we should check for Perl devel library.
240 AC_CHECK_PROG([PERL],[perl],[perl],[no])
241
242 dnl Check for Perl modules that must be present to compile and
243 dnl test the Perl bindings.
244 missing_perl_modules=no
245 for pm in Test::More Test::Pod Test::Pod::Coverage ExtUtils::MakeMaker; do
246     AC_MSG_CHECKING([for $pm])
247     if ! perl -M$pm -e1 >/dev/null 2>&1; then
248         AC_MSG_RESULT([no])
249         missing_perl_modules=yes
250     else
251         AC_MSG_RESULT([yes])
252     fi
253 done
254 if test "x$missing_perl_modules" = "xyes"; then
255     AC_MSG_WARN([some Perl modules required to compile or test the Perl bindings are missing])
256 fi
257
258 AM_CONDITIONAL([HAVE_PERL],
259     [test "x$PERL" != "xno" -a "x$missing_perl_modules" != "xyes"])
260
261 dnl Check for Python (optional, for Python bindings).
262 AC_CHECK_PROG([PYTHON],[python],[python],[no])
263
264 PYTHON_PREFIX=
265 PYTHON_VERSION=
266 PYTHON_INCLUDEDIR=
267 PYTHON_SITE_PACKAGES=
268
269 if test "x$PYTHON" != "xno"; then
270     PYTHON_PREFIX=`$PYTHON -c "import sys; print sys.prefix"`
271     PYTHON_VERSION=`$PYTHON -c "import sys; print sys.version[[0:3]]"`
272     for d in \
273         $PYTHON_PREFIX/include/python$PYTHON_VERSION \
274         /usr/include/python$PYTHON_VERSION \
275         /usr/local/include/python$PYTHON_VERSION
276     do
277         AC_MSG_CHECKING([Python.h in $d])
278         if test -r "$d/Python.h"; then
279             AC_MSG_RESULT([found])
280             PYTHON_INCLUDEDIR=$d
281             break
282         fi
283         AC_MSG_RESULT([not found])
284     done
285     for d in \
286         $PYTHON_PREFIX/lib64/python$PYTHON_VERSION/site-packages \
287         $PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages \
288         /usr/lib64/python$PYTHON_VERSION/site-packages \
289         /usr/lib/python$PYTHON_VERSION/site-packages \
290         /usr/local/lib/python$PYTHON_VERSION/site-packages
291     do
292         AC_MSG_CHECKING([for $d])
293         if test -d "$d"; then
294             AC_MSG_RESULT([found])
295             PYTHON_SITE_PACKAGES=$d
296             break
297         fi
298         AC_MSG_RESULT([not found])
299     done
300 fi
301
302 AC_SUBST(PYTHON_PREFIX)
303 AC_SUBST(PYTHON_VERSION)
304 AC_SUBST(PYTHON_INCLUDEDIR)
305 AC_SUBST(PYTHON_SITE_PACKAGES)
306
307 AM_CONDITIONAL([HAVE_PYTHON],
308     [test "x$PYTHON_INCLUDEDIR" != "x" -a "x$PYTHON_SITE_PACKAGES" != "x"])
309
310 dnl Check for Ruby and rake (optional, for Ruby bindings).
311 AC_CHECK_LIB([ruby],[ruby_init],[HAVE_LIBRUBY=1],[HAVE_LIBRUBY=0])
312 AC_CHECK_PROG([RAKE],[rake],[rake],[no])
313
314 AM_CONDITIONAL([HAVE_RUBY],
315     [test "x$RAKE" != "xno" -a -n "$HAVE_LIBRUBY"])
316
317 dnl Check for Java.
318 AC_ARG_WITH(java_home,
319     [AS_HELP_STRING([--with-java-home],
320         [specify path to JDK directory @<:@default=check@:>@])],
321     [],
322     [with_java_home=check])
323
324 if test "x$with_java_home" != "xno"; then
325     if test "x$with_java_home" != "xyes" -a "x$with_java_home" != "xcheck"
326     then
327         if test -d "$with_java_home"; then
328             JAVA_HOME="$with_java_home"
329         else
330             AC_MSG_FAILURE([$with_java_home is not a directory (use --with-java-home=no to disable Java support)])
331         fi
332     fi
333
334     if test "x$JAVA_HOME" = "x"; then
335         # Look for Java in some likely locations.
336         for d in \
337             /usr/lib/jvm/java \
338             /usr/lib/jvm/java-6-openjdk
339         do
340             if test -d $d -a -f $d/bin/java; then
341                 JAVA_HOME=$d
342                 break
343             fi
344         done
345     fi
346
347     if test "x$JAVA_HOME" != "x"; then
348         AC_MSG_CHECKING(for JDK in $JAVA_HOME)
349         if test ! -x "$JAVA_HOME/bin/java"; then
350             AC_MSG_ERROR([missing $JAVA_HOME/bin/java binary (use --with-java-home=no to disable Java support)])
351         else
352             JAVA="$JAVA_HOME/bin/java"
353         fi
354         if test ! -x "$JAVA_HOME/bin/javac"; then
355             AC_MSG_ERROR([missing $JAVA_HOME/bin/javac binary])
356         else
357             JAVAC="$JAVA_HOME/bin/javac"
358         fi
359         if test ! -x "$JAVA_HOME/bin/javah"; then
360             AC_MSG_ERROR([missing $JAVA_HOME/bin/javah binary])
361         else
362             JAVAH="$JAVA_HOME/bin/javah"
363         fi
364         if test ! -x "$JAVA_HOME/bin/javadoc"; then
365             AC_MSG_ERROR([missing $JAVA_HOME/bin/javadoc binary])
366         else
367             JAVADOC="$JAVA_HOME/bin/javadoc"
368         fi
369         if test ! -x "$JAVA_HOME/bin/jar"; then
370             AC_MSG_ERROR([missing $JAVA_HOME/bin/jar binary])
371         else
372             JAR="$JAVA_HOME/bin/jar"
373         fi
374         java_version=`$JAVA -version 2>&1 | grep "java version"`
375         AC_MSG_RESULT(found $java_version in $JAVA_HOME)
376
377         dnl Find jni.h.
378         AC_MSG_CHECKING([for jni.h])
379         if test -f "$JAVA_HOME/include/jni.h"; then
380             JNI_CFLAGS="-I$JAVA_HOME/include"
381         else
382             if test "`find $JAVA_HOME -name jni.h`" != ""; then
383                 head=`find $JAVA_HOME -name jni.h | tail -1`
384                 dir=`dirname $head`
385                 JNI_CFLAGS="-I$dir"
386             else
387                 AC_MSG_FAILURE([missing jni.h header file])
388             fi
389         fi
390         AC_MSG_RESULT([$JNI_CFLAGS])
391
392         dnl Find jni_md.h.
393         AC_MSG_CHECKING([for jni_md.h])
394         case "$build_os" in
395         *linux*) system="linux" ;;
396         *SunOS*) system="solaris" ;;
397         *cygwin*) system="win32" ;;
398         *) system="$build_os" ;;
399         esac
400         if test -f "$JAVA_HOME/include/$system/jni_md.h"; then
401             JNI_CFLAGS="$JNI_CFLAGS -I$JAVA_HOME/include/$system"
402         else
403             if test "`find $JAVA_HOME -name jni_md.h`" != ""; then
404                 head=`find $JAVA_HOME -name jni_md.h | tail -1`
405                 dir=`dirname $head`
406                 JNI_CFLAGS="$JNI_CFLAGS -I$dir"
407             else
408                 AC_MSG_FAILURE([missing jni_md.h header file])
409             fi
410         fi
411         AC_MSG_RESULT([$JNI_CFLAGS])
412
413         dnl Need extra version flag?
414         AC_MSG_CHECKING([extra javac flags])
415         JAVAC_FLAGS=
416         javac_version=`$JAVAC -version 2>&1`
417         case "$javac_version" in
418         *Eclipse*)
419             JAVAC_FLAGS="-source 1.5" ;;
420         esac
421         AC_MSG_RESULT([$JAVAC_FLAGS])
422
423         dnl Where to install jarfiles.
424         dnl XXX How to make it configurable?
425         JAR_INSTALL_DIR=\${prefix}/share/java
426         JNI_INSTALL_DIR=\${libdir}
427
428         dnl JNI version.
429         jni_major_version=`echo $VERSION | awk -F. '{print $1}'`
430         jni_minor_version=`echo $VERSION | awk -F. '{print $2}'`
431         jni_micro_version=`echo $VERSION | awk -F. '{print $3}'`
432         JNI_VERSION_INFO=`expr $jni_major_version + $jni_minor_version`:$jni_micro_version:$jni_minor_version
433     fi
434 fi
435
436 AC_SUBST(JAVA_HOME)
437 AC_SUBST(JAVA)
438 AC_SUBST(JAVAC)
439 AC_SUBST(JAVAH)
440 AC_SUBST(JAVADOC)
441 AC_SUBST(JAR)
442 AC_SUBST(JNI_CFLAGS)
443 AC_SUBST(JAVAC_FLAGS)
444 AC_SUBST(JAR_INSTALL_DIR)
445 AC_SUBST(JNI_INSTALL_DIR)
446 AC_SUBST(JNI_VERSION_INFO)
447
448 AM_CONDITIONAL([HAVE_JAVA],[test -n "$JAVAC"])
449
450 dnl Check for Haskell (GHC).
451 AC_CHECK_PROG([GHC],[ghc],[ghc],[no])
452
453 AM_CONDITIONAL([HAVE_HASKELL],
454     [test "x$GHC" != "xno"])
455
456 dnl Check for Perl modules needed by the inspector.
457 missing_perl_modules=no
458 for pm in Pod::Usage Getopt::Long Sys::Virt Data::Dumper; do
459     AC_MSG_CHECKING([for $pm])
460     if ! perl -M$pm -e1 >/dev/null 2>&1; then
461         AC_MSG_RESULT([no])
462         missing_perl_modules=yes
463     else
464         AC_MSG_RESULT([yes])
465     fi
466 done
467 if test "x$missing_perl_modules" = "xyes"; then
468     AC_MSG_WARN([some Perl modules required to compile virt-inspector are missing])
469 fi
470
471 AM_CONDITIONAL([HAVE_INSPECTOR],
472     [test "x$PERL" != "xno" -a "x$missing_perl_modules" != "xyes"])
473
474 dnl Run in subdirs.
475 AC_CONFIG_SUBDIRS([daemon])
476
477 dnl Produce output files.
478 AC_CONFIG_HEADERS([config.h])
479 AC_CONFIG_FILES([Makefile
480                  src/Makefile fish/Makefile po/Makefile.in examples/Makefile
481                  appliance/Makefile
482                  appliance/make.sh appliance/update.sh
483                  images/Makefile
484                  capitests/Makefile
485                  regressions/Makefile
486                  ocaml/Makefile ocaml/examples/Makefile
487                  perl/Makefile
488                  python/Makefile
489                  ruby/Makefile ruby/Rakefile
490                  java/Makefile
491                  haskell/Makefile
492                  inspector/Makefile
493                  libguestfs.pc
494                  ocaml/META perl/Makefile.PL])
495 AC_OUTPUT
496
497 dnl WTF?
498 chmod +x appliance/make.sh appliance/update.sh
499
500 dnl Produce summary.
501 echo
502 echo
503 echo "------------------------------------------------------------"
504 echo "Thank you for downloading $PACKAGE_STRING"
505 echo
506 echo "This is how we have configured the optional components for you today:"
507 echo
508 echo    "QEMU ................................ $QEMU"
509 echo -n "OCaml bindings ...................... "
510 if test "x$HAVE_OCAML_TRUE" = "x"; then echo "yes"; else echo "no"; fi
511 echo -n "Perl bindings ....................... "
512 if test "x$HAVE_PERL_TRUE" = "x"; then echo "yes"; else echo "no"; fi
513 echo -n "Python bindings ..................... "
514 if test "x$HAVE_PYTHON_TRUE" = "x"; then echo "yes"; else echo "no"; fi
515 echo -n "Ruby bindings ....................... "
516 if test "x$HAVE_RUBY_TRUE" = "x"; then echo "yes"; else echo "no"; fi
517 echo -n "Java bindings ....................... "
518 if test "x$HAVE_JAVA_TRUE" = "x"; then echo "yes"; else echo "no"; fi
519 echo -n "Haskell bindings .................... "
520 if test "x$HAVE_HASKELL" = "x"; then echo "yes"; else echo "no"; fi
521 echo -n "virt-inspector ...................... "
522 if test "x$HAVE_INSPECTOR" = "x"; then echo "yes"; else echo "no"; fi
523 echo "supermin appliance .................. $enable_supermin"
524 echo
525 echo "If any optional component is configured 'no' when you expected 'yes'"
526 echo "then you should check the preceeding messages."
527 echo
528 echo "Please report bugs back to the fedora-virt mailing list:"
529 echo "http://www.redhat.com/mailman/listinfo/fedora-virt"
530 echo
531 echo "Next you should type 'make' to build the package,"
532 echo "then 'make check' to run the tests."
533 echo "------------------------------------------------------------"