Ver Fonte

cmake: cannot use CheckSymbolExists for _alloca

_alloca is an intrinsic function on MSVC, which means it has no address and is no symbol.
Hence CheckSymbolExists will always fail finding it.
Anonymous Maarten há 10 meses atrás
pai
commit
40d8ec4be9
3 ficheiros alterados com 11 adições e 2 exclusões
  1. 8 1
      CMakeLists.txt
  2. 1 0
      cmake/PreseedEmscriptenCache.cmake
  3. 2 1
      cmake/PreseedMSVCCache.cmake

+ 8 - 1
CMakeLists.txt

@@ -1005,7 +1005,14 @@ set(SDL_DISABLE_ALLOCA 0)
 check_include_file("alloca.h" "HAVE_ALLOCA_H")
 if(MSVC)
   check_include_file("malloc.h" "HAVE_MALLOC_H")
-  check_symbol_exists("_alloca" "malloc.h" _ALLOCA_IN_MALLOC_H)
+  # Cannot use CheckSymbolExists for _alloca: purely intrinsic functions have no address (C7552)
+  if(NOT DEFINED _ALLOCA_IN_MALLOC_H)
+    message(STATUS "Looking for _alloca in malloc.h")
+    set(testsrc "${CMAKE_CURRENT_SOURCE_DIR}/test_malloc_alloca.c")
+    file(WRITE "${testsrc}" "#include <malloc.h>\n\nint main(int argc, char *argv[]) { void *ptr = _alloca(argc * (int)argv[0][0]); return ptr != (void *)0; }")
+    try_compile(_ALLOCA_IN_MALLOC_H "${CMAKE_CURRENT_BINARY_DIR}/alloca_in_malloc_h" SOURCES "${testsrc}")
+    message(STATUS "Looking for _alloca in malloc.h - ${_ALLOCA_IN_MALLOC_H}")
+  endif()
   if(NOT HAVE_ALLOCA_H AND NOT _ALLOCA_IN_MALLOC_H)
     set(SDL_DISABLE_ALLOCA 1)
   endif()

+ 1 - 0
cmake/PreseedEmscriptenCache.cmake

@@ -4,6 +4,7 @@ if(EMSCRIPTEN)
     set(HAVE_ALLOCA_H                                    "1"   CACHE INTERNAL "Have include alloca.h")
     set(HAVE_LIBM                                        "1"   CACHE INTERNAL "Have library m")
     set(HAVE_MALLOC                                      "1"   CACHE INTERNAL "Have include malloc.h")
+    set(HAVE_MALLOC_H                                    "1"   CACHE INTERNAL "Have include malloc.h")
     set(LIBC_HAS_ABS                                     "1"   CACHE INTERNAL "Have symbol abs")
     set(LIBC_HAS_ACOS                                    "1"   CACHE INTERNAL "Have symbol acos")
     set(LIBC_HAS_ACOSF                                   "1"   CACHE INTERNAL "Have symbol acosf")

+ 2 - 1
cmake/PreseedMSVCCache.cmake

@@ -21,6 +21,7 @@ if(MSVC)
       set(HAVE_DXGI_H                                      "1"   CACHE INTERNAL "Have include dxgi.h")
       set(HAVE_LIBM                                        ""    CACHE INTERNAL "Have library m")
       set(HAVE_MALLOC                                      "1"   CACHE INTERNAL "Have include malloc.h")
+      set(HAVE_MALLOC_H                                    "1"   CACHE INTERNAL "Have include malloc.h")
       set(HAVE_MMDEVICEAPI_H                               "1"   CACHE INTERNAL "Have include mmdeviceapi.h")
       set(HAVE_SENSORSAPI_H                                "1"   CACHE INTERNAL "Have include sensorsapi.h")
       set(HAVE_SHELLSCALINGAPI_H                           "1"   CACHE INTERNAL "Have include shellscalingapi.h")
@@ -157,7 +158,7 @@ if(MSVC)
       set(LIBC_HAS__ULTOA                                  "1"   CACHE INTERNAL "Have symbol _ultoa")
       set(LIBC_HAS__WCSDUP                                 "1"   CACHE INTERNAL "Have symbol _wcsdup")
       set(LIBC_IS_GLIBC                                    ""    CACHE INTERNAL "Have symbol __GLIBC__")
-      set(_ALLOCA_IN_MALLOC_H                              ""    CACHE INTERNAL "Have symbol _alloca")
+      set(_ALLOCA_IN_MALLOC_H                              "1"   CACHE INTERNAL "Have symbol _alloca")
 
       if(CHECK_CPU_ARCHITECTURE_X86)
         set(COMPILER_SUPPORTS_AVX                            "1"   CACHE INTERNAL "Test COMPILER_SUPPORTS_AVX")