Skip to content
Snippets Groups Projects
Commit f40e2fdd authored by Julien Malik's avatar Julien Malik
Browse files

ENH: add gdal/geotiff conflict tests during configuration

parent 82785ae7
No related branches found
No related tags found
No related merge requests found
# This macro is stolen from the CMake official module CheckCXXSourceRuns.cmake
# and slightly adapted :
# - SOURCE_FILE parameter specifies a file name
# - ARGUMENT parameter specifies a runtime argument
MACRO(CHECK_CXX_SOURCE_RUNS_ARGS SOURCE_FILE ARGUMENT VAR)
IF("${VAR}" MATCHES "^${VAR}$")
SET(MACRO_CHECK_FUNCTION_DEFINITIONS
"-D${VAR} ${CMAKE_REQUIRED_FLAGS}")
IF(CMAKE_REQUIRED_LIBRARIES)
SET(CHECK_CXX_SOURCE_COMPILES_ADD_LIBRARIES
"-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}")
ELSE(CMAKE_REQUIRED_LIBRARIES)
SET(CHECK_CXX_SOURCE_COMPILES_ADD_LIBRARIES)
ENDIF(CMAKE_REQUIRED_LIBRARIES)
IF(CMAKE_REQUIRED_INCLUDES)
SET(CHECK_CXX_SOURCE_COMPILES_ADD_INCLUDES
"-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
ELSE(CMAKE_REQUIRED_INCLUDES)
SET(CHECK_CXX_SOURCE_COMPILES_ADD_INCLUDES)
ENDIF(CMAKE_REQUIRED_INCLUDES)
MESSAGE(STATUS "Performing Test ${VAR}")
TRY_RUN(${VAR}_EXITCODE ${VAR}_COMPILED
${CMAKE_BINARY_DIR}
${SOURCE_FILE}
COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS}
-DCMAKE_SKIP_RPATH:BOOL=${CMAKE_SKIP_RPATH}
"${CHECK_CXX_SOURCE_COMPILES_ADD_LIBRARIES}"
"${CHECK_CXX_SOURCE_COMPILES_ADD_INCLUDES}"
COMPILE_OUTPUT_VARIABLE OUTPUT
ARGS ${ARGUMENT})
# if it did not compile make the return value fail code of 1
IF(NOT ${VAR}_COMPILED)
SET(${VAR}_EXITCODE 1)
ENDIF(NOT ${VAR}_COMPILED)
# if the return value was 0 then it worked
IF("${${VAR}_EXITCODE}" EQUAL 0)
SET(${VAR} 1 CACHE INTERNAL "Test ${VAR}")
MESSAGE(STATUS "Performing Test ${VAR} - Success")
FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
"Performing C++ SOURCE FILE Test ${VAR} succeded with the following output:\n"
"${OUTPUT}\n"
"Return value: ${${VAR}}\n"
"Source file was: ${SOURCE_FILE}\n\n")
ELSE("${${VAR}_EXITCODE}" EQUAL 0)
IF(CMAKE_CROSSCOMPILING AND "${${VAR}_EXITCODE}" MATCHES "FAILED_TO_RUN")
SET(${VAR} "${${VAR}_EXITCODE}")
ELSE(CMAKE_CROSSCOMPILING AND "${${VAR}_EXITCODE}" MATCHES "FAILED_TO_RUN")
SET(${VAR} "" CACHE INTERNAL "Test ${VAR}")
ENDIF(CMAKE_CROSSCOMPILING AND "${${VAR}_EXITCODE}" MATCHES "FAILED_TO_RUN")
MESSAGE(STATUS "Performing Test ${VAR} - Failed")
FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
"Performing C++ SOURCE FILE Test ${VAR} failed with the following output:\n"
"${OUTPUT}\n"
"Return value: ${${VAR}_EXITCODE}\n"
"Source file was: ${SOURCE_FILE}\n\n")
ENDIF("${${VAR}_EXITCODE}" EQUAL 0)
ENDIF("${VAR}" MATCHES "^${VAR}$")
ENDMACRO(CHECK_CXX_SOURCE_RUNS_ARGS)
......@@ -144,6 +144,41 @@ IF(OTB_USE_EXTERNAL_GDAL)
"Cannot find ogr library. Please set OGR_LIBRARY.")
ENDIF (NOT OGR_LIBRARY)
ENDIF(GDAL_HAS_OGR)
# Check for some possible crashes when reading TIFF files, when GDAL embeds geotiff and tiff libraries
# Known to lead to a crash with the official gdal package available in ubuntu & debian
INCLUDE(CheckCXXSourceRunsWithArgs)
# This test is known to fail with the Debian gdal package
SET(CMAKE_REQUIRED_INCLUDES ${GDAL_INCLUDE_DIR})
SET(CMAKE_REQUIRED_LIBRARIES "${GEOTIFF_LIBRARY};${GDAL_LIBRARY}")
CHECK_CXX_SOURCE_RUNS_ARGS(
${CMAKE_CURRENT_SOURCE_DIR}/CMake/TestGDALOpen.cxx
${CMAKE_CURRENT_SOURCE_DIR}/CMake/otb_logo.tif
CHECK_GDALOPEN_SYMBOL
)
IF(NOT CHECK_GDALOPEN_SYMBOL)
MESSAGE(WARNING "CHECK_GDALOPEN_SYMBOL test failed : your platform exhibits a gdal/geotiff conflict. "
"Opening a TIF file may generate a crash. This is most probably because the gdal library you configured "
"embeds its own libgeotiff and is compiled with --with-hide-internal-symbols=yes.\n"
"You might consider building GDAL yourself without using --with-hide-internal-symbols=no" )
ENDIF(NOT CHECK_GDALOPEN_SYMBOL)
# This test is known to fail with the Ubuntu gdal package
SET(CMAKE_REQUIRED_INCLUDES ${GEOTIFF_INCLUDE_DIRS};${TIFF_INCLUDE_DIRS})
SET(CMAKE_REQUIRED_LIBRARIES "${GDAL_LIBRARY};${GEOTIFF_LIBRARY};${TIFF_LIBRARY}")
CHECK_CXX_SOURCE_RUNS_ARGS(
${CMAKE_CURRENT_SOURCE_DIR}/CMake/TestXTIFFOpen.cxx
${CMAKE_CURRENT_SOURCE_DIR}/CMake/otb_logo.tif
CHECK_XTIFFOPEN_SYMBOL
)
IF(NOT CHECK_XTIFFOPEN_SYMBOL)
MESSAGE(WARNING "CHECK_XTIFFOPEN_SYMBOL test failed : your platform exhibits a gdal/geotiff conflict. "
"Opening a TIF file may generate a crash. This is most probably because the gdal library you configured "
"embeds its own libgeotiff and is compiled with --with-hide-internal-symbols=yes.\n"
"You might consider building GDAL yourself without using --with-hide-internal-symbols=no" )
ENDIF(NOT CHECK_XTIFFOPEN_SYMBOL)
ELSE(OTB_USE_EXTERNAL_GDAL)
MESSAGE(FATAL_ERROR "OTB_USE_EXTERNAL_GDAL=OFF is not implemented. Please set OTB_USE_EXTERNAL_GDAL to ON")
......
#include <iostream>
#include <stdexcept>
#include <gdal.h>
int main(int argc, char * argv[])
{
if (argc != 2)
{
std::cerr << "Usage : " << argv[0] << " tiff_filename" << std::endl;
return 1;
}
GDALAllRegister();
GDALOpen(argv[1], GA_ReadOnly );
return 0;
}
#include <iostream>
#include <tiffio.h>
#include <xtiffio.h>
int main(int argc, char* argv[])
{
if (argc != 2)
{
std::cerr << "Usage : " << argv[0] << " tiff_filename" << std::endl;
return 1;
}
TIFF* theTiffPtr = XTIFFOpen( argv[1], "rm");
if (!theTiffPtr)
{
std::cerr << "XTIFFOpen failed" << std::endl;
return 2;
}
unsigned int imagewidth;
if ( !TIFFGetField( theTiffPtr,
TIFFTAG_IMAGEWIDTH ,
&imagewidth ) )
{
std::cerr << "TIFFGetField failed" << std::endl;
return 3;
}
return 0;
}
File added
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment