Win::Hivex::Regedit module for importing and exporting regedit format files.
[hivex.git] / configure.ac
1 # hivex
2 # Copyright (C) 2009-2010 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],   [2])
21 m4_define([hivex_release], [0])
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 AC_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
91   gl_MANYWARN_ALL_GCC([ws])
92   gl_MANYWARN_COMPLEMENT([ws], [$ws], [$nw])
93   for w in $ws; do
94     gl_WARN_ADD([$w])
95   done
96   gl_WARN_ADD([-Wno-unused-parameter]) # stubs.c
97   gl_WARN_ADD([-Wno-jump-misses-init]) # stubs.c
98   gl_WARN_ADD([-Wno-unused-variable]) # FIXME: only temporary, for guestfs_protocol.c, etc
99
100   # In spite of excluding -Wlogical-op above, it is enabled, as of
101   # gcc 4.5.0 20090517, and it provokes warnings in cat.c, dd.c, truncate.c
102   gl_WARN_ADD([-Wno-logical-op])
103
104   gl_WARN_ADD([-fdiagnostics-show-option])
105
106   AC_SUBST([WARN_CFLAGS])
107
108   AC_DEFINE([lint], [1], [Define to 1 if the compiler is checking for lint.])
109   AC_DEFINE([_FORTIFY_SOURCE], [2],
110     [enable compile-time and run-time bounds-checking, and some warnings])
111   AC_DEFINE([GNULIB_PORTCHECK], [1], [enable some gnulib portability checks])
112 fi
113
114 AC_C_PROTOTYPES
115 test "x$U" != "x" && AC_MSG_ERROR([Compiler not ANSI compliant])
116
117 AM_PROG_CC_C_O
118
119 dnl Check support for 64 bit file offsets.
120 AC_SYS_LARGEFILE
121
122 dnl Check sizeof long.
123 AC_CHECK_SIZEOF([long])
124
125 dnl Headers.
126 AC_CHECK_HEADERS([endian.h byteswap.h])
127
128 dnl Check for pod2man and pod2text.
129 AC_CHECK_PROG([POD2MAN],[pod2man],[pod2man],[no])
130 test "x$POD2MAN" = "xno" &&
131      AC_MSG_ERROR([pod2man must be installed])
132 AC_CHECK_PROG([POD2TEXT],[pod2text],[pod2text],[no])
133 test "x$POD2TEXT" = "xno" &&
134      AC_MSG_ERROR([pod2text must be installed])
135
136 dnl Readline.
137 AC_ARG_WITH([readline],
138     [AS_HELP_STRING([--with-readline],
139         [support fancy command line editing @<:@default=check@:>@])],
140     [],
141     [with_readline=check])
142
143 LIBREADLINE=
144 AS_IF([test "x$with_readline" != xno],
145     [AC_CHECK_LIB([readline], [main],
146         [AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"])
147          AC_DEFINE([HAVE_LIBREADLINE], [1],
148                    [Define if you have libreadline])
149         ],
150         [if test "x$with_readline" != xcheck; then
151          AC_MSG_FAILURE(
152              [--with-readline was given, but test for readline failed])
153          fi
154         ], -lncurses)])
155
156 dnl For i18n.
157 AM_GNU_GETTEXT([external])
158 AM_GNU_GETTEXT_VERSION([0.17])
159
160 dnl libxml2.
161 PKG_CHECK_MODULES([LIBXML2], [libxml-2.0])
162 AC_SUBST([LIBXML2_CFLAGS])
163 AC_SUBST([LIBXML2_LIBS])
164
165 dnl Check for OCaml (optional, for OCaml bindings).
166 AC_PROG_OCAML
167 AC_PROG_FINDLIB
168 AM_CONDITIONAL([HAVE_OCAML],[test "x$OCAMLC" != "xno" -a "x$OCAMLFIND" != "xno"])
169
170 if test "x$OCAMLC" != "xno"; then
171     dnl Check if we have caml/unixsupport.h header (OCaml bindings only).
172     old_CFLAGS="$CFLAGS"
173     CFLAGS="$CFLAGS -I$OCAMLLIB"
174     AC_CHECK_HEADERS([caml/unixsupport.h],[],[],
175     [
176     #include <caml/config.h>
177     #include <caml/mlvalues.h>
178     ])
179     CFLAGS="$old_CFLAGS"
180
181     dnl Do we have function caml_raise_with_args?
182     f=caml_raise_with_args
183     AC_MSG_CHECKING([for function $f])
184     echo "char $f (); char foo() { return $f (); }" > conftest.c
185     rm -f conftest_ml.ml
186     touch conftest_ml.ml
187     if $OCAMLOPT -c conftest.c 2>/dev/null && \
188        $OCAMLOPT -c conftest_ml.ml 2>/dev/null && \
189        $OCAMLOPT conftest.o conftest_ml.cmx -o conftest 2>/dev/null ; then
190         AC_DEFINE([HAVE_CAML_RAISE_WITH_ARGS],[1],
191                   [Defined if function caml_raise_with_args exists.])
192         AC_MSG_RESULT([found])
193     else
194         AC_MSG_RESULT([not found])
195     fi
196     rm -f conftest conftest.* conftest_ml.*
197 fi
198
199 dnl Check for Perl (optional, for Perl bindings).
200 dnl XXX This isn't quite right, we should check for Perl devel library.
201 AC_CHECK_PROG([PERL],[perl],[perl],[no])
202
203 dnl Check for Perl modules that must be present to compile and
204 dnl test the Perl bindings.
205 missing_perl_modules=no
206 for pm in Test::More Test::Pod Test::Pod::Coverage ExtUtils::MakeMaker IO::Stringy; do
207     AC_MSG_CHECKING([for $pm])
208     if ! perl -M$pm -e1 >/dev/null 2>&1; then
209         AC_MSG_RESULT([no])
210         missing_perl_modules=yes
211     else
212         AC_MSG_RESULT([yes])
213     fi
214 done
215 if test "x$missing_perl_modules" = "xyes"; then
216     AC_MSG_WARN([some Perl modules required to compile or test the Perl bindings are missing])
217 fi
218
219 AM_CONDITIONAL([HAVE_PERL],
220     [test "x$PERL" != "xno" -a "x$missing_perl_modules" != "xyes"])
221
222 dnl dnl Check for Python (optional, for Python bindings).
223 dnl AC_CHECK_PROG([PYTHON],[python],[python],[no])
224
225 dnl PYTHON_PREFIX=
226 dnl PYTHON_VERSION=
227 dnl PYTHON_INCLUDEDIR=
228 dnl PYTHON_SITE_PACKAGES=
229
230 dnl if test "x$PYTHON" != "xno"; then
231 dnl     PYTHON_PREFIX=`$PYTHON -c "import sys; print sys.prefix"`
232 dnl     PYTHON_VERSION=`$PYTHON -c "import sys; print sys.version[[0:3]]"`
233 dnl     for d in \
234 dnl         $PYTHON_PREFIX/include/python$PYTHON_VERSION \
235 dnl         /usr/include/python$PYTHON_VERSION \
236 dnl         /usr/local/include/python$PYTHON_VERSION
237 dnl     do
238 dnl         AC_MSG_CHECKING([Python.h in $d])
239 dnl         if test -r "$d/Python.h"; then
240 dnl             AC_MSG_RESULT([found])
241 dnl             PYTHON_INCLUDEDIR=$d
242 dnl             break
243 dnl         fi
244 dnl         AC_MSG_RESULT([not found])
245 dnl     done
246 dnl     for d in \
247 dnl         $PYTHON_PREFIX/lib64/python$PYTHON_VERSION/site-packages \
248 dnl         $PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages \
249 dnl         /usr/lib64/python$PYTHON_VERSION/site-packages \
250 dnl         /usr/lib/python$PYTHON_VERSION/site-packages \
251 dnl         /usr/local/lib/python$PYTHON_VERSION/site-packages
252 dnl     do
253 dnl         AC_MSG_CHECKING([for $d])
254 dnl         if test -d "$d"; then
255 dnl             AC_MSG_RESULT([found])
256 dnl             PYTHON_SITE_PACKAGES=$d
257 dnl             break
258 dnl         fi
259 dnl         AC_MSG_RESULT([not found])
260 dnl     done
261 dnl fi
262
263 dnl AC_SUBST(PYTHON_PREFIX)
264 dnl AC_SUBST(PYTHON_VERSION)
265 dnl AC_SUBST(PYTHON_INCLUDEDIR)
266 dnl AC_SUBST(PYTHON_SITE_PACKAGES)
267
268 dnl AM_CONDITIONAL([HAVE_PYTHON],
269 dnl     [test "x$PYTHON_INCLUDEDIR" != "x" -a "x$PYTHON_SITE_PACKAGES" != "x"])
270
271 dnl dnl Check for Ruby and rake (optional, for Ruby bindings).
272 dnl AC_CHECK_LIB([ruby],[ruby_init],[HAVE_LIBRUBY=1],[HAVE_LIBRUBY=0])
273 dnl AC_CHECK_PROG([RAKE],[rake],[rake],[no])
274
275 dnl AM_CONDITIONAL([HAVE_RUBY],
276 dnl     [test "x$RAKE" != "xno" -a -n "$HAVE_LIBRUBY"])
277
278 dnl dnl Check for Java.
279 dnl AC_ARG_WITH(java_home,
280 dnl     [AS_HELP_STRING([--with-java-home],
281 dnl         [specify path to JDK directory @<:@default=check@:>@])],
282 dnl     [],
283 dnl     [with_java_home=check])
284
285 dnl if test "x$with_java_home" != "xno"; then
286 dnl     if test "x$with_java_home" != "xyes" -a "x$with_java_home" != "xcheck"
287 dnl     then
288 dnl         # Reject unsafe characters in $JAVA_HOME
289 dnl         jh_lf='
290 dnl '
291 dnl         case $JAVA_HOME in
292 dnl           *[\\\"\#\$\&\'\`$jh_lf\ \ ]*)
293 dnl             AC_MSG_FAILURE([unsafe \$JAVA_HOME directory (use --with-java-home=no to disable Java support)]);;
294 dnl         esac
295 dnl         if test -d "$with_java_home"; then
296 dnl             JAVA_HOME="$with_java_home"
297 dnl         else
298 dnl             AC_MSG_FAILURE([$with_java_home is not a directory (use --with-java-home=no to disable Java support)])
299 dnl         fi
300 dnl     fi
301
302 dnl     if test "x$JAVA_HOME" = "x"; then
303 dnl         # Look for Java in some likely locations.
304 dnl         for d in \
305 dnl             /usr/lib/jvm/java \
306 dnl             /usr/lib/jvm/java-6-openjdk
307 dnl         do
308 dnl             if test -d $d -a -f $d/bin/java; then
309 dnl                 JAVA_HOME=$d
310 dnl                 break
311 dnl             fi
312 dnl         done
313 dnl     fi
314
315 dnl     if test "x$JAVA_HOME" != "x"; then
316 dnl         AC_MSG_CHECKING(for JDK in $JAVA_HOME)
317 dnl         if test ! -x "$JAVA_HOME/bin/java"; then
318 dnl             AC_MSG_ERROR([missing $JAVA_HOME/bin/java binary (use --with-java-home=no to disable Java support)])
319 dnl         else
320 dnl             JAVA="$JAVA_HOME/bin/java"
321 dnl         fi
322 dnl         if test ! -x "$JAVA_HOME/bin/javac"; then
323 dnl             AC_MSG_ERROR([missing $JAVA_HOME/bin/javac binary])
324 dnl         else
325 dnl             JAVAC="$JAVA_HOME/bin/javac"
326 dnl         fi
327 dnl         if test ! -x "$JAVA_HOME/bin/javah"; then
328 dnl             AC_MSG_ERROR([missing $JAVA_HOME/bin/javah binary])
329 dnl         else
330 dnl             JAVAH="$JAVA_HOME/bin/javah"
331 dnl         fi
332 dnl         if test ! -x "$JAVA_HOME/bin/javadoc"; then
333 dnl             AC_MSG_ERROR([missing $JAVA_HOME/bin/javadoc binary])
334 dnl         else
335 dnl             JAVADOC="$JAVA_HOME/bin/javadoc"
336 dnl         fi
337 dnl         if test ! -x "$JAVA_HOME/bin/jar"; then
338 dnl             AC_MSG_ERROR([missing $JAVA_HOME/bin/jar binary])
339 dnl         else
340 dnl             JAR="$JAVA_HOME/bin/jar"
341 dnl         fi
342 dnl         java_version=`$JAVA -version 2>&1 | grep "java version"`
343 dnl         AC_MSG_RESULT(found $java_version in $JAVA_HOME)
344
345 dnl         dnl Find jni.h.
346 dnl         AC_MSG_CHECKING([for jni.h])
347 dnl         if test -f "$JAVA_HOME/include/jni.h"; then
348 dnl             JNI_CFLAGS="-I$JAVA_HOME/include"
349 dnl         else
350 dnl             if test "`find $JAVA_HOME -name jni.h`" != ""; then
351 dnl                 head=`find $JAVA_HOME -name jni.h | tail -1`
352 dnl                 dir=`dirname "$head"`
353 dnl                 JNI_CFLAGS="-I$dir"
354 dnl             else
355 dnl                 AC_MSG_FAILURE([missing jni.h header file])
356 dnl             fi
357 dnl         fi
358 dnl         AC_MSG_RESULT([$JNI_CFLAGS])
359
360 dnl         dnl Find jni_md.h.
361 dnl         AC_MSG_CHECKING([for jni_md.h])
362 dnl         case "$build_os" in
363 dnl         *linux*) system="linux" ;;
364 dnl         *SunOS*) system="solaris" ;;
365 dnl         *cygwin*) system="win32" ;;
366 dnl         *) system="$build_os" ;;
367 dnl         esac
368 dnl         if test -f "$JAVA_HOME/include/$system/jni_md.h"; then
369 dnl             JNI_CFLAGS="$JNI_CFLAGS -I$JAVA_HOME/include/$system"
370 dnl         else
371 dnl             if test "`find $JAVA_HOME -name jni_md.h`" != ""; then
372 dnl                 head=`find $JAVA_HOME -name jni_md.h | tail -1`
373 dnl                 dir=`dirname "$head"`
374 dnl                 JNI_CFLAGS="$JNI_CFLAGS -I$dir"
375 dnl             else
376 dnl                 AC_MSG_FAILURE([missing jni_md.h header file])
377 dnl             fi
378 dnl         fi
379 dnl         AC_MSG_RESULT([$JNI_CFLAGS])
380
381 dnl         dnl Need extra version flag?
382 dnl         AC_MSG_CHECKING([extra javac flags])
383 dnl         JAVAC_FLAGS=
384 dnl         javac_version=`$JAVAC -version 2>&1`
385 dnl         case "$javac_version" in
386 dnl         *Eclipse*)
387 dnl             JAVAC_FLAGS="-source 1.5" ;;
388 dnl         esac
389 dnl         AC_MSG_RESULT([$JAVAC_FLAGS])
390
391 dnl         dnl Where to install jarfiles.
392 dnl         dnl XXX How to make it configurable?
393 dnl         JAR_INSTALL_DIR=\${prefix}/share/java
394 dnl         JNI_INSTALL_DIR=\${libdir}
395
396 dnl         dnl JNI version.
397 dnl         jni_major_version=`echo "$VERSION" | awk -F. '{print $1}'`
398 dnl         jni_minor_version=`echo "$VERSION" | awk -F. '{print $2}'`
399 dnl         jni_micro_version=`echo "$VERSION" | awk -F. '{print $3}'`
400 dnl         JNI_VERSION_INFO=`expr "$jni_major_version" + "$jni_minor_version"`":$jni_micro_version:$jni_minor_version"
401 dnl     fi
402 dnl fi
403
404 dnl AC_SUBST(JAVA_HOME)
405 dnl AC_SUBST(JAVA)
406 dnl AC_SUBST(JAVAC)
407 dnl AC_SUBST(JAVAH)
408 dnl AC_SUBST(JAVADOC)
409 dnl AC_SUBST(JAR)
410 dnl AC_SUBST(JNI_CFLAGS)
411 dnl AC_SUBST(JAVAC_FLAGS)
412 dnl AC_SUBST(JAR_INSTALL_DIR)
413 dnl AC_SUBST(JNI_INSTALL_DIR)
414 dnl AC_SUBST(JNI_VERSION_INFO)
415
416 dnl AM_CONDITIONAL([HAVE_JAVA],[test -n "$JAVAC"])
417
418 dnl dnl Check for Haskell (GHC).
419 dnl AC_CHECK_PROG([GHC],[ghc],[ghc],[no])
420
421 dnl AM_CONDITIONAL([HAVE_HASKELL],
422 dnl     [test "x$GHC" != "xno"])
423
424 dnl Produce output files.
425 AC_CONFIG_HEADERS([config.h])
426 AC_CONFIG_FILES([Makefile
427                  gnulib/lib/Makefile
428                  gnulib/tests/Makefile
429                  hivex.pc
430                  images/Makefile
431                  lib/Makefile
432                  lib/tools/Makefile
433                  ocaml/Makefile ocaml/META
434                  perl/Makefile perl/Makefile.PL
435                  po/Makefile.in
436                  sh/Makefile
437                  xml/Makefile])
438 AC_OUTPUT
439
440 dnl Produce summary.
441 echo
442 echo
443 echo "------------------------------------------------------------"
444 echo "Thank you for downloading $PACKAGE_STRING"
445 echo
446 echo "This is how we have configured the optional components for you today:"
447 echo
448 echo -n "OCaml bindings ...................... "
449 if test "x$HAVE_OCAML_TRUE" = "x"; then echo "yes"; else echo "no"; fi
450 echo -n "Perl bindings ....................... "
451 if test "x$HAVE_PERL_TRUE" = "x"; then echo "yes"; else echo "no"; fi
452 dnl echo -n "Python bindings ..................... "
453 dnl if test "x$HAVE_PYTHON_TRUE" = "x"; then echo "yes"; else echo "no"; fi
454 dnl echo -n "Ruby bindings ....................... "
455 dnl if test "x$HAVE_RUBY_TRUE" = "x"; then echo "yes"; else echo "no"; fi
456 dnl echo -n "Java bindings ....................... "
457 dnl if test "x$HAVE_JAVA_TRUE" = "x"; then echo "yes"; else echo "no"; fi
458 dnl echo -n "Haskell bindings .................... "
459 dnl if test "x$HAVE_HASKELL" = "x"; then echo "yes"; else echo "no"; fi
460 echo
461 echo "If any optional component is configured 'no' when you expected 'yes'"
462 echo "then you should check the preceeding messages."
463 echo
464 echo "Please report bugs back to the mailing list:"
465 echo "http://www.redhat.com/mailman/listinfo/libguestfs"
466 echo
467 echo "Next you should type 'make' to build the package,"
468 echo "then 'make check' to run the tests."
469 echo "------------------------------------------------------------"