diff options
| author | Mathieu Malaterre <mathieu.malaterre@gmail.com> | 2012-09-28 08:11:41 +0000 |
|---|---|---|
| committer | Mathieu Malaterre <mathieu.malaterre@gmail.com> | 2012-09-28 08:11:41 +0000 |
| commit | d518970039a19a2a9b6d2bdd592cc88a43897bbb (patch) | |
| tree | 57bac2cf7e63e9352228231062763baac627563c /cmake/TestLargeFiles.cmake | |
| parent | 8363a6ab1e031bb4b2e40a92e56efd40fdab1aa1 (diff) | |
[trunk] Start FolderReorgProposal task
Update issue 177
Diffstat (limited to 'cmake/TestLargeFiles.cmake')
| -rw-r--r-- | cmake/TestLargeFiles.cmake | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/cmake/TestLargeFiles.cmake b/cmake/TestLargeFiles.cmake new file mode 100644 index 00000000..ffef84f5 --- /dev/null +++ b/cmake/TestLargeFiles.cmake @@ -0,0 +1,134 @@ +# - Define macro to check large file support +# +# OPJ_TEST_LARGE_FILES(VARIABLE) +# +# VARIABLE will be set to true if off_t is 64 bits, and fseeko/ftello present. +# This macro will also defines the necessary variable enable large file support, for instance +# _LARGE_FILES +# _LARGEFILE_SOURCE +# _FILE_OFFSET_BITS 64 +# HAVE_FSEEKO +# +# However, it is YOUR job to make sure these defines are set in a #cmakedefine so they +# end up in a config.h file that is included in your source if necessary! +# +# Adapted from Gromacs project (http://www.gromacs.org/) +# by Julien Malik +# + +macro(OPJ_TEST_LARGE_FILES VARIABLE) + if("${VARIABLE}" MATCHES "^${VARIABLE}$") + + # On most platforms it is probably overkill to first test the flags for 64-bit off_t, + # and then separately fseeko. However, in the future we might have 128-bit filesystems + # (ZFS), so it might be dangerous to indiscriminately set e.g. _FILE_OFFSET_BITS=64. + + message(STATUS "Checking for 64-bit off_t") + + # First check without any special flags + try_compile(FILE64_OK "${PROJECT_BINARY_DIR}" + "${PROJECT_SOURCE_DIR}/cmake/TestFileOffsetBits.c") + if(FILE64_OK) + message(STATUS "Checking for 64-bit off_t - present") + endif() + + if(NOT FILE64_OK) + # Test with _FILE_OFFSET_BITS=64 + try_compile(FILE64_OK "${PROJECT_BINARY_DIR}" + "${PROJECT_SOURCE_DIR}/cmake/TestFileOffsetBits.c" + COMPILE_DEFINITIONS "-D_FILE_OFFSET_BITS=64" ) + if(FILE64_OK) + message(STATUS "Checking for 64-bit off_t - present with _FILE_OFFSET_BITS=64") + set(_FILE_OFFSET_BITS 64) + endif() + endif() + + if(NOT FILE64_OK) + # Test with _LARGE_FILES + try_compile(FILE64_OK "${PROJECT_BINARY_DIR}" + "${PROJECT_SOURCE_DIR}/cmake/TestFileOffsetBits.c" + COMPILE_DEFINITIONS "-D_LARGE_FILES" ) + if(FILE64_OK) + message(STATUS "Checking for 64-bit off_t - present with _LARGE_FILES") + set(_LARGE_FILES 1) + endif() + endif() + + if(NOT FILE64_OK) + # Test with _LARGEFILE_SOURCE + try_compile(FILE64_OK "${PROJECT_BINARY_DIR}" + "${PROJECT_SOURCE_DIR}/cmake/TestFileOffsetBits.c" + COMPILE_DEFINITIONS "-D_LARGEFILE_SOURCE" ) + if(FILE64_OK) + message(STATUS "Checking for 64-bit off_t - present with _LARGEFILE_SOURCE") + set(_LARGEFILE_SOURCE 1) + endif() + endif() + + + #if(NOT FILE64_OK) + # # now check for Windows stuff + # try_compile(FILE64_OK "${PROJECT_BINARY_DIR}" + # "${PROJECT_SOURCE_DIR}/cmake/TestWindowsFSeek.c") + # if(FILE64_OK) + # message(STATUS "Checking for 64-bit off_t - present with _fseeki64") + # set(HAVE__FSEEKI64 1) + # endif() + #endif() + + if(NOT FILE64_OK) + message(STATUS "Checking for 64-bit off_t - not present") + endif() + + set(_FILE_OFFSET_BITS ${_FILE_OFFSET_BITS} CACHE INTERNAL "Result of test for needed _FILE_OFFSET_BITS=64") + set(_LARGE_FILES ${_LARGE_FILES} CACHE INTERNAL "Result of test for needed _LARGE_FILES") + set(_LARGEFILE_SOURCE ${_LARGEFILE_SOURCE} CACHE INTERNAL "Result of test for needed _LARGEFILE_SOURCE") + + # Set the flags we might have determined to be required above + configure_file("${PROJECT_SOURCE_DIR}/cmake/TestLargeFiles.c.cmake.in" + "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/TestLargeFiles.c") + + message(STATUS "Checking for fseeko/ftello") + + # Test if ftello/fseeko are available + try_compile(FSEEKO_COMPILE_OK + "${PROJECT_BINARY_DIR}" + "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/TestLargeFiles.c") + + if(FSEEKO_COMPILE_OK) + message(STATUS "Checking for fseeko/ftello - present") + endif() + + if(NOT FSEEKO_COMPILE_OK) + # glibc 2.2 needs _LARGEFILE_SOURCE for fseeko (but not for 64-bit off_t...) + try_compile(FSEEKO_COMPILE_OK + "${PROJECT_BINARY_DIR}" + "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/TestLargeFiles.c" + COMPILE_DEFINITIONS "-D_LARGEFILE_SOURCE" ) + + if(FSEEKO_COMPILE_OK) + message(STATUS "Checking for fseeko/ftello - present with _LARGEFILE_SOURCE") + set(_LARGEFILE_SOURCE ${_LARGEFILE_SOURCE} CACHE INTERNAL "Result of test for needed _LARGEFILE_SOURCE") + endif() + endif() + + if(FSEEKO_COMPILE_OK) + set(HAVE_FSEEKO ON CACHE INTERNAL "Result of test for fseeko/ftello") + else() + message(STATUS "Checking for fseeko/ftello - not found") + set(HAVE_FSEEKO OFF CACHE INTERNAL "Result of test for fseeko/ftello") + endif() + + if(FILE64_OK AND FSEEKO_COMPILE_OK) + message(STATUS "Large File support - found") + set(${VARIABLE} ON CACHE INTERNAL "Result of test for large file support") + else() + message(STATUS "Large File support - not found") + set(${VARIABLE} OFF CACHE INTERNAL "Result of test for large file support") + endif() + + endif() +endmacro() + + + |
