2 # Copyright (C) 2009-2011 Red Hat Inc.
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.
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.
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.
18 # major/minor/release must be numbers
19 m4_define([hivex_major], [1])
20 m4_define([hivex_minor], [3])
21 m4_define([hivex_release], [2])
22 # extra can be any string
23 m4_define([hivex_extra], [])
25 AC_INIT([hivex],hivex_major.hivex_minor.hivex_release[]hivex_extra)
26 AC_CONFIG_AUX_DIR([build-aux])
27 AM_INIT_AUTOMAKE([foreign])
29 m4_ifndef([AM_SILENT_RULES], [m4_define([AM_SILENT_RULES],[])])
30 AM_SILENT_RULES([yes]) # make --enable-silent-rules the default.
32 AC_CONFIG_MACRO_DIR([m4])
34 dnl Split up the version string.
35 AC_DEFINE([PACKAGE_VERSION_MAJOR],[hivex_major],[Major version number])
36 AC_DEFINE([PACKAGE_VERSION_MINOR],[hivex_minor],[Minor version number])
37 AC_DEFINE([PACKAGE_VERSION_RELEASE],[hivex_release],[Release number])
38 AC_DEFINE([PACKAGE_VERSION_EXTRA],["hivex_extra"],[Extra version string])
45 dnl Check for basic C environment.
50 AC_ARG_ENABLE([gcc-warnings],
51 [AS_HELP_STRING([--enable-gcc-warnings],
52 [turn on lots of GCC warnings (for developers)])],
55 *) AC_MSG_ERROR([bad value $enableval for gcc-warnings option]) ;;
57 gl_gcc_warnings=$enableval],
61 if test "$gl_gcc_warnings" = yes; then
62 gl_WARN_ADD([-Werror], [WERROR_CFLAGS])
63 AC_SUBST([WERROR_CFLAGS])
66 # This, $nw, is the list of warnings we disable.
67 nw="$nw -Wdeclaration-after-statement" # too useful to forbid
68 nw="$nw -Waggregate-return" # anachronistic
69 nw="$nw -Wc++-compat" # We don't care about C++ compilers
70 nw="$nw -Wundef" # Warns on '#if GNULIB_FOO' etc in gnulib
71 nw="$nw -Wtraditional" # Warns on #elif which we use often
72 nw="$nw -Wcast-qual" # Too many warnings for now
73 nw="$nw -Wconversion" # Too many warnings for now
74 nw="$nw -Wsystem-headers" # Don't let system headers trigger warnings
75 nw="$nw -Wsign-conversion" # Too many warnings for now
76 nw="$nw -Wtraditional-conversion" # Too many warnings for now
77 nw="$nw -Wunreachable-code" # Too many warnings for now
78 nw="$nw -Wpadded" # Our structs are not padded
79 nw="$nw -Wredundant-decls" # openat.h declares e.g., mkdirat
80 nw="$nw -Wlogical-op" # any use of fwrite provokes this
81 nw="$nw -Wvla" # two warnings in mount.c
82 # things I might fix soon:
83 nw="$nw -Wmissing-format-attribute" # daemon.h's asprintf_nowarn
84 nw="$nw -Winline" # daemon.h's asprintf_nowarn
85 nw="$nw -Wshadow" # numerous, plus we're not unanimous
86 # ?? -Wstrict-overflow
87 nw="$nw -Wunsafe-loop-optimizations" # just a warning that an optimization
88 # was not possible, safe to ignore
89 nw="$nw -Wpacked" # Allow attribute((packed)) on structs
90 nw="$nw -Wlong-long" # Allow long long since it's required
93 gl_MANYWARN_ALL_GCC([ws])
94 gl_MANYWARN_COMPLEMENT([ws], [$ws], [$nw])
98 gl_WARN_ADD([-Wno-unused-parameter]) # stubs.c
99 gl_WARN_ADD([-Wno-jump-misses-init]) # stubs.c
100 gl_WARN_ADD([-Wno-unused-variable]) # FIXME: only temporary, for guestfs_protocol.c, etc
102 # In spite of excluding -Wlogical-op above, it is enabled, as of
103 # gcc 4.5.0 20090517, and it provokes warnings in cat.c, dd.c, truncate.c
104 gl_WARN_ADD([-Wno-logical-op])
106 gl_WARN_ADD([-fdiagnostics-show-option])
108 AC_SUBST([WARN_CFLAGS])
110 AC_DEFINE([lint], [1], [Define to 1 if the compiler is checking for lint.])
111 AC_DEFINE([_FORTIFY_SOURCE], [2],
112 [enable compile-time and run-time bounds-checking, and some warnings])
113 AC_DEFINE([GNULIB_PORTCHECK], [1], [enable some gnulib portability checks])
117 test "x$U" != "x" && AC_MSG_ERROR([Compiler not ANSI compliant])
121 dnl Work out how to specify the linker script to the linker.
122 VERSION_SCRIPT_FLAGS=-Wl,--version-script=
123 `/usr/bin/ld --help 2>&1 | grep -- --version-script >/dev/null` || \
124 VERSION_SCRIPT_FLAGS="-Wl,-M -Wl,"
125 AC_SUBST(VERSION_SCRIPT_FLAGS)
127 dnl Check support for 64 bit file offsets.
130 dnl Check sizeof long.
131 AC_CHECK_SIZEOF([long])
134 AC_CHECK_HEADERS([byteswap.h endian.h libintl.h])
137 AC_REPLACE_FUNCS([mmap])
140 AC_CHECK_FUNCS([bindtextdomain])
142 dnl Check for pod2man and pod2text.
143 AC_CHECK_PROG([POD2MAN],[pod2man],[pod2man],[no])
144 test "x$POD2MAN" = "xno" &&
145 AC_MSG_ERROR([pod2man must be installed])
146 AC_CHECK_PROG([POD2TEXT],[pod2text],[pod2text],[no])
147 test "x$POD2TEXT" = "xno" &&
148 AC_MSG_ERROR([pod2text must be installed])
151 AC_ARG_WITH([readline],
152 [AS_HELP_STRING([--with-readline],
153 [support fancy command line editing @<:@default=check@:>@])],
155 [with_readline=check])
158 AS_IF([test "x$with_readline" != xno],
159 [AC_CHECK_LIB([readline], [main],
160 [AC_SUBST([LIBREADLINE], ["-lreadline"])
161 AC_DEFINE([HAVE_LIBREADLINE], [1],
162 [Define if you have libreadline])
164 [if test "x$with_readline" != xcheck; then
166 [--with-readline was given, but test for readline failed])
171 AM_GNU_GETTEXT([external])
172 AM_GNU_GETTEXT_VERSION([0.17])
175 PKG_CHECK_MODULES([LIBXML2], [libxml-2.0])
176 AC_SUBST([LIBXML2_CFLAGS])
177 AC_SUBST([LIBXML2_LIBS])
179 dnl hivexsh depends on open_memstream, which is absent on OS X.
180 AC_CHECK_FUNC([open_memstream])
181 AM_CONDITIONAL([HAVE_HIVEXSH],[test "x$ac_cv_func_open_memstream" = "xyes"])
183 dnl Check for OCaml (optional, for OCaml bindings).
186 AM_CONDITIONAL([HAVE_OCAML],
187 [test "x$OCAMLC" != "xno" && test "x$OCAMLFIND" != "xno"])
188 AM_CONDITIONAL([HAVE_OCAMLOPT],
189 [test "x$OCAMLOPT" != "xno" && test "x$OCAMLFIND" != "xno"])
191 if test "x$OCAMLC" != "xno"; then
192 dnl Check if we have caml/unixsupport.h header (OCaml bindings only).
194 CFLAGS="$CFLAGS -I$OCAMLLIB"
195 AC_CHECK_HEADERS([caml/unixsupport.h],[],[],
197 #include <caml/config.h>
198 #include <caml/mlvalues.h>
202 dnl Do we have function caml_raise_with_args?
203 f=caml_raise_with_args
204 AC_MSG_CHECKING([for function $f])
205 echo "char $f (); char foo() { return $f (); }" > conftest.c
208 if $OCAMLC -c conftest.c 2>/dev/null && \
209 $OCAMLC -c conftest_ml.ml 2>/dev/null && \
210 $OCAMLC conftest.o conftest_ml.cmo -o conftest 2>/dev/null ; then
211 AC_DEFINE([HAVE_CAML_RAISE_WITH_ARGS],[1],
212 [Defined if function caml_raise_with_args exists.])
213 AC_MSG_RESULT([found])
215 AC_MSG_RESULT([not found])
217 rm -f conftest conftest.* conftest_ml.*
220 dnl Check for Perl (optional, for Perl bindings).
221 dnl XXX This isn't quite right, we should check for Perl devel library.
222 AC_CHECK_PROG([PERL],[perl],[perl],[no])
224 dnl Check for Perl modules that must be present to compile and
225 dnl test the Perl bindings.
226 missing_perl_modules=no
227 for pm in Test::More ExtUtils::MakeMaker IO::Stringy; do
228 AC_MSG_CHECKING([for $pm])
229 if ! perl -M$pm -e1 >/dev/null 2>&1; then
231 missing_perl_modules=yes
236 if test "x$missing_perl_modules" = "xyes"; then
237 AC_MSG_WARN([some Perl modules required to compile or test the Perl bindings are missing])
240 AM_CONDITIONAL([HAVE_PERL],
241 [test "x$PERL" != "xno" && test "x$missing_perl_modules" != "xyes"])
243 dnl Check for Python (optional, for Python bindings).
249 AC_CHECK_PROG([PYTHON],[python],[python],[no])
251 if test "x$PYTHON" != "xno"; then
252 AC_MSG_CHECKING([Python prefix])
253 PYTHON_PREFIX=`$PYTHON -c "import sys; print (sys.prefix)"`
254 AC_MSG_RESULT([$PYTHON_PREFIX])
256 AC_MSG_CHECKING([Python version])
257 PYTHON_VERSION_MAJOR=`$PYTHON -c "import sys; print (sys.version_info@<:@0@:>@)"`
258 PYTHON_VERSION_MINOR=`$PYTHON -c "import sys; print (sys.version_info@<:@1@:>@)"`
259 PYTHON_VERSION="$PYTHON_VERSION_MAJOR.$PYTHON_VERSION_MINOR"
260 AC_MSG_RESULT([$PYTHON_VERSION])
262 AC_MSG_CHECKING([for Python include path])
263 if test -z "$PYTHON_INCLUDEDIR"; then
264 python_path=`$PYTHON -c "import distutils.sysconfig; \
265 print (distutils.sysconfig.get_python_inc ());"`
266 PYTHON_INCLUDEDIR=$python_path
268 AC_MSG_RESULT([$PYTHON_INCLUDEDIR])
270 AC_ARG_WITH([python-installdir],
271 [AS_HELP_STRING([--with-python-installdir],
272 [directory to install python modules @<:@default=check@:>@])],
273 [PYTHON_INSTALLDIR="$withval"
274 AC_MSG_NOTICE([Python install dir $PYTHON_INSTALLDIR])],
275 [PYTHON_INSTALLDIR=check])
277 if test "x$PYTHON_INSTALLDIR" = "xcheck"; then
279 AC_MSG_CHECKING([for Python site-packages path])
280 if test -z "$PYTHON_INSTALLDIR"; then
281 PYTHON_INSTALLDIR=`$PYTHON -c "import distutils.sysconfig; \
282 print (distutils.sysconfig.get_python_lib(1,0));"`
284 AC_MSG_RESULT([$PYTHON_INSTALLDIR])
287 dnl Look for libpython and some optional symbols in it.
289 if test "x$PYTHON_VERSION_MAJOR" = "x3"; then
290 dnl libpython3 is called "libpython3.Xmu.so"
291 LIBPYTHON="python${PYTHON_VERSION}mu"
293 LIBPYTHON="python$PYTHON_VERSION"
295 AC_CHECK_LIB([$LIBPYTHON], [PyList_Size], [],
296 [AC_MSG_FAILURE([$LIBPYTHON is not installed])])
298 AC_CHECK_FUNCS([PyCapsule_New \
303 AC_SUBST(PYTHON_PREFIX)
304 AC_SUBST(PYTHON_VERSION)
305 AC_SUBST(PYTHON_INCLUDEDIR)
306 AC_SUBST(PYTHON_INSTALLDIR)
308 AM_CONDITIONAL([HAVE_PYTHON],
309 [test "x$PYTHON" != "xno" && test "x$PYTHON_INCLUDEDIR" != "x" && test "x$PYTHON_INSTALLDIR" != "x"])
311 dnl Check for Ruby and rake (optional, for Ruby bindings).
312 AC_CHECK_LIB([ruby],[ruby_init],[HAVE_LIBRUBY=1],[HAVE_LIBRUBY=0])
313 AC_CHECK_PROG([RAKE],[rake],[rake],[no])
315 AM_CONDITIONAL([HAVE_RUBY],
316 [test "x$RAKE" != "xno" && test -n "$HAVE_LIBRUBY"])
318 dnl dnl Check for Java.
319 dnl AC_ARG_WITH(java_home,
320 dnl [AS_HELP_STRING([--with-java-home],
321 dnl [specify path to JDK directory @<:@default=check@:>@])],
323 dnl [with_java_home=check])
325 dnl if test "x$with_java_home" != "xno"; then
326 dnl if test "x$with_java_home" != "xyes" && test "x$with_java_home" != "xcheck"
328 dnl # Reject unsafe characters in $JAVA_HOME
331 dnl case $JAVA_HOME in
332 dnl *[\\\"\#\$\&\'\`$jh_lf\ \ ]*)
333 dnl AC_MSG_FAILURE([unsafe \$JAVA_HOME directory (use --with-java-home=no to disable Java support)]);;
335 dnl if test -d "$with_java_home"; then
336 dnl JAVA_HOME="$with_java_home"
338 dnl AC_MSG_FAILURE([$with_java_home is not a directory (use --with-java-home=no to disable Java support)])
342 dnl if test "x$JAVA_HOME" = "x"; then
343 dnl # Look for Java in some likely locations.
345 dnl /usr/lib/jvm/java \
346 dnl /usr/lib/jvm/java-6-openjdk
348 dnl if test -d $d && test -f $d/bin/java; then
355 dnl if test "x$JAVA_HOME" != "x"; then
356 dnl AC_MSG_CHECKING(for JDK in $JAVA_HOME)
357 dnl if test ! -x "$JAVA_HOME/bin/java"; then
358 dnl AC_MSG_ERROR([missing $JAVA_HOME/bin/java binary (use --with-java-home=no to disable Java support)])
360 dnl JAVA="$JAVA_HOME/bin/java"
362 dnl if test ! -x "$JAVA_HOME/bin/javac"; then
363 dnl AC_MSG_ERROR([missing $JAVA_HOME/bin/javac binary])
365 dnl JAVAC="$JAVA_HOME/bin/javac"
367 dnl if test ! -x "$JAVA_HOME/bin/javah"; then
368 dnl AC_MSG_ERROR([missing $JAVA_HOME/bin/javah binary])
370 dnl JAVAH="$JAVA_HOME/bin/javah"
372 dnl if test ! -x "$JAVA_HOME/bin/javadoc"; then
373 dnl AC_MSG_ERROR([missing $JAVA_HOME/bin/javadoc binary])
375 dnl JAVADOC="$JAVA_HOME/bin/javadoc"
377 dnl if test ! -x "$JAVA_HOME/bin/jar"; then
378 dnl AC_MSG_ERROR([missing $JAVA_HOME/bin/jar binary])
380 dnl JAR="$JAVA_HOME/bin/jar"
382 dnl java_version=`$JAVA -version 2>&1 | grep "java version"`
383 dnl AC_MSG_RESULT(found $java_version in $JAVA_HOME)
386 dnl AC_MSG_CHECKING([for jni.h])
387 dnl if test -f "$JAVA_HOME/include/jni.h"; then
388 dnl JNI_CFLAGS="-I$JAVA_HOME/include"
390 dnl if test "`find $JAVA_HOME -name jni.h`" != ""; then
391 dnl head=`find $JAVA_HOME -name jni.h | tail -1`
392 dnl dir=`dirname "$head"`
393 dnl JNI_CFLAGS="-I$dir"
395 dnl AC_MSG_FAILURE([missing jni.h header file])
398 dnl AC_MSG_RESULT([$JNI_CFLAGS])
400 dnl dnl Find jni_md.h.
401 dnl AC_MSG_CHECKING([for jni_md.h])
402 dnl case "$build_os" in
403 dnl *linux*) system="linux" ;;
404 dnl *SunOS*) system="solaris" ;;
405 dnl *cygwin*) system="win32" ;;
406 dnl *) system="$build_os" ;;
408 dnl if test -f "$JAVA_HOME/include/$system/jni_md.h"; then
409 dnl JNI_CFLAGS="$JNI_CFLAGS -I$JAVA_HOME/include/$system"
411 dnl if test "`find $JAVA_HOME -name jni_md.h`" != ""; then
412 dnl head=`find $JAVA_HOME -name jni_md.h | tail -1`
413 dnl dir=`dirname "$head"`
414 dnl JNI_CFLAGS="$JNI_CFLAGS -I$dir"
416 dnl AC_MSG_FAILURE([missing jni_md.h header file])
419 dnl AC_MSG_RESULT([$JNI_CFLAGS])
421 dnl dnl Need extra version flag?
422 dnl AC_MSG_CHECKING([extra javac flags])
424 dnl javac_version=`$JAVAC -version 2>&1`
425 dnl case "$javac_version" in
427 dnl JAVAC_FLAGS="-source 1.5" ;;
429 dnl AC_MSG_RESULT([$JAVAC_FLAGS])
431 dnl dnl Where to install jarfiles.
432 dnl dnl XXX How to make it configurable?
433 dnl JAR_INSTALL_DIR=\${prefix}/share/java
434 dnl JNI_INSTALL_DIR=\${libdir}
437 dnl jni_major_version=`echo "$VERSION" | awk -F. '{print $1}'`
438 dnl jni_minor_version=`echo "$VERSION" | awk -F. '{print $2}'`
439 dnl jni_micro_version=`echo "$VERSION" | awk -F. '{print $3}'`
440 dnl JNI_VERSION_INFO=`expr "$jni_major_version" + "$jni_minor_version"`":$jni_micro_version:$jni_minor_version"
444 dnl AC_SUBST(JAVA_HOME)
448 dnl AC_SUBST(JAVADOC)
450 dnl AC_SUBST(JNI_CFLAGS)
451 dnl AC_SUBST(JAVAC_FLAGS)
452 dnl AC_SUBST(JAR_INSTALL_DIR)
453 dnl AC_SUBST(JNI_INSTALL_DIR)
454 dnl AC_SUBST(JNI_VERSION_INFO)
456 dnl AM_CONDITIONAL([HAVE_JAVA],[test -n "$JAVAC"])
458 dnl dnl Check for Haskell (GHC).
459 dnl AC_CHECK_PROG([GHC],[ghc],[ghc],[no])
461 dnl AM_CONDITIONAL([HAVE_HASKELL],
462 dnl [test "x$GHC" != "xno"])
464 dnl Produce output files.
465 AC_CONFIG_HEADERS([config.h])
466 AC_CONFIG_FILES([Makefile
469 gnulib/tests/Makefile
474 ocaml/Makefile ocaml/META
475 perl/Makefile perl/Makefile.PL
479 ruby/Makefile ruby/Rakefile
482 AC_CONFIG_FILES([python/run-python-tests], [chmod +x python/run-python-tests])
488 echo "------------------------------------------------------------"
489 echo "Thank you for downloading $PACKAGE_STRING"
491 echo "This is how we have configured the optional components for you today:"
493 echo -n "OCaml bindings ...................... "
494 if test "x$HAVE_OCAML_TRUE" = "x"; then echo "yes"; else echo "no"; fi
495 echo -n "Perl bindings ....................... "
496 if test "x$HAVE_PERL_TRUE" = "x"; then echo "yes"; else echo "no"; fi
497 echo -n "Python bindings ..................... "
498 if test "x$HAVE_PYTHON_TRUE" = "x"; then echo "yes"; else echo "no"; fi
499 echo -n "Ruby bindings ....................... "
500 if test "x$HAVE_RUBY_TRUE" = "x"; then echo "yes"; else echo "no"; fi
501 dnl echo -n "Java bindings ....................... "
502 dnl if test "x$HAVE_JAVA_TRUE" = "x"; then echo "yes"; else echo "no"; fi
503 dnl echo -n "Haskell bindings .................... "
504 dnl if test "x$HAVE_HASKELL" = "x"; then echo "yes"; else echo "no"; fi
506 echo "If any optional component is configured 'no' when you expected 'yes'"
507 echo "then you should check the preceeding messages."
509 echo "Please report bugs back to the mailing list:"
510 echo "http://www.redhat.com/mailman/listinfo/libguestfs"
512 echo "Next you should type 'make' to build the package,"
513 echo "then 'make check' to run the tests."
514 echo "------------------------------------------------------------"