|
|
@@ -0,0 +1,142 @@
|
|
|
+# SYNOPSIS
|
|
|
+#
|
|
|
+# MHD_FIND_LIB([FUNCTION_NAME],
|
|
|
+# [INCLUDES=AC_INCLUDES_DEFAULT], [CHECK_CODE],
|
|
|
+# [LIBS_TO_CHECK],
|
|
|
+# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND],
|
|
|
+# [VAR_TO_PREPEND_LIB=LIBS], [ADDITIONAL_LIBS])
|
|
|
+#
|
|
|
+# DESCRIPTION
|
|
|
+#
|
|
|
+# This macro checks for presence of specific function by including
|
|
|
+# specified headers and compiling and linking CHECK_CODE.
|
|
|
+# This checks both the declaration and the presence in library.
|
|
|
+# If declaration is not found in headers then libraries are not
|
|
|
+# checked.
|
|
|
+# LIBS_TO_CHECK is whitespace-separated list of libraries to check.
|
|
|
+# The macro first tries to link without any library, and if it fails
|
|
|
+# the libraries are checked one by one.
|
|
|
+# The required library (if any) prepended to VAR_TO_PREPEND_LIB (or
|
|
|
+# to the LIBS variable if VAR_TO_APPEND_LIB is not specified).
|
|
|
+# By using definition from provided headers, this macro ensures that
|
|
|
+# correct calling convention is used for detection.
|
|
|
+#
|
|
|
+# Example usage:
|
|
|
+#
|
|
|
+# MHD_FIND_LIB([clock_gettime],
|
|
|
+# [[#include <time.h>]],
|
|
|
+# [[struct timespec tp;
|
|
|
+# if (0 > clock_gettime(CLOCK_REALTIME, &tp)) return 3;]],
|
|
|
+# [rt],
|
|
|
+# [var_use_gettime='yes'],[var_use_gettime='no'])
|
|
|
+#
|
|
|
+# Defined cache variable used in the check so if any test will not
|
|
|
+# work correctly on some platform, a user may simply fix it by giving
|
|
|
+# cache variable in configure parameters, for example:
|
|
|
+#
|
|
|
+# ./configure mhd_cv_find_clock_gettime=no
|
|
|
+#
|
|
|
+# This simplifies building from source on exotic platforms as patching
|
|
|
+# of configure.ac is not required to change results of tests.
|
|
|
+#
|
|
|
+# LICENSE
|
|
|
+#
|
|
|
+# Copyright (c) 2023 Karlson2k (Evgeny Grin) <[email protected]>
|
|
|
+#
|
|
|
+# 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 1
|
|
|
+
|
|
|
+AC_DEFUN([MHD_FIND_LIB],[dnl
|
|
|
+AC_PREREQ([2.64])dnl for AS_VAR_IF, m4_ifblank, m4_ifnblank
|
|
|
+m4_newline([[# Expansion of $0 macro starts here]])
|
|
|
+AC_LANG_ASSERT([C])dnl
|
|
|
+m4_ifblank(m4_translit([$1],[()],[ ]), [m4_fatal([First macro argument FUNCTION_NAME must not be empty])])dnl
|
|
|
+m4_ifblank([$3], [m4_fatal([Third macro argument CHECK_CODE must not be empty])])dnl
|
|
|
+m4_bmatch(m4_normalize([$1]), [\s],dnl
|
|
|
+ [m4_fatal([First macro argument FUNCTION_NAME must not contain whitespaces])])dnl
|
|
|
+m4_if(m4_index([$3], m4_normalize(m4_translit([$1],[()],[ ]))), [-1], dnl
|
|
|
+ [m4_fatal([CHECK_CODE parameter (third macro argument) does not contain ']m4_normalize([$1])[' token])])dnl
|
|
|
+m4_bmatch([$7], [\$], [m4_fatal([$0: Seventh macro argument VAR_TO_PREPEND_LIB must not contain '$'])])dnl
|
|
|
+_MHD_FIND_LIB_BODY([$1],[$2],[$3],[$4],[$5],[$6],m4_default_nblank(_mhd_norm_expd([$7]),[LIBS]),[$8])dnl
|
|
|
+])dnl AC_DEFUN MHD_FIND_LIB
|
|
|
+
|
|
|
+# SYNOPSIS
|
|
|
+#
|
|
|
+# _MHD_FIND_LIB_BODY([1_FUNCTION_NAME],
|
|
|
+# [2_INCLUDES=AC_INCLUDES_DEFAULT], [3_CHECK_CODE],
|
|
|
+# [4_LIBS_TO_CHECK],
|
|
|
+# [5_ACTION-IF-FOUND], [6_ACTION-IF-NOT-FOUND],
|
|
|
+# [7_VAR_TO_PREPEND_LIB=LIBS], [8_ADDITIONAL_LIBS])
|
|
|
+
|
|
|
+AC_DEFUN([_MHD_FIND_LIB_BODY],[dnl
|
|
|
+AS_VAR_PUSHDEF([decl_cv_Var],[ac_cv_have_decl_]m4_bpatsubst(_mhd_norm_expd(m4_translit([$1],[()],[ ])),[[^a-zA-Z0-9]],[_]))dnl
|
|
|
+AS_VAR_PUSHDEF([cv_Var], [mhd_cv_find_lib_]m4_bpatsubst(_mhd_norm_expd(m4_translit([$1],[()],[ ])),[[^a-zA-Z0-9]],[_]))dnl
|
|
|
+AS_VAR_SET_IF([cv_Var],[],[AC_CHECK_DECL(_mhd_norm_expd([$1]),[],[],[$2])])
|
|
|
+AC_CACHE_CHECK([for library containing function $1], [cv_Var],
|
|
|
+ [
|
|
|
+ AS_VAR_IF([decl_cv_Var],["yes"],dnl
|
|
|
+ [dnl
|
|
|
+ mhd_find_lib_SAVE_LIBS="$LIBS"
|
|
|
+ m4_if([$7],LIBS,[dnl
|
|
|
+ mhd_find_lib_CHECK_LIBS="_mhd_norm_expd([$8]) $LIBS"
|
|
|
+ ],[dnl
|
|
|
+ mhd_find_lib_CHECK_LIBS="[$]$7 _mhd_norm_expd([$8]) $LIBS"
|
|
|
+ ]
|
|
|
+ )
|
|
|
+ # Reuse the same source file
|
|
|
+ AC_LANG_CONFTEST(
|
|
|
+ [AC_LANG_SOURCE([
|
|
|
+m4_default_nblank([$2],[AC_INCLUDES_DEFAULT])
|
|
|
+
|
|
|
+[int main(void)
|
|
|
+{
|
|
|
+
|
|
|
+ ]$3[
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+ ]])
|
|
|
+ ]
|
|
|
+ )
|
|
|
+ for mhd_find_lib_LIB in '' $4
|
|
|
+ do
|
|
|
+ AS_IF([test -z "${mhd_find_lib_LIB}"],
|
|
|
+ [LIBS="${mhd_find_lib_CHECK_LIBS}"],
|
|
|
+ [LIBS="-l${mhd_find_lib_LIB} ${mhd_find_lib_CHECK_LIBS}"]
|
|
|
+ )
|
|
|
+ AC_LINK_IFELSE([],
|
|
|
+ [
|
|
|
+ AS_IF([test -z "${mhd_find_lib_LIB}"],
|
|
|
+ [AS_VAR_SET([cv_Var],["none required"])],
|
|
|
+ [AS_VAR_SET([cv_Var],["-l${mhd_find_lib_LIB}"])]
|
|
|
+ )
|
|
|
+ ]
|
|
|
+ )
|
|
|
+ AS_VAR_SET_IF([cv_Var],[break])
|
|
|
+ done
|
|
|
+ AS_UNSET([mhd_find_lib_LIB])
|
|
|
+ rm -f conftest.$ac_ext
|
|
|
+ LIBS="${mhd_find_lib_SAVE_LIBS}"
|
|
|
+ AS_UNSET([mhd_find_lib_SAVE_LIBS])
|
|
|
+ ]
|
|
|
+ )
|
|
|
+ AS_VAR_SET_IF([cv_Var],[:],[AS_VAR_SET([cv_Var],["no"])])
|
|
|
+ ]
|
|
|
+)
|
|
|
+AS_IF([test "x${cv_Var}" != "xno"],
|
|
|
+[dnl
|
|
|
+ AS_VAR_IF([cv_Var],["none required"],[:],
|
|
|
+ [
|
|
|
+ AS_IF([test -z "[$]$7"],[$7="${cv_Var}"],[$7="${cv_Var} [$]$7"])
|
|
|
+ ]
|
|
|
+ )
|
|
|
+ m4_n([$5])dnl
|
|
|
+],[m4_n([$6])])dnl AS_VAR_SET_IF cv_Var
|
|
|
+AS_VAR_POPDEF([cv_Var])dnl
|
|
|
+AS_VAR_POPDEF([decl_cv_Var])dnl
|
|
|
+m4_newline([[# Expansion of $0 macro ends here]])
|
|
|
+])dnl AC_DEFUN MHD_CHECK_FUNC
|