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)