From 2c5d9613c0d34e553c8002fa3445d94089bfffb7 Mon Sep 17 00:00:00 2001
From: Christophe Palmann <christophe.palmann@c-s.fr>
Date: Fri, 3 Apr 2015 14:14:08 +0200
Subject: [PATCH] ENH gdal-config (formats)

---
 Modules/ThirdParty/GDAL/gdalFormatsTest.cxx   |  59 ++++++++
 Modules/ThirdParty/GDAL/gdalTest.sh.in        |   3 -
 Modules/ThirdParty/GDAL/gdalTest4.cxx         |  36 -----
 Modules/ThirdParty/GDAL/otb-module-init.cmake | 131 ++++++++++++------
 4 files changed, 148 insertions(+), 81 deletions(-)
 create mode 100644 Modules/ThirdParty/GDAL/gdalFormatsTest.cxx
 delete mode 100644 Modules/ThirdParty/GDAL/gdalTest4.cxx

diff --git a/Modules/ThirdParty/GDAL/gdalFormatsTest.cxx b/Modules/ThirdParty/GDAL/gdalFormatsTest.cxx
new file mode 100644
index 0000000000..97d4509b47
--- /dev/null
+++ b/Modules/ThirdParty/GDAL/gdalFormatsTest.cxx
@@ -0,0 +1,59 @@
+#include <iostream>
+#include <fstream>
+#include <stdexcept>
+#include <gdal.h>
+#include <gdal_priv.h>
+
+//http://www.gdal.org/formats_list.html
+
+using namespace std;
+
+int main(int argc, char * argv[])
+{
+cout << " argc = " << argc << endl;
+	string driverName(argv[1]);
+
+	GDALAllRegister();
+	
+	GDALDriverH drv = NULL;
+	unsigned int count = GDALGetDriverCount();
+	
+	// Remember gdal formats
+	if (argc == 3) // ie. ./exe driverName fileName
+	{
+		const char * inputFilename  = argv[2]; 
+		ofstream file(inputFilename, ios::out | ios::trunc); 
+		if(file)  
+		  {
+			file << "###############################" << std::endl;
+			file << "# ID / Short name / Long name #" << std::endl;
+			file << "###############################" << std::endl;
+			file << std::endl;
+			file << "# Nb of drivers : " << count << std::endl;
+			file << std::endl;
+			
+			for (unsigned int i = 0; i < count; i++) 
+			{
+				drv = GDALGetDriver(i);
+				file << "i = " << i << " / " << GDALGetDriverShortName(drv) << " / " << GDALGetDriverLongName(drv) << std::endl;
+			}
+
+			file.close();
+		  }
+	}
+	
+	//std::cout << GDALGetDriverShortName(GDALGetDriverByName("GTiff")) << std::endl;
+	
+	//Driver check
+	for (unsigned int i = 0; i < count; i++) 
+	{
+		drv = GDALGetDriver(i);
+		if (string(GDALGetDriverShortName(drv)).compare(driverName) == 0 )
+			return 1; // SUCCESS
+	}
+      
+
+        
+    return 0; // FAIL
+
+}
diff --git a/Modules/ThirdParty/GDAL/gdalTest.sh.in b/Modules/ThirdParty/GDAL/gdalTest.sh.in
index 42731f5141..4ffe44262f 100644
--- a/Modules/ThirdParty/GDAL/gdalTest.sh.in
+++ b/Modules/ThirdParty/GDAL/gdalTest.sh.in
@@ -20,6 +20,3 @@ fi
 
 #TEST 3 : Big tiff
 ${gdalTranslate} -co "BIGTIFF=YES" ${tempFolder}/testImage.gtif ${tempFolder}/testImageBIG.tif > ${tempFolder}/testgdal3.txt
-
-#TEST 4 : GDAL formats
-${gdalConfig} --formats > ${tempFolder}/testgdal4.txt
diff --git a/Modules/ThirdParty/GDAL/gdalTest4.cxx b/Modules/ThirdParty/GDAL/gdalTest4.cxx
deleted file mode 100644
index 81956edca1..0000000000
--- a/Modules/ThirdParty/GDAL/gdalTest4.cxx
+++ /dev/null
@@ -1,36 +0,0 @@
-#include <fstream>
-#include <iostream>
-#include <sstream>
-#include <cstdlib>
-
-using namespace std;
-
-//----------------- FORMAT -------------------------
-int main(int argc, char * argv[])
-{
-
-  const char * inputFilename  = argv[1];
-  string format(argv[2]);
-  
-  ifstream file(inputFilename, ios::in); 
-  if(file)  
-  {
-	string line; 
-	
-	while(getline(file, line))
-		if (line.find(format) !=  string::npos)
-			return 1; //SUCCESS
-			
-	file.close();
-  
-   }
-   /*else
-   {
-	    cout << "WARNING  : Can't open file " << inputFilename << endl;
-		return 2;
-   }*/
-
-   
-  return 0; //FAIL
-
-}
diff --git a/Modules/ThirdParty/GDAL/otb-module-init.cmake b/Modules/ThirdParty/GDAL/otb-module-init.cmake
index e53c8ae522..a4ddafdb41 100644
--- a/Modules/ThirdParty/GDAL/otb-module-init.cmake
+++ b/Modules/ThirdParty/GDAL/otb-module-init.cmake
@@ -14,6 +14,8 @@ message(STATUS "Check if Gdal qualifies for Orfeo ToolBox")
 set(MIN_MAJOR_VERSION 1)
 set(MIN_MINOR_VERSION 10)
 
+set(GDAL_QUALIFIES TRUE)
+
 #------------------- TESTS ---------------------
 # Version of GDAL  
 try_run(RUN_RESULT_VERSION COMPILE_RESULT_VERSION ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/gdalVersionTest.cxx CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:PATH=${GDAL_INCLUDE_DIR}" "-DLINK_LIBRARIES:STRING=${GDAL_LIBRARY}" ARGS ${TEMP}/gdalVersion.txt ${MIN_MAJOR_VERSION} ${MIN_MINOR_VERSION})
@@ -21,14 +23,44 @@ try_run(RUN_RESULT_VERSION COMPILE_RESULT_VERSION ${CMAKE_CURRENT_BINARY_DIR} ${
 # Has OGR
 try_compile(GDAL_HAS_OGR ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/gdalOGRTest.cxx CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:PATH=${GDAL_INCLUDE_DIR}" "-DLINK_LIBRARIES:STRING=${GDAL_LIBRARY}")
 
+
+# Has formats JPEG2000 & JPEG & GTIF
+# Note : exact format names can be found here http://www.gdal.org/formats_list.html
+try_run(GDAL_HAS_J2K_OPJG COMPILE_RESULT_FORMATS ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/gdalFormatsTest.cxx CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:PATH=${GDAL_INCLUDE_DIR}" "-DLINK_LIBRARIES:STRING=${GDAL_LIBRARY}" ARGS JP2OpenJPEG ${TEMP}/gdalFormats.txt ) 
+try_run(GDAL_HAS_J2K_KAK COMPILE_RESULT_FORMATS ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/gdalFormatsTest.cxx CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:PATH=${GDAL_INCLUDE_DIR}" "-DLINK_LIBRARIES:STRING=${GDAL_LIBRARY}" ARGS JP2KAK ) # No need to output ${TEMP}/gdalFormats.txt everytime
+try_run(GDAL_HAS_J2K_ECW COMPILE_RESULT_FORMATS ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/gdalFormatsTest.cxx CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:PATH=${GDAL_INCLUDE_DIR}" "-DLINK_LIBRARIES:STRING=${GDAL_LIBRARY}" ARGS JP2ECW ) 
+try_run(GDAL_HAS_J2K_JG2000 COMPILE_RESULT_FORMATS ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/gdalFormatsTest.cxx CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:PATH=${GDAL_INCLUDE_DIR}" "-DLINK_LIBRARIES:STRING=${GDAL_LIBRARY}" ARGS JPEG2000 ) 
+try_run(GDAL_HAS_JPEG COMPILE_RESULT_FORMATS ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/gdalFormatsTest.cxx CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:PATH=${GDAL_INCLUDE_DIR}" "-DLINK_LIBRARIES:STRING=${GDAL_LIBRARY}" ARGS JPEG ) 
+try_run(GDAL_HAS_GTIF COMPILE_RESULT_FORMATS ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/gdalFormatsTest.cxx CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:PATH=${GDAL_INCLUDE_DIR}" "-DLINK_LIBRARIES:STRING=${GDAL_LIBRARY}" ARGS GTiff ) 
+
+
 # Can create geotiff file
 try_run(GDAL_CAN_CREATE_GEOTIFF COMPILE_RESULT_CREATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/gdalCreateTest.cxx CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:PATH=${GDAL_INCLUDE_DIR}" "-DLINK_LIBRARIES:STRING=${GDAL_LIBRARY}" ARGS GTiff ${TEMP}/testImage.gtif )
-if(GDAL_CAN_CREATE_GEOTIFF)
 
-	# Can create jpeg file
-	try_run(GDAL_CAN_CREATE_JPEG COMPILE_RESULT_CREATECOPY ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/gdalCreateCopyTest.cxx CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:PATH=${GDAL_INCLUDE_DIR}" "-DLINK_LIBRARIES:STRING=${GDAL_LIBRARY}" ARGS ${TEMP}/testImage.gtif ${TEMP}/testImage.jpeg JPEG)
+#Can create other format file
+if(COMPILE_RESULT_CREATE AND GDAL_CAN_CREATE_GEOTIFF) #Use the result of the previous try_run
+
+	# Can create jpeg file 
+	if (GDAL_HAS_JPEG)
+		try_run(GDAL_CAN_CREATE_JPEG COMPILE_RESULT_CREATECOPY ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/gdalCreateCopyTest.cxx CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:PATH=${GDAL_INCLUDE_DIR}" "-DLINK_LIBRARIES:STRING=${GDAL_LIBRARY}" ARGS ${TEMP}/testImage.gtif ${TEMP}/testImage.jpeg JPEG)
+	endif()
+	
 	# Can create jpeg2000 file
-	try_run(GDAL_CAN_CREATE_JPEG2000 COMPILE_RESULT_CREATECOPY ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/gdalCreateCopyTest.cxx CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:PATH=${GDAL_INCLUDE_DIR}" "-DLINK_LIBRARIES:STRING=${GDAL_LIBRARY}" ARGS ${TEMP}/testImage.gtif ${TEMP}/testImage.j2k JPEG2000)
+	if (GDAL_HAS_J2K_OPJG)
+		try_run(GDAL_CAN_CREATE_JPEG2000 COMPILE_RESULT_CREATECOPY ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/gdalCreateCopyTest.cxx CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:PATH=${GDAL_INCLUDE_DIR}" "-DLINK_LIBRARIES:STRING=${GDAL_LIBRARY}" ARGS ${TEMP}/testImage.gtif ${TEMP}/testImage.j2k JP2OpenJPEG)
+	endif()
+	
+	if (GDAL_HAS_J2K_KAK AND NOT GDAL_CAN_CREATE_JPEG2000)
+		try_run(GDAL_CAN_CREATE_JPEG2000 COMPILE_RESULT_CREATECOPY ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/gdalCreateCopyTest.cxx CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:PATH=${GDAL_INCLUDE_DIR}" "-DLINK_LIBRARIES:STRING=${GDAL_LIBRARY}" ARGS ${TEMP}/testImage.gtif ${TEMP}/testImage.j2k JP2KAK)
+	endif()
+	
+	if (GDAL_HAS_J2K_ECW AND NOT GDAL_CAN_CREATE_JPEG2000)
+		try_run(GDAL_CAN_CREATE_JPEG2000 COMPILE_RESULT_CREATECOPY ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/gdalCreateCopyTest.cxx CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:PATH=${GDAL_INCLUDE_DIR}" "-DLINK_LIBRARIES:STRING=${GDAL_LIBRARY}" ARGS ${TEMP}/testImage.gtif ${TEMP}/testImage.j2k JP2ECW)
+	endif()
+	
+	if (GDAL_HAS_J2K_JG2000 AND NOT GDAL_CAN_CREATE_JPEG2000)
+		try_run(GDAL_CAN_CREATE_JPEG2000 COMPILE_RESULT_CREATECOPY ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/gdalCreateCopyTest.cxx CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:PATH=${GDAL_INCLUDE_DIR}" "-DLINK_LIBRARIES:STRING=${GDAL_LIBRARY}" ARGS ${TEMP}/testImage.gtif ${TEMP}/testImage.j2k JPEG2000)
+	endif()
 
 endif()
 #------------------- TESTS (END)---------------------
@@ -37,31 +69,62 @@ endif()
 # Warning messages
 if (NOT COMPILE_RESULT_VERSION)
 	message(WARNING "Modules/ThirdParty/GDAL/gdalVersionTest.cxx did not compile.")
-endif()
-
-if (${RUN_RESULT_VERSION} EQUAL 1)
+elseif (${RUN_RESULT_VERSION} EQUAL 1)
 	file(READ "${TEMP}/gdalVersion.txt" DETECTED_VERSION)
 	message(WARNING "Version of GDAL must be >= " ${MIN_MAJOR_VERSION} "." ${MIN_MINOR_VERSION} " : " ${DETECTED_VERSION} " detected.")
+	set(GDAL_QUALIFIES FALSE)
 endif()
 	
 if (NOT GDAL_HAS_OGR)
 	message(WARNING "GDAL doesn't expose OGR library symbols.")
+	set(GDAL_QUALIFIES FALSE)
+endif()
+
+if (NOT COMPILE_RESULT_FORMATS)
+	message(WARNING "Modules/ThirdParty/GDAL/gdalFormatsTest.cxx did not compile.")
+else()
+
+	if (NOT GDAL_HAS_J2K_JG2000 AND NOT GDAL_HAS_J2K_OPJG AND NOT GDAL_HAS_J2K_KAK AND NOT GDAL_HAS_J2K_ECW)
+	message(WARNING "No Jpeg2000 driver found (compatible drivers are : OpenJpeg, Kakadu, ECW).")
+	set(GDAL_QUALIFIES FALSE)
+	endif()
+		
+	if (NOT GDAL_HAS_JPEG)
+	message(WARNING "No jpeg driver found.")
+	set(GDAL_QUALIFIES FALSE)
+	endif()
+	
+	if (NOT GDAL_HAS_GTIF)
+	message(WARNING "No geotiff driver found.")
+	set(GDAL_QUALIFIES FALSE)
+	endif()
+	
 endif()
 
+
 if (NOT COMPILE_RESULT_CREATE)
 	message(WARNING "Modules/ThirdParty/GDAL/gdalCreateTest.cxx did not compile.")
+	
+elseif (NOT GDAL_CAN_CREATE_GEOTIFF)
+		message(WARNING "GDAL can't create geotiff files.")
+		set(GDAL_QUALIFIES FALSE)
 endif()
+	
+
 if (NOT COMPILE_RESULT_CREATECOPY)
 	message(WARNING "Modules/ThirdParty/GDAL/gdalCreateCopyTest.cxx did not compile.")
-endif()
-if (NOT GDAL_CAN_CREATE_GEOTIFF)
-	message(WARNING "GDAL can't create tiff files.")
-endif()
-if (NOT GDAL_CAN_CREATE_JPEG)
-	message(WARNING "GDAL can't create jpeg files.")
-endif()
-if (NOT GDAL_CAN_CREATE_JPEG2000)
-	message(WARNING "GDAL can't create jpeg2000 files.")
+	
+else()
+
+	if (NOT GDAL_CAN_CREATE_JPEG)
+		message(WARNING "GDAL can't create jpeg files.")
+		set(GDAL_QUALIFIES FALSE)
+	endif()
+	if (NOT GDAL_CAN_CREATE_JPEG2000)
+		message(WARNING "GDAL can't create jpeg2000 files.")
+		set(GDAL_QUALIFIES FALSE)
+	endif()	
+	
 endif()
 
 
@@ -70,7 +133,7 @@ endif()
 #FOR UNIX SYSTEMS ONLY
 if(UNIX)
   
-  if(GDAL_CAN_CREATE_GEOTIFF)
+  if(GDAL_QUALIFIES)
   
 	  if("x${GDAL_CONFIG}" STREQUAL "x")
 		message(FATAL_ERROR "Cannot find gdal-config executable. Set GDAL_CONFIG")
@@ -88,43 +151,27 @@ if(UNIX)
 
 		# bigtiff
 		try_run(RUN_RESULT_VAR3 COMPILE_RESULT_VAR3 ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/gdalTest3.cxx ARGS ${TEMP}/testgdal3.txt)
-
-		# formats
-		try_run(GDAL_HAS_HDF COMPILE_RESULT_VAR4 ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/gdalTest4.cxx ARGS ${TEMP}/testgdal4.txt hdf)
-		try_run(GDAL_HAS_J2K_JG2000 COMPILE_RESULT_VAR4 ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/gdalTest4.cxx ARGS ${TEMP}/testgdal4.txt jpeg2000)
-		try_run(GDAL_HAS_J2K_OPJG COMPILE_RESULT_VAR4 ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/gdalTest4.cxx ARGS ${TEMP}/testgdal4.txt openjpeg)
-		try_run(GDAL_HAS_J2K_KAK  COMPILE_RESULT_VAR4 ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/gdalTest4.cxx ARGS ${TEMP}/testgdal4.txt jp2kak)
-		try_run(GDAL_HAS_J2K_ECW COMPILE_RESULT_VAR4 ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/gdalTest4.cxx ARGS ${TEMP}/testgdal4.txt ecw)
-
 		#------------------- TESTS (END)---------------------
 
 
 		# Warning messages
 		if (NOT COMPILE_RESULT_VAR2)
 			message(WARNING "Modules/ThirdParty/GDAL/gdalTest2.cxx did not compile.")
+		elseif (${RUN_RESULT_VAR2} EQUAL 1)
+			message(WARNING "Internal versions of libtiff/libgeotiff detected without symbol renaming (when configuring GDAL, if options --with-libtiff or --with-geotiff are set to 'internal', then options --with-rename-internal-libtiff-symbols and --with-rename-internal-libgeotiff-symbols should be set to 'yes').")
+			set(GDAL_QUALIFIES FALSE)
 		endif()
+		
+		
 		if (NOT COMPILE_RESULT_VAR3)
 			message(WARNING "Modules/ThirdParty/GDAL/gdalTest3.cxx did not compile.")
-		endif()
-		if (NOT COMPILE_RESULT_VAR4)
-			message(WARNING "Modules/ThirdParty/GDAL/gdalTest4.cxx did not compile.")
-		endif()
-
-
-		if (${RUN_RESULT_VAR2} EQUAL 1)
-			message(WARNING "Internal versions of libtiff/libgeotiff detected without symbol renaming (when configuring GDAL, if options --with-libtiff or --with-geotiff are set to 'internal', then options --with-rename-internal-libtiff-symbols and --with-rename-internal-libgeotiff-symbols should be set to 'yes').")
-		endif()
-		if (${RUN_RESULT_VAR3} EQUAL 1)
+		elseif (${RUN_RESULT_VAR3} EQUAL 1)
 			message(WARNING "No BIGTIFF capatilities.")
+			set(GDAL_QUALIFIES FALSE)
 		endif()
-		if (NOT GDAL_HAS_HDF)
-			message(WARNING "No HDF capatilities.")
-		endif()
-		if (NOT GDAL_HAS_J2K_JG2000 AND NOT GDAL_HAS_J2K_OPJG AND NOT GDAL_HAS_J2K_KAK AND NOT GDAL_HAS_J2K_ECW)
-			message(WARNING "No Jpeg2000 driver found (compatible drivers are : OpenJpeg, Kakadu, ECW).")
-		endif()
+
 		
-	endif() #GDAL_CAN_CREATE_GEOTIFF
+	endif() #GDAL_QUALIFIES
 
 
 endif() #UNIX
-- 
GitLab