Author: brane Date: Sat Jun 14 13:05:53 2025 New Revision: 1926412 URL: http://svn.apache.org/viewvc?rev=1926412&view=rev Log: In the CMake build: add a runtime check to determine if the target platform uses ELF, instead of guessing based on the name of the platform.
* build/SerfPlatform.cmake (SERF_ELF_TARGET): Set to FALSE on Windows and Darwin only. (_CheckElfTarget): New configure-time test to determine if SERF_ELF_TARGET should be set (to TRUE). Modified: serf/trunk/build/SerfPlatform.cmake Modified: serf/trunk/build/SerfPlatform.cmake URL: http://svn.apache.org/viewvc/serf/trunk/build/SerfPlatform.cmake?rev=1926412&r1=1926411&r2=1926412&view=diff ============================================================================== --- serf/trunk/build/SerfPlatform.cmake (original) +++ serf/trunk/build/SerfPlatform.cmake Sat Jun 14 13:05:53 2025 @@ -17,9 +17,20 @@ # under the License. # =================================================================== -if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") +if(${CMAKE_SYSTEM_NAME} MATCHES "Windows") + set(SERF_WINDOWS TRUE) + set(SERF_ELF_TARGET FALSE) + if(CMAKE_GENERATOR_PLATFORM MATCHES "(x64|ARM64|IA64)") + set(SERF_WIN64 TRUE) + set(SERF_PLATFORM "Windows (64-bit)") + else() + set(SERF_WIN32 TRUE) + set(SERF_PLATFORM "Windows (32-bit)") + endif() +elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(SERF_UNIX TRUE) set(SERF_DARWIN TRUE) + set(SERF_ELF_TARGET FALSE) if(NOT RELATIVE_RPATH) set(CMAKE_MACOSX_RPATH FALSE) endif() @@ -31,32 +42,19 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux") set(SERF_UNIX TRUE) set(SERF_LINUX TRUE) - set(SERF_ELF_TARGET TRUE) set(SERF_PLATFORM "Linux") elseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") set(SERF_UNIX TRUE) set(SERF_FREEBSD TRUE) - set(SERF_ELF_TARGET TRUE) set(SERF_PLATFORM "FreeBSD") elseif(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") set(SERF_UNIX TRUE) set(SERF_OPENBSD TRUE) - set(SERF_ELF_TARGET TRUE) set(SERF_PLATFORM "OpenBSD") elseif(${CMAKE_SYSTEM_NAME} MATCHES "NetBSD") set(SERF_UNIX TRUE) set(SERF_NETBSD TRUE) - set(SERF_ELF_TARGET TRUE) set(SERF_PLATFORM "NetBSD") -elseif(${CMAKE_SYSTEM_NAME} MATCHES "Windows") - set(SERF_WINDOWS TRUE) - if(CMAKE_GENERATOR_PLATFORM MATCHES "(x64|ARM64|IA64)") - set(SERF_WIN64 TRUE) - set(SERF_PLATFORM "Windows (64-bit)") - else() - set(SERF_WIN32 TRUE) - set(SERF_PLATFORM "Windows (32-bit)") - endif() else() set(SERF_UNIX TRUE) set(SERF_PLATFORM "generic Unix") @@ -71,3 +69,34 @@ string(TOLOWER ${CMAKE_SYSTEM_PROCESSOR} string(TOLOWER ${CMAKE_SYSTEM_NAME} _system) string(TOLOWER ${CMAKE_SYSTEM_VERSION} _version) set(SERF_TARGET "${_arch}-${_system}${_version}") + +# Check if the target uses the ELF object format. We've explicitly set this to +# FALSE on Windows and Darwin; on other platforms, we build an executable file +# and check if it has the ELF magic number in the header. +if(NOT DEFINED SERF_ELF_TARGET) + # Wrap the test into a function to keep the variables scoped. + function(_CheckElfTarget var_) + set(msg "Check if the target platform uses ELF") + set(src "${CMAKE_CURRENT_BINARY_DIR}/check_elf_target.c") + set(bin "${CMAKE_CURRENT_BINARY_DIR}/check_elf_target.out") + message(STATUS "${msg}") + file(WRITE "${src}" "int main(void) { return 0; }") + try_compile(success "${CMAKE_CURRENT_BINARY_DIR}" + SOURCES "${src}" + OUTPUT_VARIABLE log + COPY_FILE "${bin}") + if(success) + file(READ "${bin}" header LIMIT 4 HEX) + if("${header}" STREQUAL "7f454c46") # 0x7f E L F + message(STATUS "${msg} - yes") + set(${var_} TRUE PARENT_SCOPE) + else() + message(STATUS "${msg} - no") + endif() + else(success) + message(STATUS "${msg} - unknown") + message(STATUS "${log}") + endif(success) + endfunction(_CheckElfTarget) + _CheckElfTarget(SERF_ELF_TARGET) +endif()