From b0247c74440f70eda03061a46a46e81e412798f2 Mon Sep 17 00:00:00 2001
From: Guillaume Pasero <guillaume.pasero@c-s.fr>
Date: Thu, 1 Aug 2019 00:01:34 +0200
Subject: [PATCH] ENH: use official UseSWIG from CMake

---
 CMake/UseSWIGLocal.cmake                      | 264 ------------------
 CMakeLists.txt                                |   2 +
 Modules/Wrappers/SWIG/src/CMakeLists.txt      |  14 +-
 .../Wrappers/SWIG/src/python/CMakeLists.txt   |  35 ++-
 .../Wrappers/SWIG/test/python/CMakeLists.txt  |   2 +-
 5 files changed, 28 insertions(+), 289 deletions(-)
 delete mode 100644 CMake/UseSWIGLocal.cmake

diff --git a/CMake/UseSWIGLocal.cmake b/CMake/UseSWIGLocal.cmake
deleted file mode 100644
index 3f7b7984b6..0000000000
--- a/CMake/UseSWIGLocal.cmake
+++ /dev/null
@@ -1,264 +0,0 @@
-# - SWIG module for CMake
-# Defines the following macros:
-#   SWIG_ADD_MODULE(name language [ files ])
-#     - Define swig module with given name and specified language
-#   SWIG_LINK_LIBRARIES(name [ libraries ])
-#     - Link libraries to swig module
-# All other macros are for internal use only.
-# To get the actual name of the swig module,
-# use: ${SWIG_MODULE_${name}_REAL_NAME}.
-# Set Source files properties such as CPLUSPLUS and SWIG_FLAGS to specify
-# special behavior of SWIG. Also global CMAKE_SWIG_FLAGS can be used to add
-# special flags to all swig calls.
-# Another special variable is CMAKE_SWIG_OUTDIR, it allows one to specify
-# where to write all the swig generated module (swig -outdir option)
-# The name-specific variable SWIG_MODULE_<name>_EXTRA_DEPS may be used
-# to specify extra dependencies for the generated modules.
-# If the source file generated by swig need some special flag you can use
-# set_source_files_properties( ${swig_generated_file_fullname}
-#        PROPERTIES COMPILE_FLAGS "-bla")
-
-
-#=============================================================================
-# Copyright 2004-2009 Kitware, Inc.
-# Copyright 2009 Mathieu Malaterre <mathieu.malaterre@gmail.com>
-#
-# Distributed under the OSI-approved BSD License (the "License");
-# see accompanying file Copyright.txt for details.
-#
-# This software is distributed WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# See the License for more information.
-#=============================================================================
-# (To distributed this file outside of CMake, substitute the full
-#  License text for the above reference.)
-
-set(SWIG_CXX_EXTENSION "cxx")
-set(SWIG_EXTRA_LIBRARIES "")
-
-set(SWIG_PYTHON_EXTRA_FILE_EXTENSION "py")
-
-#
-# For given swig module initialize variables associated with it
-#
-macro(SWIG_MODULE_INITIALIZE name language)
-  string(TOUPPER "${language}" swig_uppercase_language)
-  string(TOLOWER "${language}" swig_lowercase_language)
-  set(SWIG_MODULE_${name}_LANGUAGE "${swig_uppercase_language}")
-  set(SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG "${swig_lowercase_language}")
-
-  if("x${SWIG_MODULE_${name}_LANGUAGE}x" MATCHES "^xUNKNOWNx$")
-    message(FATAL_ERROR "SWIG Error: Language \"${language}\" not found")
-  endif()
-
-  set(SWIG_MODULE_${name}_REAL_NAME "${name}")
-  if("x${SWIG_MODULE_${name}_LANGUAGE}x" MATCHES "^xPYTHONx$")
-    # when swig is used without the -interface it will produce in the module.py
-    # a 'import _modulename' statement, which implies having a corresponding
-    # _modulename.so (*NIX), _modulename.pyd (Win32).
-    set(SWIG_MODULE_${name}_REAL_NAME "_${name}")
-  endif()
-  if("x${SWIG_MODULE_${name}_LANGUAGE}x" MATCHES "^xRUBYx$")
-    string(TOLOWER "${name}" ruby_module_name)
-    set(SWIG_MODULE_${name}_REAL_NAME "${ruby_module_name}")
-  endif()
-  if("x${SWIG_MODULE_${name}_LANGUAGE}x" MATCHES "^xPERLx$")
-    set(SWIG_MODULE_${name}_EXTRA_FLAGS "-shadow")
-  endif()
-endmacro()
-
-#
-# For a given language, input file, and output file, determine extra files that
-# will be generated. This is internal swig macro.
-#
-
-macro(SWIG_GET_EXTRA_OUTPUT_FILES language outfiles generatedpath infile)
-  get_source_file_property(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename
-    ${infile} SWIG_MODULE_NAME)
-  if(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename STREQUAL "NOTFOUND")
-    get_filename_component(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename "${infile}" NAME_WE)
-  endif()
-  foreach(it ${SWIG_${language}_EXTRA_FILE_EXTENSION})
-    set(${outfiles} ${${outfiles}}
-      "${generatedpath}/${SWIG_GET_EXTRA_OUTPUT_FILES_module_basename}.${it}")
-  endforeach()
-endmacro()
-
-#
-# Take swig (*.i) file and add proper custom commands for it
-#
-macro(SWIG_ADD_SOURCE_TO_MODULE name outfiles infile)
-  set(swig_full_infile ${infile})
-  get_filename_component(swig_source_file_path "${infile}" PATH)
-  get_filename_component(swig_source_file_name_we "${infile}" NAME_WE)
-  get_source_file_property(swig_source_file_generated ${infile} GENERATED)
-  get_source_file_property(swig_source_file_cplusplus ${infile} CPLUSPLUS)
-  get_source_file_property(swig_source_file_flags ${infile} SWIG_FLAGS)
-  if("${swig_source_file_flags}" STREQUAL "NOTFOUND")
-    set(swig_source_file_flags "")
-  endif()
-  set(swig_source_file_fullname "${infile}")
-  if(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_SOURCE_DIR}")
-    string(REGEX REPLACE
-      "^${CMAKE_CURRENT_SOURCE_DIR}" ""
-      swig_source_file_relative_path
-      "${swig_source_file_path}")
-  else()
-    if(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_BINARY_DIR}")
-      string(REGEX REPLACE
-        "^${CMAKE_CURRENT_BINARY_DIR}" ""
-        swig_source_file_relative_path
-        "${swig_source_file_path}")
-      set(swig_source_file_generated 1)
-    else()
-      set(swig_source_file_relative_path "${swig_source_file_path}")
-      if(swig_source_file_generated)
-        set(swig_source_file_fullname "${CMAKE_CURRENT_BINARY_DIR}/${infile}")
-      else()
-        set(swig_source_file_fullname "${CMAKE_CURRENT_SOURCE_DIR}/${infile}")
-      endif()
-    endif()
-  endif()
-
-  set(swig_generated_file_fullname
-    "${CMAKE_CURRENT_BINARY_DIR}")
-  # If CMAKE_SWIG_OUTDIR was specified then pass it to -outdir
-  if(CMAKE_SWIG_OUTDIR)
-    set(swig_outdir ${CMAKE_SWIG_OUTDIR})
-    # it may not exist, so create it:
-    file(MAKE_DIRECTORY ${CMAKE_SWIG_OUTDIR})
-  else()
-    set(swig_outdir ${CMAKE_CURRENT_BINARY_DIR})
-  endif()
-  # cleanup swig_extra_generated_files content for multi-langage wrapping support
-  set(swig_extra_generated_files)
-  SWIG_GET_EXTRA_OUTPUT_FILES(${SWIG_MODULE_${name}_LANGUAGE}
-    swig_extra_generated_files
-    "${swig_outdir}"
-    "${infile}")
-  set(swig_generated_file_fullname
-    "${swig_generated_file_fullname}/${swig_source_file_name_we}")
-  # add the language into the name of the file (i.e. TCL_wrap)
-  # this allows for the same .i file to be wrapped into different languages
-  set(swig_generated_file_fullname
-    "${swig_generated_file_fullname}${SWIG_MODULE_${name}_LANGUAGE}_wrap")
-
-  if(swig_source_file_cplusplus)
-    set(swig_generated_file_fullname
-      "${swig_generated_file_fullname}.${SWIG_CXX_EXTENSION}")
-  else()
-    set(swig_generated_file_fullname
-      "${swig_generated_file_fullname}.c")
-  endif()
-
-  #message("Full path to source file: ${swig_source_file_fullname}")
-  #message("Full path to the output file: ${swig_generated_file_fullname}")
-  get_directory_property(cmake_include_directories INCLUDE_DIRECTORIES)
-  set(swig_include_dirs)
-  foreach(it ${cmake_include_directories})
-    set(swig_include_dirs ${swig_include_dirs} "-I${it}")
-  endforeach()
-
-  set(swig_special_flags)
-  # default is c, so add c++ flag if it is c++
-  if(swig_source_file_cplusplus)
-    set(swig_special_flags ${swig_special_flags} "-c++")
-  endif()
-  set(swig_extra_flags)
-  if(SWIG_MODULE_${name}_EXTRA_FLAGS)
-    set(swig_extra_flags ${swig_extra_flags} ${SWIG_MODULE_${name}_EXTRA_FLAGS})
-  endif()
-  add_custom_command(
-    OUTPUT "${swig_generated_file_fullname}" ${swig_extra_generated_files}
-    COMMAND "${SWIG_EXECUTABLE}"
-    ARGS "-${SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG}"
-    ${swig_source_file_flags}
-    ${CMAKE_SWIG_FLAGS}
-    -outdir ${swig_outdir}
-    ${swig_special_flags}
-    ${swig_extra_flags}
-    ${swig_include_dirs}
-    -o "${swig_generated_file_fullname}"
-    "${swig_source_file_fullname}"
-    MAIN_DEPENDENCY "${swig_source_file_fullname}"
-    DEPENDS ${SWIG_MODULE_${name}_EXTRA_DEPS}
-    COMMENT "Swig source to generate ${SWIG_MODULE_${name}_LANGUAGE} wrapping")
-  set_source_files_properties("${swig_generated_file_fullname}" ${swig_extra_generated_files}
-    PROPERTIES GENERATED 1)
-  set(${outfiles} "${swig_generated_file_fullname}" ${swig_extra_generated_files})
-endmacro()
-
-#
-# Create Swig module
-#
-macro(SWIG_ADD_MODULE name language)
-  SWIG_MODULE_INITIALIZE(${name} ${language})
-  set(swig_dot_i_sources)
-  set(swig_other_sources)
-  foreach(it ${ARGN})
-    if(${it} MATCHES ".*\\.i$")
-      set(swig_dot_i_sources ${swig_dot_i_sources} "${it}")
-    else()
-      set(swig_other_sources ${swig_other_sources} "${it}")
-    endif()
-  endforeach()
-
-  set(swig_generated_sources)
-  foreach(it ${swig_dot_i_sources})
-    SWIG_ADD_SOURCE_TO_MODULE(${name} swig_generated_source ${it})
-    set(swig_generated_sources ${swig_generated_sources} "${swig_generated_source}")
-  endforeach()
-  get_directory_property(swig_extra_clean_files ADDITIONAL_MAKE_CLEAN_FILES)
-  set_directory_properties(PROPERTIES
-    ADDITIONAL_MAKE_CLEAN_FILES "${swig_extra_clean_files};${swig_generated_sources}")
-  add_library(${SWIG_MODULE_${name}_REAL_NAME}
-    MODULE
-    ${swig_generated_sources}
-    ${swig_other_sources})
-  string(TOLOWER "${language}" swig_lowercase_language)
-  if("${swig_lowercase_language}" STREQUAL "java")
-    if(APPLE)
-        # In java you want:
-        #      System.loadLibrary("LIBRARY");
-        # then JNI will look for a library whose name is platform dependent, namely
-        #   MacOS  : libLIBRARY.jnilib
-        #   Windows: LIBRARY.dll
-        #   Linux  : libLIBRARY.so
-        set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES SUFFIX ".jnilib")
-      endif()
-  endif()
-  if("${swig_lowercase_language}" STREQUAL "python")
-    # this is only needed for the python case where a _modulename.so is generated
-    set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES PREFIX "")
-    # Python extension modules on Windows must have the extension ".pyd"
-    # instead of ".dll" as of Python 2.5.  Older python versions do support
-    # this suffix.
-    # http://docs.python.org/whatsnew/ports.html#SECTION0001510000000000000000
-    # <quote>
-    # Windows: .dll is no longer supported as a filename extension for extension modules.
-    # .pyd is now the only filename extension that will be searched for.
-    # </quote>
-    if(WIN32 AND NOT CYGWIN)
-      set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES SUFFIX ".pyd")
-    endif()
-  endif()
-  if("${swig_lowercase_language}" STREQUAL "ruby")
-    set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES PREFIX "")
-    if(APPLE)
-      set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES SUFFIX ".bundle")
-      set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES COMPILE_FLAGS "-bundle")
-    endif()
-  endif()
-endmacro()
-
-#
-# Like TARGET_LINK_LIBRARIES but for swig modules
-#
-macro(SWIG_LINK_LIBRARIES name)
-  if(SWIG_MODULE_${name}_REAL_NAME)
-    target_link_libraries(${SWIG_MODULE_${name}_REAL_NAME} ${ARGN})
-  else()
-    message(SEND_ERROR "Cannot find Swig library \"${name}\".")
-  endif()
-endmacro()
-
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f2f57de384..84df6b3d54 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -22,6 +22,8 @@ cmake_minimum_required(VERSION 3.10.2)
 
 foreach(p
     CMP0072 # CMake 3.11
+    CMP0078 # CMake 3.13
+    CMP0086 # CMake 3.14
     )
   if(POLICY ${p})
     cmake_policy(SET ${p} NEW)
diff --git a/Modules/Wrappers/SWIG/src/CMakeLists.txt b/Modules/Wrappers/SWIG/src/CMakeLists.txt
index ebae699688..ec5b62ad21 100644
--- a/Modules/Wrappers/SWIG/src/CMakeLists.txt
+++ b/Modules/Wrappers/SWIG/src/CMakeLists.txt
@@ -18,18 +18,10 @@
 # limitations under the License.
 #
 
-if ( OTB_WRAP_PYTHON )
-  include ( UseSWIGLocal )
-  list(APPEND SWIG_EXTRA_DEPS
-       otbWrapperSWIGIncludes.h
-       itkBase.includes
-       ${CMAKE_CURRENT_SOURCE_DIR}/itkBase.i
-       ${CMAKE_CURRENT_SOURCE_DIR}/itkMacro.i
-       )
-  include_directories ( ${CMAKE_CURRENT_SOURCE_DIR} )
-endif()
+include(UseSWIG)
+include_directories( ${CMAKE_CURRENT_SOURCE_DIR} )
 
 # Python SWIG configuration
 if ( OTB_WRAP_PYTHON )
   add_subdirectory(python)
-endif()
\ No newline at end of file
+endif()
diff --git a/Modules/Wrappers/SWIG/src/python/CMakeLists.txt b/Modules/Wrappers/SWIG/src/python/CMakeLists.txt
index 6a7b288b5c..a1d4553894 100644
--- a/Modules/Wrappers/SWIG/src/python/CMakeLists.txt
+++ b/Modules/Wrappers/SWIG/src/python/CMakeLists.txt
@@ -21,6 +21,14 @@
 include_directories ( ${PYTHON_INCLUDE_DIR} )
 include_directories ( ${CMAKE_CURRENT_SOURCE_DIR})
 set_source_files_properties ( ../otbApplication.i PROPERTIES CPLUSPLUS ON )
+# Get target name
+set(extension_target _otbApplication)
+if(POLICY CMP0078)
+  cmake_policy(GET CMP0078 swig_target_name_policy)
+  if (swig_target_name_policy STREQUAL "NEW")
+    set(extension_target otbApplication)
+  endif()
+endif()
 # Run swig
 set(CMAKE_SWIG_FLAGS ${CMAKE_SWIG_GLOBAL_FLAGS})
 if(NUMPY_FOUND)
@@ -36,34 +44,35 @@ set(SWIG_MODULE_otbApplication_EXTRA_DEPS
      otbPythonLogOutput.h
      otbProgressReporterManager.h
      OTBApplicationEngine)
-SWIG_add_module( otbApplication python ../otbApplication.i 
-                                        otbApplicationPYTHON_wrap.cxx 
-                                        itkPyCommand.cxx
-                                        ../python/otbPythonLogOutput.cxx
-                                        ../python/otbProgressReporterManager.cxx)
-SWIG_link_libraries( otbApplication ${PYTHON_LIBRARIES} OTBApplicationEngine )
-set_target_properties(_otbApplication PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SWIG_OUTDIR})
+swig_add_library( otbApplication
+    LANGUAGE python
+    SOURCES ../otbApplication.i
+            itkPyCommand.cxx
+            otbPythonLogOutput.cxx
+            otbProgressReporterManager.cxx)
+swig_link_libraries( otbApplication ${PYTHON_LIBRARIES} OTBApplicationEngine )
+set_target_properties(${extension_target} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SWIG_OUTDIR})
 
 if(MSVC)
-  set_source_files_properties( ${CMAKE_CURRENT_BINARY_DIR}/otbApplicationPYTHON_wrap.cxx COMPILE_FLAGS "/wd4005" )
+  set_source_files_properties( ${CMAKE_SWIG_OUTDIR}/otbApplicationPYTHON_wrap.cxx COMPILE_FLAGS "/wd4005" )
 else()
-  set_source_files_properties( ${CMAKE_CURRENT_BINARY_DIR}/otbApplicationPYTHON_wrap.cxx COMPILE_FLAGS "-w" )
+  set_source_files_properties( ${CMAKE_SWIG_OUTDIR}/otbApplicationPYTHON_wrap.cxx COMPILE_FLAGS "-w" )
 endif()
 
 # byte-compile the resulting python file
 add_custom_command(
-    TARGET _otbApplication
+    TARGET ${extension_target}
     POST_BUILD
     COMMAND ${CMAKE_COMMAND} -E echo "Byte-compiling otbApplication.py"
     COMMAND ${PYTHON_EXECUTABLE}
     ${CMAKE_SOURCE_DIR}/CMake/PythonCompile.py
     ${CMAKE_SWIG_OUTDIR}/otbApplication.py
-    DEPENDS _otbApplication
+    DEPENDS ${extension_target}
   )
 
-otb_module_target_label( _otbApplication )
+otb_module_target_label( ${extension_target} )
 
-install( TARGETS _otbApplication
+install( TARGETS ${extension_target}
          DESTINATION ${OTB_INSTALL_PYTHON_DIR}
          COMPONENT RuntimeLibraries )
 
diff --git a/Modules/Wrappers/SWIG/test/python/CMakeLists.txt b/Modules/Wrappers/SWIG/test/python/CMakeLists.txt
index 7b0bd59465..968ec181ea 100644
--- a/Modules/Wrappers/SWIG/test/python/CMakeLists.txt
+++ b/Modules/Wrappers/SWIG/test/python/CMakeLists.txt
@@ -19,7 +19,7 @@
 #
 
 set(TEST_DRIVER otbTestDriver
-    --add-before-env PYTHONPATH        $<TARGET_FILE_DIR:_otbApplication>
+    --add-before-env PYTHONPATH        ${CMAKE_BINARY_DIR}/${OTB_INSTALL_PYTHON_DIR}
     --add-before-env OTB_APPLICATION_PATH $<TARGET_FILE_DIR:otbapp_Smoothing> )
 
 if(WIN32)
-- 
GitLab