From 446e81b13c3d600ce51e4dd11b01efb68bdb8f4a Mon Sep 17 00:00:00 2001
From: Julien Malik <julien.malik@c-s.fr>
Date: Wed, 7 Dec 2011 14:46:04 +0100
Subject: [PATCH] ENH: generate helper scripts in the build dir also

---
 CMake/OTBWrapperMacros.cmake                  | 73 ++++++++++++++-----
 CMake/otbcli.sh.in                            | 28 ++++++-
 CMake/otbcli_app.sh.in                        | 20 +++++
 CMake/otbgui.sh.in                            | 28 ++++++-
 CMake/otbgui_app.sh.in                        | 20 +++++
 .../ApplicationLauncherQt/CMakeLists.txt      | 19 +++++
 Code/Wrappers/CommandLine/CMakeLists.txt      | 19 +++++
 7 files changed, 179 insertions(+), 28 deletions(-)
 create mode 100644 CMake/otbcli_app.sh.in
 create mode 100644 CMake/otbgui_app.sh.in

diff --git a/CMake/OTBWrapperMacros.cmake b/CMake/OTBWrapperMacros.cmake
index 9b11bd0c04..0fa8917a29 100644
--- a/CMake/OTBWrapperMacros.cmake
+++ b/CMake/OTBWrapperMacros.cmake
@@ -8,7 +8,7 @@ endif()
 macro(OTB_CREATE_APPLICATION)
   OTB_PARSE_ARGUMENTS(
       APPLICATION
-      "NAME;SOURCES;INCLUDE_DIRS;LINK_LIBRARIES;INSTALL_PATH"
+      "NAME;SOURCES;INCLUDE_DIRS;LINK_LIBRARIES;BUILD_PATH;INSTALL_PATH"
       ""
       ${ARGN})
 
@@ -33,33 +33,66 @@ macro(OTB_CREATE_APPLICATION)
    if (NOT APPLICATION_INSTALL_PATH AND OTB_INSTALL_APP_DIR_CM24)
      set(APPLICATION_INSTALL_PATH ${OTB_INSTALL_APP_DIR_CM24})
    endif()
-
-   # Install only if a path has been provided
+   
    if (APPLICATION_INSTALL_PATH)
      install(TARGETS ${APPLICATION_TARGET_NAME}
              LIBRARY DESTINATION ${APPLICATION_INSTALL_PATH})
-
-     if (NOT WIN32)
-       configure_file( ${CMAKE_SOURCE_DIR}/CMake/otbcli.sh.in
-                       ${CMAKE_CURRENT_BINARY_DIR}/otbcli_${APPLICATION_NAME}
-                       @ONLY )
-       install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/otbcli_${APPLICATION_NAME}
-               DESTINATION ${OTB_INSTALL_BIN_DIR_CM24})
-               
-       if (WRAP_QT)
-           configure_file( ${CMAKE_SOURCE_DIR}/CMake/otbgui.sh.in
-                           ${CMAKE_CURRENT_BINARY_DIR}/otbgui_${APPLICATION_NAME}
-                           @ONLY )
-           install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/otbgui_${APPLICATION_NAME}
-                   DESTINATION ${OTB_INSTALL_BIN_DIR_CM24})
-       endif(WRAP_QT)
-     endif(NOT WIN32)
    endif()
    
+   # Generate a quickstart script in the build dir
+   if (NOT WIN32)
+
+      # What is the path to the applications
+      # a MODULE target is always treated as LIBRARY
+      get_target_property(APPLICATION_BINARY_PATH ${APPLICATION_TARGET_NAME} LIBRARY_OUTPUT_DIRECTORY)
+      
+      if (NOT APPLICATION_BINARY_PATH)
+        set(APPLICATION_BINARY_PATH ${CMAKE_CURRENT_BINARY_DIR})
+      endif()
+
+      set(SCRIPT_CLI_SOURCE ${OTB_SOURCE_DIR}/CMake/otbcli_app.sh.in)
+      if (EXISTS ${SCRIPT_CLI_SOURCE})
+          # Generate a script in the build dir, next to the cli launcher
+          configure_file( ${SCRIPT_CLI_SOURCE}
+                          ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/otbcli_${APPLICATION_NAME}
+                          @ONLY )
+          
+          # Copy it next to the application shared lib, and give executable rights
+          file(COPY ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/otbcli_${APPLICATION_NAME}
+               DESTINATION ${APPLICATION_BINARY_PATH}
+               FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)  
+    
+          if (APPLICATION_INSTALL_PATH)
+              # Install a version of this script
+              install(PROGRAMS ${APPLICATION_BINARY_PATH}/otbcli_${APPLICATION_NAME}
+                      DESTINATION ${APPLICATION_INSTALL_PATH})
+          endif()
+      endif()
+
+      set(SCRIPT_GUI_SOURCE ${OTB_SOURCE_DIR}/CMake/otbgui_app.sh.in)
+      if (EXISTS ${SCRIPT_GUI_SOURCE})
+          # Generate a script in the build dir, next to the cli launcher
+          configure_file( ${SCRIPT_GUI_SOURCE}
+                          ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/otbgui_${APPLICATION_NAME}
+                          @ONLY )
+          
+          # Copy it next to the application shared lib, and give executable rights
+          file(COPY ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/otbgui_${APPLICATION_NAME}
+               DESTINATION ${APPLICATION_BINARY_PATH}
+               FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)  
+    
+          if (APPLICATION_INSTALL_PATH)
+              # Install a version of this script
+              install(PROGRAMS ${APPLICATION_BINARY_PATH}/otbgui_${APPLICATION_NAME}
+                      DESTINATION ${APPLICATION_INSTALL_PATH})
+          endif()
+      endif()
+   endif(NOT WIN32)
+   
    list(APPEND OTB_APPLICATIONS_NAME_LIST ${APPLICATION_NAME})
    set(OTB_APPLICATIONS_NAME_LIST ${OTB_APPLICATIONS_NAME_LIST}
        CACHE STRING "List of all applications" FORCE)
-   
+
 endmacro(OTB_CREATE_APPLICATION)
 
 
diff --git a/CMake/otbcli.sh.in b/CMake/otbcli.sh.in
index fade46b2bd..6cb5437f7d 100644
--- a/CMake/otbcli.sh.in
+++ b/CMake/otbcli.sh.in
@@ -5,11 +5,31 @@
 # DO NOT MODIFY
 #
 
-CURRENT_SCRIPT=$0
 CURRENT_SCRIPT_DIR=`dirname $0`
 
-OTB_CLI_LAUNCHER=$CURRENT_SCRIPT_DIR/otbApplicationLauncherCommandLine
-OTB_APP_PATH=$CURRENT_SCRIPT_DIR/../lib/otb/applications
+if [ -e $CURRENT_SCRIPT_DIR/otbApplicationLauncherCommandLine ]
+then
+  # Prefer using the launcher inside the script dir
+  OTB_CLI_LAUNCHER=$CURRENT_SCRIPT_DIR/otbApplicationLauncherCommandLine
+else
+  # Use the one from the PATH
+  OTB_CLI_LAUNCHER=otbApplicationLauncherCommandLine
+fi
 
-$OTB_CLI_LAUNCHER @APPLICATION_NAME@ $OTB_APP_PATH "$@"
+# works for build dir
+if [ -d @APPLICATION_BINARY_PATH@ ]
+then
+  ITK_AUTOLOAD_PATH=@APPLICATION_BINARY_PATH@:$ITK_AUTOLOAD_PATH
+fi
 
+# works for install tree
+if [ -d $CURRENT_SCRIPT_DIR/../@OTB_INSTALL_APP_DIR_CM24@ ]
+then
+  ITK_AUTOLOAD_PATH=$CURRENT_SCRIPT_DIR/../@OTB_INSTALL_APP_DIR_CM24@:$ITK_AUTOLOAD_PATH
+fi
+
+# export it to make it available to otbApplicationLauncherCommandLine environment
+export ITK_AUTOLOAD_PATH
+
+# start the application
+$OTB_CLI_LAUNCHER "$@"
diff --git a/CMake/otbcli_app.sh.in b/CMake/otbcli_app.sh.in
new file mode 100644
index 0000000000..f24399ea9e
--- /dev/null
+++ b/CMake/otbcli_app.sh.in
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+#
+# Autogenerated by OTB installation process
+# DO NOT MODIFY
+#
+
+CURRENT_SCRIPT_DIR=`dirname $0`
+
+if [ -e $CURRENT_SCRIPT_DIR/otbcli ]
+then
+  # Prefer using the launcher inside the script dir
+  OTB_CLI_LAUNCHER=$CURRENT_SCRIPT_DIR/otbcli
+else
+  # Use the one from the PATH
+  OTB_CLI_LAUNCHER=otbcli
+fi
+
+# start the application
+$OTB_CLI_LAUNCHER @APPLICATION_NAME@ "$@"
diff --git a/CMake/otbgui.sh.in b/CMake/otbgui.sh.in
index f9a21ebbab..f82c694ad9 100644
--- a/CMake/otbgui.sh.in
+++ b/CMake/otbgui.sh.in
@@ -5,11 +5,31 @@
 # DO NOT MODIFY
 #
 
-CURRENT_SCRIPT=$0
 CURRENT_SCRIPT_DIR=`dirname $0`
 
-OTB_GUI_LAUNCHER=$CURRENT_SCRIPT_DIR/otbApplicationLauncherQt
-OTB_APP_PATH=$CURRENT_SCRIPT_DIR/../lib/otb/applications
+if [ -e $CURRENT_SCRIPT_DIR/otbApplicationLauncherQt ]
+then
+  # Prefer using the launcher inside the script dir
+  OTB_GUI_LAUNCHER=$CURRENT_SCRIPT_DIR/otbApplicationLauncherQt
+else
+  # Use the one from the PATH
+  OTB_GUI_LAUNCHER=otbApplicationLauncherQt
+fi
 
-$OTB_GUI_LAUNCHER @APPLICATION_NAME@ $OTB_APP_PATH "$@"
+# works for build dir
+if [ -d @APPLICATION_BINARY_PATH@ ]
+then
+  ITK_AUTOLOAD_PATH=@APPLICATION_BINARY_PATH@:$ITK_AUTOLOAD_PATH
+fi
 
+# works for install tree
+if [ -d $CURRENT_SCRIPT_DIR/../@OTB_INSTALL_APP_DIR_CM24@ ]
+then
+  ITK_AUTOLOAD_PATH=$CURRENT_SCRIPT_DIR/../@OTB_INSTALL_APP_DIR_CM24@:$ITK_AUTOLOAD_PATH
+fi
+
+# export it to make it available to otbApplicationLauncherCommandLine environment
+export ITK_AUTOLOAD_PATH
+
+# start the application
+$OTB_GUI_LAUNCHER "$@"
diff --git a/CMake/otbgui_app.sh.in b/CMake/otbgui_app.sh.in
new file mode 100644
index 0000000000..937673929c
--- /dev/null
+++ b/CMake/otbgui_app.sh.in
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+#
+# Autogenerated by OTB installation process
+# DO NOT MODIFY
+#
+
+CURRENT_SCRIPT_DIR=`dirname $0`
+
+if [ -e $CURRENT_SCRIPT_DIR/otbcli ]
+then
+  # Prefer using the launcher inside the script dir
+  OTB_GUI_LAUNCHER=$CURRENT_SCRIPT_DIR/otbgui
+else
+  # Use the one from the PATH
+  OTB_GUI_LAUNCHER=otbgui
+fi
+
+# start the application
+$OTB_GUI_LAUNCHER @APPLICATION_NAME@ "$@"
diff --git a/Code/Wrappers/ApplicationLauncherQt/CMakeLists.txt b/Code/Wrappers/ApplicationLauncherQt/CMakeLists.txt
index f608da8a55..3d37c35f30 100644
--- a/Code/Wrappers/ApplicationLauncherQt/CMakeLists.txt
+++ b/Code/Wrappers/ApplicationLauncherQt/CMakeLists.txt
@@ -15,3 +15,22 @@ install(TARGETS otbApplicationLauncherQt
         RUNTIME DESTINATION ${OTB_INSTALL_BIN_DIR_CM24}
         LIBRARY DESTINATION ${OTB_INSTALL_LIB_DIR_CM24}
         ARCHIVE DESTINATION ${OTB_INSTALL_LIB_DIR_CM24})
+
+# Where we will install the script in the build tree
+get_target_property(CLI_OUPUT_DIR otbApplicationLauncherQt RUNTIME_OUTPUT_DIRECTORY)
+
+# What is the path to the applications
+# a MODULE target is always treated as LIBRARY
+set(APPLICATION_BINARY_PATH ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
+
+# Generate a script in the build dir, next to the cli launcher
+# Need a two-step process since configure_file don't support permissions
+configure_file( ${CMAKE_SOURCE_DIR}/CMake/otbgui.sh.in
+                ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/otbgui
+                @ONLY )
+file(COPY ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/otbgui
+     DESTINATION ${CLI_OUPUT_DIR}
+     FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)  
+
+install(PROGRAMS ${CLI_OUPUT_DIR}/otbgui
+        DESTINATION ${OTB_INSTALL_BIN_DIR_CM24})
diff --git a/Code/Wrappers/CommandLine/CMakeLists.txt b/Code/Wrappers/CommandLine/CMakeLists.txt
index 9bbf503301..4b7d735d9c 100644
--- a/Code/Wrappers/CommandLine/CMakeLists.txt
+++ b/Code/Wrappers/CommandLine/CMakeLists.txt
@@ -27,3 +27,22 @@ install(TARGETS otbApplicationLauncherCommandLine
         RUNTIME DESTINATION ${OTB_INSTALL_BIN_DIR_CM24}
         LIBRARY DESTINATION ${OTB_INSTALL_LIB_DIR_CM24}
         ARCHIVE DESTINATION ${OTB_INSTALL_LIB_DIR_CM24})
+
+# Where we will install the script in the build tree
+get_target_property(CLI_OUPUT_DIR otbApplicationLauncherCommandLine RUNTIME_OUTPUT_DIRECTORY)
+
+# What is the path to the applications
+# a MODULE target is always treated as LIBRARY
+set(APPLICATION_BINARY_PATH ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
+
+# Generate a script in the build dir, next to the cli launcher
+# Need a two-step process since configure_file don't support permissions
+configure_file( ${CMAKE_SOURCE_DIR}/CMake/otbcli.sh.in
+                ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/otbcli
+                @ONLY )
+file(COPY ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/otbcli
+     DESTINATION ${CLI_OUPUT_DIR}
+     FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)  
+
+install(PROGRAMS ${CLI_OUPUT_DIR}/otbcli
+        DESTINATION ${OTB_INSTALL_BIN_DIR_CM24})
-- 
GitLab