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.
This commit is contained in:
parent
1bc548b821
commit
597f49b614
@ -9,7 +9,6 @@
|
||||
#
|
||||
# On some platforms this builds also xz and xzdec, but these are
|
||||
# highly experimental and meant for testing only:
|
||||
# - No large file support on those 32-bit platforms that need it
|
||||
# - No translations
|
||||
#
|
||||
# Other missing things:
|
||||
@ -51,6 +50,7 @@ include(CheckIncludeFile)
|
||||
include(CheckSymbolExists)
|
||||
include(CheckStructHasMember)
|
||||
include(CheckCSourceCompiles)
|
||||
include(cmake/tuklib_large_file_support.cmake)
|
||||
include(cmake/tuklib_integer.cmake)
|
||||
include(cmake/tuklib_cpucores.cmake)
|
||||
include(cmake/tuklib_physmem.cmake)
|
||||
@ -150,6 +150,11 @@ add_compile_definitions(
|
||||
# it also adds the definitions to CMAKE_REQUIRED_DEFINITIONS.
|
||||
tuklib_use_system_extensions(ALL)
|
||||
|
||||
# Check for large file support. It's required on some 32-bit platforms and
|
||||
# even on 64-bit MinGW-w64 to get 64-bit off_t. This can be forced off on
|
||||
# the CMake command line if needed: -DLARGE_FILE_SUPPORT=OFF
|
||||
tuklib_large_file_support(ALL)
|
||||
|
||||
# This is needed by liblzma and xz.
|
||||
tuklib_integer(ALL)
|
||||
|
||||
|
52
cmake/tuklib_large_file_support.cmake
Normal file
52
cmake/tuklib_large_file_support.cmake
Normal file
@ -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()
|
Loading…
Reference in New Issue
Block a user