From c39bea201736116058f337211a64e7bffcc41f00 Mon Sep 17 00:00:00 2001 From: Julien Malik Date: Wed, 30 Nov 2011 19:43:48 +0000 Subject: [PATCH] [trunk] make large file support variables persistent in CMake to allow reconfiguration --- CMake/TestLargeFiles.c.cmake.in | 1 - CMake/TestLargeFiles.cmake | 106 ++++++++++++++++++-------------- opj_config.h.cmake.in | 2 - 3 files changed, 60 insertions(+), 49 deletions(-) diff --git a/CMake/TestLargeFiles.c.cmake.in b/CMake/TestLargeFiles.c.cmake.in index a6bc4996..18f754ca 100644 --- a/CMake/TestLargeFiles.c.cmake.in +++ b/CMake/TestLargeFiles.c.cmake.in @@ -1,5 +1,4 @@ #cmakedefine _LARGEFILE_SOURCE -#cmakedefine _LARGEFILE64_SOURCE #cmakedefine _LARGE_FILES #cmakedefine _FILE_OFFSET_BITS @_FILE_OFFSET_BITS@ diff --git a/CMake/TestLargeFiles.cmake b/CMake/TestLargeFiles.cmake index 96159d69..d6fd9a64 100644 --- a/CMake/TestLargeFiles.cmake +++ b/CMake/TestLargeFiles.cmake @@ -3,17 +3,21 @@ # 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 set defines necessary enable large file support, for instance +# 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 +# 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(NOT DEFINED ${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 @@ -22,13 +26,13 @@ MACRO(OPJ_TEST_LARGE_FILES VARIABLE) MESSAGE(STATUS "Checking for 64-bit off_t") # First check without any special flags - TRY_COMPILE(FILE64_OK "${PROJECT_BINARY_DIR}" + 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(FILE64_OK) + MESSAGE(STATUS "Checking for 64-bit off_t - present") + endif(FILE64_OK) - if(NOT FILE64_OK) + if(NOT FILE64_OK) # Test with _FILE_OFFSET_BITS=64 TRY_COMPILE(FILE64_OK "${PROJECT_BINARY_DIR}" "${PROJECT_SOURCE_DIR}/CMake/TestFileOffsetBits.c" @@ -37,7 +41,7 @@ MACRO(OPJ_TEST_LARGE_FILES VARIABLE) MESSAGE(STATUS "Checking for 64-bit off_t - present with _FILE_OFFSET_BITS=64") set(_FILE_OFFSET_BITS 64) endif(FILE64_OK) - endif(NOT FILE64_OK) + endif(NOT FILE64_OK) if(NOT FILE64_OK) # Test with _LARGE_FILES @@ -57,63 +61,73 @@ MACRO(OPJ_TEST_LARGE_FILES VARIABLE) COMPILE_DEFINITIONS "-D_LARGEFILE_SOURCE" ) if(FILE64_OK) MESSAGE(STATUS "Checking for 64-bit off_t - present with _LARGEFILE_SOURCE") - set(_LARGEFILE_SOURCE 1) + set(_LARGEFILE_SOURCE 1) endif(FILE64_OK) endif(NOT FILE64_OK) - 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(FILE64_OK) - endif(NOT FILE64_OK) + + #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(FILE64_OK) + #endif(NOT FILE64_OK) if(NOT FILE64_OK) MESSAGE(STATUS "Checking for 64-bit off_t - not present") - else(NOT FILE64_OK) + endif(NOT FILE64_OK) + + 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") + # 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") + 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(FSEEKO_COMPILE_OK) + 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(FSEEKO_COMPILE_OK) - if(NOT FSEEKO_COMPILE_OK) - # glibc 2.2 neds _LARGEFILE_SOURCE for fseeko (but not 64-bit off_t...) - TRY_COMPILE(FSEEKO_COMPILE_OK "${PROJECT_BINARY_DIR}" + 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) + + IF(FSEEKO_COMPILE_OK) MESSAGE(STATUS "Checking for fseeko/ftello - present with _LARGEFILE_SOURCE") - set(_LARGEFILE_SOURCE 1) - endif(FSEEKO_COMPILE_OK) - endif(NOT FSEEKO_COMPILE_OK) - - endif(NOT FILE64_OK) + SET(_LARGEFILE_SOURCE ${_LARGEFILE_SOURCE} CACHE INTERNAL "Result of test for needed _LARGEFILE_SOURCE") + ENDIF(FSEEKO_COMPILE_OK) + ENDIF(NOT FSEEKO_COMPILE_OK) if(FSEEKO_COMPILE_OK) - SET(${VARIABLE} 1 CACHE INTERNAL "Result of test for large file support" FORCE) - set(HAVE_FSEEKO 1) + SET(HAVE_FSEEKO ON CACHE INTERNAL "Result of test for fseeko/ftello") else(FSEEKO_COMPILE_OK) - if (HAVE__FSEEKI64) - SET(${VARIABLE} 1 CACHE INTERNAL "Result of test for large file support" FORCE) - SET(HAVE__FSEEKI64 1 CACHE INTERNAL "Windows 64-bit fseek" FORCE) - else (HAVE__FSEEKI64) MESSAGE(STATUS "Checking for fseeko/ftello - not found") - SET(${VARIABLE} 0 CACHE INTERNAL "Result of test for large file support" FORCE) - endif (HAVE__FSEEKI64) + SET(HAVE_FSEEKO OFF CACHE INTERNAL "Result of test for fseeko/ftello") endif(FSEEKO_COMPILE_OK) - ENDIF(NOT DEFINED ${VARIABLE}) + 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(FILE64_OK AND FSEEKO_COMPILE_OK) + MESSAGE(STATUS "Large File support - not found") + SET(${VARIABLE} OFF CACHE INTERNAL "Result of test for large file support") + endif(FILE64_OK AND FSEEKO_COMPILE_OK) + + ENDIF("${VARIABLE}" MATCHES "^${VARIABLE}$") ENDMACRO(OPJ_TEST_LARGE_FILES VARIABLE) diff --git a/opj_config.h.cmake.in b/opj_config.h.cmake.in index 7bfe9141..9cb485f1 100644 --- a/opj_config.h.cmake.in +++ b/opj_config.h.cmake.in @@ -16,11 +16,9 @@ #cmakedefine HAVE_TIFF_H #cmakedefine _LARGEFILE_SOURCE -#cmakedefine _LARGEFILE64_SOURCE #cmakedefine _LARGE_FILES #cmakedefine _FILE_OFFSET_BITS @_FILE_OFFSET_BITS@ #cmakedefine HAVE_FSEEKO -#cmakedefine HAVE__FSEEKI64 #cmakedefine HAVE_LIBLCMS1