Procházet zdrojové kódy

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 před 11 měsíci
rodič
revize
40d8ec4be9

+ 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")