9d04e35be89d616418895aaec591f3bbb150800d
[hivex.git] / configure.ac
1 # hivex
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 # major/minor/release must be numbers
19 m4_define([hivex_major],   [1])
20 m4_define([hivex_minor],   [3])
21 m4_define([hivex_release], [1])
22 # extra can be any string
23 m4_define([hivex_extra],   [])
24
25 AC_INIT([hivex],hivex_major.hivex_minor.hivex_release[]hivex_extra)
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 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])
39
40 gl_EARLY
41 gl_INIT
42
43 AM_PROG_LIBTOOL
44
45 dnl Check for basic C environment.
46 AC_PROG_CC_STDC
47 AC_PROG_INSTALL
48 AC_PROG_CPP
49
50 AC_ARG_ENABLE([gcc-warnings],
51   [AS_HELP_STRING([--enable-gcc-warnings],
52                   [turn on lots of GCC warnings (for developers)])],
53   [case $enableval in
54      yes|no) ;;
55      *)      AC_MSG_ERROR([bad value $enableval for gcc-warnings option]) ;;
56    esac
57    gl_gcc_warnings=$enableval],
58   [gl_gcc_warnings=no]
59 )
60
61 if test "$gl_gcc_warnings" = yes; then
62   gl_WARN_ADD([-Werror], [WERROR_CFLAGS])
63   AC_SUBST([WERROR_CFLAGS])
64
65   nw=
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
91                                     # by xstrtoll.
92
93   gl_MANYWARN_ALL_GCC([ws])
94   gl_MANYWARN_COMPLEMENT([ws], [$ws], [$nw])
95   for w in $ws; do
96     gl_WARN_ADD([$w])
97   done
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
101
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])
105
106   gl_WARN_ADD([-fdiagnostics-show-option])
107
108   AC_SUBST([WARN_CFLAGS])
109
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])
114 fi
115
116 AC_C_PROTOTYPES
117 test "x$U" != "x" && AC_MSG_ERROR([Compiler not ANSI compliant])
118
119 AM_PROG_CC_C_O
120
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)
126
127 dnl Check support for 64 bit file offsets.
128 AC_SYS_LARGEFILE
129
130 dnl Check sizeof long.
131 AC_CHECK_SIZEOF([long])
132
133 dnl Headers.
134 AC_CHECK_HEADERS([byteswap.h endian.h libintl.h])
135
136 dnl Check for mmap
137 AC_REPLACE_FUNCS([mmap])
138
139 dnl Functions.
140 AC_CHECK_FUNCS([bindtextdomain])
141
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])
149
150 dnl Readline.
151 AC_ARG_WITH([readline],
152     [AS_HELP_STRING([--with-readline],
153         [support fancy command line editing @<:@default=check@:>@])],
154     [],
155     [with_readline=check])
156
157 LIBREADLINE=
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])
163         ],
164         [if test "x$with_readline" != xcheck; then
165          AC_MSG_FAILURE(
166              [--with-readline was given, but test for readline failed])
167          fi
168         ])])
169
170 dnl For i18n.
171 AM_GNU_GETTEXT([external])
172 AM_GNU_GETTEXT_VERSION([0.17])
173
174 dnl libxml2.
175 PKG_CHECK_MODULES([LIBXML2], [libxml-2.0])
176 AC_SUBST([LIBXML2_CFLAGS])
177 AC_SUBST([LIBXML2_LIBS])
178
179 dnl Check for OCaml (optional, for OCaml bindings).
180 AC_PROG_OCAML
181 AC_PROG_FINDLIB
182 AM_CONDITIONAL([HAVE_OCAML],
183     [test "x$OCAMLC" != "xno" && test "x$OCAMLFIND" != "xno"])
184 AM_CONDITIONAL([HAVE_OCAMLOPT],
185     [test "x$OCAMLOPT" != "xno" && test "x$OCAMLFIND" != "xno"])
186
187 if test "x$OCAMLC" != "xno"; then
188     dnl Check if we have caml/unixsupport.h header (OCaml bindings only).
189     old_CFLAGS="$CFLAGS"
190     CFLAGS="$CFLAGS -I$OCAMLLIB"
191     AC_CHECK_HEADERS([caml/unixsupport.h],[],[],
192     [
193     #include <caml/config.h>
194     #include <caml/mlvalues.h>
195     ])
196     CFLAGS="$old_CFLAGS"
197
198     dnl Do we have function caml_raise_with_args?
199     f=caml_raise_with_args
200     AC_MSG_CHECKING([for function $f])
201     echo "char $f (); char foo() { return $f (); }" > conftest.c
202     rm -f conftest_ml.ml
203     touch conftest_ml.ml
204     if $OCAMLC -c conftest.c 2>/dev/null && \
205        $OCAMLC -c conftest_ml.ml 2>/dev/null && \
206        $OCAMLC conftest.o conftest_ml.cmo -o conftest 2>/dev/null ; then
207         AC_DEFINE([HAVE_CAML_RAISE_WITH_ARGS],[1],
208                   [Defined if function caml_raise_with_args exists.])
209         AC_MSG_RESULT([found])
210     else
211         AC_MSG_RESULT([not found])
212     fi
213     rm -f conftest conftest.* conftest_ml.*
214 fi
215
216 dnl Check for Perl (optional, for Perl bindings).
217 dnl XXX This isn't quite right, we should check for Perl devel library.
218 AC_CHECK_PROG([PERL],[perl],[perl],[no])
219
220 dnl Check for Perl modules that must be present to compile and
221 dnl test the Perl bindings.
222 missing_perl_modules=no
223 for pm in Test::More ExtUtils::MakeMaker IO::Stringy; do
224     AC_MSG_CHECKING([for $pm])
225     if ! perl -M$pm -e1 >/dev/null 2>&1; then
226         AC_MSG_RESULT([no])
227         missing_perl_modules=yes
228     else
229         AC_MSG_RESULT([yes])
230     fi
231 done
232 if test "x$missing_perl_modules" = "xyes"; then
233     AC_MSG_WARN([some Perl modules required to compile or test the Perl bindings are missing])
234 fi
235
236 AM_CONDITIONAL([HAVE_PERL],
237     [test "x$PERL" != "xno" && test "x$missing_perl_modules" != "xyes"])
238
239 dnl Check for Python (optional, for Python bindings).
240 AC_CHECK_PROG([PYTHON],[python],[python],[no])
241
242 PYTHON_PREFIX=
243 PYTHON_VERSION=
244
245 if test "x$PYTHON" != "xno"; then
246     PYTHON_PREFIX=`$PYTHON -c "import sys; print(sys.prefix)"`
247     PYTHON_VERSION=`$PYTHON -c "import sys; print(sys.version[[0:3]])"`
248
249     AC_MSG_CHECKING([for Python include path])
250     if test -z "$PYTHON_INCLUDEDIR"; then
251         python_path=`$PYTHON -c "import distutils.sysconfig; \
252                                  print (distutils.sysconfig.get_python_inc ());"`
253         PYTHON_INCLUDEDIR=$python_path
254     fi
255     AC_MSG_RESULT([$PYTHON_INCLUDEDIR])
256
257     AC_MSG_CHECKING([for Python site-packages path])
258     if test -z "$PYTHON_SITE_PACKAGES"; then
259         PYTHON_SITE_PACKAGES=`$PYTHON -c "import distutils.sysconfig; \
260                 print (distutils.sysconfig.get_python_lib(1,0));"`
261     fi
262     AC_MSG_RESULT([$PYTHON_SITE_PACKAGES])
263
264     old_LIBS="$LIBS"
265     LIBS="$LIBS -lpython$PYTHON_VERSION"
266     AC_CHECK_FUNCS([PyCapsule_New])
267     LIBS="$old_LIBS"
268 fi
269
270 AC_SUBST(PYTHON_PREFIX)
271 AC_SUBST(PYTHON_VERSION)
272 AC_SUBST(PYTHON_INCLUDEDIR)
273 AC_SUBST(PYTHON_SITE_PACKAGES)
274
275 AM_CONDITIONAL([HAVE_PYTHON],
276     [test "x$PYTHON_INCLUDEDIR" != "x" && test "x$PYTHON_SITE_PACKAGES" != "x"])
277
278 dnl Check for Ruby and rake (optional, for Ruby bindings).
279 AC_CHECK_LIB([ruby],[ruby_init],[HAVE_LIBRUBY=1],[HAVE_LIBRUBY=0])
280 AC_CHECK_PROG([RAKE],[rake],[rake],[no])
281
282 AM_CONDITIONAL([HAVE_RUBY],
283     [test "x$RAKE" != "xno" && test -n "$HAVE_LIBRUBY"])
284
285 dnl dnl Check for Java.
286 dnl AC_ARG_WITH(java_home,
287 dnl     [AS_HELP_STRING([--with-java-home],
288 dnl         [specify path to JDK directory @<:@default=check@:>@])],
289 dnl     [],
290 dnl     [with_java_home=check])
291
292 dnl if test "x$with_java_home" != "xno"; then
293 dnl     if test "x$with_java_home" != "xyes" && test "x$with_java_home" != "xcheck"
294 dnl     then
295 dnl         # Reject unsafe characters in $JAVA_HOME
296 dnl         jh_lf='
297 dnl '
298 dnl         case $JAVA_HOME in
299 dnl           *[\\\"\#\$\&\'\`$jh_lf\ \ ]*)
300 dnl             AC_MSG_FAILURE([unsafe \$JAVA_HOME directory (use --with-java-home=no to disable Java support)]);;
301 dnl         esac
302 dnl         if test -d "$with_java_home"; then
303 dnl             JAVA_HOME="$with_java_home"
304 dnl         else
305 dnl             AC_MSG_FAILURE([$with_java_home is not a directory (use --with-java-home=no to disable Java support)])
306 dnl         fi
307 dnl     fi
308
309 dnl     if test "x$JAVA_HOME" = "x"; then
310 dnl         # Look for Java in some likely locations.
311 dnl         for d in \
312 dnl             /usr/lib/jvm/java \
313 dnl             /usr/lib/jvm/java-6-openjdk
314 dnl         do
315 dnl             if test -d $d && test -f $d/bin/java; then
316 dnl                 JAVA_HOME=$d
317 dnl                 break
318 dnl             fi
319 dnl         done
320 dnl     fi
321
322 dnl     if test "x$JAVA_HOME" != "x"; then
323 dnl         AC_MSG_CHECKING(for JDK in $JAVA_HOME)
324 dnl         if test ! -x "$JAVA_HOME/bin/java"; then
325 dnl             AC_MSG_ERROR([missing $JAVA_HOME/bin/java binary (use --with-java-home=no to disable Java support)])
326 dnl         else
327 dnl             JAVA="$JAVA_HOME/bin/java"
328 dnl         fi
329 dnl         if test ! -x "$JAVA_HOME/bin/javac"; then
330 dnl             AC_MSG_ERROR([missing $JAVA_HOME/bin/javac binary])
331 dnl         else
332 dnl             JAVAC="$JAVA_HOME/bin/javac"
333 dnl         fi
334 dnl         if test ! -x "$JAVA_HOME/bin/javah"; then
335 dnl             AC_MSG_ERROR([missing $JAVA_HOME/bin/javah binary])
336 dnl         else
337 dnl             JAVAH="$JAVA_HOME/bin/javah"
338 dnl         fi
339 dnl         if test ! -x "$JAVA_HOME/bin/javadoc"; then
340 dnl             AC_MSG_ERROR([missing $JAVA_HOME/bin/javadoc binary])
341 dnl         else
342 dnl             JAVADOC="$JAVA_HOME/bin/javadoc"
343 dnl         fi
344 dnl         if test ! -x "$JAVA_HOME/bin/jar"; then
345 dnl             AC_MSG_ERROR([missing $JAVA_HOME/bin/jar binary])
346 dnl         else
347 dnl             JAR="$JAVA_HOME/bin/jar"
348 dnl         fi
349 dnl         java_version=`$JAVA -version 2>&1 | grep "java version"`
350 dnl         AC_MSG_RESULT(found $java_version in $JAVA_HOME)
351
352 dnl         dnl Find jni.h.
353 dnl         AC_MSG_CHECKING([for jni.h])
354 dnl         if test -f "$JAVA_HOME/include/jni.h"; then
355 dnl             JNI_CFLAGS="-I$JAVA_HOME/include"
356 dnl         else
357 dnl             if test "`find $JAVA_HOME -name jni.h`" != ""; then
358 dnl                 head=`find $JAVA_HOME -name jni.h | tail -1`
359 dnl                 dir=`dirname "$head"`
360 dnl                 JNI_CFLAGS="-I$dir"
361 dnl             else
362 dnl                 AC_MSG_FAILURE([missing jni.h header file])
363 dnl             fi
364 dnl         fi
365 dnl         AC_MSG_RESULT([$JNI_CFLAGS])
366
367 dnl         dnl Find jni_md.h.
368 dnl         AC_MSG_CHECKING([for jni_md.h])
369 dnl         case "$build_os" in
370 dnl         *linux*) system="linux" ;;
371 dnl         *SunOS*) system="solaris" ;;
372 dnl         *cygwin*) system="win32" ;;
373 dnl         *) system="$build_os" ;;
374 dnl         esac
375 dnl         if test -f "$JAVA_HOME/include/$system/jni_md.h"; then
376 dnl             JNI_CFLAGS="$JNI_CFLAGS -I$JAVA_HOME/include/$system"
377 dnl         else
378 dnl             if test "`find $JAVA_HOME -name jni_md.h`" != ""; then
379 dnl                 head=`find $JAVA_HOME -name jni_md.h | tail -1`
380 dnl                 dir=`dirname "$head"`
381 dnl                 JNI_CFLAGS="$JNI_CFLAGS -I$dir"
382 dnl             else
383 dnl                 AC_MSG_FAILURE([missing jni_md.h header file])
384 dnl             fi
385 dnl         fi
386 dnl         AC_MSG_RESULT([$JNI_CFLAGS])
387
388 dnl         dnl Need extra version flag?
389 dnl         AC_MSG_CHECKING([extra javac flags])
390 dnl         JAVAC_FLAGS=
391 dnl         javac_version=`$JAVAC -version 2>&1`
392 dnl         case "$javac_version" in
393 dnl         *Eclipse*)
394 dnl             JAVAC_FLAGS="-source 1.5" ;;
395 dnl         esac
396 dnl         AC_MSG_RESULT([$JAVAC_FLAGS])
397
398 dnl         dnl Where to install jarfiles.
399 dnl         dnl XXX How to make it configurable?
400 dnl         JAR_INSTALL_DIR=\${prefix}/share/java
401 dnl         JNI_INSTALL_DIR=\${libdir}
402
403 dnl         dnl JNI version.
404 dnl         jni_major_version=`echo "$VERSION" | awk -F. '{print $1}'`
405 dnl         jni_minor_version=`echo "$VERSION" | awk -F. '{print $2}'`
406 dnl         jni_micro_version=`echo "$VERSION" | awk -F. '{print $3}'`
407 dnl         JNI_VERSION_INFO=`expr "$jni_major_version" + "$jni_minor_version"`":$jni_micro_version:$jni_minor_version"
408 dnl     fi
409 dnl fi
410
411 dnl AC_SUBST(JAVA_HOME)
412 dnl AC_SUBST(JAVA)
413 dnl AC_SUBST(JAVAC)
414 dnl AC_SUBST(JAVAH)
415 dnl AC_SUBST(JAVADOC)
416 dnl AC_SUBST(JAR)
417 dnl AC_SUBST(JNI_CFLAGS)
418 dnl AC_SUBST(JAVAC_FLAGS)
419 dnl AC_SUBST(JAR_INSTALL_DIR)
420 dnl AC_SUBST(JNI_INSTALL_DIR)
421 dnl AC_SUBST(JNI_VERSION_INFO)
422
423 dnl AM_CONDITIONAL([HAVE_JAVA],[test -n "$JAVAC"])
424
425 dnl dnl Check for Haskell (GHC).
426 dnl AC_CHECK_PROG([GHC],[ghc],[ghc],[no])
427
428 dnl AM_CONDITIONAL([HAVE_HASKELL],
429 dnl     [test "x$GHC" != "xno"])
430
431 dnl Produce output files.
432 AC_CONFIG_HEADERS([config.h])
433 AC_CONFIG_FILES([Makefile
434                  generator/Makefile
435                  gnulib/lib/Makefile
436                  gnulib/tests/Makefile
437                  hivex.pc
438                  images/Makefile
439                  lib/Makefile
440                  lib/tools/Makefile
441                  ocaml/Makefile ocaml/META
442                  perl/Makefile perl/Makefile.PL
443                  python/Makefile
444                  po/Makefile.in
445                  regedit/Makefile
446                  ruby/Makefile ruby/Rakefile
447                  sh/Makefile
448                  xml/Makefile])
449 AC_CONFIG_FILES([python/run-python-tests], [chmod +x python/run-python-tests])
450 AC_OUTPUT
451
452 dnl Produce summary.
453 echo
454 echo
455 echo "------------------------------------------------------------"
456 echo "Thank you for downloading $PACKAGE_STRING"
457 echo
458 echo "This is how we have configured the optional components for you today:"
459 echo
460 echo -n "OCaml bindings ...................... "
461 if test "x$HAVE_OCAML_TRUE" = "x"; then echo "yes"; else echo "no"; fi
462 echo -n "Perl bindings ....................... "
463 if test "x$HAVE_PERL_TRUE" = "x"; then echo "yes"; else echo "no"; fi
464 echo -n "Python bindings ..................... "
465 if test "x$HAVE_PYTHON_TRUE" = "x"; then echo "yes"; else echo "no"; fi
466 echo -n "Ruby bindings ....................... "
467 if test "x$HAVE_RUBY_TRUE" = "x"; then echo "yes"; else echo "no"; fi
468 dnl echo -n "Java bindings ....................... "
469 dnl if test "x$HAVE_JAVA_TRUE" = "x"; then echo "yes"; else echo "no"; fi
470 dnl echo -n "Haskell bindings .................... "
471 dnl if test "x$HAVE_HASKELL" = "x"; then echo "yes"; else echo "no"; fi
472 echo
473 echo "If any optional component is configured 'no' when you expected 'yes'"
474 echo "then you should check the preceeding messages."
475 echo
476 echo "Please report bugs back to the mailing list:"
477 echo "http://www.redhat.com/mailman/listinfo/libguestfs"
478 echo
479 echo "Next you should type 'make' to build the package,"
480 echo "then 'make check' to run the tests."
481 echo "------------------------------------------------------------"