You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
3.9 KiB
110 lines
3.9 KiB
## Checks for large file support ##
|
|
include(CheckIncludeFile)
|
|
include(CheckSymbolExists)
|
|
include(CheckTypeSize)
|
|
|
|
macro(check_lfs _isenable)
|
|
set(LFS_OFF_T "")
|
|
set(LFS_FOPEN "")
|
|
set(LFS_FSEEK "")
|
|
set(LFS_FTELL "")
|
|
set(LFS_PRID "")
|
|
|
|
if(${_isenable})
|
|
set(SAFE_CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS}")
|
|
set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
|
|
-D_LARGEFILE_SOURCE -D_LARGE_FILES -D_FILE_OFFSET_BITS=64
|
|
-D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS)
|
|
|
|
check_include_file("sys/types.h" HAVE_SYS_TYPES_H)
|
|
check_include_file("inttypes.h" HAVE_INTTYPES_H)
|
|
check_include_file("stddef.h" HAVE_STDDEF_H)
|
|
check_include_file("stdint.h" HAVE_STDINT_H)
|
|
|
|
# LFS type1: 8 <= sizeof(off_t), fseeko, ftello
|
|
check_type_size("off_t" SIZEOF_OFF_T)
|
|
if(SIZEOF_OFF_T GREATER 7)
|
|
check_symbol_exists("fseeko" "stdio.h" HAVE_FSEEKO)
|
|
check_symbol_exists("ftello" "stdio.h" HAVE_FTELLO)
|
|
if(HAVE_FSEEKO AND HAVE_FTELLO)
|
|
set(LFS_OFF_T "off_t")
|
|
set(LFS_FOPEN "fopen")
|
|
set(LFS_FSEEK "fseeko")
|
|
set(LFS_FTELL "ftello")
|
|
check_symbol_exists("PRIdMAX" "inttypes.h" HAVE_PRIDMAX)
|
|
if(HAVE_PRIDMAX)
|
|
set(LFS_PRID "PRIdMAX")
|
|
else(HAVE_PRIDMAX)
|
|
check_type_size("long" SIZEOF_LONG)
|
|
check_type_size("int" SIZEOF_INT)
|
|
if(SIZEOF_OFF_T GREATER SIZEOF_LONG)
|
|
set(LFS_PRID "\"lld\"")
|
|
elseif(SIZEOF_LONG GREATER SIZEOF_INT)
|
|
set(LFS_PRID "\"ld\"")
|
|
else(SIZEOF_OFF_T GREATER SIZEOF_LONG)
|
|
set(LFS_PRID "\"d\"")
|
|
endif(SIZEOF_OFF_T GREATER SIZEOF_LONG)
|
|
endif(HAVE_PRIDMAX)
|
|
endif(HAVE_FSEEKO AND HAVE_FTELLO)
|
|
endif(SIZEOF_OFF_T GREATER 7)
|
|
|
|
# LFS type2: 8 <= sizeof(off64_t), fopen64, fseeko64, ftello64
|
|
if(NOT LFS_OFF_T)
|
|
check_type_size("off64_t" SIZEOF_OFF64_T)
|
|
if(SIZEOF_OFF64_T GREATER 7)
|
|
check_symbol_exists("fopen64" "stdio.h" HAVE_FOPEN64)
|
|
check_symbol_exists("fseeko64" "stdio.h" HAVE_FSEEKO64)
|
|
check_symbol_exists("ftello64" "stdio.h" HAVE_FTELLO64)
|
|
if(HAVE_FOPEN64 AND HAVE_FSEEKO64 AND HAVE_FTELLO64)
|
|
set(LFS_OFF_T "off64_t")
|
|
set(LFS_FOPEN "fopen64")
|
|
set(LFS_FSEEK "fseeko64")
|
|
set(LFS_FTELL "ftello64")
|
|
check_symbol_exists("PRIdMAX" "inttypes.h" HAVE_PRIDMAX)
|
|
if(HAVE_PRIDMAX)
|
|
set(LFS_PRID "PRIdMAX")
|
|
else(HAVE_PRIDMAX)
|
|
check_type_size("long" SIZEOF_LONG)
|
|
check_type_size("int" SIZEOF_INT)
|
|
if(SIZEOF_OFF64_T GREATER SIZEOF_LONG)
|
|
set(LFS_PRID "\"lld\"")
|
|
elseif(SIZEOF_LONG GREATER SIZEOF_INT)
|
|
set(LFS_PRID "\"ld\"")
|
|
else(SIZEOF_OFF64_T GREATER SIZEOF_LONG)
|
|
set(LFS_PRID "\"d\"")
|
|
endif(SIZEOF_OFF64_T GREATER SIZEOF_LONG)
|
|
endif(HAVE_PRIDMAX)
|
|
endif(HAVE_FOPEN64 AND HAVE_FSEEKO64 AND HAVE_FTELLO64)
|
|
endif(SIZEOF_OFF64_T GREATER 7)
|
|
endif(NOT LFS_OFF_T)
|
|
|
|
# LFS type3: 8 <= sizeof(__int64), _fseeki64, _ftelli64
|
|
if(NOT LFS_OFF_T)
|
|
check_type_size("__int64" SIZEOF___INT64)
|
|
if(SIZEOF___INT64 GREATER 7)
|
|
check_symbol_exists("_fseeki64" "stdio.h" HAVE__FSEEKI64)
|
|
check_symbol_exists("_ftelli64" "stdio.h" HAVE__FTELLI64)
|
|
if(HAVE__FSEEKI64 AND HAVE__FTELLI64)
|
|
set(LFS_OFF_T "__int64")
|
|
set(LFS_FOPEN "fopen")
|
|
set(LFS_FSEEK "_fseeki64")
|
|
set(LFS_FTELL "_ftelli64")
|
|
set(LFS_PRID "\"I64d\"")
|
|
endif(HAVE__FSEEKI64 AND HAVE__FTELLI64)
|
|
endif(SIZEOF___INT64 GREATER 7)
|
|
endif(NOT LFS_OFF_T)
|
|
|
|
set(CMAKE_REQUIRED_DEFINITIONS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}")
|
|
endif(${_isenable})
|
|
|
|
if(NOT LFS_OFF_T)
|
|
## not found
|
|
set(LFS_OFF_T "long")
|
|
set(LFS_FOPEN "fopen")
|
|
set(LFS_FSEEK "fseek")
|
|
set(LFS_FTELL "ftell")
|
|
set(LFS_PRID "\"ld\"")
|
|
endif(NOT LFS_OFF_T)
|
|
|
|
endmacro(check_lfs)
|