1## Checks for large file support ##
2include(CheckIncludeFile)
3include(CheckSymbolExists)
4include(CheckTypeSize)
5
6macro(check_lfs _isenable)
7  set(LFS_OFF_T "")
8  set(LFS_FOPEN "")
9  set(LFS_FSEEK "")
10  set(LFS_FTELL "")
11  set(LFS_PRID "")
12
13  if(${_isenable})
14    set(SAFE_CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS}")
15    set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
16        -D_LARGEFILE_SOURCE -D_LARGE_FILES -D_FILE_OFFSET_BITS=64
17        -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS)
18
19    check_include_file("sys/types.h" HAVE_SYS_TYPES_H)
20    check_include_file("inttypes.h" HAVE_INTTYPES_H)
21    check_include_file("stddef.h" HAVE_STDDEF_H)
22    check_include_file("stdint.h" HAVE_STDINT_H)
23
24    # LFS type1: 8 <= sizeof(off_t), fseeko, ftello
25    check_type_size("off_t" SIZEOF_OFF_T)
26    if(SIZEOF_OFF_T GREATER 7)
27      check_symbol_exists("fseeko" "stdio.h" HAVE_FSEEKO)
28      check_symbol_exists("ftello" "stdio.h" HAVE_FTELLO)
29      if(HAVE_FSEEKO AND HAVE_FTELLO)
30        set(LFS_OFF_T "off_t")
31        set(LFS_FOPEN "fopen")
32        set(LFS_FSEEK "fseeko")
33        set(LFS_FTELL "ftello")
34        check_symbol_exists("PRIdMAX" "inttypes.h" HAVE_PRIDMAX)
35        if(HAVE_PRIDMAX)
36          set(LFS_PRID "PRIdMAX")
37        else(HAVE_PRIDMAX)
38          check_type_size("long" SIZEOF_LONG)
39          check_type_size("int" SIZEOF_INT)
40          if(SIZEOF_OFF_T GREATER SIZEOF_LONG)
41            set(LFS_PRID "\"lld\"")
42          elseif(SIZEOF_LONG GREATER SIZEOF_INT)
43            set(LFS_PRID "\"ld\"")
44          else(SIZEOF_OFF_T GREATER SIZEOF_LONG)
45            set(LFS_PRID "\"d\"")
46          endif(SIZEOF_OFF_T GREATER SIZEOF_LONG)
47        endif(HAVE_PRIDMAX)
48      endif(HAVE_FSEEKO AND HAVE_FTELLO)
49    endif(SIZEOF_OFF_T GREATER 7)
50
51    # LFS type2: 8 <= sizeof(off64_t), fopen64, fseeko64, ftello64
52    if(NOT LFS_OFF_T)
53      check_type_size("off64_t" SIZEOF_OFF64_T)
54      if(SIZEOF_OFF64_T GREATER 7)
55        check_symbol_exists("fopen64" "stdio.h" HAVE_FOPEN64)
56        check_symbol_exists("fseeko64" "stdio.h" HAVE_FSEEKO64)
57        check_symbol_exists("ftello64" "stdio.h" HAVE_FTELLO64)
58        if(HAVE_FOPEN64 AND HAVE_FSEEKO64 AND HAVE_FTELLO64)
59          set(LFS_OFF_T "off64_t")
60          set(LFS_FOPEN "fopen64")
61          set(LFS_FSEEK "fseeko64")
62          set(LFS_FTELL "ftello64")
63          check_symbol_exists("PRIdMAX" "inttypes.h" HAVE_PRIDMAX)
64          if(HAVE_PRIDMAX)
65            set(LFS_PRID "PRIdMAX")
66          else(HAVE_PRIDMAX)
67            check_type_size("long" SIZEOF_LONG)
68            check_type_size("int" SIZEOF_INT)
69            if(SIZEOF_OFF64_T GREATER SIZEOF_LONG)
70              set(LFS_PRID "\"lld\"")
71            elseif(SIZEOF_LONG GREATER SIZEOF_INT)
72              set(LFS_PRID "\"ld\"")
73            else(SIZEOF_OFF64_T GREATER SIZEOF_LONG)
74              set(LFS_PRID "\"d\"")
75            endif(SIZEOF_OFF64_T GREATER SIZEOF_LONG)
76          endif(HAVE_PRIDMAX)
77        endif(HAVE_FOPEN64 AND HAVE_FSEEKO64 AND HAVE_FTELLO64)
78      endif(SIZEOF_OFF64_T GREATER 7)
79    endif(NOT LFS_OFF_T)
80
81    # LFS type3: 8 <= sizeof(__int64), _fseeki64, _ftelli64
82    if(NOT LFS_OFF_T)
83      check_type_size("__int64" SIZEOF___INT64)
84      if(SIZEOF___INT64 GREATER 7)
85        check_symbol_exists("_fseeki64" "stdio.h" HAVE__FSEEKI64)
86        check_symbol_exists("_ftelli64" "stdio.h" HAVE__FTELLI64)
87        if(HAVE__FSEEKI64 AND HAVE__FTELLI64)
88          set(LFS_OFF_T "__int64")
89          set(LFS_FOPEN "fopen")
90          set(LFS_FSEEK "_fseeki64")
91          set(LFS_FTELL "_ftelli64")
92          set(LFS_PRID  "\"I64d\"")
93        endif(HAVE__FSEEKI64 AND HAVE__FTELLI64)
94      endif(SIZEOF___INT64 GREATER 7)
95    endif(NOT LFS_OFF_T)
96
97    set(CMAKE_REQUIRED_DEFINITIONS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}")
98  endif(${_isenable})
99
100  if(NOT LFS_OFF_T)
101    ## not found
102    set(LFS_OFF_T "long")
103    set(LFS_FOPEN "fopen")
104    set(LFS_FSEEK "fseek")
105    set(LFS_FTELL "ftell")
106    set(LFS_PRID  "\"ld\"")
107  endif(NOT LFS_OFF_T)
108
109endmacro(check_lfs)
110