1include (CheckIncludeFile)
2include (CheckTypeSize)
3include (CMakePushCheckState)
4
5macro (TEST_LARGE_FILES VARIABLE)
6
7if (NOT DEFINED ${VARIABLE})
8
9	cmake_push_check_state()
10
11	message (STATUS "")
12	message (STATUS "")
13	message (STATUS "Checking large files support...")
14
15	if (WIN32)
16		set (${VARIABLE} 1 CACHE INTERNAL "Result of tests for large file support" FORCE)
17		message (STATUS "")
18		message (STATUS "Result of checking large files support: supported with WinAPI")
19	else ()
20
21		message (STATUS "")
22		check_include_file(sys/types.h HAVE_SYS_TYPES_H)
23		check_include_file(stdint.h HAVE_STDINT_H)
24		check_include_file(stddef.h HAVE_STDDEF_H)
25		message (STATUS "")
26
27		message (STATUS "Checking size of off_t without any definitions:")
28		check_type_size (off_t SIZEOF_OFF_T)
29		message (STATUS "Checking of off_t without any definitions: ${SIZEOF_OFF_T}")
30		if (SIZEOF_OFF_T EQUAL 8)
31			set (LARGE_FILES_DEFINITIONS "" CACHE INTERNAL "64-bit off_t required definitions")
32			set (FILE64 TRUE)
33		else ()
34			unset (HAVE_SIZEOF_OFF_T CACHE)
35			unset (SIZEOF_OFF_T CACHE)
36			unset (SIZEOF_OFF_T_CODE CACHE)
37			cmake_pop_check_state()
38			set (FILE64 FALSE)
39		endif ()
40
41		if (NOT FILE64)
42			set (CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} /D_FILE_OFFSET_BITS=64)
43			message (STATUS "")
44			message (STATUS "Checking size of off_t with _FILE_OFFSET_BITS=64:")
45			check_type_size (off_t SIZEOF_OFF_T)
46			message (STATUS "Checking size of off_t with _FILE_OFFSET_BITS=64: ${SIZEOF_OFF_T}")
47			if (SIZEOF_OFF_T EQUAL 8)
48				set (_FILE_OFFSET_BITS 64 CACHE INTERNAL "")
49				set (_FILE_OFFSET_BITS_CODE "#define _FILE_OFFSET_BITS 64" CACHE INTERNAL "")
50				set (LARGE_FILES_DEFINITIONS ${LARGE_FILES_DEFINITIONS} "/D_FILE_OFFSET_BITS=64" CACHE INTERNAL "64-bit off_t required definitions")
51				set (FILE64 TRUE)
52			else ()
53				set (_FILE_OFFSET_BITS_CODE "" CACHE INTERNAL "")
54				unset (HAVE_SIZEOF_OFF_T CACHE)
55				unset (SIZEOF_OFF_T CACHE)
56				unset (SIZEOF_OFF_T_CODE CACHE)
57				cmake_pop_check_state()
58				set (FILE64 FALSE)
59			endif ()
60		endif ()
61
62		if (NOT FILE64)
63			set (CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} /D_LARGE_FILES)
64			message (STATUS "")
65			message (STATUS "Checking size of off_t with _LARGE_FILES:")
66			check_type_size (off_t SIZEOF_OFF_T)
67			message (STATUS "Checking size of off_t with _LARGE_FILES: ${SIZEOF_OFF_T}")
68			if (SIZEOF_OFF_T EQUAL 8)
69				set (_LARGE_FILES 1 CACHE INTERNAL "")
70				set (LARGE_FILES_DEFINITIONS ${LARGE_FILES_DEFINITIONS} "/D_LARGE_FILES" CACHE INTERNAL "64-bit off_t required definitions")
71				set (FILE64 TRUE)
72			else ()
73				unset (HAVE_SIZEOF_OFF_T CACHE)
74				unset (SIZEOF_OFF_T CACHE)
75				unset (SIZEOF_OFF_T_CODE CACHE)
76				cmake_pop_check_state()
77				set (FILE64 FALSE)
78			endif ()
79		endif ()
80
81		if (NOT FILE64)
82			set (CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} /D_LARGEFILE_SOURCE)
83			unset (HAVE_SIZEOF_OFF_T CACHE)
84			unset (SIZEOF_OFF_T CACHE)
85			unset (SIZEOF_OFF_T_CODE CACHE)
86			message (STATUS "")
87			message (STATUS "Checking size of off_t with _LARGEFILE_SOURCE:")
88			check_type_size (off_t SIZEOF_OFF_T)
89			message (STATUS "Checking size of off_t with _LARGEFILE_SOURCE: ${SIZEOF_OFF_T}")
90			if (SIZEOF_OFF_T EQUAL 8)
91				set (_LARGEFILE_SOURCE 1 CACHE INTERNAL "")
92				set (LARGE_FILES_DEFINITIONS ${LARGE_FILES_DEFINITIONS} "/D_LARGEFILE_SOURCE"  CACHE INTERNAL "64-bit off_t required definitions")
93				set (FILE64 TRUE)
94			else ()
95				cmake_pop_check_state()
96				set (FILE64 FALSE)
97			endif ()
98		endif ()
99
100		message (STATUS "")
101		if (FILE64)
102			set (${VARIABLE} 1 CACHE INTERNAL "Result of tests for large file support" FORCE)
103			if (NOT SIZEOF_OFF_T_REQURED_DEFINITIONS)
104				message (STATUS "Result of checking large files support: supported")
105			else ()
106				message (STATUS "Result of checking large files support: supported with ${LARGE_FILES_DEFINITIONS}")
107				message (STATUS "Add LARGE_FILES_DEFINITIONS to your compiler definitions or configure with _FILE_OFFSET_BITS,")
108				message (STATUS "_FILE_OFFSET_BITS_CODE, _LARGE_FILES and _LARGEFILE_SOURCE variables.")
109			endif ()
110		else ()
111			message ("Result of checking large files support: not supported")
112			set (${VARIABLE} 0 CACHE INTERNAL "Result of test for large file support" FORCE)
113		endif ()
114		message ("")
115		message ("")
116
117	endif ()
118
119endif (NOT DEFINED ${VARIABLE})
120
121endmacro (TEST_LARGE_FILES VARIABLE)
122