From 1d2b2852d68d3c799dd5015bfdc6ef142dc9ee0a Mon Sep 17 00:00:00 2001
From: Julien Malik <julien.malik@c-s.fr>
Date: Sun, 12 Jun 2011 10:25:00 +0200
Subject: [PATCH] ENH: improve build system

---
 CMake/Definitions.cmake                       | 33 +++++++++++++
 CMake/ParseArguments.cmake                    | 32 +++++++++++++
 CMake/WrapperMacros.cmake                     | 17 +++++++
 CMakeLists.txt                                | 47 +------------------
 .../ApplicationLauncherQt/CMakeLists.txt      |  2 +
 Code/Wrappers/CMakeLists.txt                  |  2 +
 Code/Wrappers/QtWidget/CMakeLists.txt         |  2 +-
 Example/Addition/CMakeLists.txt               |  6 ---
 Example/CMakeLists.txt                        |  6 ++-
 Example/Smoothing/CMakeLists.txt              |  6 ---
 Example/{Addition => }/otbAddition.cxx        |  0
 Example/{Smoothing => }/otbSmoothing.cxx      |  0
 Testing/Core/CMakeLists.txt                   |  1 +
 Testing/QtWidget/CMakeLists.txt               |  4 ++
 14 files changed, 97 insertions(+), 61 deletions(-)
 create mode 100644 CMake/Definitions.cmake
 create mode 100644 CMake/ParseArguments.cmake
 create mode 100644 CMake/WrapperMacros.cmake
 delete mode 100644 Example/Addition/CMakeLists.txt
 delete mode 100644 Example/Smoothing/CMakeLists.txt
 rename Example/{Addition => }/otbAddition.cxx (100%)
 rename Example/{Smoothing => }/otbSmoothing.cxx (100%)

diff --git a/CMake/Definitions.cmake b/CMake/Definitions.cmake
new file mode 100644
index 0000000000..0ccc28c8bd
--- /dev/null
+++ b/CMake/Definitions.cmake
@@ -0,0 +1,33 @@
+
+# ensure WIN32 definition
+IF(WIN32)
+  ADD_DEFINITIONS(-DWIN32)
+ENDIF(WIN32)
+
+
+# On Visual Studio 8 MS deprecated C. This removes all 1.276E1265 security
+# warnings
+IF(WIN32)
+    IF(NOT CYGWIN)
+      IF(NOT MINGW)
+          ADD_DEFINITIONS(
+            -D_CRT_FAR_MAPPINGS_NO_DEPRECATE
+            -D_CRT_IS_WCTYPE_NO_DEPRECATE
+            -D_CRT_MANAGED_FP_NO_DEPRECATE
+            -D_CRT_NONSTDC_NO_DEPRECATE
+            -D_CRT_SECURE_NO_DEPRECATE
+            -D_CRT_SECURE_NO_DEPRECATE_GLOBALS
+            -D_CRT_SETERRORMODE_BEEP_SLEEP_NO_DEPRECATE
+            -D_CRT_TIME_FUNCTIONS_NO_DEPRECATE
+            -D_CRT_VCCLRIT_NO_DEPRECATE
+            -D_SCL_SECURE_NO_DEPRECATE
+            )
+
+        IF (MSVC)
+          ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
+          ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_WARNING)
+        ENDIF(MSVC)
+
+      ENDIF(NOT MINGW)
+    ENDIF(NOT CYGWIN)
+ENDIF(WIN32)
\ No newline at end of file
diff --git a/CMake/ParseArguments.cmake b/CMake/ParseArguments.cmake
new file mode 100644
index 0000000000..da5000e58e
--- /dev/null
+++ b/CMake/ParseArguments.cmake
@@ -0,0 +1,32 @@
+# Source : http://www.itk.org/Wiki/CMakeMacroParseArguments
+
+MACRO(PARSE_ARGUMENTS prefix arg_names option_names)
+  SET(DEFAULT_ARGS)
+  FOREACH(arg_name ${arg_names})
+    SET(${prefix}_${arg_name})
+  ENDFOREACH(arg_name)
+  FOREACH(option ${option_names})
+    SET(${prefix}_${option} FALSE)
+  ENDFOREACH(option)
+
+  SET(current_arg_name DEFAULT_ARGS)
+  SET(current_arg_list)
+  FOREACH(arg ${ARGN})
+    SET(larg_names ${arg_names})
+    LIST(FIND larg_names "${arg}" is_arg_name)
+    IF (is_arg_name GREATER -1)
+      SET(${prefix}_${current_arg_name} ${current_arg_list})
+      SET(current_arg_name ${arg})
+      SET(current_arg_list)
+    ELSE (is_arg_name GREATER -1)
+      SET(loption_names ${option_names})
+      LIST(FIND loption_names "${arg}" is_option)
+      IF (is_option GREATER -1)
+         SET(${prefix}_${arg} TRUE)
+      ELSE (is_option GREATER -1)
+         SET(current_arg_list ${current_arg_list} ${arg})
+      ENDIF (is_option GREATER -1)
+    ENDIF (is_arg_name GREATER -1)
+  ENDFOREACH(arg)
+  SET(${prefix}_${current_arg_name} ${current_arg_list})
+ENDMACRO(PARSE_ARGUMENTS)
\ No newline at end of file
diff --git a/CMake/WrapperMacros.cmake b/CMake/WrapperMacros.cmake
new file mode 100644
index 0000000000..4ea434d38c
--- /dev/null
+++ b/CMake/WrapperMacros.cmake
@@ -0,0 +1,17 @@
+include(ParseArguments)
+
+macro(OTB_CREATE_APPLICATION)
+  PARSE_ARGUMENTS(
+      APPLICATION
+      "NAME;SOURCES;INCLUDE_DIRS;LINK_LIBRARIES"
+      ""
+      ${ARGN})
+
+   set( APPLICATION_TARGET_NAME otbapp_${APPLICATION_NAME} )
+
+   include_directories(${CMAKE_SOURCE_DIR}/Code/Core)
+   include_directories(${APPLICATION_INCLUDE_DIRS})
+   add_library(${APPLICATION_TARGET_NAME} MODULE ${APPLICATION_SOURCES})
+   target_link_libraries(${APPLICATION_TARGET_NAME} OTBWrapperCore ${APPLICATION_LINK_LIBRARIES})
+   set_target_properties(${APPLICATION_TARGET_NAME} PROPERTIES PREFIX "")
+endmacro(OTB_CREATE_APPLICATION)
\ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 306b78796d..43286e412c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -6,42 +6,12 @@ IF(COMMAND CMAKE_POLICY)
   CMAKE_POLICY(SET CMP0003 NEW)
 ENDIF(COMMAND CMAKE_POLICY)
 
-# ensure WIN32 definition
-IF(WIN32)
-  ADD_DEFINITIONS(-DWIN32)
-ENDIF(WIN32)
-
 # Path to additional CMake modules
 SET(CMAKE_MODULE_PATH
     ${CMAKE_SOURCE_DIR}/CMake
     ${CMAKE_MODULE_PATH})
 
-# On Visual Studio 8 MS deprecated C. This removes all 1.276E1265 security
-# warnings
-IF(WIN32)
-    IF(NOT CYGWIN)
-      IF(NOT MINGW)
-          ADD_DEFINITIONS(
-            -D_CRT_FAR_MAPPINGS_NO_DEPRECATE
-            -D_CRT_IS_WCTYPE_NO_DEPRECATE
-            -D_CRT_MANAGED_FP_NO_DEPRECATE
-            -D_CRT_NONSTDC_NO_DEPRECATE
-            -D_CRT_SECURE_NO_DEPRECATE
-            -D_CRT_SECURE_NO_DEPRECATE_GLOBALS
-            -D_CRT_SETERRORMODE_BEEP_SLEEP_NO_DEPRECATE
-            -D_CRT_TIME_FUNCTIONS_NO_DEPRECATE
-            -D_CRT_VCCLRIT_NO_DEPRECATE
-            -D_SCL_SECURE_NO_DEPRECATE
-            )
-
-        IF (MSVC)
-          ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
-          ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_WARNING)
-        ENDIF(MSVC)
-
-      ENDIF(NOT MINGW)
-    ENDIF(NOT CYGWIN)
-ENDIF(WIN32)
+include(Definitions)
 
 # Link to the Orfeo ToolBox
 FIND_PACKAGE(OTB REQUIRED PATHS /usr/lib/otb )
@@ -53,7 +23,6 @@ IF(OTB_USE_QT)
   FIND_PACKAGE(Qt4 REQUIRED)
   SET(QT_USE_QTXML 1)
   INCLUDE(${QT_USE_FILE})
-  INCLUDE_DIRECTORIES(${QT_INCLUDE_DIRS})
 ENDIF(OTB_USE_QT)
 
 OPTION(OTB_USE_SWIG "Generate Qt wrappers for Applications" ON)
@@ -63,22 +32,8 @@ INCLUDE(${SWIG_USE_FILE})
 FIND_PACKAGE(PythonLibs REQUIRED)
 FIND_PACKAGE(PythonInterp REQUIRED)
 
-#-----------------------------------------------------------------------------
-#Build shared libraries for monteverdi
-#By default, import the option from the OTB configuration
 SET(BUILD_SHARED_LIBS ${OTB_BUILD_SHARED_LIBS})
 
-INCLUDE_DIRECTORIES(
-    ${CMAKE_CURRENT_SOURCE_DIR}/Code
-    ${CMAKE_CURRENT_SOURCE_DIR}/Code/Core
-    ${CMAKE_CURRENT_SOURCE_DIR}/Code/Wrappers
-    ${CMAKE_CURRENT_SOURCE_DIR}/Code/Wrappers/QtWidget
-    ${CMAKE_CURRENT_BINARY_DIR}
-    ${CMAKE_CURRENT_BINARY_DIR}/Code
-    ${CMAKE_CURRENT_BINARY_DIR}/Code/Wrappers
-    ${CMAKE_CURRENT_BINARY_DIR}/Code/Wrappers/QtWidget
-)
-
 ADD_SUBDIRECTORY(Code)
 ADD_SUBDIRECTORY(Example)
 
diff --git a/Code/Wrappers/ApplicationLauncherQt/CMakeLists.txt b/Code/Wrappers/ApplicationLauncherQt/CMakeLists.txt
index 8943b137bb..ba822eeaa3 100644
--- a/Code/Wrappers/ApplicationLauncherQt/CMakeLists.txt
+++ b/Code/Wrappers/ApplicationLauncherQt/CMakeLists.txt
@@ -1,3 +1,5 @@
+INCLUDE_DIRECTORIES(${QT_INCLUDE_DIRS})
+INCLUDE_DIRECTORIES(../QtWidget)
 
 SET( SRCS
      otbApplicationLauncherQt.cxx )
diff --git a/Code/Wrappers/CMakeLists.txt b/Code/Wrappers/CMakeLists.txt
index f247fc1735..f3b5897812 100644
--- a/Code/Wrappers/CMakeLists.txt
+++ b/Code/Wrappers/CMakeLists.txt
@@ -1,3 +1,5 @@
+INCLUDE_DIRECTORIES(../Core)
+
 ADD_SUBDIRECTORY(ApplicationLauncherQt)
 ADD_SUBDIRECTORY(QtWidget)
 ADD_SUBDIRECTORY(SWIG)
diff --git a/Code/Wrappers/QtWidget/CMakeLists.txt b/Code/Wrappers/QtWidget/CMakeLists.txt
index 11ff545652..f7ebaddfb3 100644
--- a/Code/Wrappers/QtWidget/CMakeLists.txt
+++ b/Code/Wrappers/QtWidget/CMakeLists.txt
@@ -1,4 +1,4 @@
-
+INCLUDE_DIRECTORIES(${QT_INCLUDE_DIRS})
 FILE(GLOB srcs "*.cxx")
 
 SET( WrappersQtWidget_MOC_HDR
diff --git a/Example/Addition/CMakeLists.txt b/Example/Addition/CMakeLists.txt
deleted file mode 100644
index 947c7083fe..0000000000
--- a/Example/Addition/CMakeLists.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-
-SET( SRCS
-     otbAddition.cxx )
-
-ADD_LIBRARY(OTBWrapperAddition otbAddition.cxx)
-TARGET_LINK_LIBRARIES(OTBWrapperAddition OTBWrapperCore)
diff --git a/Example/CMakeLists.txt b/Example/CMakeLists.txt
index ec66495bcf..04e9d75bd3 100644
--- a/Example/CMakeLists.txt
+++ b/Example/CMakeLists.txt
@@ -1,2 +1,4 @@
-add_subdirectory(Addition)
-add_subdirectory(Smoothing)
\ No newline at end of file
+include(WrapperMacros)
+
+OTB_CREATE_APPLICATION(NAME Addition  SOURCES otbAddition.cxx)
+OTB_CREATE_APPLICATION(NAME Smoothing SOURCES otbSmoothing.cxx)
\ No newline at end of file
diff --git a/Example/Smoothing/CMakeLists.txt b/Example/Smoothing/CMakeLists.txt
deleted file mode 100644
index adc89f52a7..0000000000
--- a/Example/Smoothing/CMakeLists.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-
-SET( SRCS
-     otbSmoothing.cxx )
-
-ADD_LIBRARY(OTBWrapperSmoothing otbSmoothing.cxx)
-TARGET_LINK_LIBRARIES(OTBWrapperSmoothing OTBWrapperCore)
diff --git a/Example/Addition/otbAddition.cxx b/Example/otbAddition.cxx
similarity index 100%
rename from Example/Addition/otbAddition.cxx
rename to Example/otbAddition.cxx
diff --git a/Example/Smoothing/otbSmoothing.cxx b/Example/otbSmoothing.cxx
similarity index 100%
rename from Example/Smoothing/otbSmoothing.cxx
rename to Example/otbSmoothing.cxx
diff --git a/Testing/Core/CMakeLists.txt b/Testing/Core/CMakeLists.txt
index 5ad0ed9191..323639eab8 100644
--- a/Testing/Core/CMakeLists.txt
+++ b/Testing/Core/CMakeLists.txt
@@ -76,5 +76,6 @@ otbWrapperParameterTest.cxx
 otbWrapperApplicationRegistryTest.cxx
 )
 
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/Code/Core)
 ADD_EXECUTABLE(otbWrapperTests ${Wrapper_SRCS})
 TARGET_LINK_LIBRARIES(otbWrapperTests OTBIO OTBCommon ITKIO ITKCommon OTBTesting OTBWrapperCore)
diff --git a/Testing/QtWidget/CMakeLists.txt b/Testing/QtWidget/CMakeLists.txt
index 5cb6767c3d..526b98e409 100644
--- a/Testing/QtWidget/CMakeLists.txt
+++ b/Testing/QtWidget/CMakeLists.txt
@@ -8,6 +8,10 @@ SET(WrapperQtWidget_SRCS
     otbWrapperQtWidgetTests.cxx
     otbWrapperQtWidgetParameterFactory.cxx)
 
+INCLUDE_DIRECTORIES(${QT_INCLUDE_DIRS})
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/Code/Core)
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/Code/Wrappers/QtWidget)
+
 ADD_EXECUTABLE(otbWrapperQtWidgetTests ${WrapperQtWidget_SRCS})
 TARGET_LINK_LIBRARIES(otbWrapperQtWidgetTests
                         OTBIO
-- 
GitLab