libmicrohttpd

HTTP/1.x server C library (MHD 1.x, stable)
Log | Files | Refs | Submodules | README | LICENSE

mhd_sys_extentions.m4 (43039B)


      1 # SYNOPSIS
      2 #
      3 #   MHD_SYS_EXT([VAR-ADD-CPPFLAGS])
      4 #
      5 # DESCRIPTION
      6 #
      7 #   This macro checks system headers and add defines that enable maximum
      8 #   number of exposed system interfaces. Macro verifies that added defines
      9 #   will not break basic headers, some defines are also checked against
     10 #   real recognition by headers.
     11 #   If VAR-ADD-CPPFLAGS is specified, defines will be added to this variable
     12 #   in form suitable for CPPFLAGS. Otherwise defines will be added to
     13 #   configuration header (usually 'config.h').
     14 #
     15 #   Example usage:
     16 #
     17 #     MHD_SYS_EXT
     18 #
     19 #   or
     20 #
     21 #     MHD_SYS_EXT([CPPFLAGS])
     22 #
     23 #   Macro is not enforced to be called before AC_COMPILE_IFELSE, but it
     24 #   advisable to call macro before any compile and header tests since
     25 #   additional defines can change results of those tests.
     26 #
     27 #   Defined in command line macros are always honored and cache variables
     28 #   used in all checks so if any test will not work correctly on some
     29 #   platform, user may simply fix it by giving correct defines in CPPFLAGS
     30 #   or by giving cache variable in configure parameters, for example:
     31 #
     32 #     ./configure CPPFLAGS='-D_XOPEN_SOURCE=1 -D_XOPEN_SOURCE_EXTENDED'
     33 #
     34 #   or
     35 #
     36 #     ./configure mhd_cv_define__xopen_source_sevenh_works=no
     37 #
     38 #   This simplify building from source on exotic platforms as patching
     39 #   of configure.ac is not required to change results of tests.
     40 #
     41 # LICENSE
     42 #
     43 #   Copyright (c) 2016, 2017, 2024 Karlson2k (Evgeny Grin) <k2k@narod.ru>
     44 #
     45 #   Copying and distribution of this file, with or without modification, are
     46 #   permitted in any medium without royalty provided the copyright notice
     47 #   and this notice are preserved. This file is offered as-is, without any
     48 #   warranty.
     49 
     50 #serial 5
     51 
     52 AC_DEFUN([MHD_SYS_EXT],[dnl
     53   AC_PREREQ([2.64])dnl for AS_VAR_IF, AS_VAR_SET_IF, m4_ifnblank
     54   AC_LANG_ASSERT([C])dnl Only C is supported
     55 m4_ifdef([_AC_UNDECLARED_BUILTIN],
     56 [AC_DEFUN_ONCE([_AC_UNDECLARED_BUILTIN_]_AC_LANG_ABBREV,
     57                [_AC_UNDECLARED_BUILTIN])]dnl
     58 [AC_REQUIRE([_AC_UNDECLARED_BUILTIN_]_AC_LANG_ABBREV)]dnl
     59 )dnl m4_ifdef _AC_UNDECLARED_BUILTIN
     60   mhd_mse_sys_ext_defines=""
     61   mhd_mse_sys_ext_flags=""
     62 
     63   dnl Check platform-specific extensions.
     64   dnl Use compiler-based test for determinig target.
     65 
     66   dnl Always add _GNU_SOURCE if headers allow.
     67   MHD_CHECK_DEF_AND_ACCEPT([[_GNU_SOURCE]], [],
     68     [[${mhd_mse_sys_ext_defines}]], [mhd_cv_macro_add__gnu_source="no"],
     69     [mhd_cv_macro_add__gnu_source="yes"],
     70     [mhd_cv_macro_add__gnu_source="no"]
     71   )
     72   AS_VAR_IF([mhd_cv_macro_add__gnu_source], ["yes"],
     73     [
     74       _MHD_SYS_EXT_VAR_ADD_FLAG([[mhd_mse_sys_ext_defines]], [[mhd_mse_sys_ext_flags]], [[_GNU_SOURCE]])
     75     ]
     76   )
     77 
     78   dnl __BSD_VISIBLE is actually a small hack for FreeBSD.
     79   dnl Funny that it's used in some Android versions too.
     80   AC_CACHE_CHECK([[whether to try __BSD_VISIBLE macro]],
     81     [[mhd_cv_macro_try___bsd_visible]], [dnl
     82     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
     83 /* Warning: test with inverted logic! */
     84 #ifdef __FreeBSD__
     85 #error Target FreeBSD
     86 choke me now;
     87 #endif /* __FreeBSD__ */
     88 
     89 #ifdef __ANDROID__
     90 #include <android/api-level.h>
     91 #ifndef __ANDROID_API_O__
     92 #error Target is Android NDK before R14
     93 choke me now;
     94 #endif /* ! __ANDROID_API_O__ */
     95 #endif /* __ANDROID__ */
     96         ]],[])],
     97       [[mhd_cv_macro_try___bsd_visible="no"]],
     98       [[mhd_cv_macro_try___bsd_visible="yes"]]
     99     )
    100   ])
    101   AS_VAR_IF([[mhd_cv_macro_try___bsd_visible]], [["yes"]],
    102   [dnl
    103     AC_CACHE_CHECK([[whether __BSD_VISIBLE is already defined]],
    104       [[mhd_cv_macro___bsd_visible_defined]], [dnl
    105       AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
    106 ${mhd_mse_sys_ext_defines}
    107 /* Warning: test with inverted logic! */
    108 #ifdef __BSD_VISIBLE
    109 #error __BSD_VISIBLE is defined
    110 choke me now;
    111 #endif
    112           ]],[])
    113       ],
    114         [[mhd_cv_macro___bsd_visible_defined="no"]],
    115         [[mhd_cv_macro___bsd_visible_defined="yes"]]
    116       )
    117     ])
    118     AS_VAR_IF([[mhd_cv_macro___bsd_visible_defined]], [["yes"]], [[:]],
    119     [dnl
    120       MHD_CHECK_ACCEPT_DEFINE(
    121         [[__BSD_VISIBLE]], [], [[${mhd_mse_sys_ext_defines}]],
    122         [
    123           _MHD_SYS_EXT_VAR_ADD_FLAG([[mhd_mse_sys_ext_defines]], [[mhd_mse_sys_ext_flags]], [[__BSD_VISIBLE]])
    124         ]
    125       )dnl
    126     ])
    127   ])
    128 
    129 
    130   dnl _DARWIN_C_SOURCE enables additional functionality on Darwin.
    131   MHD_CHECK_DEFINED_MSG([[__APPLE__]], [[${mhd_mse_sys_ext_defines}]],
    132     [[whether to try _DARWIN_C_SOURCE macro]],
    133   [dnl
    134     MHD_CHECK_DEF_AND_ACCEPT(
    135       [[_DARWIN_C_SOURCE]], [], [[${mhd_mse_sys_ext_defines}]], [],
    136       [
    137         _MHD_SYS_EXT_VAR_ADD_FLAG([[mhd_mse_sys_ext_defines]], [[mhd_mse_sys_ext_flags]], [[_DARWIN_C_SOURCE]])
    138       ]
    139     )dnl
    140   ])
    141 
    142   dnl __EXTENSIONS__ unlocks almost all interfaces on Solaris.
    143   MHD_CHECK_DEFINED_MSG([[__sun]], [[${mhd_mse_sys_ext_defines}]],
    144     [[whether to try __EXTENSIONS__ macro]],
    145   [dnl
    146     MHD_CHECK_DEF_AND_ACCEPT(
    147       [[__EXTENSIONS__]], [], [[${mhd_mse_sys_ext_defines}]], [],
    148       [
    149         _MHD_SYS_EXT_VAR_ADD_FLAG([[mhd_mse_sys_ext_defines]], [[mhd_mse_sys_ext_flags]], [[__EXTENSIONS__]])
    150       ]
    151     )dnl
    152   ])
    153 
    154   dnl _NETBSD_SOURCE switch on almost all headers definitions on NetBSD.
    155   MHD_CHECK_DEFINED_MSG([[__NetBSD__]], [[${mhd_mse_sys_ext_defines}]],
    156     [[whether to try _NETBSD_SOURCE macro]],
    157   [dnl
    158     MHD_CHECK_DEF_AND_ACCEPT(
    159       [[_NETBSD_SOURCE]], [], [[${mhd_mse_sys_ext_defines}]], [],
    160       [
    161         _MHD_SYS_EXT_VAR_ADD_FLAG([[mhd_mse_sys_ext_defines]], [[mhd_mse_sys_ext_flags]], [[_NETBSD_SOURCE]])
    162       ]
    163     )dnl
    164   ])
    165 
    166   dnl _BSD_SOURCE currently used only on OpenBSD to unhide functions.
    167   MHD_CHECK_DEFINED_MSG([[__OpenBSD__]], [[${mhd_mse_sys_ext_defines}]],
    168     [[whether to try _BSD_SOURCE macro]],
    169   [dnl
    170     MHD_CHECK_DEF_AND_ACCEPT(
    171       [[_BSD_SOURCE]], [], [[${mhd_mse_sys_ext_defines}]], [],
    172       [
    173         _MHD_SYS_EXT_VAR_ADD_FLAG([[mhd_mse_sys_ext_defines]], [[mhd_mse_sys_ext_flags]], [[_BSD_SOURCE]])
    174       ]
    175     )dnl
    176   ])
    177 
    178   dnl _TANDEM_SOURCE unhides most functions on NonStop OS
    179   dnl (which comes from Tandem Computers decades ago).
    180   MHD_CHECK_DEFINED_MSG([[__TANDEM]], [[${mhd_mse_sys_ext_defines}]],
    181     [[whether to try _TANDEM_SOURCE macro]],
    182   [dnl
    183     MHD_CHECK_DEF_AND_ACCEPT(
    184       [[_TANDEM_SOURCE]], [], [[${mhd_mse_sys_ext_defines}]], [],
    185       [
    186         _MHD_SYS_EXT_VAR_ADD_FLAG([[mhd_mse_sys_ext_defines]], [[mhd_mse_sys_ext_flags]], [[_TANDEM_SOURCE]])
    187       ]
    188     )dnl
    189   ])
    190 
    191   dnl _ALL_SOURCE makes visible POSIX and non-POSIX symbols
    192   dnl on z/OS, AIX and Interix.
    193   AC_CACHE_CHECK([[whether to try _ALL_SOURCE macro]],
    194     [[mhd_cv_macro_try__all_source]], [dnl
    195     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
    196 #if !defined(__TOS_MVS__) && !defined (__INTERIX)
    197 #error Target is not z/OS, AIX or Interix
    198 choke me now;
    199 #endif
    200         ]],[])],
    201       [[mhd_cv_macro_try__all_source="yes"]],
    202       [[mhd_cv_macro_try__all_source="no"]]
    203     )
    204   ])
    205   AS_VAR_IF([[mhd_cv_macro_try__all_source]], [["yes"]],
    206   [dnl
    207     MHD_CHECK_DEF_AND_ACCEPT(
    208       [[_ALL_SOURCE]], [], [[${mhd_mse_sys_ext_defines}]], [],
    209       [
    210         _MHD_SYS_EXT_VAR_ADD_FLAG([[mhd_mse_sys_ext_defines]], [[mhd_mse_sys_ext_flags]], [[_ALL_SOURCE]])
    211       ]
    212     )dnl
    213   ])
    214 
    215   mhd_mse_xopen_features=""
    216   mhd_mse_xopen_defines=""
    217   mhd_mse_xopen_flags=""
    218 
    219   AC_CACHE_CHECK([[whether _XOPEN_SOURCE is already defined]],
    220     [[mhd_cv_macro__xopen_source_defined]], [
    221       _MHD_CHECK_DEFINED([[_XOPEN_SOURCE]], [[${mhd_mse_sys_ext_defines}]],
    222         [[mhd_cv_macro__xopen_source_defined="yes"]],
    223         [[mhd_cv_macro__xopen_source_defined="no"]]
    224       )
    225     ]
    226   )
    227   AS_VAR_IF([[mhd_cv_macro__xopen_source_defined]], [["no"]],
    228     [
    229       dnl Some platforms (namely: Solaris) use '==' checks instead of '>='
    230       dnl for _XOPEN_SOURCE, resulting that unknown for platform values are
    231       dnl interpreted as oldest and platform expose reduced number of
    232       dnl interfaces. Next checks will ensure that platform recognise
    233       dnl requested mode instead of blindly define high number that can
    234       dnl be simply ignored by platform.
    235       _MHD_CHECK_POSIX2008([[mhd_mse_xopen_defines]],
    236         [[mhd_mse_xopen_flags]],
    237         [[${mhd_mse_sys_ext_defines}]],
    238         [mhd_mse_xopen_features="${mhd_cv_headers_posix2008}"],
    239         [
    240           _MHD_CHECK_POSIX2001([[mhd_mse_xopen_defines]],
    241             [[mhd_mse_xopen_flags]],
    242              [[${mhd_mse_sys_ext_defines}]],
    243             [mhd_mse_xopen_features="${mhd_cv_headers_posix2001}"],
    244             [
    245               _MHD_CHECK_SUSV2([[mhd_mse_xopen_defines]],
    246                 [[mhd_mse_xopen_flags]],
    247                 [[${mhd_mse_sys_ext_defines}]],
    248                 [mhd_mse_xopen_features="${mhd_cv_headers_susv2}"],
    249                 [mhd_mse_xopen_features="${mhd_cv_headers_susv2}"]
    250               )
    251             ]
    252           )
    253         ]
    254       )
    255     ]
    256   )
    257 
    258   AS_IF([[test "x${mhd_cv_macro__xopen_source_defined}" = "xno" && \
    259           test "x${mhd_cv_macro__xopen_source_def_fiveh}" = "xno" || \
    260           test "x${mhd_mse_xopen_features}" = "xnot available" ]],
    261     [
    262       _MHD_XOPEN_VAR_ADD([mhd_mse_xopen_defines], [mhd_mse_xopen_flags], [${mhd_mse_sys_ext_defines}])
    263     ]
    264   )
    265 
    266   mhd_mse_sys_features_src="
    267 #ifdef __APPLE__
    268 #include <sys/socket.h>
    269 #else
    270 #error No useful system features.
    271 choke me now;
    272 #endif
    273 
    274 int main()
    275 {
    276 #ifdef __APPLE__
    277 #ifndef sendfile
    278   (void) sendfile;
    279 #endif
    280 #endif
    281   return 0;
    282 }
    283 "
    284   AC_CACHE_CHECK([[for useful system-specific features]],
    285     [[mhd_cv_headers_useful_features_present]], [
    286     mhd_SYS_EXT_SAVE_CFLAGS="$CFLAGS"
    287     CFLAGS="$CFLAGS $ac_[]_AC_LANG_ABBREV[]_undeclared_builtin_options"
    288     AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
    289 ${mhd_mse_sys_ext_defines}
    290 ${mhd_mse_sys_features_src}
    291       ]])],
    292       [[mhd_cv_headers_useful_features_present="yes"]],
    293       [[mhd_cv_headers_useful_features_present="no"]]
    294     )dnl
    295   ])
    296   AS_VAR_IF([[mhd_cv_headers_useful_features_present]], [["yes"]],
    297     [
    298       AS_IF([[test "x${mhd_mse_xopen_flags}" = "x"]], [[:]],
    299         [
    300           AC_CACHE_CHECK([[whether useful system-specific features works with ${mhd_mse_xopen_flags}]],
    301             [[mhd_cv_headers_useful_features_works_xopen]], [dnl
    302             AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
    303 ${mhd_mse_sys_ext_defines}
    304 ${mhd_mse_xopen_defines}
    305 ${mhd_mse_sys_features_src}
    306               ]])],
    307               [[mhd_cv_headers_useful_features_works_xopen="yes"]],
    308               [[mhd_cv_headers_useful_features_works_xopen="no"]]
    309             )dnl
    310           ])dnl
    311         ]
    312       )
    313     CFLAGS="$mhd_SYS_EXT_SAVE_CFLAGS"
    314     AS_UNSET([mhd_SYS_EXT_SAVE_CFLAGS])
    315     ]
    316   )
    317 
    318 
    319   AS_IF([[test "x${mhd_cv_headers_useful_features_present}" = "xyes" && \
    320           test "x${mhd_cv_headers_useful_features_works_xopen}" = "xno" && \
    321           test "x${mhd_mse_xopen_flags}" != "x"]],
    322     [
    323       _MHD_VAR_CONTAIN([[mhd_mse_xopen_features]], [[, activated by _XOPEN_SOURCE]],
    324         [
    325           AC_MSG_WARN([[_XOPEN_SOURCE macro is required to activate all headers symbols, however some useful system-specific features does not work with _XOPEN_SOURCE. ]dnl
    326           [_XOPEN_SOURCE macro will not be used.]])
    327         ]
    328       )
    329       AS_UNSET([[mhd_mse_xopen_defines]])
    330       AS_UNSET([[mhd_mse_xopen_flags]])
    331       AS_UNSET([[mhd_mse_xopen_values]])
    332     ]
    333   )
    334 
    335   dnl Discard temporal source variables
    336   AS_UNSET([[mhd_mse_sys_features_src]])
    337   AS_UNSET([[mhd_mse_xopen_defines]])
    338   AS_UNSET([[mhd_mse_sys_ext_defines]])
    339 
    340   dnl Determined all required defines.
    341   AC_MSG_CHECKING([[for final set of defined symbols]])
    342   m4_ifblank([$1], [dnl
    343     AH_TEMPLATE([[_XOPEN_SOURCE]], [Define to maximum value supported by system headers])dnl
    344     AH_TEMPLATE([[_XOPEN_SOURCE_EXTENDED]], [Define to 1 if _XOPEN_SOURCE is defined to value less than 500 ]dnl
    345       [and system headers require this symbol])dnl
    346     AH_TEMPLATE([[_XOPEN_VERSION]], [Define to maximum value supported by system headers if _XOPEN_SOURCE ]dnl
    347       [is defined to value less than 500 and headers do not support _XOPEN_SOURCE_EXTENDED])dnl
    348     AH_TEMPLATE([[_GNU_SOURCE]], [Define to 1 to enable GNU-related header features])dnl
    349     AH_TEMPLATE([[__BSD_VISIBLE]], [Define to 1 if it is required by headers to expose additional symbols])dnl
    350     AH_TEMPLATE([[_DARWIN_C_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl
    351     AH_TEMPLATE([[__EXTENSIONS__]], [Define to 1 if it is required by headers to expose additional symbols])dnl
    352     AH_TEMPLATE([[_NETBSD_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl
    353     AH_TEMPLATE([[_BSD_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl
    354     AH_TEMPLATE([[_TANDEM_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl
    355     AH_TEMPLATE([[_ALL_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl
    356   ])
    357   for mhd_mse_Flag in ${mhd_mse_sys_ext_flags} ${mhd_mse_xopen_flags}
    358   do
    359     m4_ifnblank([$1], [dnl
    360       AS_VAR_APPEND([$1],[[" -D$mhd_mse_Flag"]])
    361     ], [dnl
    362       AS_CASE([[$mhd_mse_Flag]], [[*=*]],
    363       [dnl
    364         AC_DEFINE_UNQUOTED([[`echo $mhd_mse_Flag | cut -f 1 -d =`]],
    365           [[`echo $mhd_mse_Flag | cut -f 2 -d = -s`]])
    366       ], [dnl
    367         AC_DEFINE_UNQUOTED([[$mhd_mse_Flag]])
    368       ])
    369     ])
    370   done
    371   AS_UNSET([[mhd_mse_Flag]])
    372   dnl Trim whitespaces
    373   mhd_mse_result=`echo ${mhd_mse_sys_ext_flags} ${mhd_mse_xopen_flags}`
    374   AC_MSG_RESULT([[${mhd_mse_result}]])
    375   AS_UNSET([[mhd_mse_result]])
    376   AS_UNSET([[mhd_mse_xopen_flags]])
    377   AS_UNSET([[mhd_mse_sys_ext_flags]])
    378 ])
    379 
    380 
    381 #
    382 # _MHD_SYS_EXT_VAR_ADD_FLAG(DEFINES_VAR, FLAGS_VAR,
    383 #                           FLAG, [FLAG-VALUE = 1])
    384 #
    385 # Internal macro, only to be used from MHD_SYS_EXT, _MHD_XOPEN_VAR_ADD
    386 
    387 m4_define([_MHD_SYS_EXT_VAR_ADD_FLAG], [dnl
    388   m4_ifnblank([$4],[dnl
    389     ]m4_normalize([$1])[="[$]{]m4_normalize([$1])[}[#define ]m4_normalize($3) ]m4_normalize([$4])[
    390 "
    391     AS_IF([test "x[$]{]m4_normalize([$2])[}" = "x"],
    392       []m4_normalize([$2])[="]m4_normalize([$3])[=]m4_normalize([$4])["],
    393       []m4_normalize([$2])[="[$]{]m4_normalize([$2])[} ]m4_normalize([$3])[=]m4_normalize([$4])["]
    394     )dnl
    395   ], [dnl
    396     ]m4_normalize([$1])[="[$]{]m4_normalize([$1])[}[#define ]m4_normalize($3) 1
    397 "
    398     AS_IF([test "x[$]{]m4_normalize([$2])[}" = "x"],
    399       []m4_normalize([$2])[="]m4_normalize([$3])["],
    400       []m4_normalize([$2])[="[$]{]m4_normalize([$2])[} ]m4_normalize([$3])["]
    401     )dnl
    402   ])dnl
    403 ])
    404 
    405 #
    406 # _MHD_VAR_IF(VAR, VALUE, [IF-EQ], [IF-NOT-EQ])
    407 #
    408 # Same as AS_VAR_IF, except that it expands to nothing if
    409 # both IF-EQ and IF-NOT-EQ are empty.
    410 
    411 m4_define([_MHD_VAR_IF],[dnl
    412 m4_ifnblank([$3$4],[dnl
    413 AS_VAR_IF([$1],[$2],[$3],[$4])])])
    414 
    415 #
    416 # _MHD_STRING_CONTAIN(VAR, MATCH, [IF-MATCH], [IF-NOT-MATCH])
    417 #
    418 
    419 AC_DEFUN([_MHD_VAR_CONTAIN],[dnl
    420 AC_REQUIRE([AC_PROG_FGREP])dnl
    421 AS_IF([[`echo "${]$1[}" | $FGREP ']$2[' >/dev/null 2>&1`]], [$3], [$4])
    422 ])
    423 
    424 #
    425 # _MHD_STRING_CONTAIN_BRE(VAR, BRE, [IF-MATCH], [IF-NOT-MATCH])
    426 #
    427 
    428 AC_DEFUN([_MHD_VAR_CONTAIN_BRE],[dnl
    429 AC_REQUIRE([AC_PROG_GREP])dnl
    430 AS_IF([[`echo "${]$1[}" | $GREP ']$2[' >/dev/null 2>&1`]], [$3], [$4])
    431 ])
    432 
    433 # SYNOPSIS
    434 #
    435 # _MHD_CHECK_POSIX2008(DEFINES_VAR, FLAGS_VAR,
    436 #                      [EXT_DEFINES],
    437 #                      [ACTION-IF-AVAILABLE],
    438 #                      [ACTION-IF-NOT-AVAILABLE])
    439 #
    440 #
    441 AC_DEFUN([_MHD_CHECK_POSIX2008], [dnl
    442   AC_CACHE_CHECK([headers for POSIX.1-2008/SUSv4 features],
    443     [[mhd_cv_headers_posix2008]], [dnl
    444       _MHD_CHECK_POSIX_FEATURES_SINGLE([
    445 _MHD_BASIC_INCLUDES
    446 [
    447 /* Check will be passed if ALL features are available 
    448  * and failed if ANY feature is not available. */
    449 int main()
    450 {
    451 
    452 #ifndef stpncpy
    453   (void) stpncpy;
    454 #endif
    455 #ifndef strnlen
    456   (void) strnlen;
    457 #endif
    458 
    459 #if !defined(__NetBSD__) && !defined(__OpenBSD__)
    460 /* NetBSD and OpenBSD didn't implement wcsnlen() for some reason. */
    461 #ifndef wcsnlen
    462   (void) wcsnlen;
    463 #endif
    464 #endif
    465 
    466 #ifdef __CYGWIN__
    467 /* The only depend function on Cygwin, but missing on some other platforms */
    468 #ifndef strndup
    469   (void) strndup;
    470 #endif
    471 #endif
    472 
    473 #ifndef __sun
    474 /* illumos forget to uncomment some _XPG7 macros. */
    475 #ifndef renameat
    476   (void) renameat;
    477 #endif
    478 
    479 #ifndef getline
    480   (void) getline;
    481 #endif
    482 #endif /* ! __sun */
    483 
    484 /* gmtime_r() becomes mandatory only in POSIX.1-2008. */
    485 #ifndef gmtime_r
    486   (void) gmtime_r;
    487 #endif
    488 
    489 /* unsetenv() actually defined in POSIX.1-2001 so it
    490  * must be present with _XOPEN_SOURCE == 700 too. */
    491 #ifndef unsetenv
    492   (void) unsetenv;
    493 #endif
    494 
    495   return 0;
    496 }
    497         ]],
    498         [$3], [[700]],
    499         [[mhd_cv_headers_posix2008]]dnl
    500       )
    501     ]
    502   )
    503   _MHD_VAR_CONTAIN_BRE([[mhd_cv_headers_posix2008]], [[^available]],
    504     [
    505       _MHD_VAR_CONTAIN([[mhd_cv_headers_posix2008]], [[does not work with _XOPEN_SOURCE]], [[:]],
    506         [_MHD_SYS_EXT_VAR_ADD_FLAG([$1],[$2],[[_XOPEN_SOURCE]],[[700]])]
    507       )
    508       $4
    509     ],
    510     [$5]
    511   )
    512 ])
    513 
    514 
    515 # SYNOPSIS
    516 #
    517 # _MHD_CHECK_POSIX2001(DEFINES_VAR, FLAGS_VAR,
    518 #                      [EXT_DEFINES],
    519 #                      [ACTION-IF-AVAILABLE],
    520 #                      [ACTION-IF-NOT-AVAILABLE])
    521 #
    522 #
    523 AC_DEFUN([_MHD_CHECK_POSIX2001], [dnl
    524   AC_CACHE_CHECK([headers for POSIX.1-2001/SUSv3 features],
    525     [[mhd_cv_headers_posix2001]], [
    526       _MHD_CHECK_POSIX_FEATURES_SINGLE([
    527 _MHD_BASIC_INCLUDES
    528 [
    529 /* Check will be passed if ALL features are available
    530  * and failed if ANY feature is not available. */
    531 int main()
    532 {
    533 
    534 #ifndef setenv
    535   (void) setenv;
    536 #endif
    537 
    538 #ifndef __NetBSD__
    539 #ifndef vsscanf
    540   (void) vsscanf;
    541 #endif
    542 #endif
    543 
    544 /* Availability of next features varies, but they all must be present
    545  * on platform with support for _XOPEN_SOURCE = 600. */
    546 
    547 /* vsnprintf() should be available with _XOPEN_SOURCE >= 500, but some platforms
    548  * provide it only with _POSIX_C_SOURCE >= 200112 (autodefined when
    549  * _XOPEN_SOURCE >= 600) where specification of vsnprintf() is aligned with
    550  * ISO C99 while others platforms defined it with even earlier standards. */
    551 #ifndef vsnprintf
    552   (void) vsnprintf;
    553 #endif
    554 
    555 /* On platforms that prefer POSIX over X/Open, fseeko() is available
    556  * with _POSIX_C_SOURCE >= 200112 (autodefined when _XOPEN_SOURCE >= 600).
    557  * On other platforms it should be available with _XOPEN_SOURCE >= 500. */
    558 #ifndef fseeko
    559   (void) fseeko;
    560 #endif
    561 
    562 /* F_GETOWN must be defined with _XOPEN_SOURCE >= 600, but some platforms
    563  * define it with _XOPEN_SOURCE >= 500. */
    564 #ifndef F_GETOWN
    565 #error F_GETOWN is not defined
    566 choke me now;
    567 #endif
    568   return 0;
    569 }
    570         ]],
    571         [$3],[[600]],[[mhd_cv_headers_posix2001]]dnl
    572       )
    573     ]
    574   )
    575   _MHD_VAR_CONTAIN_BRE([[mhd_cv_headers_posix2001]], [[^available]],
    576     [
    577       _MHD_VAR_CONTAIN([[mhd_cv_headers_posix2001]], [[does not work with _XOPEN_SOURCE]], [[:]],
    578         [_MHD_SYS_EXT_VAR_ADD_FLAG([$1],[$2],[[_XOPEN_SOURCE]],[[600]])]
    579       )
    580       $4
    581     ],
    582     [$5]
    583   )
    584 ])
    585 
    586 
    587 # SYNOPSIS
    588 #
    589 # _MHD_CHECK_SUSV2(DEFINES_VAR, FLAGS_VAR,
    590 #                  [EXT_DEFINES],
    591 #                  [ACTION-IF-AVAILABLE],
    592 #                  [ACTION-IF-NOT-AVAILABLE])
    593 #
    594 #
    595 AC_DEFUN([_MHD_CHECK_SUSV2], [dnl
    596   AC_CACHE_CHECK([headers for SUSv2/XPG5 features],
    597     [[mhd_cv_headers_susv2]], [
    598       _MHD_CHECK_POSIX_FEATURES_SINGLE([
    599 _MHD_BASIC_INCLUDES
    600 [
    601 /* Check will be passed if ALL features are available
    602  * and failed if ANY feature is not available. */
    603 int main()
    604 {
    605 /* It's not easy to write reliable test for _XOPEN_SOURCE = 500 as
    606  * platforms not always precisely follow this standard and some
    607  * functions are already deprecated in later standards. */
    608 
    609 /* Availability of next features varies, but they all must be present
    610  * on platform with correct support for _XOPEN_SOURCE = 500. */
    611 
    612 /* Mandatory with _XOPEN_SOURCE >= 500 but as XSI extension available
    613  * with much older standards. */
    614 #ifndef ftruncate
    615   (void) ftruncate;
    616 #endif
    617 
    618 /* Added with _XOPEN_SOURCE >= 500 but was available in some standards
    619  * before. XSI extension. */
    620 #ifndef pread
    621   (void) pread;
    622 #endif
    623 
    624 #ifndef __APPLE__
    625 /* Actually comes from XPG4v2 and must be available
    626  * with _XOPEN_SOURCE >= 500 as well. */
    627 #ifndef symlink
    628   (void) symlink;
    629 #endif
    630 
    631 /* Actually comes from XPG4v2 and must be available
    632  * with _XOPEN_SOURCE >= 500 as well. XSI extension. */
    633 #ifndef strdup
    634   (void) strdup;
    635 #endif
    636 #endif /* ! __APPLE__ */
    637   return 0;
    638 }
    639         ]],
    640         [$3],[[500]],[[mhd_cv_headers_susv2]]dnl
    641       )
    642     ]
    643   )
    644   _MHD_VAR_CONTAIN_BRE([[mhd_cv_headers_susv2]], [[^available]],
    645     [
    646       _MHD_VAR_CONTAIN([[mhd_cv_headers_susv2]], [[does not work with _XOPEN_SOURCE]], [[:]],
    647         [_MHD_SYS_EXT_VAR_ADD_FLAG([$1],[$2],[[_XOPEN_SOURCE]],[[500]])]
    648       )
    649       $4
    650     ],
    651     [$5]
    652   )
    653 ])
    654 
    655 
    656 # SYNOPSIS
    657 #
    658 # _MHD_CHECK_POSIX_FEATURES_SINGLE(FEATURES_TEST,
    659 #                                  EXT_DEFINES,
    660 #                                  _XOPEN_SOURCE-VALUE,
    661 #                                  VAR-RESULT)
    662 
    663 AC_DEFUN([_MHD_CHECK_POSIX_FEATURES_SINGLE], [dnl
    664   AS_VAR_PUSHDEF([avail_Var], [mhd_cpsxfs_tmp_features_available])dnl
    665   AS_VAR_PUSHDEF([ext_Var], [mhd_cpsxfs_tmp_extentions_allowed])dnl
    666   AS_VAR_PUSHDEF([xopen_Var], [mhd_cpsxfs_tmp_src_xopen_allowed])dnl
    667   AS_VAR_PUSHDEF([dislb_Var], [mhd_cpsxfs_tmp_features_disableable])dnl
    668   AS_UNSET([avail_Var])
    669   AS_UNSET([ext_Var])
    670   AS_UNSET([xopen_Var])
    671   AS_UNSET([dislb_Var])
    672   _MHD_CHECK_POSIX_FEATURES([$1], [$2], [$3], [avail_Var], [ext_Var], [xopen_Var], [dislb_Var])
    673   AS_VAR_IF([avail_Var], ["yes"],
    674     [
    675       AS_VAR_IF([dislb_Var], ["yes"],
    676         [
    677           AS_VAR_IF([ext_Var], ["required"],
    678             [
    679               AS_VAR_IF([xopen_Var], ["allowed"],
    680                 [
    681                   AS_VAR_SET(m4_normalize([$4]), ["available, activated by extension macro, works with _XOPEN_SOURCE=]m4_normalize([$3])["])
    682                 ],
    683                 [
    684                   AS_VAR_SET(m4_normalize([$4]), ["available, activated by extension macro, does not work with _XOPEN_SOURCE=]m4_normalize([$3])["])
    685                 ]
    686               )
    687             ],
    688             [
    689               AS_VAR_IF([ext_Var], ["allowed"],
    690                 [
    691                   AS_VAR_IF([xopen_Var], ["required"],
    692                     [
    693                       AS_VAR_SET(m4_normalize([$4]), ["available, activated by _XOPEN_SOURCE=]m4_normalize([$3])[, works with extension macro"])
    694                     ],
    695                     [
    696                       AS_VAR_IF([xopen_Var], ["allowed"],
    697                         [
    698                           AS_VAR_SET(m4_normalize([$4]), ["available, works with _XOPEN_SOURCE=]m4_normalize([$3])[, works with extension macro"])
    699                         ],
    700                         [
    701                           AS_VAR_SET(m4_normalize([$4]), ["available, works with extension macro, does not work with _XOPEN_SOURCE=]m4_normalize([$3])["])
    702                         ]
    703                       )
    704                     ]
    705                   )
    706                 ],
    707                 [
    708                   AS_VAR_IF([xopen_Var], ["required"],
    709                     [
    710                       AS_VAR_SET(m4_normalize([$4]), ["available, activated by _XOPEN_SOURCE=]m4_normalize([$3])[, does not work with extension macro"])
    711                     ],
    712                     [
    713                       AS_VAR_IF([xopen_Var], ["allowed"],
    714                         [
    715                           AS_VAR_SET(m4_normalize([$4]), ["available, works with _XOPEN_SOURCE=]m4_normalize([$3])[, does not work with extension macro"])
    716                         ],
    717                         [
    718                           AS_VAR_SET(m4_normalize([$4]), ["available, does not work with _XOPEN_SOURCE=]m4_normalize([$3])[, does not work with extension macro"])
    719                         ]
    720                       )
    721                     ]
    722                   )
    723                 ]
    724               )
    725             ]
    726           )
    727         ],
    728         [
    729           AS_VAR_SET(m4_normalize([$4]), ["available, works always"])
    730         ]
    731       )
    732     ],
    733     [
    734       AS_VAR_SET(m4_normalize([$4]), ["not available"])
    735     ]
    736   )
    737   AS_UNSET([dislb_Var])
    738   AS_UNSET([xopen_Var])
    739   AS_UNSET([ext_Var])
    740   AS_UNSET([avail_Var])
    741   AS_VAR_POPDEF([dislb_Var])dnl
    742   AS_VAR_POPDEF([xopen_Var])dnl
    743   AS_VAR_POPDEF([ext_Var])dnl
    744   AS_VAR_POPDEF([avail_Var])dnl
    745 ])
    746 
    747 # SYNOPSIS
    748 #
    749 # _MHD_CHECK_POSIX_FEATURES(FEATURES_TEST, EXT_DEFINES, _XOPEN_SOURCE-VALUE,
    750 #                           [VAR-FEATURES-AVAILABLE-YES_NO],
    751 #                           [VAR-EXTENSIONS-REQUIRED_NOT-ALLOWED_ALLOWED],
    752 #                           [VAR-XOPEN-REQUIRED_NOT-ALLOWED_ALLOWED],
    753 #                           [VAR-FEATURES-DISABLEABLE-YES_NO])
    754 
    755 AC_DEFUN([_MHD_CHECK_POSIX_FEATURES], [dnl
    756   AS_VAR_PUSHDEF([src_Var], [mhd_cpsxf_tmp_src_variable])dnl
    757   AS_VAR_PUSHDEF([defs_Var], [mhd_cpsxf_tmp_defs_variable])dnl
    758   AS_VAR_SET([src_Var],["
    759 $1
    760 "])
    761   dnl To reduce 'configure' size
    762   AS_VAR_SET([defs_Var],["
    763 $2
    764 "])
    765   dnl To reduce 'configure' size
    766 
    767   dnl Some platforms enable most features when no
    768   dnl specific mode is requested by macro.
    769   dnl Check whether features test works without _XOPEN_SOURCE and
    770   dnl with disabled extensions (undefined most of
    771   dnl predefined macros for specific requested mode).
    772   mhd_SYS_EXT_SAVE_CFLAGS="$CFLAGS"
    773   CFLAGS="$CFLAGS $ac_[]_AC_LANG_ABBREV[]_undeclared_builtin_options"
    774   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
    775 _MHD_UNDEF_ALL_EXT
    776 $src_Var
    777     ])],
    778     [dnl
    779       _AS_ECHO_LOG([[Checked features work with undefined all extensions and without _XOPEN_SOURCE]])
    780       AS_VAR_SET(m4_normalize([$4]),["yes"]) # VAR-FEATURES-AVAILABLE-YES_NO
    781 
    782       dnl Check whether features will work extensions
    783       AC_COMPILE_IFELSE([AC_LANG_SOURCE([
    784 $defs_Var
    785 $src_Var
    786         ])],
    787         [dnl
    788           _AS_ECHO_LOG([[Checked features work with extensions]])
    789           AS_VAR_SET(m4_normalize([$5]),["allowed"]) # VAR-EXTENSIONS-REQUIRED_NOT-ALLOWED_ALLOWED
    790           dnl Check whether features will work with _XOPEN_SOURCE
    791           AC_COMPILE_IFELSE([AC_LANG_SOURCE([
    792 $defs_Var
    793 [#define _XOPEN_SOURCE ]]m4_normalize([$3])[
    794 $src_Var
    795             ])],
    796             [dnl
    797               _AS_ECHO_LOG([Checked features work with extensions and with _XOPEN_SOURCE=]m4_normalize([$3])[])
    798               AS_VAR_SET(m4_normalize([$6]),["allowed"]) # VAR-XOPEN-REQUIRED_NOT-ALLOWED_ALLOWED
    799               dnl Check whether features could be disabled
    800               dnl Request oldest POSIX mode and strict ANSI mode
    801               AC_COMPILE_IFELSE([AC_LANG_SOURCE([
    802 _MHD_UNDEF_ALL_EXT
    803 [#define _POSIX_C_SOURCE 1]
    804 [#define  _ANSI_SOURCE 1]
    805 $src_Var
    806                 ])],
    807                 [dnl
    808                   _AS_ECHO_LOG([[Checked features work with disabled extensions, with _POSIX_C_SOURCE=1 and _ANSI_SOURCE=1]])
    809                   AS_VAR_SET(m4_normalize([$7]),["no"]) # VAR-FEATURES-DISABLEABLE-YES_NO
    810                 ],
    811                 [dnl
    812                   _AS_ECHO_LOG([[Checked features DO NOT work with disabled extensions, with _POSIX_C_SOURCE=1 and _ANSI_SOURCE=1]])
    813                   AS_VAR_SET(m4_normalize([$7]),["yes"]) # VAR-FEATURES-DISABLEABLE-YES_NO
    814                 ]
    815               )
    816             ],
    817             [dnl
    818               _AS_ECHO_LOG([Checked features DO NOT work with extensions and with _XOPEN_SOURCE=]m4_normalize([$3])[])
    819               AS_VAR_SET(m4_normalize([$6]),["not allowed"])  # VAR-XOPEN-REQUIRED_NOT-ALLOWED_ALLOWED
    820               AS_VAR_SET(m4_normalize([$7]),["yes"]) # VAR-FEATURES-DISABLEABLE-YES_NO
    821             ]
    822           )
    823         ],
    824         [dnl
    825           _AS_ECHO_LOG([[Checked features DO NOT work with extensions]])
    826           AS_VAR_SET(m4_normalize([$7]),["yes"]) # VAR-FEATURES-DISABLEABLE-YES_NO
    827           dnl Check whether features work with _XOPEN_SOURCE
    828           AC_COMPILE_IFELSE([AC_LANG_SOURCE([
    829 [#define _XOPEN_SOURCE ]m4_normalize($3)
    830 $src_Var
    831             ])],
    832             [dnl
    833               _AS_ECHO_LOG([Checked features work with _XOPEN_SOURCE=]m4_normalize([$3])[])
    834               dnl Check default state (without enabling/disabling)
    835               AC_COMPILE_IFELSE([AC_LANG_SOURCE([
    836 $src_Var
    837                 ])],
    838                 [dnl
    839                   _AS_ECHO_LOG([[Checked features work by default]])
    840                   AS_VAR_SET(m4_normalize([$6]),["allowed"]) # VAR-XOPEN-REQUIRED_NOT-ALLOWED_ALLOWED
    841                 ],
    842                 [dnl
    843                   _AS_ECHO_LOG([[Checked features DO NOT by default]])
    844                   AS_VAR_SET(m4_normalize([$6]),["required"]) # VAR-XOPEN-REQUIRED_NOT-ALLOWED_ALLOWED
    845                 ]
    846               )
    847               dnl Check whether features work with _XOPEN_SOURCE and extensions
    848               AC_COMPILE_IFELSE([AC_LANG_SOURCE([
    849 $defs_Var
    850 [#define _XOPEN_SOURCE] ]m4_normalize([$3])[
    851 $src_Var
    852                 ])],
    853                 [dnl
    854                   _AS_ECHO_LOG([[Checked features work with _XOPEN_SOURCE and extensions]])
    855                   AS_VAR_SET(m4_normalize([$5]),["allowed"]) # VAR-EXTENSIONS-REQUIRED_NOT-ALLOWED_ALLOWED
    856                 ],
    857                 [dnl
    858                   _AS_ECHO_LOG([[Checked features DO NOT work with _XOPEN_SOURCE and extensions]])
    859                   AS_VAR_SET(m4_normalize([$5]),["not allowed"]) # VAR-EXTENSIONS-REQUIRED_NOT-ALLOWED_ALLOWED
    860                 ]
    861               )
    862             ],
    863             [dnl
    864               _AS_ECHO_LOG([Checked features DO NOT work with _XOPEN_SOURCE=]m4_normalize([$3])[])
    865               AS_VAR_SET(m4_normalize([$5]),["not allowed"]) # VAR-EXTENSIONS-REQUIRED_NOT-ALLOWED_ALLOWED
    866               AS_VAR_SET(m4_normalize([$6]),["not allowed"]) # VAR-XOPEN-REQUIRED_NOT-ALLOWED_ALLOWED
    867             ]
    868           )
    869         ]
    870       )
    871     ],
    872     [dnl
    873       _AS_ECHO_LOG([[Checked features DO NOT work with undefined all extensions and without _XOPEN_SOURCE]])
    874       dnl Let's find the way to enable POSIX features
    875       AC_COMPILE_IFELSE([AC_LANG_SOURCE([
    876 $defs_Var
    877 $src_Var
    878         ])],
    879         [dnl
    880           _AS_ECHO_LOG([[Checked features work with extensions]])
    881           AS_VAR_SET(m4_normalize([$4]),["yes"]) # VAR-FEATURES-AVAILABLE-YES_NO
    882           AS_VAR_SET(m4_normalize([$7]),["yes"]) # VAR-FEATURES-DISABLEABLE-YES_NO
    883           dnl Check default state (without enabling/disabling)
    884           AC_COMPILE_IFELSE([AC_LANG_SOURCE([
    885 $src_Var
    886             ])],
    887             [dnl
    888               _AS_ECHO_LOG([[Checked features work by default]])
    889               AS_VAR_SET(m4_normalize([$5]),["allowed"]) # VAR-EXTENSIONS-REQUIRED_NOT-ALLOWED_ALLOWED
    890             ],
    891             [dnl
    892               _AS_ECHO_LOG([[Checked features DO NOT by default]])
    893               AS_VAR_SET(m4_normalize([$5]),["required"]) # VAR-EXTENSIONS-REQUIRED_NOT-ALLOWED_ALLOWED
    894             ]
    895           )
    896           dnl Check whether features work with extensions and _XOPEN_SOURCE
    897           AC_COMPILE_IFELSE([AC_LANG_SOURCE([
    898 $defs_Var
    899 [#define _XOPEN_SOURCE] ]m4_normalize([$3])[
    900 $src_Var
    901             ])],
    902             [dnl
    903               _AS_ECHO_LOG([Checked features work with extensions and _XOPEN_SOURCE=]m4_normalize([$3])[])
    904               AS_VAR_SET(m4_normalize([$6]),["allowed"]) # VAR-XOPEN-REQUIRED_NOT-ALLOWED_ALLOWED
    905             ],
    906             [dnl
    907               _AS_ECHO_LOG([Checked features DO NOT work with extensions and _XOPEN_SOURCE=]m4_normalize([$3])[])
    908               AS_VAR_SET(m4_normalize([$6]),["not allowed"]) # VAR-XOPEN-REQUIRED_NOT-ALLOWED_ALLOWED
    909             ]
    910           )
    911         ],
    912         [dnl
    913           _AS_ECHO_LOG([[Checked features DO NOT work with extensions]])
    914           dnl Check whether features work with _XOPEN_SOURCE
    915           AC_COMPILE_IFELSE([AC_LANG_SOURCE([
    916 [#define _XOPEN_SOURCE] ]m4_normalize([$3])[
    917 $src_Var
    918             ])],
    919             [dnl
    920               _AS_ECHO_LOG([Checked features work with _XOPEN_SOURCE=]m4_normalize([$3])[])
    921               AS_VAR_SET(m4_normalize([$4]),["yes"]) # VAR-FEATURES-AVAILABLE-YES_NO
    922               dnl Check default state (without enabling/disabling)
    923               AC_COMPILE_IFELSE([AC_LANG_SOURCE([
    924 $src_Var
    925                 ])],
    926                 [dnl
    927                   _AS_ECHO_LOG([[Checked features work by default]])
    928                   AS_VAR_SET(m4_normalize([$6]),["allowed"]) # VAR-XOPEN-REQUIRED_NOT-ALLOWED_ALLOWED
    929                 ],
    930                 [dnl
    931                   _AS_ECHO_LOG([[Checked features DO NOT by default]])
    932                   AS_VAR_SET(m4_normalize([$6]),["required"]) # VAR-XOPEN-REQUIRED_NOT-ALLOWED_ALLOWED
    933                 ]
    934               )
    935               dnl Check whether features work with _XOPEN_SOURCE and extensions
    936               AC_COMPILE_IFELSE([AC_LANG_SOURCE([
    937 $defs_Var
    938 [#define _XOPEN_SOURCE] ]m4_normalize([$3])[
    939 $src_Var
    940                 ])],
    941                 [dnl
    942                   _AS_ECHO_LOG([Checked features work with _XOPEN_SOURCE=]m4_normalize([$3])[ and extensions])
    943                   AS_VAR_SET(m4_normalize([$5]),["allowed"]) # VAR-EXTENSIONS-REQUIRED_NOT-ALLOWED_ALLOWED
    944                 ],
    945                 [dnl
    946                   _AS_ECHO_LOG([Checked features DO NOT work with _XOPEN_SOURCE=]m4_normalize([$3])[ and extensions])
    947                   AS_VAR_SET(m4_normalize([$5]),["not allowed"]) # VAR-EXTENSIONS-REQUIRED_NOT-ALLOWED_ALLOWED
    948                 ]
    949               )
    950             ],
    951             [dnl
    952               _AS_ECHO_LOG([Checked features DO NOT work with _XOPEN_SOURCE=]m4_normalize([$3])[])
    953               AS_VAR_SET(m4_normalize([$4]),["no"]) # VAR-FEATURES-AVAILABLE-YES_NO
    954             ]
    955           )
    956         ]
    957       )
    958     ]
    959   )
    960   CFLAGS="$mhd_SYS_EXT_SAVE_CFLAGS"
    961   AS_UNSET([mhd_SYS_EXT_SAVE_CFLAGS])
    962   AS_UNSET([defs_Var])
    963   AS_UNSET([src_Var])
    964   AS_VAR_POPDEF([defs_Var])dnl
    965   AS_VAR_POPDEF([src_Var])dnl
    966 ])
    967 
    968 
    969 #
    970 # MHD_CHECK_HEADER_PRESENCE(headername.h)
    971 #
    972 # Check only by preprocessor whether header file is present.
    973 
    974 AC_DEFUN([MHD_CHECK_HEADER_PRESENCE], [dnl
    975   AC_PREREQ([2.64])dnl for AS_VAR_PUSHDEF, AS_VAR_SET
    976   AS_VAR_PUSHDEF([mhd_cache_Var],[mhd_cv_header_[]$1[]_present])dnl
    977   AC_CACHE_CHECK([for presence of $1], [mhd_cache_Var], [dnl
    978     dnl Hack autoconf to get pure result of only single header presence
    979     cat > conftest.$ac_ext <<_ACEOF
    980 @%:@include <[]$1[]>
    981 _ACEOF
    982     AC_PREPROC_IFELSE([],
    983       [AS_VAR_SET([mhd_cache_Var],[["yes"]])],
    984       [AS_VAR_SET([mhd_cache_Var],[["no"]])]
    985     )
    986     rm -f conftest.$ac_ext
    987   ])
    988   AS_VAR_POPDEF([mhd_cache_Var])dnl
    989 ])
    990 
    991 
    992 #
    993 # MHD_CHECK_HEADERS_PRESENCE(oneheader.h otherheader.h ...)
    994 #
    995 # Check each specified header in whitespace-separated list for presence.
    996 
    997 AC_DEFUN([MHD_CHECK_HEADERS_PRESENCE], [dnl
    998   AC_PREREQ([2.60])dnl for m4_foreach_w
    999   m4_foreach_w([mhd_chk_Header], [$1],
   1000     [MHD_CHECK_HEADER_PRESENCE(m4_defn([mhd_chk_Header]))]
   1001   )dnl
   1002 ])
   1003 
   1004 
   1005 #
   1006 # MHD_CHECK_BASIC_HEADERS_PRESENCE
   1007 #
   1008 # Check basic headers for presence.
   1009 
   1010 AC_DEFUN([MHD_CHECK_BASIC_HEADERS_PRESENCE], [dnl
   1011   MHD_CHECK_HEADERS_PRESENCE([stdio.h wchar.h stdlib.h string.h strings.h stdint.h fcntl.h sys/types.h time.h unistd.h])
   1012 ])
   1013 
   1014 
   1015 #
   1016 # _MHD_SET_BASIC_INCLUDES
   1017 #
   1018 # Internal preparatory macro.
   1019 
   1020 AC_DEFUN([_MHD_SET_BASIC_INCLUDES], [dnl
   1021   AC_REQUIRE([MHD_CHECK_BASIC_HEADERS_PRESENCE])dnl
   1022   AS_IF([[test -z "$mhd_basic_headers_includes"]], [dnl
   1023     AS_VAR_IF([mhd_cv_header_stdio_h_present], [["yes"]],
   1024       [[mhd_basic_headers_includes="\
   1025 #include <stdio.h>
   1026 "     ]],[[mhd_basic_headers_includes=""]]
   1027     )
   1028     AS_VAR_IF([mhd_cv_header_sys_types_h_present], [["yes"]],
   1029       [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\
   1030 #include <sys/types.h>
   1031 "     ]]
   1032     )
   1033     AS_VAR_IF([mhd_cv_header_wchar_h_present], [["yes"]],
   1034       [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\
   1035 #include <wchar.h>
   1036 "     ]]
   1037     )
   1038     AS_VAR_IF([mhd_cv_header_stdlib_h_present], [["yes"]],
   1039       [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\
   1040 #include <stdlib.h>
   1041 "     ]]
   1042     )
   1043     AS_VAR_IF([mhd_cv_header_string_h_present], [["yes"]],
   1044       [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\
   1045 #include <string.h>
   1046 "     ]]
   1047     )
   1048     AS_VAR_IF([mhd_cv_header_strings_h_present], [["yes"]],
   1049       [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\
   1050 #include <strings.h>
   1051 "     ]]
   1052     )
   1053     AS_VAR_IF([mhd_cv_header_stdint_h_present], [["yes"]],
   1054       [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\
   1055 #include <stdint.h>
   1056 "     ]]
   1057     )
   1058     AS_VAR_IF([mhd_cv_header_fcntl_h_present], [["yes"]],
   1059       [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\
   1060 #include <fcntl.h>
   1061 "     ]]
   1062     )
   1063     AS_VAR_IF([mhd_cv_header_time_h_present], [["yes"]],
   1064       [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\
   1065 #include <time.h>
   1066 "     ]]
   1067     )
   1068     AS_VAR_IF([mhd_cv_header_unistd_h_present], [["yes"]],
   1069       [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\
   1070 #include <unistd.h>
   1071 "     ]]
   1072     )
   1073   ])dnl
   1074 ])
   1075 
   1076 
   1077 #
   1078 # _MHD_BASIC_INCLUDES
   1079 #
   1080 # Internal macro. Output set of basic includes.
   1081 
   1082 AC_DEFUN([_MHD_BASIC_INCLUDES], [AC_REQUIRE([_MHD_SET_BASIC_INCLUDES])dnl
   1083 [ /* Start of MHD basic test includes */
   1084 $mhd_basic_headers_includes /* End of MHD basic test includes */
   1085 ]])
   1086 
   1087 
   1088 #
   1089 # MHD_CHECK_BASIC_HEADERS([PROLOG], [ACTION-IF-OK], [ACTION-IF-FAIL])
   1090 #
   1091 # Check whether basic headers can be compiled with specified prolog.
   1092 
   1093 AC_DEFUN([MHD_CHECK_BASIC_HEADERS], [dnl
   1094   AC_COMPILE_IFELSE([dnl
   1095     AC_LANG_PROGRAM([m4_n([$1])dnl
   1096 _MHD_BASIC_INCLUDES
   1097     ], [[int i = 1; i++; if(i) return i]])
   1098   ], [$2], [$3])
   1099 ])
   1100 
   1101 
   1102 #
   1103 # _MHD_SET_UNDEF_ALL_EXT
   1104 #
   1105 # Internal preparatory macro.
   1106 
   1107 AC_DEFUN([_MHD_SET_UNDEF_ALL_EXT], [m4_divert_text([INIT_PREPARE],[dnl
   1108 [mhd_undef_all_extensions="
   1109 #ifdef _GNU_SOURCE
   1110 #undef _GNU_SOURCE
   1111 #endif
   1112 #ifdef _XOPEN_SOURCE
   1113 #undef _XOPEN_SOURCE
   1114 #endif
   1115 #ifdef _XOPEN_SOURCE_EXTENDED
   1116 #undef _XOPEN_SOURCE_EXTENDED
   1117 #endif
   1118 #ifdef _XOPEN_VERSION
   1119 #undef _XOPEN_VERSION
   1120 #endif
   1121 #ifdef _POSIX_C_SOURCE
   1122 #undef _POSIX_C_SOURCE
   1123 #endif
   1124 #ifdef _POSIX_SOURCE
   1125 #undef _POSIX_SOURCE
   1126 #endif
   1127 #ifdef _DEFAULT_SOURCE
   1128 #undef _DEFAULT_SOURCE
   1129 #endif
   1130 #ifdef _BSD_SOURCE
   1131 #undef _BSD_SOURCE
   1132 #endif
   1133 #ifdef _SVID_SOURCE
   1134 #undef _SVID_SOURCE
   1135 #endif
   1136 #ifdef __EXTENSIONS__
   1137 #undef __EXTENSIONS__
   1138 #endif
   1139 #ifdef _ALL_SOURCE
   1140 #undef _ALL_SOURCE
   1141 #endif
   1142 #ifdef _TANDEM_SOURCE
   1143 #undef _TANDEM_SOURCE
   1144 #endif
   1145 #ifdef _DARWIN_C_SOURCE
   1146 #undef _DARWIN_C_SOURCE
   1147 #endif
   1148 #ifdef __BSD_VISIBLE
   1149 #undef __BSD_VISIBLE
   1150 #endif
   1151 #ifdef _NETBSD_SOURCE
   1152 #undef _NETBSD_SOURCE
   1153 #endif
   1154 "
   1155 ]])])
   1156 
   1157 
   1158 #
   1159 # _MHD_UNDEF_ALL_EXT
   1160 #
   1161 # Output prolog that undefine all known extension and visibility macros.
   1162 
   1163 AC_DEFUN([_MHD_UNDEF_ALL_EXT], [dnl
   1164 AC_REQUIRE([_MHD_SET_UNDEF_ALL_EXT])dnl
   1165 $mhd_undef_all_extensions
   1166 ])
   1167 
   1168 
   1169 #
   1170 # _MHD_CHECK_DEFINED(SYMBOL, [PROLOG],
   1171 #                    [ACTION-IF-DEFINED], [ACTION-IF-NOT-DEFINED])
   1172 #
   1173 # Silently checks for defined symbols.
   1174 
   1175 AC_DEFUN([_MHD_CHECK_DEFINED], [dnl
   1176   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
   1177 m4_n([$2])dnl
   1178 [#ifndef ]$1[
   1179 #error ]$1[ is not defined
   1180 choke me now;
   1181 #endif
   1182         ]],[])
   1183     ], [m4_default_nblank([$3])], [m4_default_nblank([$4])]
   1184   )
   1185 ])
   1186 
   1187 
   1188 #
   1189 # MHD_CHECK_DEFINED(SYMBOL, [PROLOG],
   1190 #                   [ACTION-IF-DEFINED], [ACTION-IF-NOT-DEFINED],
   1191 #                   [MESSAGE])
   1192 #
   1193 # Cache-check for defined symbols with printing results.
   1194 
   1195 AC_DEFUN([MHD_CHECK_DEFINED], [dnl
   1196   AS_VAR_PUSHDEF([mhd_cache_Var],[mhd_cv_macro_[]m4_tolower(m4_normalize($1))_defined])dnl
   1197   AC_CACHE_CHECK([dnl
   1198 m4_ifnblank([$5], [$5], [whether ]m4_normalize([$1])[ is already defined])],
   1199     [mhd_cache_Var], [dnl
   1200     _MHD_CHECK_DEFINED(m4_normalize([$1]), [$2],
   1201       [mhd_cache_Var="yes"],
   1202       [mhd_cache_Var="no"]
   1203     )
   1204   ])
   1205   _MHD_VAR_IF([mhd_cache_Var], [["yes"]], [$3], [$4])
   1206   AS_VAR_POPDEF([mhd_cache_Var])dnl
   1207 ])
   1208 
   1209 
   1210 #
   1211 # MHD_CHECK_DEFINED_MSG(SYMBOL, [PROLOG], [MESSAGE]
   1212 #                       [ACTION-IF-DEFINED], [ACTION-IF-NOT-DEFINED])
   1213 #
   1214 # Cache-check for defined symbols with printing results.
   1215 # Reordered arguments for better readability.
   1216 
   1217 AC_DEFUN([MHD_CHECK_DEFINED_MSG],[dnl
   1218 MHD_CHECK_DEFINED([$1],[$2],[$4],[$5],[$3])])
   1219 
   1220 #
   1221 # MHD_CHECK_ACCEPT_DEFINE(DEFINE-SYMBOL, [DEFINE-VALUE = 1], [PROLOG],
   1222 #                         [ACTION-IF-ACCEPTED], [ACTION-IF-NOT-ACCEPTED],
   1223 #                         [MESSAGE])
   1224 #
   1225 # Cache-check whether specific defined symbol do not break basic headers.
   1226 
   1227 AC_DEFUN([MHD_CHECK_ACCEPT_DEFINE], [dnl
   1228   AC_PREREQ([2.64])dnl for AS_VAR_PUSHDEF, AS_VAR_SET, m4_ifnblank
   1229   AS_VAR_PUSHDEF([mhd_cache_Var],
   1230     [mhd_cv_define_[]m4_tolower(m4_normalize($1))[]_accepted[]m4_ifnblank([$2],[_[]$2])])dnl
   1231   AC_CACHE_CHECK([dnl
   1232 m4_ifnblank([$6],[$6],[whether headers accept $1[]m4_ifnblank([$2],[[ with value ]$2])])],
   1233     [mhd_cache_Var], [dnl
   1234     MHD_CHECK_BASIC_HEADERS([
   1235 m4_n([$3])[#define ]$1 m4_default_nblank($2,[[1]])],
   1236       [mhd_cache_Var="yes"], [mhd_cache_Var="no"]
   1237     )
   1238   ])
   1239   _MHD_VAR_IF([mhd_cache_Var], [["yes"]], [$4], [$5])
   1240   AS_VAR_POPDEF([mhd_cache_Var])dnl
   1241 ])
   1242 
   1243 
   1244 #
   1245 # MHD_CHECK_DEF_AND_ACCEPT(DEFINE-SYMBOL, [DEFINE-VALUE = 1], [PROLOG],
   1246 #                         [ACTION-IF-DEFINED],
   1247 #                         [ACTION-IF-ACCEPTED], [ACTION-IF-NOT-ACCEPTED])
   1248 #
   1249 # Combination of MHD_CHECK_DEFINED_ECHO and MHD_CHECK_ACCEPT_DEFINE.
   1250 # First check whether symbol is already defined and, if not defined,
   1251 # checks whether it can be defined.
   1252 
   1253 AC_DEFUN([MHD_CHECK_DEF_AND_ACCEPT], [dnl
   1254   MHD_CHECK_DEFINED([$1], [$3], [$4], [dnl
   1255     MHD_CHECK_ACCEPT_DEFINE([$1], [$2], [$3], [$5], [$6])dnl
   1256   ])dnl
   1257 ])
   1258 
   1259 #
   1260 # _MHD_XOPEN_VAR_ADD(DEFINES_VAR, FLAGS_VAR, [PROLOG])
   1261 #
   1262 # Internal macro. Only to be used in MHD_SYS_EXT.
   1263 
   1264 AC_DEFUN([_MHD_XOPEN_VAR_ADD], [dnl
   1265   MHD_CHECK_DEF_AND_ACCEPT([[_XOPEN_SOURCE]], [[1]], [$3],
   1266     [
   1267       AC_CACHE_CHECK([[whether predefined value of _XOPEN_SOURCE is more or equal 500]],
   1268         [[mhd_cv_macro__xopen_source_def_fiveh]], [dnl
   1269           AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
   1270 m4_n([$3])dnl
   1271 [#if _XOPEN_SOURCE+0 < 500
   1272 #error Value of _XOPEN_SOURCE is less than 500
   1273 choke me now;
   1274 #endif
   1275               ]],[[int i = 0; i++; if(i) return i]])],
   1276             [[mhd_cv_macro__xopen_source_def_fiveh="yes"]],
   1277             [[mhd_cv_macro__xopen_source_def_fiveh="no"]]
   1278           )dnl
   1279         ]
   1280       )dnl
   1281     ],
   1282     [_MHD_SYS_EXT_VAR_ADD_FLAG([$1], [$2], [[_XOPEN_SOURCE]], [[1]])]
   1283   )
   1284   AS_IF([[test "x${mhd_cv_define__xopen_source_accepted_1}" = "xyes" || \
   1285           test "x${mhd_cv_macro__xopen_source_def_fiveh}" = "xno"]],
   1286     [
   1287       MHD_CHECK_DEF_AND_ACCEPT([[_XOPEN_SOURCE_EXTENDED]], [],
   1288         [
   1289 m4_n([$3])], [],
   1290       [dnl
   1291         _MHD_SYS_EXT_VAR_ADD_FLAG([$1],[$2],[[_XOPEN_SOURCE_EXTENDED]])
   1292       ], [dnl
   1293         MHD_CHECK_DEFINED([[_XOPEN_VERSION]],
   1294           [
   1295 m4_n([$3])], [],
   1296         [dnl
   1297           AC_CACHE_CHECK([[for value of _XOPEN_VERSION accepted by headers]],
   1298             [mhd_cv_define__xopen_version_accepted], [dnl
   1299             MHD_CHECK_BASIC_HEADERS([
   1300 m4_n([$3])
   1301 [#define _XOPEN_VERSION 4]],
   1302               [[mhd_cv_define__xopen_version_accepted="4"]],
   1303             [
   1304               MHD_CHECK_BASIC_HEADERS([
   1305 m4_n([$3])
   1306 [#define _XOPEN_VERSION 3]],
   1307                 [[mhd_cv_define__xopen_version_accepted="3"]],
   1308                 [[mhd_cv_define__xopen_version_accepted="no"]]
   1309               )
   1310             ])
   1311           ])
   1312           AS_VAR_IF([mhd_cv_define__xopen_version_accepted], [["no"]],
   1313             [[:]],
   1314           [dnl
   1315             _MHD_SYS_EXT_VAR_ADD_FLAG([$1],[$2],[[_XOPEN_VERSION]],
   1316               [[${mhd_cv_define__xopen_version_accepted}]]dnl
   1317             )
   1318           ])
   1319         ])
   1320       ])
   1321     ]
   1322   )dnl
   1323 ])
   1324