Author: brane
Date: Sun Jun  8 03:50:03 2025
New Revision: 1926231

URL: http://svn.apache.org/viewvc?rev=1926231&view=rev
Log:
Another step towards SCons/CMake build feature parity: in the CMake build,
check for functions by actually compiling and linking code, just like SCons.
SCons and CMake now get the same result from feature checks, even with
"functions" that are actually compatibility macros.

* build/SerfChecks.cmake
  (CheckCSourceCompiles): Include this instead of CheckFunctionExists.
  (CheckSymbolExists): Remove unused module
  (_CheckFunction, CheckFunction, CheckNotFunction): Reimpplement these
   tests to verify the result of compiling and linking some test code --
   which is similare to what we have in build/scons_extras.py.
  (_CheckSymbol): Remove.
  (_CheckHeader, _CheckType): Make internal names consistent.

* CMakeLists.txt: Update CheckFunction/CheckNotFunction tests. Replace
   CheckFunctionMacro with CheckFunction.

Modified:
    serf/trunk/CMakeLists.txt
    serf/trunk/build/SerfChecks.cmake

Modified: serf/trunk/CMakeLists.txt
URL: 
http://svn.apache.org/viewvc/serf/trunk/CMakeLists.txt?rev=1926231&r1=1926230&r2=1926231&view=diff
==============================================================================
--- serf/trunk/CMakeLists.txt (original)
+++ serf/trunk/CMakeLists.txt Sun Jun  8 03:50:03 2025
@@ -277,19 +277,39 @@ endif(APR_STATIC)
 
 # Feature tests
 include(SerfChecks)
-CheckNotFunction("BIO_set_init" "SERF_NO_SSL_BIO_WRAPPERS" 
${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES})
-CheckNotFunction("X509_STORE_get0_param" "SERF_NO_SSL_X509_STORE_WRAPPERS" 
${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES})
-CheckNotFunction("X509_get0_notBefore" "SERF_NO_SSL_X509_GET0_NOTBEFORE" 
${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES})
-CheckNotFunction("X509_get0_notAfter" "SERF_NO_SSL_X509_GET0_NOTAFTER" 
${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES})
-CheckNotFunction("X509_STORE_CTX_get0_chain" "SERF_NO_SSL_X509_GET0_CHAIN" 
${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES})
-CheckNotFunction("ASN1_STRING_get0_data" "SERF_NO_SSL_ASN1_STRING_GET0_DATA" 
${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES})
-CheckFunction("CRYPTO_set_locking_callback" "SERF_HAVE_SSL_LOCKING_CALLBACKS" 
${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES})
-CheckFunction("OpenSSL_version_num" "SERF_HAVE_OPENSSL_VERSION_NUM" 
${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES})
-CheckFunction("SSL_set_alpn_protos" "SERF_HAVE_OPENSSL_ALPN" 
${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES})
-CheckFunctionMacro("OPENSSL_malloc_init" "SERF_HAVE_OPENSSL_MALLOC_INIT" 
"openssl/crypto.h"
-                   "${OPENSSL_INCLUDE_DIR}" ${OPENSSL_LIBRARIES} 
${SERF_STANDARD_LIBRARIES})
-CheckFunctionMacro("SSL_library_init" "SERF_HAVE_OPENSSL_SSL_LIBRARY_INIT" 
"openssl/ssl.h"
-                   "${OPENSSL_INCLUDE_DIR}" ${OPENSSL_LIBRARIES} 
${SERF_STANDARD_LIBRARIES})
+CheckNotFunction("BIO_set_init" "NULL, 0" "SERF_NO_SSL_BIO_WRAPPERS"
+                 "openssl/bio.h" "${OPENSSL_INCLUDE_DIR}"
+                 ${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES})
+CheckNotFunction("X509_STORE_get0_param" "NULL" 
"SERF_NO_SSL_X509_STORE_WRAPPERS"
+                 "openssl/x509.h" "${OPENSSL_INCLUDE_DIR}"
+                 ${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES})
+CheckNotFunction("X509_get0_notBefore" "NULL" "SERF_NO_SSL_X509_GET0_NOTBEFORE"
+                 "openssl/x509.h" "${OPENSSL_INCLUDE_DIR}"
+                 ${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES})
+CheckNotFunction("X509_get0_notAfter" "NULL" "SERF_NO_SSL_X509_GET0_NOTAFTER"
+                 "openssl/x509.h" "${OPENSSL_INCLUDE_DIR}"
+                 ${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES})
+CheckNotFunction("X509_STORE_CTX_get0_chain" "NULL" 
"SERF_NO_SSL_X509_GET0_CHAIN"
+                 "openssl/x509.h" "${OPENSSL_INCLUDE_DIR}"
+                 ${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES})
+CheckNotFunction("ASN1_STRING_get0_data" "NULL" 
"SERF_NO_SSL_ASN1_STRING_GET0_DATA"
+                 "openssl/asn1.h" "${OPENSSL_INCLUDE_DIR}"
+                 ${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES})
+CheckFunction("CRYPTO_set_locking_callback" "NULL" 
"SERF_HAVE_SSL_LOCKING_CALLBACKS"
+              "openssl/crypto.h" "${OPENSSL_INCLUDE_DIR}"
+              ${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES})
+CheckFunction("SSL_set_alpn_protos" "NULL, NULL, 0" "SERF_HAVE_OPENSSL_ALPN"
+              "openssl/ssl.h" "${OPENSSL_INCLUDE_DIR}"
+              ${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES})
+CheckFunction("OpenSSL_version_num" "" "SERF_HAVE_OPENSSL_VERSION_NUM"
+              "openssl/ssl.h" "${OPENSSL_INCLUDE_DIR}"
+              ${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES})
+CheckFunction("OPENSSL_malloc_init" "" "SERF_HAVE_OPENSSL_MALLOC_INIT"
+              "openssl/ssl.h" "${OPENSSL_INCLUDE_DIR}"
+              ${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES})
+CheckFunction("SSL_library_init" "" "SERF_HAVE_OPENSSL_SSL_LIBRARY_INIT"
+              "openssl/ssl.h" "${OPENSSL_INCLUDE_DIR}"
+              ${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES})
 CheckHeader("stdbool.h" "HAVE_STDBOOL_H=1")
 CheckType("OSSL_HANDSHAKE_STATE" "openssl/ssl.h" 
"SERF_HAVE_OSSL_HANDSHAKE_STATE" ${OPENSSL_INCLUDE_DIR})
 if(Brotli_FOUND)
@@ -297,7 +317,9 @@ if(Brotli_FOUND)
   # Check for the function only if the type check succeeded.
   get_directory_property(_cdef COMPILE_DEFINITIONS)
   if("SERF_HAVE_BROTLI_DECODER_RESULT" IN_LIST _cdef)
-    CheckFunction("BrotliDecoderTakeOutput" "SERF_HAVE_BROTLI" Brotli::Decode 
${SERF_STANDARD_LIBRARIES})
+    CheckFunction("BrotliDecoderTakeOutput" "NULL, NULL" "SERF_HAVE_BROTLI"
+                  "brotli/decode.h" ${BROTLI_INCLUDES}
+                  Brotli::Decode ${SERF_STANDARD_LIBRARIES})
   endif()
 endif()
 

Modified: serf/trunk/build/SerfChecks.cmake
URL: 
http://svn.apache.org/viewvc/serf/trunk/build/SerfChecks.cmake?rev=1926231&r1=1926230&r2=1926231&view=diff
==============================================================================
--- serf/trunk/build/SerfChecks.cmake (original)
+++ serf/trunk/build/SerfChecks.cmake Sun Jun  8 03:50:03 2025
@@ -17,71 +17,69 @@
 #   under the License.
 # ===================================================================
 
-include(CheckFunctionExists)
+include(CheckCSourceCompiles)
 include(CheckIncludeFile)
-include(CheckSymbolExists)
 include(CheckTypeSize)
 
-function(_CheckFunction var_ name_ libraries_)
+function(_CheckFunction var_ name_ args_ header_ includes_ libraries_)
   if(libraries_)
     set(CMAKE_REQUIRED_LIBRARIES "${libraries_}")
   else()
     unset(CMAKE_REQUIRED_LIBRARIES)
   endif()
 
-  check_function_exists("${name_}" "serf_foundit_${name_}_")
-  if(serf_foundit_${name_}_)
+  if(includes_)
+    set(CMAKE_REQUIRED_INCLUDES "${includes_}")
+  else()
+    unset(CMAKE_REQUIRED_INCLUDES)
+  endif()
+
+  set(source_
+      "#include <${header_}>"
+      ""
+      "#if _MSC_VER && !__INTEL_COMPILER"
+      "  #pragma function(${name_})"
+      "#endif"
+      ""
+      "int main(void) {"
+      "#if defined (__stub_${name_}) || defined (__stub___${name_})"
+      "  #error \"${name_} has a GNU stub, cannot check\""
+      "#else"
+      "  ${name_}(${args_})\\;"
+      "#endif"
+      "  return 0\\;"
+      "}"
+      "")
+  list(JOIN source_ "\n" source_)
+
+  check_c_source_compiles("${source_}" "check_function_${name_}")
+  if(${check_function_${name_}})
     set("${var_}" TRUE PARENT_SCOPE)
   else()
     set("${var_}" FALSE PARENT_SCOPE)
   endif()
+
+  unset(CMAKE_REQUIRED_INCLUDES)
   unset(CMAKE_REQUIRED_LIBRARIES)
 endfunction(_CheckFunction)
 
-macro(CheckFunction name_ symbol_)
-  _CheckFunction("serf_feature_CheckFunction_${name_}_" "${name_}" "${ARGN}")
+macro(CheckFunction name_ args_ symbol_ header_ includes_)
+  _CheckFunction("serf_feature_CheckFunction_${name_}_"
+                 "${name_}" "${args_}" "${header_}" "${includes_}" "${ARGN}")
   if("${serf_feature_CheckFunction_${name_}_}")
     add_compile_definitions("${symbol_}")
   endif()
 endmacro(CheckFunction)
 
-macro(CheckNotFunction name_ symbol_)
-  _CheckFunction("serf_feature_CheckNotFunction_${name_}_" "${name_}" 
"${ARGN}")
+macro(CheckNotFunction name_ args_ symbol_ header_ includes_)
+  _CheckFunction("serf_feature_CheckNotFunction_${name_}_"
+                 "${name_}" "${args_}" "${header_}" "${includes_}" "${ARGN}")
   if(NOT "${serf_feature_CheckNotFunction_${name_}_}")
     add_compile_definitions("${symbol_}")
   endif()
 endmacro(CheckNotFunction)
 
 
-function(_CheckSymbol var_ name_ header_ includes_)
-  if(includes_)
-    set(CMAKE_REQUIRED_INCLUDES "${includes_}")
-  else()
-    unset(CMAKE_REQUIRED_INCLUDES)
-  endif()
-
-  check_symbol_exists("${name_}" "${header_}" "serf_foundit_symbol_${name_}_")
-  if(serf_foundit_symbol_${name_}_)
-    set("${var_}" TRUE PARENT_SCOPE)
-  else()
-    set("${var_}" FALSE PARENT_SCOPE)
-  endif()
-  unset(CMAKE_REQUIRED_INCLUDES)
-endfunction(_CheckSymbol)
-
-macro(CheckFunctionMacro name_ symbol_ header_ includes_)
-  _CheckFunction("serf_feature_CheckFunctionMacro_${name_}_" "${name_}" 
"${ARGN}")
-  if("${serf_feature_CheckFunctionMacro_${name_}_}")
-    add_compile_definitions("${symbol_}")
-  else()
-    _CheckSymbol("serf_feature_CheckFunctionMacro_${name_}_" "${name_}" 
"${header_}" "${includes_}")
-    if("${serf_feature_CheckFunctionMacro_${name_}_}")
-      add_compile_definitions("${symbol_}")
-    endif()
-  endif()
-endmacro(CheckFunctionMacro)
-
-
 function(_CheckHeader var_ name_ includes_)
   if(includes_)
     set(CMAKE_REQUIRED_INCLUDES "${includes_}")
@@ -89,8 +87,8 @@ function(_CheckHeader var_ name_ include
     unset(CMAKE_REQUIRED_INCLUDES)
   endif()
 
-  check_include_file("${name_}" "serf_foundit_${name_}_")
-  if(${serf_foundit_${name_}_})
+  check_include_file("${name_}" "check_symbol_${name_}")
+  if(${check_symbol_${name_}})
     set("${var_}" TRUE PARENT_SCOPE)
   else()
     set("${var_}" FALSE PARENT_SCOPE)
@@ -119,8 +117,8 @@ function(_CheckType var_ name_ header_ i
     unset(CMAKE_EXTRA_INCLUDE_FILES)
   endif()
 
-  check_type_size("${name_}" "serf_foundit_${name_}_")
-  if(${HAVE_serf_foundit_${name_}_})
+  check_type_size("${name_}" "check_type_${name_}")
+  if(${HAVE_check_type_${name_}})
     set("${var_}" TRUE PARENT_SCOPE)
   else()
     set("${var_}" FALSE PARENT_SCOPE)


Reply via email to