Skip to content
  • Yonggang Luo's avatar
    7c3afc85
    win32: Simplify gmtime_r detection not depends on if _POSIX_C_SOURCE are defined on msys2/mingw · 7c3afc85
    Yonggang Luo authored
    
    
    We remove the CONFIG_LOCALTIME_R detection option in configure, and move the check
    existence of gmtime_r from configure into C header and source directly by using macro
    `_POSIX_THREAD_SAFE_FUNCTIONS`.
    Before this patch, the configure script are always assume the compiler doesn't define
    _POSIX_C_SOURCE macro at all, but that's not true, because thirdparty library such
    as ncursesw may define -D_POSIX_C_SOURCE in it's pkg-config file. And that C Flags will
    added -D_POSIX_C_SOURCE into each QEMU_CFLAGS. And that's causing the following compiling error:
    n file included from C:/work/xemu/qemu/include/qemu/osdep.h:119,
                     from ../softmmu/main.c:25:
    C:/work/xemu/qemu/include/sysemu/os-win32.h:53:12: error: redundant redeclaration of 'gmtime_r' [-Werror=redundant-decls]
       53 | struct tm *gmtime_r(const time_t *timep, struct tm *result);
          |            ^~~~~~~~
    In file included from C:/work/xemu/qemu/include/qemu/osdep.h:94,
                     from ../softmmu/main.c:25:
    C:/CI-Tools/msys64/mingw64/x86_64-w64-mingw32/include/time.h:284:36: note: previous definition of 'gmtime_r' was here
      284 | __forceinline struct tm *__CRTDECL gmtime_r(const time_t *_Time, struct tm *_Tm) {
          |                                    ^~~~~~~~
    In file included from C:/work/xemu/qemu/include/qemu/osdep.h:119,
                     from ../softmmu/main.c:25:
    C:/work/xemu/qemu/include/sysemu/os-win32.h:55:12: error: redundant redeclaration of 'localtime_r' [-Werror=redundant-decls]
       55 | struct tm *localtime_r(const time_t *timep, struct tm *result);
          |            ^~~~~~~~~~~
    In file included from C:/work/xemu/qemu/include/qemu/osdep.h:94,
                     from ../softmmu/main.c:25:
    C:/CI-Tools/msys64/mingw64/x86_64-w64-mingw32/include/time.h:281:36: note: previous definition of 'localtime_r' was here
      281 | __forceinline struct tm *__CRTDECL localtime_r(const time_t *_Time, struct tm *_Tm) {
          |                                    ^~~~~~~~~~~
    Compiling C object libcommon.fa.p/hw_gpio_zaurus.c.obj
    In file included from C:/work/xemu/qemu/include/qemu/osdep.h:119,
                     from ../hw/i2c/smbus_slave.c:16:
    C:/work/xemu/qemu/include/sysemu/os-win32.h:53:12: error: redundant redeclaration of 'gmtime_r' [-Werror=redundant-decls]
       53 | struct tm *gmtime_r(const time_t *timep, struct tm *result);
          |            ^~~~~~~~
    In file included from C:/work/xemu/qemu/include/qemu/osdep.h:94,
                     from ../hw/i2c/smbus_slave.c:16:
    C:/CI-Tools/msys64/mingw64/x86_64-w64-mingw32/include/time.h:284:36: note: previous definition of 'gmtime_r' was here
      284 | __forceinline struct tm *__CRTDECL gmtime_r(const time_t *_Time, struct tm *_Tm) {
          |                                    ^~~~~~~~
    In file included from C:/work/xemu/qemu/include/qemu/osdep.h:119,
                     from ../hw/i2c/smbus_slave.c:16:
    C:/work/xemu/qemu/include/sysemu/os-win32.h:55:12: error: redundant redeclaration of 'localtime_r' [-Werror=redundant-decls]
       55 | struct tm *localtime_r(const time_t *timep, struct tm *result);
          |            ^~~~~~~~~~~
    In file included from C:/work/xemu/qemu/include/qemu/osdep.h:94,
                     from ../hw/i2c/smbus_slave.c:16:
    C:/CI-Tools/msys64/mingw64/x86_64-w64-mingw32/include/time.h:281:36: note: previous definition of 'localtime_r' was here
      281 | __forceinline struct tm *__CRTDECL localtime_r(const time_t *_Time, struct tm *_Tm) {
          |                                    ^~~~~~~~~~~
    Compiling C object libcommon.fa.p/hw_dma_xilinx_axidma.c.obj
    
    After this patch, whenever ncursesw or other thirdparty libraries tried to define or not
    define  _POSIX_C_SOURCE, the source will building properly. Because now, we don't make any
    assumption if _POSIX_C_SOURCE are defined. We solely relied on if the macro `_POSIX_THREAD_SAFE_FUNCTIONS`
    are defined in msys2/mingw header.
    
    The _POSIX_THREAD_SAFE_FUNCTIONS are defined in mingw header like this:
    
    ```
    #if defined(_POSIX_C_SOURCE) && !defined(_POSIX_THREAD_SAFE_FUNCTIONS)
    #define _POSIX_THREAD_SAFE_FUNCTIONS 200112L
    #endif
    
    #ifdef _POSIX_THREAD_SAFE_FUNCTIONS
    __forceinline struct tm *__CRTDECL localtime_r(const time_t *_Time, struct tm *_Tm) {
      return localtime_s(_Tm, _Time) ? NULL : _Tm;
    }
    __forceinline struct tm *__CRTDECL gmtime_r(const time_t *_Time, struct tm *_Tm) {
      return gmtime_s(_Tm, _Time) ? NULL : _Tm;
    }
    __forceinline char *__CRTDECL ctime_r(const time_t *_Time, char *_Str) {
      return ctime_s(_Str, 0x7fffffff, _Time) ? NULL : _Str;
    }
    __forceinline char *__CRTDECL asctime_r(const struct tm *_Tm, char * _Str) {
      return asctime_s(_Str, 0x7fffffff, _Tm) ? NULL : _Str;
    }
    #endif
    ```
    
    Signed-off-by: default avatarYonggang Luo <luoyonggang@gmail.com>
    Reviewed-by: default avatarDaniel P. Berrangé <berrange@redhat.com>
    Message-id: 20201012234348.1427-5-luoyonggang@gmail.com
    Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
    7c3afc85
    win32: Simplify gmtime_r detection not depends on if _POSIX_C_SOURCE are defined on msys2/mingw
    Yonggang Luo authored
    
    
    We remove the CONFIG_LOCALTIME_R detection option in configure, and move the check
    existence of gmtime_r from configure into C header and source directly by using macro
    `_POSIX_THREAD_SAFE_FUNCTIONS`.
    Before this patch, the configure script are always assume the compiler doesn't define
    _POSIX_C_SOURCE macro at all, but that's not true, because thirdparty library such
    as ncursesw may define -D_POSIX_C_SOURCE in it's pkg-config file. And that C Flags will
    added -D_POSIX_C_SOURCE into each QEMU_CFLAGS. And that's causing the following compiling error:
    n file included from C:/work/xemu/qemu/include/qemu/osdep.h:119,
                     from ../softmmu/main.c:25:
    C:/work/xemu/qemu/include/sysemu/os-win32.h:53:12: error: redundant redeclaration of 'gmtime_r' [-Werror=redundant-decls]
       53 | struct tm *gmtime_r(const time_t *timep, struct tm *result);
          |            ^~~~~~~~
    In file included from C:/work/xemu/qemu/include/qemu/osdep.h:94,
                     from ../softmmu/main.c:25:
    C:/CI-Tools/msys64/mingw64/x86_64-w64-mingw32/include/time.h:284:36: note: previous definition of 'gmtime_r' was here
      284 | __forceinline struct tm *__CRTDECL gmtime_r(const time_t *_Time, struct tm *_Tm) {
          |                                    ^~~~~~~~
    In file included from C:/work/xemu/qemu/include/qemu/osdep.h:119,
                     from ../softmmu/main.c:25:
    C:/work/xemu/qemu/include/sysemu/os-win32.h:55:12: error: redundant redeclaration of 'localtime_r' [-Werror=redundant-decls]
       55 | struct tm *localtime_r(const time_t *timep, struct tm *result);
          |            ^~~~~~~~~~~
    In file included from C:/work/xemu/qemu/include/qemu/osdep.h:94,
                     from ../softmmu/main.c:25:
    C:/CI-Tools/msys64/mingw64/x86_64-w64-mingw32/include/time.h:281:36: note: previous definition of 'localtime_r' was here
      281 | __forceinline struct tm *__CRTDECL localtime_r(const time_t *_Time, struct tm *_Tm) {
          |                                    ^~~~~~~~~~~
    Compiling C object libcommon.fa.p/hw_gpio_zaurus.c.obj
    In file included from C:/work/xemu/qemu/include/qemu/osdep.h:119,
                     from ../hw/i2c/smbus_slave.c:16:
    C:/work/xemu/qemu/include/sysemu/os-win32.h:53:12: error: redundant redeclaration of 'gmtime_r' [-Werror=redundant-decls]
       53 | struct tm *gmtime_r(const time_t *timep, struct tm *result);
          |            ^~~~~~~~
    In file included from C:/work/xemu/qemu/include/qemu/osdep.h:94,
                     from ../hw/i2c/smbus_slave.c:16:
    C:/CI-Tools/msys64/mingw64/x86_64-w64-mingw32/include/time.h:284:36: note: previous definition of 'gmtime_r' was here
      284 | __forceinline struct tm *__CRTDECL gmtime_r(const time_t *_Time, struct tm *_Tm) {
          |                                    ^~~~~~~~
    In file included from C:/work/xemu/qemu/include/qemu/osdep.h:119,
                     from ../hw/i2c/smbus_slave.c:16:
    C:/work/xemu/qemu/include/sysemu/os-win32.h:55:12: error: redundant redeclaration of 'localtime_r' [-Werror=redundant-decls]
       55 | struct tm *localtime_r(const time_t *timep, struct tm *result);
          |            ^~~~~~~~~~~
    In file included from C:/work/xemu/qemu/include/qemu/osdep.h:94,
                     from ../hw/i2c/smbus_slave.c:16:
    C:/CI-Tools/msys64/mingw64/x86_64-w64-mingw32/include/time.h:281:36: note: previous definition of 'localtime_r' was here
      281 | __forceinline struct tm *__CRTDECL localtime_r(const time_t *_Time, struct tm *_Tm) {
          |                                    ^~~~~~~~~~~
    Compiling C object libcommon.fa.p/hw_dma_xilinx_axidma.c.obj
    
    After this patch, whenever ncursesw or other thirdparty libraries tried to define or not
    define  _POSIX_C_SOURCE, the source will building properly. Because now, we don't make any
    assumption if _POSIX_C_SOURCE are defined. We solely relied on if the macro `_POSIX_THREAD_SAFE_FUNCTIONS`
    are defined in msys2/mingw header.
    
    The _POSIX_THREAD_SAFE_FUNCTIONS are defined in mingw header like this:
    
    ```
    #if defined(_POSIX_C_SOURCE) && !defined(_POSIX_THREAD_SAFE_FUNCTIONS)
    #define _POSIX_THREAD_SAFE_FUNCTIONS 200112L
    #endif
    
    #ifdef _POSIX_THREAD_SAFE_FUNCTIONS
    __forceinline struct tm *__CRTDECL localtime_r(const time_t *_Time, struct tm *_Tm) {
      return localtime_s(_Tm, _Time) ? NULL : _Tm;
    }
    __forceinline struct tm *__CRTDECL gmtime_r(const time_t *_Time, struct tm *_Tm) {
      return gmtime_s(_Tm, _Time) ? NULL : _Tm;
    }
    __forceinline char *__CRTDECL ctime_r(const time_t *_Time, char *_Str) {
      return ctime_s(_Str, 0x7fffffff, _Time) ? NULL : _Str;
    }
    __forceinline char *__CRTDECL asctime_r(const struct tm *_Tm, char * _Str) {
      return asctime_s(_Str, 0x7fffffff, _Tm) ? NULL : _Str;
    }
    #endif
    ```
    
    Signed-off-by: default avatarYonggang Luo <luoyonggang@gmail.com>
    Reviewed-by: default avatarDaniel P. Berrangé <berrange@redhat.com>
    Message-id: 20201012234348.1427-5-luoyonggang@gmail.com
    Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
Loading