Просмотр исходного кода

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 10 месяцев назад
Родитель
Сommit
40d8ec4be9
3 измененных файлов с 11 добавлено и 2 удалено
  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")