1 # - Define macro to check large file support
3 # OPJ_TEST_LARGE_FILES(VARIABLE)
5 # VARIABLE will be set to true if off_t is 64 bits, and fseeko/ftello present.
6 # This macro will also defines the necessary variable enable large file support, for instance
12 # However, it is YOUR job to make sure these defines are set in a #cmakedefine so they
13 # end up in a config.h file that is included in your source if necessary!
15 # Adapted from Gromacs project (http://www.gromacs.org/)
19 MACRO(OPJ_TEST_LARGE_FILES VARIABLE)
20 IF("${VARIABLE}" MATCHES "^${VARIABLE}$")
22 # On most platforms it is probably overkill to first test the flags for 64-bit off_t,
23 # and then separately fseeko. However, in the future we might have 128-bit filesystems
24 # (ZFS), so it might be dangerous to indiscriminately set e.g. _FILE_OFFSET_BITS=64.
26 MESSAGE(STATUS "Checking for 64-bit off_t")
28 # First check without any special flags
29 TRY_COMPILE(FILE64_OK "${PROJECT_BINARY_DIR}"
30 "${PROJECT_SOURCE_DIR}/CMake/TestFileOffsetBits.c")
32 MESSAGE(STATUS "Checking for 64-bit off_t - present")
36 # Test with _FILE_OFFSET_BITS=64
37 TRY_COMPILE(FILE64_OK "${PROJECT_BINARY_DIR}"
38 "${PROJECT_SOURCE_DIR}/CMake/TestFileOffsetBits.c"
39 COMPILE_DEFINITIONS "-D_FILE_OFFSET_BITS=64" )
41 MESSAGE(STATUS "Checking for 64-bit off_t - present with _FILE_OFFSET_BITS=64")
42 set(_FILE_OFFSET_BITS 64)
47 # Test with _LARGE_FILES
48 TRY_COMPILE(FILE64_OK "${PROJECT_BINARY_DIR}"
49 "${PROJECT_SOURCE_DIR}/CMake/TestFileOffsetBits.c"
50 COMPILE_DEFINITIONS "-D_LARGE_FILES" )
52 MESSAGE(STATUS "Checking for 64-bit off_t - present with _LARGE_FILES")
58 # Test with _LARGEFILE_SOURCE
59 TRY_COMPILE(FILE64_OK "${PROJECT_BINARY_DIR}"
60 "${PROJECT_SOURCE_DIR}/CMake/TestFileOffsetBits.c"
61 COMPILE_DEFINITIONS "-D_LARGEFILE_SOURCE" )
63 MESSAGE(STATUS "Checking for 64-bit off_t - present with _LARGEFILE_SOURCE")
64 set(_LARGEFILE_SOURCE 1)
70 # # now check for Windows stuff
71 # TRY_COMPILE(FILE64_OK "${PROJECT_BINARY_DIR}"
72 # "${PROJECT_SOURCE_DIR}/CMake/TestWindowsFSeek.c")
74 # MESSAGE(STATUS "Checking for 64-bit off_t - present with _fseeki64")
75 # set(HAVE__FSEEKI64 1)
80 MESSAGE(STATUS "Checking for 64-bit off_t - not present")
83 SET(_FILE_OFFSET_BITS ${_FILE_OFFSET_BITS} CACHE INTERNAL "Result of test for needed _FILE_OFFSET_BITS=64")
84 SET(_LARGE_FILES ${_LARGE_FILES} CACHE INTERNAL "Result of test for needed _LARGE_FILES")
85 SET(_LARGEFILE_SOURCE ${_LARGEFILE_SOURCE} CACHE INTERNAL "Result of test for needed _LARGEFILE_SOURCE")
87 # Set the flags we might have determined to be required above
88 CONFIGURE_FILE("${PROJECT_SOURCE_DIR}/CMake/TestLargeFiles.c.cmake.in"
89 "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/TestLargeFiles.c")
91 MESSAGE(STATUS "Checking for fseeko/ftello")
93 # Test if ftello/fseeko are available
94 TRY_COMPILE(FSEEKO_COMPILE_OK
95 "${PROJECT_BINARY_DIR}"
96 "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/TestLargeFiles.c")
99 MESSAGE(STATUS "Checking for fseeko/ftello - present")
100 ENDIF(FSEEKO_COMPILE_OK)
102 IF(NOT FSEEKO_COMPILE_OK)
103 # glibc 2.2 needs _LARGEFILE_SOURCE for fseeko (but not for 64-bit off_t...)
104 TRY_COMPILE(FSEEKO_COMPILE_OK
105 "${PROJECT_BINARY_DIR}"
106 "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/TestLargeFiles.c"
107 COMPILE_DEFINITIONS "-D_LARGEFILE_SOURCE" )
109 IF(FSEEKO_COMPILE_OK)
110 MESSAGE(STATUS "Checking for fseeko/ftello - present with _LARGEFILE_SOURCE")
111 SET(_LARGEFILE_SOURCE ${_LARGEFILE_SOURCE} CACHE INTERNAL "Result of test for needed _LARGEFILE_SOURCE")
112 ENDIF(FSEEKO_COMPILE_OK)
113 ENDIF(NOT FSEEKO_COMPILE_OK)
115 if(FSEEKO_COMPILE_OK)
116 SET(HAVE_FSEEKO ON CACHE INTERNAL "Result of test for fseeko/ftello")
117 else(FSEEKO_COMPILE_OK)
118 MESSAGE(STATUS "Checking for fseeko/ftello - not found")
119 SET(HAVE_FSEEKO OFF CACHE INTERNAL "Result of test for fseeko/ftello")
120 endif(FSEEKO_COMPILE_OK)
122 if(FILE64_OK AND FSEEKO_COMPILE_OK)
123 MESSAGE(STATUS "Large File support - found")
124 SET(${VARIABLE} ON CACHE INTERNAL "Result of test for large file support")
125 else(FILE64_OK AND FSEEKO_COMPILE_OK)
126 MESSAGE(STATUS "Large File support - not found")
127 SET(${VARIABLE} OFF CACHE INTERNAL "Result of test for large file support")
128 endif(FILE64_OK AND FSEEKO_COMPILE_OK)
130 ENDIF("${VARIABLE}" MATCHES "^${VARIABLE}$")
131 ENDMACRO(OPJ_TEST_LARGE_FILES VARIABLE)