Browse Source

Merge topic 'fix-mingw32-gcc11-ice' into release-3.22

26c9fbab46 MINGW-w64: Fix string(TIMESTAMP) build on 32bits.
f0eae9292b cmTimestamp: Declare component buffer before MinGW-specific code

Acked-by: Kitware Robot <[email protected]>
Merge-request: !6737
Brad King 4 years ago
parent
commit
b33cae9d2d
1 changed files with 11 additions and 5 deletions
  1. 11 5
      Source/cmTimestamp.cxx

+ 11 - 5
Source/cmTimestamp.cxx

@@ -192,11 +192,13 @@ std::string cmTimestamp::AddTimestampComponent(char flag,
     }
   }
 
+  char buffer[16];
+
 #ifdef __MINGW32__
   /* See a bug in MinGW: https://sourceforge.net/p/mingw-w64/bugs/793/. A work
    * around is to try to use strftime() from ucrtbase.dll. */
   using T = size_t(WINAPI*)(char*, size_t, const char*, const struct tm*);
-  auto loadStrftime = [] {
+  auto loadUcrtStrftime = []() -> T {
     auto handle =
       LoadLibraryExA("ucrtbase.dll", nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32);
     if (handle) {
@@ -205,12 +207,16 @@ std::string cmTimestamp::AddTimestampComponent(char flag,
       return reinterpret_cast<T>(GetProcAddress(handle, "strftime"));
 #  pragma GCC diagnostic pop
     }
-    return strftime;
+    return nullptr;
   };
-  static T strftime = loadStrftime();
-#endif
+  static T ucrtStrftime = loadUcrtStrftime();
 
-  char buffer[16];
+  if (ucrtStrftime) {
+    size_t size =
+      ucrtStrftime(buffer, sizeof(buffer), formatString.c_str(), &timeStruct);
+    return std::string(buffer, size);
+  }
+#endif
 
   size_t size =
     strftime(buffer, sizeof(buffer), formatString.c_str(), &timeStruct);