On Fri, Oct 02, 2020 at 01:32:30AM +0800, Yonggang Luo wrote: > 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: Yonggang Luo <luoyongg...@gmail.com> > --- > configure | 34 ---------------------------------- > include/sysemu/os-win32.h | 4 ++-- > util/oslib-win32.c | 4 ++-- > 3 files changed, 4 insertions(+), 38 deletions(-)
Reviewed-by: Daniel P. Berrangé <berra...@redhat.com> Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|