mirror of
https://github.com/libguestfs/libguestfs.git
synced 2026-03-22 07:03:38 +00:00
configure: Move basic C compiler environment checks to separate file.
Also gnulib stuff.
This commit is contained in:
172
configure.ac
172
configure.ac
@@ -96,167 +96,8 @@ dnl Check for external programs required to either build or run
|
||||
dnl libguestfs.
|
||||
m4_include([m4/guestfs_progs.m4])
|
||||
|
||||
dnl Define the host CPU architecture (defines 'host_cpu')
|
||||
AC_CANONICAL_HOST
|
||||
|
||||
dnl Check for basic C environment.
|
||||
AC_PROG_CC_STDC
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_CPP
|
||||
|
||||
AC_ARG_ENABLE([werror],
|
||||
[AS_HELP_STRING([--enable-werror],
|
||||
[turn GCC warnings into errors (for developers)])],
|
||||
[case $enableval in
|
||||
yes|no) ;;
|
||||
*) AC_MSG_ERROR([bad value $enableval for werror option]) ;;
|
||||
esac
|
||||
gl_gcc_werror=$enableval],
|
||||
[gl_gcc_werror=no]
|
||||
)
|
||||
|
||||
if test "$gl_gcc_werror" = yes; then
|
||||
gl_WARN_ADD([-Werror], [WERROR_CFLAGS])
|
||||
AC_SUBST([WERROR_CFLAGS])
|
||||
fi
|
||||
|
||||
dnl This, $nw, is the list of warnings we disable.
|
||||
nw=
|
||||
nw="$nw -Waggregate-return" # anachronistic
|
||||
nw="$nw -Wc++-compat" # We don't care about C++ compilers
|
||||
nw="$nw -Wundef" # Warns on '#if GNULIB_FOO' etc in gnulib
|
||||
nw="$nw -Wtraditional" # Warns on #elif which we use often
|
||||
nw="$nw -Wcast-qual" # Too many warnings for now
|
||||
nw="$nw -Wconversion" # Too many warnings for now
|
||||
nw="$nw -Wsystem-headers" # Don't let system headers trigger warnings
|
||||
nw="$nw -Wsign-conversion" # Not an error
|
||||
nw="$nw -Wtraditional-conversion" # Don't care about pre-ANSI compilers
|
||||
nw="$nw -Wpadded" # Our structs are not padded
|
||||
nw="$nw -Wvla" # two warnings in mount.c
|
||||
dnl things I might fix soon:
|
||||
nw="$nw -Wmissing-format-attribute" # daemon.h's asprintf_nowarn
|
||||
nw="$nw -Winline" # daemon.h's asprintf_nowarn
|
||||
nw="$nw -Wshadow" # numerous, plus we're not unanimous
|
||||
nw="$nw -Wunsafe-loop-optimizations" # just a warning that an optimization
|
||||
# was not possible, safe to ignore
|
||||
nw="$nw -Wpacked" # Allow attribute((packed)) on structs
|
||||
nw="$nw -Wlong-long" # Allow long long since it's required
|
||||
# by Python, Ruby and xstrtoll.
|
||||
nw="$nw -Wsuggest-attribute=pure" # Don't suggest pure functions.
|
||||
nw="$nw -Wsuggest-attribute=const" # Don't suggest const functions.
|
||||
nw="$nw -Wunsuffixed-float-constants" # Don't care about these.
|
||||
nw="$nw -Wswitch-default" # This warning is actively dangerous.
|
||||
nw="$nw -Woverlength-strings" # Who cares about stupid ISO C99 limit.
|
||||
|
||||
gl_MANYWARN_ALL_GCC([ws])
|
||||
gl_MANYWARN_COMPLEMENT([ws], [$ws], [$nw])
|
||||
for w in $ws; do
|
||||
gl_WARN_ADD([$w])
|
||||
done
|
||||
|
||||
dnl Normally we disable warnings in $nw above. However $nw only
|
||||
dnl filters out exact matching warning strings from a list inside
|
||||
dnl gnulib (see m4/manywarnings.m4). So we need to explicitly list a
|
||||
dnl few disabled warnings below.
|
||||
|
||||
dnl Unused parameters are not a bug.
|
||||
gl_WARN_ADD([-Wno-unused-parameter])
|
||||
|
||||
dnl Missing field initializers is not a bug in C.
|
||||
gl_WARN_ADD([-Wno-missing-field-initializers])
|
||||
|
||||
dnl Display the name of the warning option with the warning.
|
||||
gl_WARN_ADD([-fdiagnostics-show-option])
|
||||
|
||||
dnl Now some warnings we want to enable and/or customize ...
|
||||
|
||||
dnl Warn about large stack allocations. 10000 happens to be the
|
||||
dnl same size as Coverity warns about.
|
||||
gl_WARN_ADD([-Wframe-larger-than=10000])
|
||||
|
||||
AC_SUBST([WARN_CFLAGS])
|
||||
|
||||
AC_DEFINE([lint], [1], [Define to 1 if the compiler is checking for lint.])
|
||||
AC_DEFINE([GNULIB_PORTCHECK], [1], [Enable some gnulib portability checks.])
|
||||
AH_VERBATIM([FORTIFY_SOURCE],[
|
||||
/* Enable compile-time and run-time bounds-checking, and some warnings. */
|
||||
#if __OPTIMIZE__ && (! defined (_FORTIFY_SOURCE) || _FORTIFY_SOURCE < 2)
|
||||
# undef _FORTIFY_SOURCE
|
||||
# define _FORTIFY_SOURCE 2
|
||||
#endif])
|
||||
|
||||
AC_C_PROTOTYPES
|
||||
test "x$U" != "x" && AC_MSG_ERROR([Compiler not ANSI compliant])
|
||||
|
||||
AM_PROG_CC_C_O
|
||||
|
||||
# Provide a global place to set CFLAGS. (Note that setting AM_CFLAGS
|
||||
# is no use because it doesn't override target_CFLAGS).
|
||||
#---
|
||||
# Kill -fstrict-overflow which is a license for the C compiler to make
|
||||
# dubious and often unsafe optimizations, in a time-wasting attempt to
|
||||
# deal with CPU architectures that do not exist.
|
||||
CFLAGS="$CFLAGS -fno-strict-overflow -Wno-strict-overflow"
|
||||
|
||||
dnl Work out how to specify the linker script to the linker.
|
||||
VERSION_SCRIPT_FLAGS=-Wl,--version-script=
|
||||
`/usr/bin/ld --help 2>&1 | grep -- --version-script >/dev/null` || \
|
||||
VERSION_SCRIPT_FLAGS="-Wl,-M -Wl,"
|
||||
AC_SUBST(VERSION_SCRIPT_FLAGS)
|
||||
|
||||
dnl Use -fvisibility=hidden by default in the library.
|
||||
dnl http://gcc.gnu.org/wiki/Visibility
|
||||
AS_IF([test -n "$GCC"],
|
||||
[AC_SUBST([GCC_VISIBILITY_HIDDEN], [-fvisibility=hidden])],
|
||||
[AC_SUBST([GCC_VISIBILITY_HIDDEN], [:])])
|
||||
|
||||
dnl Check support for 64 bit file offsets.
|
||||
AC_SYS_LARGEFILE
|
||||
|
||||
dnl Check sizeof long.
|
||||
AC_CHECK_SIZEOF([long])
|
||||
|
||||
dnl Check if __attribute__((cleanup(...))) works.
|
||||
dnl XXX It would be nice to use AC_COMPILE_IFELSE here, but gcc just
|
||||
dnl emits a warning for attributes that it doesn't understand.
|
||||
AC_MSG_CHECKING([if __attribute__((cleanup(...))) works with this compiler])
|
||||
AC_RUN_IFELSE([
|
||||
AC_LANG_SOURCE([[
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
void
|
||||
freep (void *ptr)
|
||||
{
|
||||
exit (EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
void
|
||||
test (void)
|
||||
{
|
||||
__attribute__((cleanup(freep))) char *ptr = malloc (100);
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
test ();
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
]])
|
||||
],[
|
||||
AC_MSG_RESULT([yes])
|
||||
AC_DEFINE([HAVE_ATTRIBUTE_CLEANUP],[1],[Define to 1 if '__attribute__((cleanup(...)))' works with this compiler.])
|
||||
],[
|
||||
AC_MSG_WARN(
|
||||
['__attribute__((cleanup(...)))' does not work.
|
||||
|
||||
You may not be using a sufficiently recent version of GCC or CLANG, or
|
||||
you may be using a C compiler which does not support this attribute,
|
||||
or the configure test may be wrong.
|
||||
|
||||
The code will still compile, but is likely to leak memory and other
|
||||
resources when it runs.])])
|
||||
dnl The C compiler environment.
|
||||
m4_include([m4/guestfs_c.m4])
|
||||
|
||||
dnl Check if dirent (readdir) supports d_type member.
|
||||
AC_STRUCT_DIRENT_D_TYPE
|
||||
@@ -840,15 +681,6 @@ dnl For search paths.
|
||||
AC_DEFINE_UNQUOTED([PATH_SEPARATOR],["$PATH_SEPARATOR"],
|
||||
[Character that separates path elements in search paths])
|
||||
|
||||
AC_MSG_CHECKING([if we should run the GNUlib tests])
|
||||
AC_ARG_ENABLE([gnulib-tests],
|
||||
[AS_HELP_STRING([--disable-gnulib-tests],
|
||||
[disable running GNU Portability library tests @<:@default=yes@:>@])],
|
||||
[ENABLE_GNULIB_TESTS="$enableval"],
|
||||
[ENABLE_GNULIB_TESTS=yes])
|
||||
AM_CONDITIONAL([ENABLE_GNULIB_TESTS],[test "x$ENABLE_GNULIB_TESTS" = "xyes"])
|
||||
AC_MSG_RESULT([$ENABLE_GNULIB_TESTS])
|
||||
|
||||
dnl Library versioning.
|
||||
MAX_PROC_NR=`cat $srcdir/src/MAX_PROC_NR`
|
||||
AC_SUBST(MAX_PROC_NR)
|
||||
|
||||
189
m4/guestfs_c.m4
Normal file
189
m4/guestfs_c.m4
Normal file
@@ -0,0 +1,189 @@
|
||||
# libguestfs
|
||||
# Copyright (C) 2009-2015 Red Hat Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
dnl The C compiler environment.
|
||||
dnl Define the host CPU architecture (defines 'host_cpu')
|
||||
AC_CANONICAL_HOST
|
||||
|
||||
dnl Check for basic C environment.
|
||||
AC_PROG_CC_STDC
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_CPP
|
||||
|
||||
AC_ARG_ENABLE([werror],
|
||||
[AS_HELP_STRING([--enable-werror],
|
||||
[turn GCC warnings into errors (for developers)])],
|
||||
[case $enableval in
|
||||
yes|no) ;;
|
||||
*) AC_MSG_ERROR([bad value $enableval for werror option]) ;;
|
||||
esac
|
||||
gl_gcc_werror=$enableval],
|
||||
[gl_gcc_werror=no]
|
||||
)
|
||||
|
||||
if test "$gl_gcc_werror" = yes; then
|
||||
gl_WARN_ADD([-Werror], [WERROR_CFLAGS])
|
||||
AC_SUBST([WERROR_CFLAGS])
|
||||
fi
|
||||
|
||||
dnl This, $nw, is the list of warnings we disable.
|
||||
nw=
|
||||
nw="$nw -Waggregate-return" # anachronistic
|
||||
nw="$nw -Wc++-compat" # We don't care about C++ compilers
|
||||
nw="$nw -Wundef" # Warns on '#if GNULIB_FOO' etc in gnulib
|
||||
nw="$nw -Wtraditional" # Warns on #elif which we use often
|
||||
nw="$nw -Wcast-qual" # Too many warnings for now
|
||||
nw="$nw -Wconversion" # Too many warnings for now
|
||||
nw="$nw -Wsystem-headers" # Don't let system headers trigger warnings
|
||||
nw="$nw -Wsign-conversion" # Not an error
|
||||
nw="$nw -Wtraditional-conversion" # Don't care about pre-ANSI compilers
|
||||
nw="$nw -Wpadded" # Our structs are not padded
|
||||
nw="$nw -Wvla" # two warnings in mount.c
|
||||
dnl things I might fix soon:
|
||||
nw="$nw -Wmissing-format-attribute" # daemon.h's asprintf_nowarn
|
||||
nw="$nw -Winline" # daemon.h's asprintf_nowarn
|
||||
nw="$nw -Wshadow" # numerous, plus we're not unanimous
|
||||
nw="$nw -Wunsafe-loop-optimizations" # just a warning that an optimization
|
||||
# was not possible, safe to ignore
|
||||
nw="$nw -Wpacked" # Allow attribute((packed)) on structs
|
||||
nw="$nw -Wlong-long" # Allow long long since it's required
|
||||
# by Python, Ruby and xstrtoll.
|
||||
nw="$nw -Wsuggest-attribute=pure" # Don't suggest pure functions.
|
||||
nw="$nw -Wsuggest-attribute=const" # Don't suggest const functions.
|
||||
nw="$nw -Wunsuffixed-float-constants" # Don't care about these.
|
||||
nw="$nw -Wswitch-default" # This warning is actively dangerous.
|
||||
nw="$nw -Woverlength-strings" # Who cares about stupid ISO C99 limit.
|
||||
|
||||
gl_MANYWARN_ALL_GCC([ws])
|
||||
gl_MANYWARN_COMPLEMENT([ws], [$ws], [$nw])
|
||||
for w in $ws; do
|
||||
gl_WARN_ADD([$w])
|
||||
done
|
||||
|
||||
dnl Normally we disable warnings in $nw above. However $nw only
|
||||
dnl filters out exact matching warning strings from a list inside
|
||||
dnl gnulib (see m4/manywarnings.m4). So we need to explicitly list a
|
||||
dnl few disabled warnings below.
|
||||
|
||||
dnl Unused parameters are not a bug.
|
||||
gl_WARN_ADD([-Wno-unused-parameter])
|
||||
|
||||
dnl Missing field initializers is not a bug in C.
|
||||
gl_WARN_ADD([-Wno-missing-field-initializers])
|
||||
|
||||
dnl Display the name of the warning option with the warning.
|
||||
gl_WARN_ADD([-fdiagnostics-show-option])
|
||||
|
||||
dnl Now some warnings we want to enable and/or customize ...
|
||||
|
||||
dnl Warn about large stack allocations. 10000 happens to be the
|
||||
dnl same size as Coverity warns about.
|
||||
gl_WARN_ADD([-Wframe-larger-than=10000])
|
||||
|
||||
AC_SUBST([WARN_CFLAGS])
|
||||
|
||||
AC_DEFINE([lint], [1], [Define to 1 if the compiler is checking for lint.])
|
||||
AC_DEFINE([GNULIB_PORTCHECK], [1], [Enable some gnulib portability checks.])
|
||||
AH_VERBATIM([FORTIFY_SOURCE],[
|
||||
/* Enable compile-time and run-time bounds-checking, and some warnings. */
|
||||
#if __OPTIMIZE__ && (! defined (_FORTIFY_SOURCE) || _FORTIFY_SOURCE < 2)
|
||||
# undef _FORTIFY_SOURCE
|
||||
# define _FORTIFY_SOURCE 2
|
||||
#endif])
|
||||
|
||||
AC_C_PROTOTYPES
|
||||
test "x$U" != "x" && AC_MSG_ERROR([Compiler not ANSI compliant])
|
||||
|
||||
AM_PROG_CC_C_O
|
||||
|
||||
# Provide a global place to set CFLAGS. (Note that setting AM_CFLAGS
|
||||
# is no use because it doesn't override target_CFLAGS).
|
||||
#---
|
||||
# Kill -fstrict-overflow which is a license for the C compiler to make
|
||||
# dubious and often unsafe optimizations, in a time-wasting attempt to
|
||||
# deal with CPU architectures that do not exist.
|
||||
CFLAGS="$CFLAGS -fno-strict-overflow -Wno-strict-overflow"
|
||||
|
||||
dnl Work out how to specify the linker script to the linker.
|
||||
VERSION_SCRIPT_FLAGS=-Wl,--version-script=
|
||||
`/usr/bin/ld --help 2>&1 | grep -- --version-script >/dev/null` || \
|
||||
VERSION_SCRIPT_FLAGS="-Wl,-M -Wl,"
|
||||
AC_SUBST(VERSION_SCRIPT_FLAGS)
|
||||
|
||||
dnl Use -fvisibility=hidden by default in the library.
|
||||
dnl http://gcc.gnu.org/wiki/Visibility
|
||||
AS_IF([test -n "$GCC"],
|
||||
[AC_SUBST([GCC_VISIBILITY_HIDDEN], [-fvisibility=hidden])],
|
||||
[AC_SUBST([GCC_VISIBILITY_HIDDEN], [:])])
|
||||
|
||||
dnl Check support for 64 bit file offsets.
|
||||
AC_SYS_LARGEFILE
|
||||
|
||||
dnl Check sizeof long.
|
||||
AC_CHECK_SIZEOF([long])
|
||||
|
||||
dnl Check if __attribute__((cleanup(...))) works.
|
||||
dnl XXX It would be nice to use AC_COMPILE_IFELSE here, but gcc just
|
||||
dnl emits a warning for attributes that it doesn't understand.
|
||||
AC_MSG_CHECKING([if __attribute__((cleanup(...))) works with this compiler])
|
||||
AC_RUN_IFELSE([
|
||||
AC_LANG_SOURCE([[
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
void
|
||||
freep (void *ptr)
|
||||
{
|
||||
exit (EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
void
|
||||
test (void)
|
||||
{
|
||||
__attribute__((cleanup(freep))) char *ptr = malloc (100);
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
test ();
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
]])
|
||||
],[
|
||||
AC_MSG_RESULT([yes])
|
||||
AC_DEFINE([HAVE_ATTRIBUTE_CLEANUP],[1],[Define to 1 if '__attribute__((cleanup(...)))' works with this compiler.])
|
||||
],[
|
||||
AC_MSG_WARN(
|
||||
['__attribute__((cleanup(...)))' does not work.
|
||||
|
||||
You may not be using a sufficiently recent version of GCC or CLANG, or
|
||||
you may be using a C compiler which does not support this attribute,
|
||||
or the configure test may be wrong.
|
||||
|
||||
The code will still compile, but is likely to leak memory and other
|
||||
resources when it runs.])])
|
||||
|
||||
dnl Should we run the gnulib tests?
|
||||
AC_MSG_CHECKING([if we should run the GNUlib tests])
|
||||
AC_ARG_ENABLE([gnulib-tests],
|
||||
[AS_HELP_STRING([--disable-gnulib-tests],
|
||||
[disable running GNU Portability library tests @<:@default=yes@:>@])],
|
||||
[ENABLE_GNULIB_TESTS="$enableval"],
|
||||
[ENABLE_GNULIB_TESTS=yes])
|
||||
AM_CONDITIONAL([ENABLE_GNULIB_TESTS],[test "x$ENABLE_GNULIB_TESTS" = "xyes"])
|
||||
AC_MSG_RESULT([$ENABLE_GNULIB_TESTS])
|
||||
Reference in New Issue
Block a user