From 54c3d998a04a4002697a3a44293074cb01df54a5 Mon Sep 17 00:00:00 2001 From: Victor Zhang Date: Thu, 2 Jan 2025 14:02:10 -0800 Subject: [PATCH] Support for libc variants without fseeko/ftello Some older Android libc implementations don't support `fseeko` or `ftello`. This commit adds a new compile-time macro `LIBC_NO_FSEEKO` as well as a usage in CMake for old Android APIs. --- build/cmake/CMakeLists.txt | 12 ++++++++++++ contrib/seekable_format/zstdseek_decompress.c | 5 ++++- programs/fileio_common.h | 6 +++++- programs/util.h | 5 ++++- 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/build/cmake/CMakeLists.txt b/build/cmake/CMakeLists.txt index b43671cc2..e03eadb66 100644 --- a/build/cmake/CMakeLists.txt +++ b/build/cmake/CMakeLists.txt @@ -82,8 +82,19 @@ else () add_definitions(-DZSTD_LEGACY_SUPPORT=0) endif () +get_cmake_property(_variableNames VARIABLES) +list (SORT _variableNames) +foreach (_variableName ${_variableNames}) + message("${_variableName}=${${_variableName}}") +endforeach() + if (ANDROID) set(ZSTD_MULTITHREAD_SUPPORT_DEFAULT OFF) + # Old versions of bionic libc don't have fseeko/ftello + if ((NOT ${ANDROID_PLATFORM_LEVEL}) OR ${ANDROID_PLATFORM_LEVEL} VERSION_LESS 24) + message("Hi Android SDK") + add_compile_definitions(LIBC_NO_FSEEKO) + endif () else() set(ZSTD_MULTITHREAD_SUPPORT_DEFAULT ON) endif() @@ -153,6 +164,7 @@ if (ZSTD_BUILD_PROGRAMS) elseif(NOT ZSTD_BUILD_SHARED AND ZSTD_PROGRAMS_LINK_SHARED) message(SEND_ERROR "You need to build shared library to build zstd CLI") endif () + message("Building program") add_subdirectory(programs) endif () diff --git a/contrib/seekable_format/zstdseek_decompress.c b/contrib/seekable_format/zstdseek_decompress.c index 5ee6e0541..7f4979875 100644 --- a/contrib/seekable_format/zstdseek_decompress.c +++ b/contrib/seekable_format/zstdseek_decompress.c @@ -77,7 +77,10 @@ /* ************************************************************ * Avoid fseek()'s 2GiB barrier with MSVC, macOS, *BSD, MinGW ***************************************************************/ -#if defined(_MSC_VER) && _MSC_VER >= 1400 +#if defined(LIBC_NO_FSEEKO) +/* Some older libc implementations don't include these functions (e.g. Bionic < 24) */ +#define LONG_SEEK fseek +#elif defined(_MSC_VER) && _MSC_VER >= 1400 # define LONG_SEEK _fseeki64 #elif !defined(__64BIT__) && (PLATFORM_POSIX_VERSION >= 200112L) /* No point defining Large file for 64 bit */ # define LONG_SEEK fseeko diff --git a/programs/fileio_common.h b/programs/fileio_common.h index 7a014ee4b..f1eb8160b 100644 --- a/programs/fileio_common.h +++ b/programs/fileio_common.h @@ -79,7 +79,11 @@ extern UTIL_time_t g_displayClock; /* Avoid fseek()'s 2GiB barrier with MSVC, macOS, *BSD, MinGW */ -#if defined(_MSC_VER) && _MSC_VER >= 1400 +#if defined(LIBC_NO_FSEEKO) +/* Some older libc implementations don't include these functions (e.g. Bionic < 24) */ +#define LONG_SEEK fseek +#define LONG_TELL ftell +#elif defined(_MSC_VER) && _MSC_VER >= 1400 # define LONG_SEEK _fseeki64 # define LONG_TELL _ftelli64 #elif !defined(__64BIT__) && (PLATFORM_POSIX_VERSION >= 200112L) /* No point defining Large file for 64 bit */ diff --git a/programs/util.h b/programs/util.h index ec8139684..e66d95c08 100644 --- a/programs/util.h +++ b/programs/util.h @@ -24,7 +24,10 @@ /*-************************************************************ * Fix fseek()'s 2GiB barrier with MSVC, macOS, *BSD, MinGW ***************************************************************/ -#if defined(_MSC_VER) && (_MSC_VER >= 1400) +#if defined(LIBC_NO_FSEEKO) +/* Some older libc implementations don't include these functions (e.g. Bionic < 24) */ +#define UTIL_fseek fseek +#elif defined(_MSC_VER) && (_MSC_VER >= 1400) # define UTIL_fseek _fseeki64 #elif !defined(__64BIT__) && (PLATFORM_POSIX_VERSION >= 200112L) /* No point defining Large file for 64 bit */ # define UTIL_fseek fseeko