A small build fix for some MinGW toolchains
Виталий Новичков <[email protected]> Wed, 14 Aug 2019 14:27:09 +0300
| Newsgroups | gmane.comp.audio.compression.flac.devel |
|---|---|
| Message-ID | <[email protected]> |
Hello! Many years ago I have found some bugs are prevented build of libFLAC on some MinGW toolchains and I made my own patch to fix that. - The `_wutime64()` call may absent. For this case I using the `_wutime()` call as a fallback when _wutime64() is unavailable. - `_stricmp` and `_strnicmp` are also may fail. Therefore it's prefer to use `stricmp` and `strnicmp` (without `_` prefix) on MinGW toolchains. I have added a small check into CMake build, however, I didn't touched Automake and MSVC builds yet. Anyway, for MSVC builds you can simply define the `HAVE_WUTIME64` macro if MSVC toolchains are always have that call available. I have included a patch and a simple test program which tests availability of `_wutime64()` call. Can you apply my patch or make a different fix of this issue? Best regards, Vitaly Novichkov "Wohlstand" _______________________________________________ flac-dev mailing list [email protected] http://lists.xiph.org/mailman/listinfo/flac-dev
wutime64_test.c
(text/x-csrc, 322 B)
#ifdef _WIN32
#undef NO_OLDNAMES
#undef _NO_OLDNAMES
#endif
#include <io.h>
#include <sys/utime.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/utime.h>
#include <windows.h>
int main()
{
wchar_t *wname = L"dummy.txt";
struct __utimbuf64 ut;
ut.actime = 0;
ut.modtime = 0;
return _wutime64(wname, &ut);
}
0001-Build-fix-for-some-MinGW-toolchains.patch
(text/x-patch, 3.6 KB)
From 65314fdc13ebc227f5d85adafed7fabe9cd322f5 Mon Sep 17 00:00:00 2001 From: Wohlstand <[email protected]> Date: Wed, 14 Aug 2019 14:07:59 +0300 Subject: [PATCH] Build fix for some MinGW toolchains - _wutime64() call may absent and build will fail - it's preferred to use `str*cmp` rather `_str*cmp` as `_str*cmp` also may absent and build also will fail --- CMakeLists.txt | 2 ++ config.cmake.h.in | 3 +++ include/share/compat.h | 9 +++++++-- include/share/windows_unicode_filenames.h | 8 ++++++++ src/libFLAC/windows_unicode_filenames.c | 4 ++-- 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 66f4db24..0d91b4c1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,6 +50,8 @@ check_include_file("x86intrin.h" FLAC__HAS_X86INTRIN) check_function_exists(fseeko HAVE_FSEEKO) +check_c_source_compiles("#ifdef _WIN32\n#undef NO_OLDNAMES\n#undef _NO_OLDNAMES\n#endif\n#include <sys/utime.h>\n int main() { wchar_t *wname = L\"dummy.txt\"; struct __utimbuf64 ut; ut.actime = 0; ut.modtime = 0; return _wutime64(wname, &ut); }" HAVE_WUTIME64) + check_c_source_compiles("int main() { return __builtin_bswap16 (0) ; }" HAVE_BSWAP16) check_c_source_compiles("int main() { return __builtin_bswap32 (0) ; }" HAVE_BSWAP32) diff --git a/config.cmake.h.in b/config.cmake.h.in index 1d96f426..fb6ed5f0 100644 --- a/config.cmake.h.in +++ b/config.cmake.h.in @@ -125,6 +125,9 @@ /* Define to 1 if you have the <unistd.h> header file. */ #cmakedefine HAVE_UNISTD_H +/* Define to 1 if _wutime64() exists and is declared */ +#cmakedefine HAVE_WUTIME64 + /* Define to 1 if you have the <x86intrin.h> header file. */ #cmakedefine HAVE_X86INTRIN_H diff --git a/include/share/compat.h b/include/share/compat.h index f3041655..5caebe90 100644 --- a/include/share/compat.h +++ b/include/share/compat.h @@ -88,8 +88,13 @@ #define FLAC__U64L(x) x##ULL #if defined _MSC_VER || defined __MINGW32__ -#define FLAC__STRCASECMP _stricmp -#define FLAC__STRNCASECMP _strnicmp +# if defined _MSC_VER +# define FLAC__STRCASECMP _stricmp +# define FLAC__STRNCASECMP _strnicmp +# else +# define FLAC__STRCASECMP stricmp +# define FLAC__STRNCASECMP strnicmp +# endif #elif defined __BORLANDC__ #define FLAC__STRCASECMP stricmp #define FLAC__STRNCASECMP strnicmp diff --git a/include/share/windows_unicode_filenames.h b/include/share/windows_unicode_filenames.h index 526b30d5..8121cdec 100644 --- a/include/share/windows_unicode_filenames.h +++ b/include/share/windows_unicode_filenames.h @@ -43,6 +43,14 @@ extern "C" { #endif +#ifdef HAVE_WUTIME64 +#define FLAC_struct_utime __utimbuf64 +#define FLAC_utime _wutime64 +#else +#define FLAC_struct_utime _utimbuf +#define FLAC_utime _wutime +#endif + void flac_internal_set_utf8_filenames(FLAC__bool flag); FLAC__bool flac_internal_get_utf8_filenames(void); #define flac_set_utf8_filenames flac_internal_set_utf8_filenames diff --git a/src/libFLAC/windows_unicode_filenames.c b/src/libFLAC/windows_unicode_filenames.c index 78550087..41ecc661 100644 --- a/src/libFLAC/windows_unicode_filenames.c +++ b/src/libFLAC/windows_unicode_filenames.c @@ -133,13 +133,13 @@ int flac_internal_utime_utf8(const char *filename, struct utimbuf *times) return utime(filename, times); } else { wchar_t *wname; - struct __utimbuf64 ut; + struct FLAC_struct_utime ut; int ret; if (!(wname = wchar_from_utf8(filename))) return -1; ut.actime = times->actime; ut.modtime = times->modtime; - ret = _wutime64(wname, &ut); + ret = FLAC_utime(wname, &ut); free(wname); return ret; -- 2.17.1