aboutsummaryrefslogtreecommitdiff
path: root/cmake
diff options
context:
space:
mode:
authorLasse Collin <lasse.collin@tukaani.org>2023-09-27 00:58:17 +0300
committerJia Tan <jiat0218@gmail.com>2023-10-31 18:44:59 +0800
commit36fabdbe67c8a8fbdc3ac695a91fc443a1328cc4 (patch)
treeba20c834cc510c25e180ef0dd08a234996f92ddd /cmake
parentCMake: Generate and install liblzma.pc if not using MSVC. (diff)
downloadxz-36fabdbe67c8a8fbdc3ac695a91fc443a1328cc4.tar.xz
CMake: Use -D_FILE_OFFSET_BITS=64 if (and only if) needed.
A CMake option LARGE_FILE_SUPPORT is created if and only if -D_FILE_OFFSET_BITS=64 affects sizeof(off_t). This is needed on many 32-bit platforms and even with 64-bit builds with MinGW-w64 to get support for files larger than 2 GiB.
Diffstat (limited to 'cmake')
-rw-r--r--cmake/tuklib_large_file_support.cmake52
1 files changed, 52 insertions, 0 deletions
diff --git a/cmake/tuklib_large_file_support.cmake b/cmake/tuklib_large_file_support.cmake
new file mode 100644
index 00000000..0800faa2
--- /dev/null
+++ b/cmake/tuklib_large_file_support.cmake
@@ -0,0 +1,52 @@
+#
+# tuklib_large_file_support.cmake
+#
+# If off_t is less than 64 bits by default and -D_FILE_OFFSET_BITS=64
+# makes off_t become 64-bit, the CMake option LARGE_FILE_SUPPORT is
+# provided (ON by default) and -D_FILE_OFFSET_BITS=64 is added to
+# the compile definitions if LARGE_FILE_SUPPORT is ON.
+#
+# Author: Lasse Collin
+#
+# This file has been put into the public domain.
+# You can do whatever you want with this file.
+#
+
+include("${CMAKE_CURRENT_LIST_DIR}/tuklib_common.cmake")
+include(CheckCSourceCompiles)
+
+function(tuklib_large_file_support TARGET_OR_ALL)
+ # MSVC must be handled specially in the C code.
+ if(MSVC)
+ return()
+ endif()
+
+ set(TUKLIB_LARGE_FILE_SUPPORT_TEST
+ "#include <sys/types.h>
+ int foo[sizeof(off_t) >= 8 ? 1 : -1];
+ int main(void) { return 0; }")
+
+ check_c_source_compiles("${TUKLIB_LARGE_FILE_SUPPORT_TEST}"
+ TUKLIB_LARGE_FILE_SUPPORT_BY_DEFAULT)
+
+ if(NOT TUKLIB_LARGE_FILE_SUPPORT_BY_DEFAULT)
+ cmake_push_check_state()
+ # This needs -D.
+ list(APPEND CMAKE_REQUIRED_DEFINITIONS "-D_FILE_OFFSET_BITS=64")
+ check_c_source_compiles("${TUKLIB_LARGE_FILE_SUPPORT_TEST}"
+ TUKLIB_LARGE_FILE_SUPPORT_WITH_FOB64)
+ cmake_pop_check_state()
+ endif()
+
+ if(TUKLIB_LARGE_FILE_SUPPORT_WITH_FOB64)
+ # Show the option only when _FILE_OFFSET_BITS=64 affects sizeof(off_t).
+ option(LARGE_FILE_SUPPORT
+ "Use -D_FILE_OFFSET_BITS=64 to support files larger than 2 GiB."
+ ON)
+
+ if(LARGE_FILE_SUPPORT)
+ # This must not use -D.
+ tuklib_add_definitions("${TARGET_OR_ALL}" "_FILE_OFFSET_BITS=64")
+ endif()
+ endif()
+endfunction()