From 6db438e784826d8b83d5fd38ad61154635243034 Mon Sep 17 00:00:00 2001 From: Bradley Lowekamp Date: Thu, 18 Jun 2026 19:50:20 +0000 Subject: [PATCH] COMP: prefix CMake check commands with DCMTK_ to avoid leaking CHECK_FUNCTION_EXISTS (Windows override) and CHECK_CXX_SYMBOL_EXISTS (fallback) were defined as global CMake commands. When DCMTK is built via FetchContent inside another project, these overrides leaked into sibling modules and caused incorrect feature detection. Renamed to DCMTK_CHECK_FUNCTION_EXISTS and DCMTK_CHECK_CXX_SYMBOL_EXISTS and updated all call sites. --- CMake/GenerateDCMTKConfigure.cmake | 92 +++++++++++++++++------------- 1 file changed, 51 insertions(+), 41 deletions(-) diff --git a/CMake/GenerateDCMTKConfigure.cmake b/CMake/GenerateDCMTKConfigure.cmake index ac3ae70aab..87b62f7af2 100644 --- a/CMake/GenerateDCMTKConfigure.cmake +++ b/CMake/GenerateDCMTKConfigure.cmake @@ -241,9 +241,14 @@ include("${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake") include("${CMAKE_ROOT}/Modules/CheckLibraryExists.cmake") include("${DCMTK_CMAKE_INCLUDE}CMake/CheckFunctionWithHeaderExists.cmake") include(CheckCXXSymbolExists OPTIONAL) -if(NOT COMMAND CHECK_CXX_SYMBOL_EXISTS) - # fallback implementation for old CMake Versions - function(CHECK_CXX_SYMBOL_EXISTS SYMBOL FILES VAR) +# Defined with DCMTK_ prefix to avoid overriding the global command name. +if(COMMAND check_cxx_symbol_exists) + macro(DCMTK_CHECK_CXX_SYMBOL_EXISTS SYMBOL FILES VAR) + check_cxx_symbol_exists("${SYMBOL}" "${FILES}" "${VAR}") + endmacro() +else() + # Fallback for CMake versions that predate CheckCXXSymbolExists + function(DCMTK_CHECK_CXX_SYMBOL_EXISTS SYMBOL FILES VAR) set(CODE) foreach(FILE ${FILES}) set(CODE "${CODE}#include <${FILE}>\n") @@ -256,7 +261,7 @@ endif() foreach(FUNC "__FUNCTION__" "__PRETTY_FUNCTION__" "__func__") CHECK_SYMBOL_EXISTS("${FUNC}" "" "HAVE_${FUNC}_C_MACRO") # test if the C++ compiler also supports them (e.g. SunPro doesn't) - CHECK_CXX_SYMBOL_EXISTS("${FUNC}" "" "HAVE_${FUNC}_CXX_MACRO") + DCMTK_CHECK_CXX_SYMBOL_EXISTS("${FUNC}" "" "HAVE_${FUNC}_CXX_MACRO") if(HAVE_${FUNC}_C_MACRO AND HAVE_${FUNC}_CXX_MACRO) set("HAVE_${FUNC}_MACRO" 1 CACHE INTERNAL "Have symbol ${FUNC}" FORCE) else() @@ -505,48 +510,53 @@ endif() set(CXXHEADERS ${CXXHEADERS} cstdint) endif() + # On Windows check_function_exists fails due to symbol name mangling; use + # check_symbol_exists instead. Defined with DCMTK_ prefix to avoid + # overriding the global CHECK_FUNCTION_EXISTS command. if(WIN32) - # CHECK_FUNCTION_EXISTS does not work correctly on Windows (due to symbol name mangling) - # use CHECK_SYMBOL_EXISTS instead - macro(CHECK_FUNCTION_EXISTS FUNCTION VAR) + macro(DCMTK_CHECK_FUNCTION_EXISTS FUNCTION VAR) check_symbol_exists("${FUNCTION}" "${HEADERS}" "${VAR}") endmacro() + else() + macro(DCMTK_CHECK_FUNCTION_EXISTS FUNCTION VAR) + check_function_exists("${FUNCTION}" "${VAR}") + endmacro() endif() - CHECK_FUNCTION_EXISTS(_findfirst HAVE__FINDFIRST) - CHECK_FUNCTION_EXISTS(_set_output_format HAVE__SET_OUTPUT_FORMAT) - CHECK_FUNCTION_EXISTS(atoll HAVE_ATOLL) - CHECK_FUNCTION_EXISTS(cuserid HAVE_CUSERID) - CHECK_FUNCTION_EXISTS(fgetln HAVE_FGETLN) - CHECK_FUNCTION_EXISTS(flock HAVE_FLOCK) - CHECK_FUNCTION_EXISTS(fork HAVE_FORK) - CHECK_FUNCTION_EXISTS(fseeko HAVE_FSEEKO) - CHECK_FUNCTION_EXISTS(ftime HAVE_FTIME) - CHECK_FUNCTION_EXISTS(geteuid HAVE_GETEUID) - CHECK_FUNCTION_EXISTS(getgrnam HAVE_GETGRNAM) - CHECK_FUNCTION_EXISTS(gethostbyaddr_r HAVE_GETHOSTBYADDR_R) - CHECK_FUNCTION_EXISTS(gethostbyname_r HAVE_GETHOSTBYNAME_R) - CHECK_FUNCTION_EXISTS(gethostid HAVE_GETHOSTID) - CHECK_FUNCTION_EXISTS(getlogin HAVE_GETLOGIN) - CHECK_FUNCTION_EXISTS(getlogin_r HAVE_GETLOGIN_R) - CHECK_FUNCTION_EXISTS(getpwnam HAVE_GETPWNAM) - CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY) - CHECK_FUNCTION_EXISTS(getuid HAVE_GETUID) - CHECK_FUNCTION_EXISTS(gmtime_r HAVE_GMTIME_R) - CHECK_FUNCTION_EXISTS(localtime_r HAVE_LOCALTIME_R) - CHECK_FUNCTION_EXISTS(lockf HAVE_LOCKF) - CHECK_FUNCTION_EXISTS(lstat HAVE_LSTAT) - CHECK_FUNCTION_EXISTS(malloc_debug HAVE_MALLOC_DEBUG) - CHECK_FUNCTION_EXISTS(mkstemp HAVE_MKSTEMP) - CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP) - CHECK_FUNCTION_EXISTS(setuid HAVE_SETUID) - CHECK_FUNCTION_EXISTS(sleep HAVE_SLEEP) - CHECK_FUNCTION_EXISTS(strlcat HAVE_STRLCAT) - CHECK_FUNCTION_EXISTS(strlcpy HAVE_STRLCPY) - CHECK_FUNCTION_EXISTS(sysinfo HAVE_SYSINFO) - CHECK_FUNCTION_EXISTS(uname HAVE_UNAME) - CHECK_FUNCTION_EXISTS(usleep HAVE_USLEEP) - CHECK_FUNCTION_EXISTS(waitpid HAVE_WAITPID) + DCMTK_CHECK_FUNCTION_EXISTS(_findfirst HAVE__FINDFIRST) + DCMTK_CHECK_FUNCTION_EXISTS(_set_output_format HAVE__SET_OUTPUT_FORMAT) + DCMTK_CHECK_FUNCTION_EXISTS(atoll HAVE_ATOLL) + DCMTK_CHECK_FUNCTION_EXISTS(cuserid HAVE_CUSERID) + DCMTK_CHECK_FUNCTION_EXISTS(fgetln HAVE_FGETLN) + DCMTK_CHECK_FUNCTION_EXISTS(flock HAVE_FLOCK) + DCMTK_CHECK_FUNCTION_EXISTS(fork HAVE_FORK) + DCMTK_CHECK_FUNCTION_EXISTS(fseeko HAVE_FSEEKO) + DCMTK_CHECK_FUNCTION_EXISTS(ftime HAVE_FTIME) + DCMTK_CHECK_FUNCTION_EXISTS(geteuid HAVE_GETEUID) + DCMTK_CHECK_FUNCTION_EXISTS(getgrnam HAVE_GETGRNAM) + DCMTK_CHECK_FUNCTION_EXISTS(gethostbyaddr_r HAVE_GETHOSTBYADDR_R) + DCMTK_CHECK_FUNCTION_EXISTS(gethostbyname_r HAVE_GETHOSTBYNAME_R) + DCMTK_CHECK_FUNCTION_EXISTS(gethostid HAVE_GETHOSTID) + DCMTK_CHECK_FUNCTION_EXISTS(getlogin HAVE_GETLOGIN) + DCMTK_CHECK_FUNCTION_EXISTS(getlogin_r HAVE_GETLOGIN_R) + DCMTK_CHECK_FUNCTION_EXISTS(getpwnam HAVE_GETPWNAM) + DCMTK_CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY) + DCMTK_CHECK_FUNCTION_EXISTS(getuid HAVE_GETUID) + DCMTK_CHECK_FUNCTION_EXISTS(gmtime_r HAVE_GMTIME_R) + DCMTK_CHECK_FUNCTION_EXISTS(localtime_r HAVE_LOCALTIME_R) + DCMTK_CHECK_FUNCTION_EXISTS(lockf HAVE_LOCKF) + DCMTK_CHECK_FUNCTION_EXISTS(lstat HAVE_LSTAT) + DCMTK_CHECK_FUNCTION_EXISTS(malloc_debug HAVE_MALLOC_DEBUG) + DCMTK_CHECK_FUNCTION_EXISTS(mkstemp HAVE_MKSTEMP) + DCMTK_CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP) + DCMTK_CHECK_FUNCTION_EXISTS(setuid HAVE_SETUID) + DCMTK_CHECK_FUNCTION_EXISTS(sleep HAVE_SLEEP) + DCMTK_CHECK_FUNCTION_EXISTS(strlcat HAVE_STRLCAT) + DCMTK_CHECK_FUNCTION_EXISTS(strlcpy HAVE_STRLCPY) + DCMTK_CHECK_FUNCTION_EXISTS(sysinfo HAVE_SYSINFO) + DCMTK_CHECK_FUNCTION_EXISTS(uname HAVE_UNAME) + DCMTK_CHECK_FUNCTION_EXISTS(usleep HAVE_USLEEP) + DCMTK_CHECK_FUNCTION_EXISTS(waitpid HAVE_WAITPID) CHECK_SYMBOL_EXISTS(strcasestr "string.h" HAVE_PROTOTYPE_STRCASESTR)