regedit: Fix syntax for deleting registry keys (RHBZ#737944).
[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 open_memstream])
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 hivexsh depends on open_memstream, which is absent on OS X.
180 AM_CONDITIONAL([HAVE_HIVEXSH],[test "x$HAVE_OPEN_MEMSTREAM" = "xyes"])
181
182 dnl Check for OCaml (optional, for OCaml bindings).
183 AC_PROG_OCAML
184 AC_PROG_FINDLIB
185 AM_CONDITIONAL([HAVE_OCAML],
186     [test "x$OCAMLC" != "xno" && test "x$OCAMLFIND" != "xno"])
187 AM_CONDITIONAL([HAVE_OCAMLOPT],
188     [test "x$OCAMLOPT" != "xno" && test "x$OCAMLFIND" != "xno"])
189
190 if test "x$OCAMLC" != "xno"; then
191     dnl Check if we have caml/unixsupport.h header (OCaml bindings only).
192     old_CFLAGS="$CFLAGS"
193     CFLAGS="$CFLAGS -I$OCAMLLIB"
194     AC_CHECK_HEADERS([caml/unixsupport.h],[],[],
195     [
196     #include <caml/config.h>
197     #include <caml/mlvalues.h>
198     ])
199     CFLAGS="$old_CFLAGS"
200
201     dnl Do we have function caml_raise_with_args?
202     f=caml_raise_with_args
203     AC_MSG_CHECKING([for function $f])
204     echo "char $f (); char foo() { return $f (); }" > conftest.c
205     rm -f conftest_ml.ml
206     touch conftest_ml.ml
207     if $OCAMLC -c conftest.c 2>/dev/null && \
208        $OCAMLC -c conftest_ml.ml 2>/dev/null && \
209        $OCAMLC conftest.o conftest_ml.cmo -o conftest 2>/dev/null ; then
210         AC_DEFINE([HAVE_CAML_RAISE_WITH_ARGS],[1],
211                   [Defined if function caml_raise_with_args exists.])
212         AC_MSG_RESULT([found])
213     else
214         AC_MSG_RESULT([not found])
215     fi
216     rm -f conftest conftest.* conftest_ml.*
217 fi
218
219 dnl Check for Perl (optional, for Perl bindings).
220 dnl XXX This isn't quite right, we should check for Perl devel library.
221 AC_CHECK_PROG([PERL],[perl],[perl],[no])
222
223 dnl Check for Perl modules that must be present to compile and
224 dnl test the Perl bindings.
225 missing_perl_modules=no
226 for pm in Test::More ExtUtils::MakeMaker IO::Stringy; do
227     AC_MSG_CHECKING([for $pm])
228     if ! perl -M$pm -e1 >/dev/null 2>&1; then
229         AC_MSG_RESULT([no])
230         missing_perl_modules=yes
231     else
232         AC_MSG_RESULT([yes])
233     fi
234 done
235 if test "x$missing_perl_modules" = "xyes"; then
236     AC_MSG_WARN([some Perl modules required to compile or test the Perl bindings are missing])
237 fi
238
239 AM_CONDITIONAL([HAVE_PERL],
240     [test "x$PERL" != "xno" && test "x$missing_perl_modules" != "xyes"])
241
242 dnl Check for Python (optional, for Python bindings).
243 AC_CHECK_PROG([PYTHON],[python],[python],[no])
244
245 PYTHON_PREFIX=
246 PYTHON_VERSION=
247
248 if test "x$PYTHON" != "xno"; then
249     PYTHON_PREFIX=`$PYTHON -c "import sys; print(sys.prefix)"`
250     PYTHON_VERSION=`$PYTHON -c "import sys; print(sys.version[[0:3]])"`
251
252     AC_MSG_CHECKING([for Python include path])
253     if test -z "$PYTHON_INCLUDEDIR"; then
254         python_path=`$PYTHON -c "import distutils.sysconfig; \
255                                  print (distutils.sysconfig.get_python_inc ());"`
256         PYTHON_INCLUDEDIR=$python_path
257     fi
258     AC_MSG_RESULT([$PYTHON_INCLUDEDIR])
259
260     AC_MSG_CHECKING([for Python site-packages path])
261     if test -z "$PYTHON_SITE_PACKAGES"; then
262         PYTHON_SITE_PACKAGES=`$PYTHON -c "import distutils.sysconfig; \
263                 print (distutils.sysconfig.get_python_lib(1,0));"`
264     fi
265     AC_MSG_RESULT([$PYTHON_SITE_PACKAGES])
266
267     old_LIBS="$LIBS"
268     LIBS="$LIBS -lpython$PYTHON_VERSION"
269     AC_CHECK_FUNCS([PyCapsule_New])
270     LIBS="$old_LIBS"
271 fi
272
273 AC_SUBST(PYTHON_PREFIX)
274 AC_SUBST(PYTHON_VERSION)
275 AC_SUBST(PYTHON_INCLUDEDIR)
276 AC_SUBST(PYTHON_SITE_PACKAGES)
277
278 AM_CONDITIONAL([HAVE_PYTHON],
279     [test "x$PYTHON_INCLUDEDIR" != "x" && test "x$PYTHON_SITE_PACKAGES" != "x"])
280
281 dnl Check for Ruby and rake (optional, for Ruby bindings).
282 AC_CHECK_LIB([ruby],[ruby_init],[HAVE_LIBRUBY=1],[HAVE_LIBRUBY=0])
283 AC_CHECK_PROG([RAKE],[rake],[rake],[no])
284
285 AM_CONDITIONAL([HAVE_RUBY],
286     [test "x$RAKE" != "xno" && test -n "$HAVE_LIBRUBY"])
287
288 dnl dnl Check for Java.
289 dnl AC_ARG_WITH(java_home,
290 dnl     [AS_HELP_STRING([--with-java-home],
291 dnl         [specify path to JDK directory @<:@default=check@:>@])],
292 dnl     [],
293 dnl     [with_java_home=check])
294
295 dnl if test "x$with_java_home" != "xno"; then
296 dnl     if test "x$with_java_home" != "xyes" && test "x$with_java_home" != "xcheck"
297 dnl     then
298 dnl         # Reject unsafe characters in $JAVA_HOME
299 dnl         jh_lf='
300 dnl '
301 dnl         case $JAVA_HOME in
302 dnl           *[\\\"\#\$\&\'\`$jh_lf\ \ ]*)
303 dnl             AC_MSG_FAILURE([unsafe \$JAVA_HOME directory (use --with-java-home=no to disable Java support)]);;
304 dnl         esac
305 dnl         if test -d "$with_java_home"; then
306 dnl             JAVA_HOME="$with_java_home"
307 dnl         else
308 dnl             AC_MSG_FAILURE([$with_java_home is not a directory (use --with-java-home=no to disable Java support)])
309 dnl         fi
310 dnl     fi
311
312 dnl     if test "x$JAVA_HOME" = "x"; then
313 dnl         # Look for Java in some likely locations.
314 dnl         for d in \
315 dnl             /usr/lib/jvm/java \
316 dnl             /usr/lib/jvm/java-6-openjdk
317 dnl         do
318 dnl             if test -d $d && test -f $d/bin/java; then
319 dnl                 JAVA_HOME=$d
320 dnl                 break
321 dnl             fi
322 dnl         done
323 dnl     fi
324
325 dnl     if test "x$JAVA_HOME" != "x"; then
326 dnl         AC_MSG_CHECKING(for JDK in $JAVA_HOME)
327 dnl         if test ! -x "$JAVA_HOME/bin/java"; then
328 dnl             AC_MSG_ERROR([missing $JAVA_HOME/bin/java binary (use --with-java-home=no to disable Java support)])
329 dnl         else
330 dnl             JAVA="$JAVA_HOME/bin/java"
331 dnl         fi
332 dnl         if test ! -x "$JAVA_HOME/bin/javac"; then
333 dnl             AC_MSG_ERROR([missing $JAVA_HOME/bin/javac binary])
334 dnl         else
335 dnl             JAVAC="$JAVA_HOME/bin/javac"
336 dnl         fi
337 dnl         if test ! -x "$JAVA_HOME/bin/javah"; then
338 dnl             AC_MSG_ERROR([missing $JAVA_HOME/bin/javah binary])
339 dnl         else
340 dnl             JAVAH="$JAVA_HOME/bin/javah"
341 dnl         fi
342 dnl         if test ! -x "$JAVA_HOME/bin/javadoc"; then
343 dnl             AC_MSG_ERROR([missing $JAVA_HOME/bin/javadoc binary])
344 dnl         else
345 dnl             JAVADOC="$JAVA_HOME/bin/javadoc"
346 dnl         fi
347 dnl         if test ! -x "$JAVA_HOME/bin/jar"; then
348 dnl             AC_MSG_ERROR([missing $JAVA_HOME/bin/jar binary])
349 dnl         else
350 dnl             JAR="$JAVA_HOME/bin/jar"
351 dnl         fi
352 dnl         java_version=`$JAVA -version 2>&1 | grep "java version"`
353 dnl         AC_MSG_RESULT(found $java_version in $JAVA_HOME)
354
355 dnl         dnl Find jni.h.
356 dnl         AC_MSG_CHECKING([for jni.h])
357 dnl         if test -f "$JAVA_HOME/include/jni.h"; then
358 dnl             JNI_CFLAGS="-I$JAVA_HOME/include"
359 dnl         else
360 dnl             if test "`find $JAVA_HOME -name jni.h`" != ""; then
361 dnl                 head=`find $JAVA_HOME -name jni.h | tail -1`
362 dnl                 dir=`dirname "$head"`
363 dnl                 JNI_CFLAGS="-I$dir"
364 dnl             else
365 dnl                 AC_MSG_FAILURE([missing jni.h header file])
366 dnl             fi
367 dnl         fi
368 dnl         AC_MSG_RESULT([$JNI_CFLAGS])
369
370 dnl         dnl Find jni_md.h.
371 dnl         AC_MSG_CHECKING([for jni_md.h])
372 dnl         case "$build_os" in
373 dnl         *linux*) system="linux" ;;
374 dnl         *SunOS*) system="solaris" ;;
375 dnl         *cygwin*) system="win32" ;;
376 dnl         *) system="$build_os" ;;
377 dnl         esac
378 dnl         if test -f "$JAVA_HOME/include/$system/jni_md.h"; then
379 dnl             JNI_CFLAGS="$JNI_CFLAGS -I$JAVA_HOME/include/$system"
380 dnl         else
381 dnl             if test "`find $JAVA_HOME -name jni_md.h`" != ""; then
382 dnl                 head=`find $JAVA_HOME -name jni_md.h | tail -1`
383 dnl                 dir=`dirname "$head"`
384 dnl                 JNI_CFLAGS="$JNI_CFLAGS -I$dir"
385 dnl             else
386 dnl                 AC_MSG_FAILURE([missing jni_md.h header file])
387 dnl             fi
388 dnl         fi
389 dnl         AC_MSG_RESULT([$JNI_CFLAGS])
390
391 dnl         dnl Need extra version flag?
392 dnl         AC_MSG_CHECKING([extra javac flags])
393 dnl         JAVAC_FLAGS=
394 dnl         javac_version=`$JAVAC -version 2>&1`
395 dnl         case "$javac_version" in
396 dnl         *Eclipse*)
397 dnl             JAVAC_FLAGS="-source 1.5" ;;
398 dnl         esac
399 dnl         AC_MSG_RESULT([$JAVAC_FLAGS])
400
401 dnl         dnl Where to install jarfiles.
402 dnl         dnl XXX How to make it configurable?
403 dnl         JAR_INSTALL_DIR=\${prefix}/share/java
404 dnl         JNI_INSTALL_DIR=\${libdir}
405
406 dnl         dnl JNI version.
407 dnl         jni_major_version=`echo "$VERSION" | awk -F. '{print $1}'`
408 dnl         jni_minor_version=`echo "$VERSION" | awk -F. '{print $2}'`
409 dnl         jni_micro_version=`echo "$VERSION" | awk -F. '{print $3}'`
410 dnl         JNI_VERSION_INFO=`expr "$jni_major_version" + "$jni_minor_version"`":$jni_micro_version:$jni_minor_version"
411 dnl     fi
412 dnl fi
413
414 dnl AC_SUBST(JAVA_HOME)
415 dnl AC_SUBST(JAVA)
416 dnl AC_SUBST(JAVAC)
417 dnl AC_SUBST(JAVAH)
418 dnl AC_SUBST(JAVADOC)
419 dnl AC_SUBST(JAR)
420 dnl AC_SUBST(JNI_CFLAGS)
421 dnl AC_SUBST(JAVAC_FLAGS)
422 dnl AC_SUBST(JAR_INSTALL_DIR)
423 dnl AC_SUBST(JNI_INSTALL_DIR)
424 dnl AC_SUBST(JNI_VERSION_INFO)
425
426 dnl AM_CONDITIONAL([HAVE_JAVA],[test -n "$JAVAC"])
427
428 dnl dnl Check for Haskell (GHC).
429 dnl AC_CHECK_PROG([GHC],[ghc],[ghc],[no])
430
431 dnl AM_CONDITIONAL([HAVE_HASKELL],
432 dnl     [test "x$GHC" != "xno"])
433
434 dnl Produce output files.
435 AC_CONFIG_HEADERS([config.h])
436 AC_CONFIG_FILES([Makefile
437                  generator/Makefile
438                  gnulib/lib/Makefile
439                  gnulib/tests/Makefile
440                  hivex.pc
441                  images/Makefile
442                  lib/Makefile
443                  lib/tools/Makefile
444                  ocaml/Makefile ocaml/META
445                  perl/Makefile perl/Makefile.PL
446                  python/Makefile
447                  po/Makefile.in
448                  regedit/Makefile
449                  ruby/Makefile ruby/Rakefile
450                  sh/Makefile
451                  xml/Makefile])
452 AC_CONFIG_FILES([python/run-python-tests], [chmod +x python/run-python-tests])
453 AC_OUTPUT
454
455 dnl Produce summary.
456 echo
457 echo
458 echo "------------------------------------------------------------"
459 echo "Thank you for downloading $PACKAGE_STRING"
460 echo
461 echo "This is how we have configured the optional components for you today:"
462 echo
463 echo -n "OCaml bindings ...................... "
464 if test "x$HAVE_OCAML_TRUE" = "x"; then echo "yes"; else echo "no"; fi
465 echo -n "Perl bindings ....................... "
466 if test "x$HAVE_PERL_TRUE" = "x"; then echo "yes"; else echo "no"; fi
467 echo -n "Python bindings ..................... "
468 if test "x$HAVE_PYTHON_TRUE" = "x"; then echo "yes"; else echo "no"; fi
469 echo -n "Ruby bindings ....................... "
470 if test "x$HAVE_RUBY_TRUE" = "x"; then echo "yes"; else echo "no"; fi
471 dnl echo -n "Java bindings ....................... "
472 dnl if test "x$HAVE_JAVA_TRUE" = "x"; then echo "yes"; else echo "no"; fi
473 dnl echo -n "Haskell bindings .................... "
474 dnl if test "x$HAVE_HASKELL" = "x"; then echo "yes"; else echo "no"; fi
475 echo
476 echo "If any optional component is configured 'no' when you expected 'yes'"
477 echo "then you should check the preceeding messages."
478 echo
479 echo "Please report bugs back to the mailing list:"
480 echo "http://www.redhat.com/mailman/listinfo/libguestfs"
481 echo
482 echo "Next you should type 'make' to build the package,"
483 echo "then 'make check' to run the tests."
484 echo "------------------------------------------------------------"