Fix some build issues

Optional dependencies were temporarily marked as mandatory, in order
to sort any build problem, later it will be marked as optional again.
This commit is contained in:
Felipe Zimmerle 2015-08-25 00:11:49 -03:00
parent fd8578351d
commit e94226f1d8
8 changed files with 221 additions and 18 deletions

View File

@ -0,0 +1,171 @@
# ============================================================================
# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html
# ============================================================================
#
# SYNOPSIS
#
# AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional])
#
# DESCRIPTION
#
# Check for baseline language coverage in the compiler for the C++11
# standard; if necessary, add switches to CXXFLAGS to enable support.
#
# The first argument, if specified, indicates whether you insist on an
# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
# -std=c++11). If neither is specified, you get whatever works, with
# preference for an extended mode.
#
# The second argument, if specified 'mandatory' or if left unspecified,
# indicates that baseline C++11 support is required and that the macro
# should error out if no mode with that support is found. If specified
# 'optional', then configuration proceeds regardless, after defining
# HAVE_CXX11 if and only if a supporting mode is found.
#
# LICENSE
#
# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
# Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
# Copyright (c) 2015 Paul Norman <penorman@mac.com>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved. This file is offered as-is, without any
# warranty.
#serial 12
m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [[
template <typename T>
struct check
{
static_assert(sizeof(int) <= sizeof(T), "not big enough");
};
struct Base {
virtual void f() {}
};
struct Child : public Base {
virtual void f() override {}
};
typedef check<check<bool>> right_angle_brackets;
int a;
decltype(a) b;
typedef check<int> check_type;
check_type c;
check_type&& cr = static_cast<check_type&&>(c);
auto d = a;
auto l = [](){};
// Prevent Clang error: unused variable 'l' [-Werror,-Wunused-variable]
struct use_l { use_l() { l(); } };
// http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
// Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function because of this
namespace test_template_alias_sfinae {
struct foo {};
template<typename T>
using member = typename T::member_type;
template<typename T>
void func(...) {}
template<typename T>
void func(member<T>*) {}
void test();
void test() {
func<foo>(0);
}
}
// Check for C++11 attribute support
void noret [[noreturn]] () { throw 0; }
]])
AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl
m4_if([$1], [], [],
[$1], [ext], [],
[$1], [noext], [],
[m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl
m4_if([$2], [], [ax_cxx_compile_cxx11_required=true],
[$2], [mandatory], [ax_cxx_compile_cxx11_required=true],
[$2], [optional], [ax_cxx_compile_cxx11_required=false],
[m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_11])])
AC_LANG_PUSH([C++])dnl
ac_success=no
AC_CACHE_CHECK(whether $CXX supports C++11 features by default,
ax_cv_cxx_compile_cxx11,
[AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
[ax_cv_cxx_compile_cxx11=yes],
[ax_cv_cxx_compile_cxx11=no])])
if test x$ax_cv_cxx_compile_cxx11 = xyes; then
ac_success=yes
fi
m4_if([$1], [noext], [], [dnl
if test x$ac_success = xno; then
for switch in -std=gnu++11 -std=gnu++0x; do
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
$cachevar,
[ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS $switch"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
[eval $cachevar=yes],
[eval $cachevar=no])
CXXFLAGS="$ac_save_CXXFLAGS"])
if eval test x\$$cachevar = xyes; then
CXXFLAGS="$CXXFLAGS $switch"
ac_success=yes
break
fi
done
fi])
m4_if([$1], [ext], [], [dnl
if test x$ac_success = xno; then
dnl HP's aCC needs +std=c++11 according to:
dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf
for switch in -std=c++11 -std=c++0x +std=c++11; do
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
$cachevar,
[ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS $switch"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
[eval $cachevar=yes],
[eval $cachevar=no])
CXXFLAGS="$ac_save_CXXFLAGS"])
if eval test x\$$cachevar = xyes; then
CXXFLAGS="$CXXFLAGS $switch"
ac_success=yes
break
fi
done
fi])
AC_LANG_POP([C++])
if test x$ax_cxx_compile_cxx11_required = xtrue; then
if test x$ac_success = xno; then
AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.])
fi
else
if test x$ac_success = xno; then
HAVE_CXX11=0
AC_MSG_NOTICE([No compiler with C++11 support was found])
else
HAVE_CXX11=1
AC_DEFINE(HAVE_CXX11,1,
[define if the compiler supports basic C++11 syntax])
fi
AC_SUBST(HAVE_CXX11)
fi
])

View File

@ -102,6 +102,7 @@ AC_SUBST(CURL_USES_GNUTLS)
if test -z "${CURL_VERSION}"; then
AC_MSG_NOTICE([*** curl library not found.])
ifelse([$2], , AC_MSG_ERROR([curl library is required]), $2)
else
AC_MSG_NOTICE([using curl v${CURL_VERSION}])
ifelse([$1], , , $1)

View File

@ -19,7 +19,7 @@ GEOIP_CPPFLAGS=""
GEOIP_LDADD=""
GEOIP_LDFLAGS=""
GEOIP_CONFIG=${PKG_CONFIG}
GEOIP_PKGNAMES="geoip2 geoip"
GEOIP_PKGNAMES="geoip2 geoip GeoIP"
GEOIP_SONAMES="so la sl dll dylib"
AC_ARG_WITH(
@ -29,7 +29,7 @@ AC_ARG_WITH(
AS_CASE(["${with_geoip}"],
[no], [test_paths=],
[yes], [test_paths="/usr/local/libgeoip /usr/local/geoip /usr/local /opt/libgeoip /opt/geoip /opt /usr /opt/local/include /opt/local"],
[yes], [test_paths="/usr/local/libgeoip /usr/local/geoip /usr/local /opt/libgeoip /opt/geoip /opt /usr /opt/local/include /opt/local /usr/lib /usr/local/lib /usr/lib64"],
[test_paths="${with_geoip}"])
AS_IF([test "x${test_paths}" != "x"], [
@ -43,7 +43,7 @@ for x in ${test_paths}; do
dnl # Try known config script names/locations
for y in $GEOIP_CONFIG; do
if test -e "${x}/bin/${y}"; then
if test -e "${x}/bin/${y}"; then
GEOIP_CONFIG="${x}/bin/${y}"
geoip_config="${GEOIP_CONFIG}"
break
@ -86,14 +86,21 @@ else
AC_MSG_CHECKING([for geoip install])
for x in ${test_paths}; do
for y in ${GEOIP_SONAMES}; do
if test -e "${x}/libgeoip.${y}"; then
geoip_lib_path="${x}/"
geoip_lib_name="geoip"
break
else
geoip_lib_path=""
geoip_lib_name=""
fi
for z in ${GEOIP_PKGNAMES}; do
if test -e "${x}/${z}.${y}"; then
geoip_lib_path="${x}/"
geoip_lib_name="${z}"
break
fi
if test -e "${x}/lib${z}.${y}"; then
geoip_lib_path="${x}/"
geoip_lib_name="${z}"
break
fi
done
if test -n "$geoip_lib_path"; then
break
fi
done
if test -n "$geoip_lib_path"; then
break
@ -146,7 +153,7 @@ AC_SUBST(GEOIP_LDADD)
AC_SUBST(GEOIP_LIBS)
AC_SUBST(GEOIP_LDFLAGS)
if test -z "${GEOIP_VERSION}"; then
ifelse([$2], , AC_MSG_NOTICE([optional geoip library not found]), $2)
ifelse([$2], , AC_MSG_ERROR([*** geoip library not found]), $2)
else
AC_MSG_NOTICE([using geoip v${GEOIP_VERSION}])
GEOIP_CFLAGS="-DWITH_GEOIP ${GEOIP_CFLAGS}"

View File

@ -29,7 +29,7 @@ AC_ARG_WITH(
AS_CASE(["${with_yajl}"],
[no], [test_paths=],
[yes], [test_paths="/usr/local/libyajl /usr/local/yajl /usr/local /opt/libyajl /opt/yajl /opt /usr"],
[yes], [test_paths="/usr/lib /usr/local/lib /usr/local/libyajl /usr/local/yajl /usr/local /opt/libyajl /opt/yajl /opt /usr"],
[test_paths="${with_yajl}"])
AS_IF([test "x${test_paths}" != "x"], [
@ -146,7 +146,7 @@ AC_SUBST(YAJL_LDADD)
AC_SUBST(YAJL_LIBS)
AC_SUBST(YAJL_LDFLAGS)
if test -z "${YAJL_VERSION}"; then
ifelse([$2], , AC_MSG_NOTICE([optional yajl library not found]), $2)
ifelse([$2], , AC_MSG_ERROR([*** yajl library not found]), $2)
else
AC_MSG_NOTICE([using yajl v${YAJL_VERSION}])
YAJL_CFLAGS="-DWITH_YAJL ${YAJL_CFLAGS}"

View File

@ -34,6 +34,29 @@ AC_PROG_YACC
AC_PROG_LEX
AC_PROG_MAKE_SET
AC_PATH_PROG([FLEX], [flex])
test "x$FLEX" = "x" && AC_MSG_ERROR([flex is needed to build ModSecurity])
AC_PATH_PROG([BISON], [bison])
test "x$BISON" = "x" && AC_MSG_ERROR([bison is needed to build ModSecurity])
AC_PATH_PROG([YACC_INST], $YACC)
if test ! -f "$srcdir/gram.c"; then
if test -z "$YACC_INST"; then
AC_MSG_ERROR([yacc not found - unable to compile ModSecurity])
fi
fi
# Check if the compiler is c++11 compatible.
AX_CXX_COMPILE_STDCXX_11(,mandatory)
# Check for libinjection
AC_CHECK_FILE("others/libinjection/src/libinjection_html5.c", HAS_LIBINJECTION=1)
test "x$HAS_LIBINJECTION" = "x" && AC_MSG_ERROR([libinjection is needed to build ModSecurity, make sure you have downloaded all the git submodules])
# Check for yajl
PROG_YAJL
@ -49,9 +72,7 @@ AM_CONDITIONAL([GEOIP_VERSION], [test "$GEOIP_VERSION" != ""])
#
CHECK_CURL
if test -z "${CURL_VERSION}"; then
AC_MSG_NOTICE([NOTE: curl was not found. SecRemoteRules support was disabled.])
else
if ! test -z "${CURL_VERSION}"; then
AC_DEFINE([MSC_WITH_CURL], [1], [Define if libcurl is available])
fi
@ -162,4 +183,3 @@ DX_INIT_DOXYGEN([ModSecurity],[doc/doxygen.cfg])
# Generate the files.
AC_OUTPUT

View File

@ -201,6 +201,7 @@ libmodsecurity_la_CPPFLAGS = \
$(PCRE_CPPFLAGS)
libmodsecurity_la_LIBADD = \
-lrt \
$(CURL_LDADD) \
$(GEOIP_LDADD) \
@LEXLIB@ \

View File

@ -24,6 +24,7 @@ unit_tests_SOURCES = \
unit/unit_test.cc
unit_tests_LDADD = \
-lrt \
$(top_builddir)/src/.libs/libmodsecurity.a \
$(CURL_LDADD) \
$(GEOIP_LDADD) \
@ -51,6 +52,7 @@ regression_tests_SOURCES = \
regression/custom_debug_log.cc
regression_tests_LDADD = \
-lrt \
$(top_builddir)/src/.libs/libmodsecurity.a \
$(CURL_LDADD) \
$(GEOIP_LDADD) \

View File

@ -6,6 +6,7 @@ benchmark_SOURCES = \
benchmark.cc
benchmark_LDADD = \
-lrt \
$(top_builddir)/src/.libs/libmodsecurity.a \
$(CURL_LDADD) \
$(GEOIP_LDADD) \