1# - Define macro to check large file support
2#
3#  OPJ_TEST_LARGE_FILES(VARIABLE)
4#
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
7#  _LARGE_FILES
8#  _LARGEFILE_SOURCE
9#  _FILE_OFFSET_BITS 64
10#  OPJ_HAVE_FSEEKO
11#
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!
14#
15#  Adapted from Gromacs project (http://www.gromacs.org/)
16#  by Julien Malik
17#
18
19macro(OPJ_TEST_LARGE_FILES VARIABLE)
20    if(NOT DEFINED ${VARIABLE})
21
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.
25
26        message(STATUS "Checking for 64-bit off_t")
27
28        # First check without any special flags
29        try_compile(FILE64_OK "${PROJECT_BINARY_DIR}"
30                    "${PROJECT_SOURCE_DIR}/cmake/TestFileOffsetBits.c")
31        if(FILE64_OK)
32          message(STATUS "Checking for 64-bit off_t - present")
33       	endif()
34
35        if(NOT FILE64_OK)
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" )
40            if(FILE64_OK)
41                message(STATUS "Checking for 64-bit off_t - present with _FILE_OFFSET_BITS=64")
42                set(_FILE_OFFSET_BITS 64)
43            endif()
44        endif()
45
46        if(NOT FILE64_OK)
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" )
51            if(FILE64_OK)
52                message(STATUS "Checking for 64-bit off_t - present with _LARGE_FILES")
53                set(_LARGE_FILES 1)
54            endif()
55        endif()
56
57        if(NOT FILE64_OK)
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" )
62            if(FILE64_OK)
63                message(STATUS "Checking for 64-bit off_t - present with _LARGEFILE_SOURCE")
64                set(_LARGEFILE_SOURCE 1)
65            endif()
66        endif()
67
68
69        #if(NOT FILE64_OK)
70        #    # now check for Windows stuff
71        #    try_compile(FILE64_OK "${PROJECT_BINARY_DIR}"
72        #                "${PROJECT_SOURCE_DIR}/cmake/TestWindowsFSeek.c")
73        #    if(FILE64_OK)
74        #        message(STATUS "Checking for 64-bit off_t - present with _fseeki64")
75        #        set(HAVE__FSEEKI64 1)
76        #    endif()
77        #endif()
78
79        if(NOT FILE64_OK)
80            message(STATUS "Checking for 64-bit off_t - not present")
81        endif()
82
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")
86
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")
90
91        message(STATUS "Checking for fseeko/ftello")
92
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")
97
98	    if(FSEEKO_COMPILE_OK)
99            message(STATUS "Checking for fseeko/ftello - present")
100        endif()
101
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" )
108
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()
113        endif()
114
115	    if(FSEEKO_COMPILE_OK)
116                set(OPJ_HAVE_FSEEKO ON CACHE INTERNAL "Result of test for fseeko/ftello")
117        else()
118                message(STATUS "Checking for fseeko/ftello - not found")
119                set(OPJ_HAVE_FSEEKO OFF CACHE INTERNAL "Result of test for fseeko/ftello")
120        endif()
121
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()
126                message(STATUS "Large File support - not found")
127                set(${VARIABLE} OFF CACHE INTERNAL "Result of test for large file support")
128        endif()
129
130    endif()
131endmacro()
132
133
134
135