From d930280af5df9de318229b8fa7d4f1f7d27b748d Mon Sep 17 00:00:00 2001 From: Yang Tse Date: Tue, 7 Oct 2008 13:13:34 +0000 Subject: [PATCH] Initial attempt to support configure's --(dis|en)able-optimize option to specify dis(activation) of compiler optimizations. If option is specified, it will be honored independant of the --(dis|en)able-debug option. --- ares/configure.ac | 20 ++- ares/m4/cares-compilers.m4 | 306 +++++++++++++++++++++++++++++++++---- ares/m4/cares-confopts.m4 | 76 +++++++-- configure.ac | 22 ++- m4/curl-compilers.m4 | 299 ++++++++++++++++++++++++++++++++---- m4/curl-confopts.m4 | 76 +++++++-- 6 files changed, 708 insertions(+), 91 deletions(-) diff --git a/ares/configure.ac b/ares/configure.ac index 39c249554f..685caa1310 100644 --- a/ares/configure.ac +++ b/ares/configure.ac @@ -9,6 +9,7 @@ AM_CONFIG_HEADER([config.h]) AM_MAINTAINER_MODE CARES_CHECK_OPTION_DEBUG +CARES_CHECK_OPTION_OPTIMIZE CARES_CHECK_OPTION_WARNINGS dnl SED is mandatory for configure process and libtool. @@ -67,7 +68,7 @@ AC_CANONICAL_HOST dnl Get system canonical name AC_DEFINE_UNQUOTED(OS, "${host}", [cpu-machine-OS]) -AC_PROG_CC +CARES_CHECK_PROG_CC AM_PROG_CC_C_O AC_PROG_INSTALL @@ -142,9 +143,10 @@ dnl platform/compiler/architecture specific checks/flags dnl ********************************************************************** CARES_CHECK_COMPILER -CARES_PROCESS_CC_BASIC_OPTS -CARES_PROCESS_CC_DEBUG_OPTS -CARES_PROCESS_CC_WARNING_OPTS +CARES_SET_COMPILER_BASIC_OPTS +CARES_SET_COMPILER_DEBUG_OPTS +CARES_SET_COMPILER_OPTIMIZE_OPTS +CARES_SET_COMPILER_WARNING_OPTS case $host in # @@ -882,5 +884,15 @@ fi CARES_PRIVATE_LIBS="$LIBS" AC_SUBST(CARES_PRIVATE_LIBS) +dnl squeeze whitespace out of some variables + +CFLAGS=`eval echo $CFLAGS` +CPPFLAGS=`eval echo $CPPFLAGS` +DEFS=`eval echo $DEFS` +LDFLAGS=`eval echo $LDFLAGS` +LIBS=`eval echo $LIBS` + +CARES_PRIVATE_LIBS=`eval echo $CARES_PRIVATE_LIBS` + AC_CONFIG_FILES([Makefile libcares.pc]) AC_OUTPUT diff --git a/ares/m4/cares-compilers.m4 b/ares/m4/cares-compilers.m4 index 5dcf03ee41..8af70637b5 100644 --- a/ares/m4/cares-compilers.m4 +++ b/ares/m4/cares-compilers.m4 @@ -16,7 +16,7 @@ #*************************************************************************** # File version for 'aclocal' use. Keep it a single number. -# serial 2 +# serial 3 dnl CARES_CHECK_COMPILER @@ -28,11 +28,33 @@ AC_DEFUN([CARES_CHECK_COMPILER], [ compiler_id="unknown" compiler_num="0" # + flags_dbg_all="unknown" + flags_dbg_yes="unknown" + flags_dbg_off="unknown" + flags_opt_all="unknown" + flags_opt_yes="unknown" + flags_opt_off="unknown" + # CARES_CHECK_COMPILER_DEC CARES_CHECK_COMPILER_IBM CARES_CHECK_COMPILER_INTEL CARES_CHECK_COMPILER_GNU # + if test "$compiler_id" = "unknown"; then + cat <<_EOF 1>&2 +*** +*** Warning: This configure script does not have information about the +*** compiler you are using, relative to the flags required to enable or +*** disable generation of debug info, optimization options or warnings. +*** +*** Whatever settings are present in CFLAGS will be used for this run. +*** +*** If you wish to help the c-ares project to better support your compiler +*** you can report this and the required info on the c-ares development +*** mailing list: http://cool.haxx.se/mailman/listinfo/c-ares/ +*** +_EOF + fi ]) @@ -48,6 +70,12 @@ AC_DEFUN([CARES_CHECK_COMPILER_DEC], [ test "$curl_cv_have_def___DECC_VER" = "yes"; then AC_MSG_RESULT([yes]) compiler_id="DECC" + flags_dbg_all="-g -g0 -g1 -g2 -g3" + flags_dbg_yes="-g2" + flags_dbg_off="-g0" + flags_opt_all="-O -O0 -O1 -O2 -O3 -O4" + flags_opt_yes="-O1" + flags_opt_off="-O0" else AC_MSG_RESULT([no]) fi @@ -71,6 +99,19 @@ AC_DEFUN([CARES_CHECK_COMPILER_GNU], [ gccvhi=`echo $gccver | cut -d . -f1` gccvlo=`echo $gccver | cut -d . -f2` compiler_num=`(expr $gccvhi "*" 100 + $gccvlo) 2>/dev/null` + flags_dbg_all="-g -g0 -g1 -g2 -g3" + flags_dbg_all="$flags_dbg_all -ggdb" + flags_dbg_all="$flags_dbg_all -gstabs" + flags_dbg_all="$flags_dbg_all -gstabs+" + flags_dbg_all="$flags_dbg_all -gcoff" + flags_dbg_all="$flags_dbg_all -gxcoff" + flags_dbg_all="$flags_dbg_all -gdwarf-2" + flags_dbg_all="$flags_dbg_all -gvms" + flags_dbg_yes="-g" + flags_dbg_off="-g0" + flags_opt_all="-O -O0 -O1 -O2 -O3 -Os" + flags_opt_yes="-O2" + flags_opt_off="-O0" else AC_MSG_RESULT([no]) fi @@ -87,6 +128,19 @@ AC_DEFUN([CARES_CHECK_COMPILER_IBM], [ if test "$curl_cv_have_def___IBMC__" = "yes"; then AC_MSG_RESULT([yes]) compiler_id="IBMC" + flags_dbg_all="-g -g0 -g1 -g2 -g3" + flags_dbg_yes="-g" + flags_dbg_off="" + flags_opt_all="-O -O0 -O1 -O2 -O3 -O4 -O5" + flags_opt_all="$flags_opt_all -qnooptimize" + flags_opt_all="$flags_opt_all -qoptimize=0" + flags_opt_all="$flags_opt_all -qoptimize=1" + flags_opt_all="$flags_opt_all -qoptimize=2" + flags_opt_all="$flags_opt_all -qoptimize=3" + flags_opt_all="$flags_opt_all -qoptimize=4" + flags_opt_all="$flags_opt_all -qoptimize=5" + flags_opt_yes="-O2" + flags_opt_off="-qnooptimize" else AC_MSG_RESULT([no]) fi @@ -106,8 +160,27 @@ AC_DEFUN([CARES_CHECK_COMPILER_INTEL], [ CURL_CHECK_DEF([__unix__], [], [silent]) if test "$curl_cv_have_def___unix__" = "yes"; then compiler_id="ICC_unix" + flags_dbg_all="-g -g0" + flags_dbg_yes="-g -fp" + flags_dbg_off="-g0" + flags_opt_all="-O -O0 -O1 -O2 -O3 -Os" + flags_opt_yes="-O2" + flags_opt_off="-O0" else compiler_id="ICC_windows" + flags_dbg_all="/ZI /Zi /zI /zi /ZD /Zd /zD /zd /Z7 /z7" + flags_dbg_all="$flags_dbg_all /debug" + flags_dbg_all="$flags_dbg_all /debug:none" + flags_dbg_all="$flags_dbg_all /debug:minimal" + flags_dbg_all="$flags_dbg_all /debug:partial" + flags_dbg_all="$flags_dbg_all /debug:full" + flags_dbg_all="$flags_dbg_all /debug:semantic_stepping" + flags_dbg_all="$flags_dbg_all /debug:extended" + flags_dbg_yes="/Zi /Oy-" + flags_dbg_off="" + flags_opt_all="/O /O0 /O1 /O2 /O3 /Os" + flags_opt_yes="/O2" + flags_opt_off="" fi compiler_num="$curl_cv_def___INTEL_COMPILER" else @@ -116,12 +189,13 @@ AC_DEFUN([CARES_CHECK_COMPILER_INTEL], [ ]) -dnl CARES_PROCESS_CC_BASIC_OPTS +dnl CARES_SET_COMPILER_BASIC_OPTS dnl ------------------------------------------------- -dnl Sets compiler options/flags which are independant -dnl of configure's debug or warnings options. +dnl Sets compiler specific options/flags which do not +dnl depend on configure's debug, optimize or warnings +dnl options. -AC_DEFUN([CARES_PROCESS_CC_BASIC_OPTS], [ +AC_DEFUN([CARES_SET_COMPILER_BASIC_OPTS], [ AC_REQUIRE([CARES_CHECK_COMPILER])dnl # if test "$compiler_id" = "DECC"; then @@ -174,44 +248,134 @@ AC_DEFUN([CARES_PROCESS_CC_BASIC_OPTS], [ ]) -dnl CARES_PROCESS_CC_DEBUG_OPTS +dnl CARES_SET_COMPILER_DEBUG_OPTS dnl ------------------------------------------------- -dnl Sets compiler options/flags which depend on -dnl configure's debug given option. +dnl Sets compiler specific options/flags which depend +dnl on configure's debug option. -AC_DEFUN([CARES_PROCESS_CC_DEBUG_OPTS], [ +AC_DEFUN([CARES_SET_COMPILER_DEBUG_OPTS], [ AC_REQUIRE([CARES_CHECK_OPTION_DEBUG])dnl AC_REQUIRE([CARES_CHECK_COMPILER])dnl # - if test "$want_debug" = "yes"; then - CFLAGS="$CFLAGS -g" + if test "$compiler_id" != "unknown"; then + # + ac_save_CFLAGS="$CFLAGS" + ac_save_CPPFLAGS="$CPPFLAGS" + # + honor_debug_option="yes" + CARES_VAR_STRIP([CFLAGS],[${flags_dbg_all}]) + CARES_VAR_STRIP([CPPFLAGS],[${flags_dbg_all}]) + if test "$want_debug" = "yes"; then + CFLAGS="$CFLAGS $flags_dbg_yes" + AC_MSG_CHECKING([if compiler accepts debug enabling flags $flags_dbg_yes]) + fi + if test "$want_debug" = "no"; then + CFLAGS="$CFLAGS $flags_dbg_off" + AC_MSG_CHECKING([if compiler accepts debug disabling flags $flags_dbg_off]) + fi + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + ]],[[ + int i = 1; + return i; + ]]) + ],[ + AC_MSG_RESULT([yes]) + ],[ + AC_MSG_RESULT([no]) + honor_debug_option="no" + ]) + # + if test "$honor_debug_option" = "no"; then + CFLAGS="$ac_save_CFLAGS" + CPPFLAGS="$ac_save_CPPFLAGS" + fi + # fi - # - if test "$want_debug" = "no"; then - dnl strip off optimizer flags - NEWFLAGS="" - for flag in $CFLAGS; do - case "$flag" in - -O*) - dnl echo "cut off $flag" - ;; - *) - NEWFLAGS="$NEWFLAGS $flag" - ;; - esac - done - CFLAGS=$NEWFLAGS - fi - # ]) -dnl CARES_PROCESS_CC_WARNING_OPTS +dnl CARES_SET_COMPILER_OPTIMIZE_OPTS +dnl ------------------------------------------------- +dnl Sets compiler specific options/flags which depend +dnl on configure's optimize option. + +AC_DEFUN([CARES_SET_COMPILER_OPTIMIZE_OPTS], [ + AC_REQUIRE([CARES_CHECK_OPTION_OPTIMIZE])dnl + AC_REQUIRE([CARES_CHECK_COMPILER])dnl + # + if test "$compiler_id" != "unknown"; then + # + ac_save_CFLAGS="$CFLAGS" + ac_save_CPPFLAGS="$CPPFLAGS" + # + dnl If optimization request setting has not been explicitly specified, + dnl it has been derived from the debug setting and initially assumed. + dnl This initially assumed optimizer setting will finally be ignored + dnl if CFLAGS or CPPFLAGS already hold optimizer flags. This implies + dnl that an initially assumed optimizer setting might not be honored. + # + honor_optimize_option="yes" + if test "$want_optimize" = "assume_no" || + test "$want_optimize" = "assume_yes"; then + AC_MSG_CHECKING([if compiler optimizer assumed setting might be used]) + CARES_VAR_MATCH_IFELSE([CFLAGS],[${flags_opt_all}],[ + honor_optimize_option="no" + ]) + CARES_VAR_MATCH_IFELSE([CPPFLAGS],[${flags_opt_all}],[ + honor_optimize_option="no" + ]) + AC_MSG_RESULT([$honor_optimize_option]) + if test "$honor_optimize_option" = "yes"; then + if test "$want_optimize" = "assume_yes"; then + want_optimize="yes" + fi + if test "$want_optimize" = "assume_no"; then + want_optimize="no" + fi + fi + fi + # + if test "$honor_optimize_option" = "yes"; then + CARES_VAR_STRIP([CFLAGS],[${flags_opt_all}]) + CARES_VAR_STRIP([CPPFLAGS],[${flags_opt_all}]) + if test "$want_optimize" = "yes"; then + CFLAGS="$CFLAGS $flags_opt_yes" + AC_MSG_CHECKING([if compiler accepts optimizer enabling flags $flags_opt_yes]) + fi + if test "$want_optimize" = "no"; then + CFLAGS="$CFLAGS $flags_opt_off" + AC_MSG_CHECKING([if compiler accepts optimizer disabling flags $flags_opt_off]) + fi + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + ]],[[ + int i = 1; + return i; + ]]) + ],[ + AC_MSG_RESULT([yes]) + ],[ + AC_MSG_RESULT([no]) + honor_optimize_option="no" + ]) + fi + # + if test "$honor_optimize_option" = "no"; then + CFLAGS="$ac_save_CFLAGS" + CPPFLAGS="$ac_save_CPPFLAGS" + fi + # + fi +]) + + +dnl CARES_SET_COMPILER_WARNING_OPTS dnl ------------------------------------------------- dnl Sets compiler options/flags which depend on dnl configure's warnings given option. -AC_DEFUN([CARES_PROCESS_CC_WARNING_OPTS], [ +AC_DEFUN([CARES_SET_COMPILER_WARNING_OPTS], [ AC_REQUIRE([CARES_CHECK_OPTION_WARNINGS])dnl AC_REQUIRE([CARES_CHECK_COMPILER])dnl # @@ -236,7 +400,7 @@ AC_DEFUN([CARES_PROCESS_CC_WARNING_OPTS], [ if test "$compiler_id" = "GNUC"; then # # FIXME: Some of these warnings should be changed into errors - # and moved to CARES-PROCESS-CC-BASIC-OPTS + # and moved to CARES-SET-COMPILER-BASIC-OPTS # if test "$want_warnings" = "yes"; then dnl this is a set of options we believe *ALL* gcc versions support: @@ -295,6 +459,7 @@ dnl CARES_PROCESS_DEBUG_BUILD_OPTS dnl ------------------------------------------------- dnl Settings which depend on configure's debug given dnl option, and further configure the build process. +dnl Don't use this macro for compiler dependant stuff. AC_DEFUN([CARES_PROCESS_DEBUG_BUILD_OPTS], [ AC_REQUIRE([CARES_CHECK_OPTION_DEBUG])dnl @@ -311,9 +476,86 @@ AC_DEFUN([CARES_PROCESS_DEBUG_BUILD_OPTS], [ dnl libcurl stuff so this BUILDING_LIBCURL is not THAT much uglier AC_DEFINE(BUILDING_LIBCURL, 1, [when building as static part of libcurl]) - CPPFLAGS="$CPPFLAGS -DCURLDEBUG -I$srcdir/../include" + CPPFLAGS="$CPPFLAGS -DCURLDEBUG" + + dnl CHECKME: Do we still need so specify this include path here? + CPPFLAGS="$CPPFLAGS -I$srcdir/../include" + fi # ]) +dnl CARES_CHECK_PROG_CC +dnl ------------------------------------------------- +dnl Check for compiler program, preventing CFLAGS and +dnl CPPFLAGS from being unexpectedly changed. + +AC_DEFUN([CARES_CHECK_PROG_CC], [ + ac_save_CFLAGS="$CFLAGS" + ac_save_CPPFLAGS="$CPPFLAGS" + AC_PROG_CC + CFLAGS="$ac_save_CFLAGS" + CPPFLAGS="$ac_save_CPPFLAGS" +]) + + +dnl CARES_VAR_MATCH (VARNAME, VALUE) +dnl ------------------------------------------------- +dnl Verifies if shell variable VARNAME contains VALUE. +dnl Contents of variable VARNAME and VALUE are handled +dnl as whitespace separated lists of words. If at least +dnl one word of VALUE is present in VARNAME the match +dnl is considered positive, otherwise false. + +AC_DEFUN([CARES_VAR_MATCH], [ + ac_var_match_word="no" + for word1 in "${[$1]}"; do + for word2 in "[$2]"; do + if test "$word1" = "$word2"; then + ac_var_match_word="yes" + fi + done + done +]) + + +dnl CARES_VAR_MATCH_IFELSE (VARNAME, VALUE, +dnl [ACTION-IF-MATCH], [ACTION-IF-NOT-MATCH]) +dnl ------------------------------------------------- +dnl This performs a CURL_VAR_MATCH check and executes +dnl first branch if the match is positive, otherwise +dnl the second branch is executed. + +AC_DEFUN([CARES_VAR_MATCH_IFELSE], [ + CARES_VAR_MATCH([$1],[$2]) + if test "$ac_var_match_word" = "yes"; then + ifelse($3,,:,[$3]) + ifelse($4,,,[else + [$4]]) + fi +]) + + +dnl CARES_VAR_STRIP (VARNAME, VALUE) +dnl ------------------------------------------------- +dnl Contents of variable VARNAME and VALUE are handled +dnl as whitespace separated lists of words. Each word +dnl from VALUE is removed from VARNAME when present. + +AC_DEFUN([CARES_VAR_STRIP], [ + ac_var_stripped="" + for word1 in "${[$1]}"; do + ac_var_strip_word="no" + for word2 in "[$2]"; do + if test "$word1" = "$word2"; then + ac_var_strip_word="yes" + fi + done + if test "$ac_var_strip_word" = "no"; then + ac_var_stripped="$ac_var_stripped $word1" + fi + done + dnl squeeze whitespace out of result + [$1]=`eval echo $[$1]` +]) diff --git a/ares/m4/cares-confopts.m4 b/ares/m4/cares-confopts.m4 index 2299b60746..17a6875f37 100644 --- a/ares/m4/cares-confopts.m4 +++ b/ares/m4/cares-confopts.m4 @@ -16,7 +16,7 @@ #*************************************************************************** # File version for 'aclocal' use. Keep it a single number. -# serial 1 +# serial 2 dnl CARES_CHECK_OPTION_DEBUG @@ -27,13 +27,13 @@ dnl variable want_debug value as appropriate. AC_DEFUN([CARES_CHECK_OPTION_DEBUG], [ AC_BEFORE([$0],[CARES_CHECK_OPTION_WARNINGS])dnl - AC_BEFORE([$0],[AC_PROG_CC])dnl + AC_BEFORE([$0],[CARES_CHECK_PROG_CC])dnl AC_MSG_CHECKING([whether to enable debug build options]) OPT_DEBUG_BUILD="default" AC_ARG_ENABLE(debug, - AC_HELP_STRING([--enable-debug],[Enable debug build options]) - AC_HELP_STRING([--disable-debug],[Disable debug build options]), - OPT_DEBUG_BUILD=$enableval) +AC_HELP_STRING([--enable-debug],[Enable debug build options]) +AC_HELP_STRING([--disable-debug],[Disable debug build options]), + OPT_DEBUG_BUILD=$enableval) case "$OPT_DEBUG_BUILD" in no) dnl --disable-debug option used @@ -52,21 +52,77 @@ AC_DEFUN([CARES_CHECK_OPTION_DEBUG], [ ]) +dnl CARES_CHECK_OPTION_OPTIMIZE +dnl ------------------------------------------------- +dnl Verify if configure has been invoked with option +dnl --enable-optimize or --disable-optimize, and set +dnl shell variable want_optimize value as appropriate. + +AC_DEFUN([CARES_CHECK_OPTION_OPTIMIZE], [ + AC_REQUIRE([CARES_CHECK_OPTION_DEBUG])dnl + AC_BEFORE([$0],[CARES_CHECK_PROG_CC])dnl + AC_MSG_CHECKING([whether to enable compiler optimizer]) + OPT_COMPILER_OPTIMIZE="default" + AC_ARG_ENABLE(optimize, +AC_HELP_STRING([--enable-optimize(=OPT)],[Enable compiler optimizations (default=-O2)]) +AC_HELP_STRING([--disable-optimize],[Disable compiler optimizations]), + OPT_COMPILER_OPTIMIZE=$enableval) + case "$OPT_COMPILER_OPTIMIZE" in + no) + dnl --disable-optimize option used. We will handle this as + dnl a request to disable compiler optimizations if possible. + dnl If the compiler is known CFLAGS and CPPFLAGS will be + dnl overridden, otherwise this can not be honored. + want_optimize="no" + AC_MSG_RESULT([no]) + ;; + default) + dnl configure's optimize option not specified. Initially we will + dnl handle this as a a request contrary to configure's setting + dnl for --enable-debug. IOW, initially, for debug-enabled builds + dnl this will be handled as a request to disable optimizations if + dnl possible, and for debug-disabled builds this will be handled + dnl initially as a request to enable optimizations if possible. + dnl Finally, if the compiler is known and CFLAGS and CPPFLAGS do + dnl not have any optimizer flag the request will be honored, in + dnl any other case the request can not be honored. + dnl IOW, existing optimizer flags defined in CFLAGS or CPPFLAGS + dnl will always take precedence over any initial assumption. + if test "$want_debug" = "yes"; then + want_optimize="assume_no" + AC_MSG_RESULT([not specified (assuming no)]) + else + want_optimize="assume_yes" + AC_MSG_RESULT([not specified (assuming yes)]) + fi + ;; + *) + dnl --enable-optimize option used. We will handle this as + dnl a request to enable compiler optimizations if possible. + dnl If the compiler is known CFLAGS and CPPFLAGS will be + dnl overridden, otherwise this can not be honored. + want_optimize="yes" + AC_MSG_RESULT([yes]) + ;; + esac +]) + + dnl CARES_CHECK_OPTION_WARNINGS dnl ------------------------------------------------- dnl Verify if configure has been invoked with option dnl --enable-warnings or --disable-warnings, and set -DNL shell variable want_warnings as appropriate. +dnl shell variable want_warnings as appropriate. AC_DEFUN([CARES_CHECK_OPTION_WARNINGS], [ AC_REQUIRE([CARES_CHECK_OPTION_DEBUG])dnl - AC_BEFORE([$0],[AC_PROG_CC])dnl + AC_BEFORE([$0],[CARES_CHECK_PROG_CC])dnl AC_MSG_CHECKING([whether to enable strict compiler warnings]) OPT_COMPILER_WARNINGS="default" AC_ARG_ENABLE(warnings, - AC_HELP_STRING([--enable-warnings],[Enable strict compiler warnings]) - AC_HELP_STRING([--disable-warnings],[Disable strict compiler warnings]), - OPT_COMPILER_WARNINGS=$enableval) +AC_HELP_STRING([--enable-warnings],[Enable strict compiler warnings]) +AC_HELP_STRING([--disable-warnings],[Disable strict compiler warnings]), + OPT_COMPILER_WARNINGS=$enableval) case "$OPT_COMPILER_WARNINGS" in no) dnl --disable-warnings option used diff --git a/configure.ac b/configure.ac index 935ee46cb9..bf86bf038e 100644 --- a/configure.ac +++ b/configure.ac @@ -37,6 +37,7 @@ AM_CONFIG_HEADER(lib/config.h src/config.h include/curl/curlbuild.h) AM_MAINTAINER_MODE CURL_CHECK_OPTION_DEBUG +CURL_CHECK_OPTION_OPTIMIZE CURL_CHECK_OPTION_WARNINGS dnl SED is mandatory for configure process and libtool. @@ -133,7 +134,7 @@ dnl Get system canonical name AC_DEFINE_UNQUOTED(OS, "${host}", [cpu-machine-OS]) dnl Checks for programs. -AC_PROG_CC +CURL_CHECK_PROG_CC dnl Our curl_off_t internal and external configure settings CURL_CONFIGURE_CURL_OFF_T @@ -251,9 +252,10 @@ dnl platform/compiler/architecture specific checks/flags dnl ********************************************************************** CURL_CHECK_COMPILER -CURL_PROCESS_CC_BASIC_OPTS -CURL_PROCESS_CC_DEBUG_OPTS -CURL_PROCESS_CC_WARNING_OPTS +CURL_SET_COMPILER_BASIC_OPTS +CURL_SET_COMPILER_DEBUG_OPTS +CURL_SET_COMPILER_OPTIMIZE_OPTS +CURL_SET_COMPILER_WARNING_OPTS case $host in # @@ -2529,6 +2531,18 @@ fi AC_SUBST(SUPPORT_PROTOCOLS) +dnl squeeze whitespace out of some variables + +CFLAGS=`eval echo $CFLAGS` +CPPFLAGS=`eval echo $CPPFLAGS` +DEFS=`eval echo $DEFS` +LDFLAGS=`eval echo $LDFLAGS` +LIBS=`eval echo $LIBS` + +CURL_LIBS=`eval echo $CURL_LIBS` +LIBCURL_LIBS=`eval echo $LIBCURL_LIBS` +TEST_SERVER_LIBS=`eval echo $TEST_SERVER_LIBS` + AC_CONFIG_FILES([Makefile \ docs/Makefile \ docs/examples/Makefile \ diff --git a/m4/curl-compilers.m4 b/m4/curl-compilers.m4 index a132ec28b0..1cff5be010 100644 --- a/m4/curl-compilers.m4 +++ b/m4/curl-compilers.m4 @@ -22,7 +22,7 @@ #*************************************************************************** # File version for 'aclocal' use. Keep it a single number. -# serial 1 +# serial 2 dnl CURL_CHECK_COMPILER @@ -34,11 +34,33 @@ AC_DEFUN([CURL_CHECK_COMPILER], [ compiler_id="unknown" compiler_num="0" # + flags_dbg_all="unknown" + flags_dbg_yes="unknown" + flags_dbg_off="unknown" + flags_opt_all="unknown" + flags_opt_yes="unknown" + flags_opt_off="unknown" + # CURL_CHECK_COMPILER_DEC CURL_CHECK_COMPILER_IBM CURL_CHECK_COMPILER_INTEL CURL_CHECK_COMPILER_GNU # + if test "$compiler_id" = "unknown"; then + cat <<_EOF 1>&2 +*** +*** Warning: This configure script does not have information about the +*** compiler you are using, relative to the flags required to enable or +*** disable generation of debug info, optimization options or warnings. +*** +*** Whatever settings are present in CFLAGS will be used for this run. +*** +*** If you wish to help the cURL project to better support your compiler +*** you can report this and the required info on the libcurl development +*** mailing list: http://cool.haxx.se/mailman/listinfo/curl-library/ +*** +_EOF + fi ]) @@ -54,6 +76,12 @@ AC_DEFUN([CURL_CHECK_COMPILER_DEC], [ test "$curl_cv_have_def___DECC_VER" = "yes"; then AC_MSG_RESULT([yes]) compiler_id="DECC" + flags_dbg_all="-g -g0 -g1 -g2 -g3" + flags_dbg_yes="-g2" + flags_dbg_off="-g0" + flags_opt_all="-O -O0 -O1 -O2 -O3 -O4" + flags_opt_yes="-O1" + flags_opt_off="-O0" else AC_MSG_RESULT([no]) fi @@ -77,6 +105,19 @@ AC_DEFUN([CURL_CHECK_COMPILER_GNU], [ gccvhi=`echo $gccver | cut -d . -f1` gccvlo=`echo $gccver | cut -d . -f2` compiler_num=`(expr $gccvhi "*" 100 + $gccvlo) 2>/dev/null` + flags_dbg_all="-g -g0 -g1 -g2 -g3" + flags_dbg_all="$flags_dbg_all -ggdb" + flags_dbg_all="$flags_dbg_all -gstabs" + flags_dbg_all="$flags_dbg_all -gstabs+" + flags_dbg_all="$flags_dbg_all -gcoff" + flags_dbg_all="$flags_dbg_all -gxcoff" + flags_dbg_all="$flags_dbg_all -gdwarf-2" + flags_dbg_all="$flags_dbg_all -gvms" + flags_dbg_yes="-g" + flags_dbg_off="-g0" + flags_opt_all="-O -O0 -O1 -O2 -O3 -Os" + flags_opt_yes="-O2" + flags_opt_off="-O0" else AC_MSG_RESULT([no]) fi @@ -93,6 +134,19 @@ AC_DEFUN([CURL_CHECK_COMPILER_IBM], [ if test "$curl_cv_have_def___IBMC__" = "yes"; then AC_MSG_RESULT([yes]) compiler_id="IBMC" + flags_dbg_all="-g -g0 -g1 -g2 -g3" + flags_dbg_yes="-g" + flags_dbg_off="" + flags_opt_all="-O -O0 -O1 -O2 -O3 -O4 -O5" + flags_opt_all="$flags_opt_all -qnooptimize" + flags_opt_all="$flags_opt_all -qoptimize=0" + flags_opt_all="$flags_opt_all -qoptimize=1" + flags_opt_all="$flags_opt_all -qoptimize=2" + flags_opt_all="$flags_opt_all -qoptimize=3" + flags_opt_all="$flags_opt_all -qoptimize=4" + flags_opt_all="$flags_opt_all -qoptimize=5" + flags_opt_yes="-O2" + flags_opt_off="-qnooptimize" else AC_MSG_RESULT([no]) fi @@ -112,8 +166,27 @@ AC_DEFUN([CURL_CHECK_COMPILER_INTEL], [ CURL_CHECK_DEF([__unix__], [], [silent]) if test "$curl_cv_have_def___unix__" = "yes"; then compiler_id="ICC_unix" + flags_dbg_all="-g -g0" + flags_dbg_yes="-g -fp" + flags_dbg_off="-g0" + flags_opt_all="-O -O0 -O1 -O2 -O3 -Os" + flags_opt_yes="-O2" + flags_opt_off="-O0" else compiler_id="ICC_windows" + flags_dbg_all="/ZI /Zi /zI /zi /ZD /Zd /zD /zd /Z7 /z7" + flags_dbg_all="$flags_dbg_all /debug" + flags_dbg_all="$flags_dbg_all /debug:none" + flags_dbg_all="$flags_dbg_all /debug:minimal" + flags_dbg_all="$flags_dbg_all /debug:partial" + flags_dbg_all="$flags_dbg_all /debug:full" + flags_dbg_all="$flags_dbg_all /debug:semantic_stepping" + flags_dbg_all="$flags_dbg_all /debug:extended" + flags_dbg_yes="/Zi /Oy-" + flags_dbg_off="" + flags_opt_all="/O /O0 /O1 /O2 /O3 /Os" + flags_opt_yes="/O2" + flags_opt_off="" fi compiler_num="$curl_cv_def___INTEL_COMPILER" else @@ -122,12 +195,13 @@ AC_DEFUN([CURL_CHECK_COMPILER_INTEL], [ ]) -dnl CURL_PROCESS_CC_BASIC_OPTS +dnl CURL_SET_COMPILER_BASIC_OPTS dnl ------------------------------------------------- -dnl Sets compiler options/flags which are independant -dnl of configure's debug or warnings options. +dnl Sets compiler specific options/flags which do not +dnl depend on configure's debug, optimize or warnings +dnl options. -AC_DEFUN([CURL_PROCESS_CC_BASIC_OPTS], [ +AC_DEFUN([CURL_SET_COMPILER_BASIC_OPTS], [ AC_REQUIRE([CURL_CHECK_COMPILER])dnl # if test "$compiler_id" = "DECC"; then @@ -180,44 +254,134 @@ AC_DEFUN([CURL_PROCESS_CC_BASIC_OPTS], [ ]) -dnl CURL_PROCESS_CC_DEBUG_OPTS +dnl CURL_SET_COMPILER_DEBUG_OPTS dnl ------------------------------------------------- -dnl Sets compiler options/flags which depend on -dnl configure's debug given option. +dnl Sets compiler specific options/flags which depend +dnl on configure's debug option. -AC_DEFUN([CURL_PROCESS_CC_DEBUG_OPTS], [ +AC_DEFUN([CURL_SET_COMPILER_DEBUG_OPTS], [ AC_REQUIRE([CURL_CHECK_OPTION_DEBUG])dnl AC_REQUIRE([CURL_CHECK_COMPILER])dnl # - if test "$want_debug" = "yes"; then - CFLAGS="$CFLAGS -g" + if test "$compiler_id" != "unknown"; then + # + ac_save_CFLAGS="$CFLAGS" + ac_save_CPPFLAGS="$CPPFLAGS" + # + honor_debug_option="yes" + CURL_VAR_STRIP([CFLAGS],[${flags_dbg_all}]) + CURL_VAR_STRIP([CPPFLAGS],[${flags_dbg_all}]) + if test "$want_debug" = "yes"; then + CFLAGS="$CFLAGS $flags_dbg_yes" + AC_MSG_CHECKING([if compiler accepts debug enabling flags $flags_dbg_yes]) + fi + if test "$want_debug" = "no"; then + CFLAGS="$CFLAGS $flags_dbg_off" + AC_MSG_CHECKING([if compiler accepts debug disabling flags $flags_dbg_off]) + fi + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + ]],[[ + int i = 1; + return i; + ]]) + ],[ + AC_MSG_RESULT([yes]) + ],[ + AC_MSG_RESULT([no]) + honor_debug_option="no" + ]) + # + if test "$honor_debug_option" = "no"; then + CFLAGS="$ac_save_CFLAGS" + CPPFLAGS="$ac_save_CPPFLAGS" + fi + # fi - # - if test "$want_debug" = "no"; then - dnl strip off optimizer flags - NEWFLAGS="" - for flag in $CFLAGS; do - case "$flag" in - -O*) - dnl echo "cut off $flag" - ;; - *) - NEWFLAGS="$NEWFLAGS $flag" - ;; - esac - done - CFLAGS=$NEWFLAGS - fi - # ]) -dnl CURL_PROCESS_CC_WARNING_OPTS +dnl CURL_SET_COMPILER_OPTIMIZE_OPTS +dnl ------------------------------------------------- +dnl Sets compiler specific options/flags which depend +dnl on configure's optimize option. + +AC_DEFUN([CURL_SET_COMPILER_OPTIMIZE_OPTS], [ + AC_REQUIRE([CURL_CHECK_OPTION_OPTIMIZE])dnl + AC_REQUIRE([CURL_CHECK_COMPILER])dnl + # + if test "$compiler_id" != "unknown"; then + # + ac_save_CFLAGS="$CFLAGS" + ac_save_CPPFLAGS="$CPPFLAGS" + # + dnl If optimization request setting has not been explicitly specified, + dnl it has been derived from the debug setting and initially assumed. + dnl This initially assumed optimizer setting will finally be ignored + dnl if CFLAGS or CPPFLAGS already hold optimizer flags. This implies + dnl that an initially assumed optimizer setting might not be honored. + # + honor_optimize_option="yes" + if test "$want_optimize" = "assume_no" || + test "$want_optimize" = "assume_yes"; then + AC_MSG_CHECKING([if compiler optimizer assumed setting might be used]) + CURL_VAR_MATCH_IFELSE([CFLAGS],[${flags_opt_all}],[ + honor_optimize_option="no" + ]) + CURL_VAR_MATCH_IFELSE([CPPFLAGS],[${flags_opt_all}],[ + honor_optimize_option="no" + ]) + AC_MSG_RESULT([$honor_optimize_option]) + if test "$honor_optimize_option" = "yes"; then + if test "$want_optimize" = "assume_yes"; then + want_optimize="yes" + fi + if test "$want_optimize" = "assume_no"; then + want_optimize="no" + fi + fi + fi + # + if test "$honor_optimize_option" = "yes"; then + CURL_VAR_STRIP([CFLAGS],[${flags_opt_all}]) + CURL_VAR_STRIP([CPPFLAGS],[${flags_opt_all}]) + if test "$want_optimize" = "yes"; then + CFLAGS="$CFLAGS $flags_opt_yes" + AC_MSG_CHECKING([if compiler accepts optimizer enabling flags $flags_opt_yes]) + fi + if test "$want_optimize" = "no"; then + CFLAGS="$CFLAGS $flags_opt_off" + AC_MSG_CHECKING([if compiler accepts optimizer disabling flags $flags_opt_off]) + fi + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + ]],[[ + int i = 1; + return i; + ]]) + ],[ + AC_MSG_RESULT([yes]) + ],[ + AC_MSG_RESULT([no]) + honor_optimize_option="no" + ]) + fi + # + if test "$honor_optimize_option" = "no"; then + CFLAGS="$ac_save_CFLAGS" + CPPFLAGS="$ac_save_CPPFLAGS" + fi + # + fi +]) + + +dnl CURL_SET_COMPILER_WARNING_OPTS dnl ------------------------------------------------- dnl Sets compiler options/flags which depend on dnl configure's warnings given option. -AC_DEFUN([CURL_PROCESS_CC_WARNING_OPTS], [ +AC_DEFUN([CURL_SET_COMPILER_WARNING_OPTS], [ AC_REQUIRE([CURL_CHECK_OPTION_WARNINGS])dnl AC_REQUIRE([CURL_CHECK_COMPILER])dnl # @@ -242,7 +406,7 @@ AC_DEFUN([CURL_PROCESS_CC_WARNING_OPTS], [ if test "$compiler_id" = "GNUC"; then # # FIXME: Some of these warnings should be changed into errors - # and moved to CURL-PROCESS-CC-BASIC-OPTS + # and moved to CURL-SET-COMPILER-BASIC-OPTS # if test "$want_warnings" = "yes"; then dnl this is a set of options we believe *ALL* gcc versions support: @@ -301,6 +465,7 @@ dnl CURL_PROCESS_DEBUG_BUILD_OPTS dnl ------------------------------------------------- dnl Settings which depend on configure's debug given dnl option, and further configure the build process. +dnl Don't use this macro for compiler dependant stuff. AC_DEFUN([CURL_PROCESS_DEBUG_BUILD_OPTS], [ AC_REQUIRE([CURL_CHECK_OPTION_DEBUG])dnl @@ -313,4 +478,76 @@ AC_DEFUN([CURL_PROCESS_DEBUG_BUILD_OPTS], [ ]) +dnl CURL_CHECK_PROG_CC +dnl ------------------------------------------------- +dnl Check for compiler program, preventing CFLAGS and +dnl CPPFLAGS from being unexpectedly changed. +AC_DEFUN([CURL_CHECK_PROG_CC], [ + ac_save_CFLAGS="$CFLAGS" + ac_save_CPPFLAGS="$CPPFLAGS" + AC_PROG_CC + CFLAGS="$ac_save_CFLAGS" + CPPFLAGS="$ac_save_CPPFLAGS" +]) + + +dnl CURL_VAR_MATCH (VARNAME, VALUE) +dnl ------------------------------------------------- +dnl Verifies if shell variable VARNAME contains VALUE. +dnl Contents of variable VARNAME and VALUE are handled +dnl as whitespace separated lists of words. If at least +dnl one word of VALUE is present in VARNAME the match +dnl is considered positive, otherwise false. + +AC_DEFUN([CURL_VAR_MATCH], [ + ac_var_match_word="no" + for word1 in "${[$1]}"; do + for word2 in "[$2]"; do + if test "$word1" = "$word2"; then + ac_var_match_word="yes" + fi + done + done +]) + + +dnl CURL_VAR_MATCH_IFELSE (VARNAME, VALUE, +dnl [ACTION-IF-MATCH], [ACTION-IF-NOT-MATCH]) +dnl ------------------------------------------------- +dnl This performs a CURL_VAR_MATCH check and executes +dnl first branch if the match is positive, otherwise +dnl the second branch is executed. + +AC_DEFUN([CURL_VAR_MATCH_IFELSE], [ + CURL_VAR_MATCH([$1],[$2]) + if test "$ac_var_match_word" = "yes"; then + ifelse($3,,:,[$3]) + ifelse($4,,,[else + [$4]]) + fi +]) + + +dnl CURL_VAR_STRIP (VARNAME, VALUE) +dnl ------------------------------------------------- +dnl Contents of variable VARNAME and VALUE are handled +dnl as whitespace separated lists of words. Each word +dnl from VALUE is removed from VARNAME when present. + +AC_DEFUN([CURL_VAR_STRIP], [ + ac_var_stripped="" + for word1 in "${[$1]}"; do + ac_var_strip_word="no" + for word2 in "[$2]"; do + if test "$word1" = "$word2"; then + ac_var_strip_word="yes" + fi + done + if test "$ac_var_strip_word" = "no"; then + ac_var_stripped="$ac_var_stripped $word1" + fi + done + dnl squeeze whitespace out of result + [$1]=`eval echo $[$1]` +]) diff --git a/m4/curl-confopts.m4 b/m4/curl-confopts.m4 index 0c125d9c3f..b0c1f3cd41 100644 --- a/m4/curl-confopts.m4 +++ b/m4/curl-confopts.m4 @@ -22,7 +22,7 @@ #*************************************************************************** # File version for 'aclocal' use. Keep it a single number. -# serial 2 +# serial 3 dnl CURL_CHECK_OPTION_DEBUG @@ -33,13 +33,13 @@ dnl variable want_debug value as appropriate. AC_DEFUN([CURL_CHECK_OPTION_DEBUG], [ AC_BEFORE([$0],[CURL_CHECK_OPTION_WARNINGS])dnl - AC_BEFORE([$0],[AC_PROG_CC])dnl + AC_BEFORE([$0],[CURL_CHECK_PROG_CC])dnl AC_MSG_CHECKING([whether to enable debug build options]) OPT_DEBUG_BUILD="default" AC_ARG_ENABLE(debug, - AC_HELP_STRING([--enable-debug],[Enable debug build options]) - AC_HELP_STRING([--disable-debug],[Disable debug build options]), - OPT_DEBUG_BUILD=$enableval) +AC_HELP_STRING([--enable-debug],[Enable debug build options]) +AC_HELP_STRING([--disable-debug],[Disable debug build options]), + OPT_DEBUG_BUILD=$enableval) case "$OPT_DEBUG_BUILD" in no) dnl --disable-debug option used @@ -58,21 +58,77 @@ AC_DEFUN([CURL_CHECK_OPTION_DEBUG], [ ]) +dnl CURL_CHECK_OPTION_OPTIMIZE +dnl ------------------------------------------------- +dnl Verify if configure has been invoked with option +dnl --enable-optimize or --disable-optimize, and set +dnl shell variable want_optimize value as appropriate. + +AC_DEFUN([CURL_CHECK_OPTION_OPTIMIZE], [ + AC_REQUIRE([CURL_CHECK_OPTION_DEBUG])dnl + AC_BEFORE([$0],[CURL_CHECK_PROG_CC])dnl + AC_MSG_CHECKING([whether to enable compiler optimizer]) + OPT_COMPILER_OPTIMIZE="default" + AC_ARG_ENABLE(optimize, +AC_HELP_STRING([--enable-optimize],[Enable compiler optimizations]) +AC_HELP_STRING([--disable-optimize],[Disable compiler optimizations]), + OPT_COMPILER_OPTIMIZE=$enableval) + case "$OPT_COMPILER_OPTIMIZE" in + no) + dnl --disable-optimize option used. We will handle this as + dnl a request to disable compiler optimizations if possible. + dnl If the compiler is known CFLAGS and CPPFLAGS will be + dnl overridden, otherwise this can not be honored. + want_optimize="no" + AC_MSG_RESULT([no]) + ;; + default) + dnl configure's optimize option not specified. Initially we will + dnl handle this as a a request contrary to configure's setting + dnl for --enable-debug. IOW, initially, for debug-enabled builds + dnl this will be handled as a request to disable optimizations if + dnl possible, and for debug-disabled builds this will be handled + dnl initially as a request to enable optimizations if possible. + dnl Finally, if the compiler is known and CFLAGS and CPPFLAGS do + dnl not have any optimizer flag the request will be honored, in + dnl any other case the request can not be honored. + dnl IOW, existing optimizer flags defined in CFLAGS or CPPFLAGS + dnl will always take precedence over any initial assumption. + if test "$want_debug" = "yes"; then + want_optimize="assume_no" + AC_MSG_RESULT([not specified (assuming no)]) + else + want_optimize="assume_yes" + AC_MSG_RESULT([not specified (assuming yes)]) + fi + ;; + *) + dnl --enable-optimize option used. We will handle this as + dnl a request to enable compiler optimizations if possible. + dnl If the compiler is known CFLAGS and CPPFLAGS will be + dnl overridden, otherwise this can not be honored. + want_optimize="yes" + AC_MSG_RESULT([yes]) + ;; + esac +]) + + dnl CURL_CHECK_OPTION_WARNINGS dnl ------------------------------------------------- dnl Verify if configure has been invoked with option dnl --enable-warnings or --disable-warnings, and set -DNL shell variable want_warnings as appropriate. +dnl shell variable want_warnings as appropriate. AC_DEFUN([CURL_CHECK_OPTION_WARNINGS], [ AC_REQUIRE([CURL_CHECK_OPTION_DEBUG])dnl - AC_BEFORE([$0],[AC_PROG_CC])dnl + AC_BEFORE([$0],[CURL_CHECK_PROG_CC])dnl AC_MSG_CHECKING([whether to enable strict compiler warnings]) OPT_COMPILER_WARNINGS="default" AC_ARG_ENABLE(warnings, - AC_HELP_STRING([--enable-warnings],[Enable strict compiler warnings]) - AC_HELP_STRING([--disable-warnings],[Disable strict compiler warnings]), - OPT_COMPILER_WARNINGS=$enableval) +AC_HELP_STRING([--enable-warnings],[Enable strict compiler warnings]) +AC_HELP_STRING([--disable-warnings],[Disable strict compiler warnings]), + OPT_COMPILER_WARNINGS=$enableval) case "$OPT_COMPILER_WARNINGS" in no) dnl --disable-warnings option used