Simplify CMake policy guard
[libftdi] / python / CMakeLists.txt
index bf88e23..4f758d5 100644 (file)
@@ -1,69 +1,79 @@
-option ( PYTHON_BINDINGS "Build python bindings via swig" ON )
+# swig_add_library behavior changed in cmake 3.13 to no longer set
+# SWIG_MODULE_<target>_REAL_NAME, so restore the old behavior.
+if ( POLICY CMP0078 )
+  cmake_policy( SET CMP0078 OLD )
+endif ()
 
-if ( PYTHON_BINDINGS )
-  find_package ( SWIG )
-  find_package ( PythonLibs )
-  find_package ( PythonInterp )
+# workaround for cmake bug #0013449
+if ( NOT DEFINED CMAKE_FIND_ROOT_PATH OR NOT CMAKE_VERSION VERSION_LESS 3.0.0 )
+  find_package ( SWIG REQUIRED )
+else ()
+  find_program ( SWIG_EXECUTABLE NAMES swig2.0 swig )
+  if ( SWIG_EXECUTABLE )
+    set ( SWIG_USE_FILE ${CMAKE_ROOT}/Modules/UseSWIG.cmake )
+    set ( SWIG_FOUND TRUE )
+  endif ()
 endif ()
+find_package ( PythonLibs REQUIRED )
+find_package ( PythonInterp REQUIRED )
 
-if ( SWIG_FOUND AND PYTHONLIBS_FOUND AND PYTHONINTERP_FOUND )
-  include ( UseSWIG )
-  include_directories ( BEFORE ${CMAKE_SOURCE_DIR}/src )
-  include_directories ( ${PYTHON_INCLUDE_DIRS} )
-  link_directories ( ${CMAKE_CURRENT_BINARY_DIR}/../src )
+include ( UseSWIG )
+include_directories ( BEFORE ${CMAKE_SOURCE_DIR}/src )
+include_directories ( ${PYTHON_INCLUDE_DIRS} )
+link_directories ( ${CMAKE_CURRENT_BINARY_DIR}/../src )
 
+if ( DOCUMENTATION )
+  set(CMAKE_SWIG_FLAGS -DDOXYGEN=${DOXYGEN_FOUND})
+endif()
+if(NOT CMAKE_VERSION VERSION_LESS 3.8.0)
+  swig_add_library ( ftdi1 LANGUAGE python SOURCES ftdi1.i )
+else ()
   swig_add_module ( ftdi1 python ftdi1.i )
-  swig_link_libraries ( ftdi1 ftdi1 )
+endif()
+swig_link_libraries ( ftdi1 ftdi1 )
 
-  # do not link python modules on debian
-  # http://www.debian.org/doc/packaging-manuals/python-policy/ch-module_packages.html
-  if ( NOT UNIX OR ( UNIX AND NOT EXISTS "/etc/debian_version" ) )
-    swig_link_libraries ( ftdi1 ${PYTHON_LIBRARIES} )
-  endif ()
+if ( LINK_PYTHON_LIBRARY )
+  swig_link_libraries ( ftdi1 ${PYTHON_LIBRARIES} )
+elseif( APPLE )
+  set_target_properties ( ${SWIG_MODULE_ftdi1_REAL_NAME} PROPERTIES LINK_FLAGS "-undefined dynamic_lookup" )
+endif ()
 
-  execute_process ( COMMAND ${PYTHON_EXECUTABLE} -c "from distutils import sysconfig; print( sysconfig.get_python_lib( plat_specific=True, prefix='${CMAKE_INSTALL_PREFIX}' ) )"
-                    OUTPUT_VARIABLE _ABS_PYTHON_MODULE_PATH
-                    OUTPUT_STRIP_TRAILING_WHITESPACE )
-                      
-  get_filename_component ( _ABS_PYTHON_MODULE_PATH ${_ABS_PYTHON_MODULE_PATH} ABSOLUTE )
-  file ( RELATIVE_PATH _REL_PYTHON_MODULE_PATH ${CMAKE_INSTALL_PREFIX} ${_ABS_PYTHON_MODULE_PATH} )                   
-                        
-  set ( PYTHON_MODULE_PATH
-        ${_REL_PYTHON_MODULE_PATH}
-      )
-        
-  INSTALL ( FILES ${CMAKE_CURRENT_BINARY_DIR}/_ftdi1.so DESTINATION ${PYTHON_MODULE_PATH} )
-  INSTALL ( FILES ${CMAKE_CURRENT_BINARY_DIR}/ftdi1.py DESTINATION ${PYTHON_MODULE_PATH} )
+set_target_properties ( ${SWIG_MODULE_ftdi1_REAL_NAME} PROPERTIES NO_SONAME ON )
 
-  if ( DOCUMENTATION AND DOXYGEN_FOUND )
+execute_process ( COMMAND ${PYTHON_EXECUTABLE} -c "from distutils import sysconfig; print( sysconfig.get_python_lib( plat_specific=True, prefix='${CMAKE_INSTALL_PREFIX}' ) )"
+                  OUTPUT_VARIABLE _ABS_PYTHON_MODULE_PATH
+                  OUTPUT_STRIP_TRAILING_WHITESPACE )
 
-      set(CMAKE_SWIG_FLAGS -DDOXYGEN=${DOXYGEN_FOUND})
+get_filename_component ( _ABS_PYTHON_MODULE_PATH ${_ABS_PYTHON_MODULE_PATH} ABSOLUTE )
+file ( RELATIVE_PATH _REL_PYTHON_MODULE_PATH ${CMAKE_INSTALL_PREFIX} ${_ABS_PYTHON_MODULE_PATH} )
 
-      # Run doxygen to only generate the xml
-      add_custom_command ( OUTPUT ${CMAKE_BINARY_DIR}/doc/xml/ftdi_8c.xml
-          COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/doc
-          COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/Doxyfile.xml
-          WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
-          DEPENDS ${c_headers};${c_sources};${cpp_sources};${cpp_headers}
-      )
+set ( PYTHON_MODULE_PATH ${_REL_PYTHON_MODULE_PATH} )
 
-      # generate .i from doxygen .xml
-      add_custom_command ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ftdi1_doc.i
-          COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/doxy2swig.py -n
-              ${CMAKE_BINARY_DIR}/doc/xml/ftdi_8c.xml
-              ${CMAKE_CURRENT_BINARY_DIR}/ftdi1_doc.i
-          DEPENDS ${CMAKE_BINARY_DIR}/doc/xml/ftdi_8c.xml
-      )
-      add_custom_target ( doc_i DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/ftdi1_doc.i )
-      add_dependencies( ${SWIG_MODULE_ftdi1_REAL_NAME} doc_i )
+install ( FILES ${CMAKE_CURRENT_BINARY_DIR}/ftdi1.py DESTINATION ${PYTHON_MODULE_PATH} )
+install ( TARGETS ${SWIG_MODULE_ftdi1_REAL_NAME} LIBRARY DESTINATION ${PYTHON_MODULE_PATH} )
 
-  endif ()
-  
-  set ( LIBFTDI_PYTHON_MODULE_PATH ${CMAKE_INSTALL_PREFIX}/${PYTHON_MODULE_PATH} )
-  set ( LIBFTDI_PYTHON_MODULE_PATH ${LIBFTDI_PYTHON_MODULE_PATH} PARENT_SCOPE ) # for ftdiconfig.cmake
-  message(STATUS "Building python bindings via swig. Will be installed under ${LIBFTDI_PYTHON_MODULE_PATH}")
+if ( DOCUMENTATION )
+    # Run doxygen to only generate the xml
+    add_custom_command ( OUTPUT ${CMAKE_BINARY_DIR}/doc/xml/ftdi_8c.xml
+        COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/doc
+        COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/Doxyfile.xml
+        WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
+        DEPENDS ${c_headers};${c_sources};${cpp_sources};${cpp_headers}
+    )
+
+    # generate .i from doxygen .xml
+    add_custom_command ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ftdi1_doc.i
+        COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/doxy2swig.py -n
+            ${CMAKE_BINARY_DIR}/doc/xml/ftdi_8c.xml
+            ${CMAKE_CURRENT_BINARY_DIR}/ftdi1_doc.i
+        DEPENDS ${CMAKE_BINARY_DIR}/doc/xml/ftdi_8c.xml
+    )
+    add_custom_target ( doc_i DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/ftdi1_doc.i )
+    add_dependencies( ${SWIG_MODULE_ftdi1_REAL_NAME} doc_i )
 
-  add_subdirectory ( examples )
-else ()
-  message(STATUS "Not building python bindings")
 endif ()
+
+set ( LIBFTDI_PYTHON_MODULE_PATH ${CMAKE_INSTALL_PREFIX}/${PYTHON_MODULE_PATH} )
+set ( LIBFTDI_PYTHON_MODULE_PATH ${LIBFTDI_PYTHON_MODULE_PATH} PARENT_SCOPE ) # for ftdiconfig.cmake
+
+add_subdirectory ( examples )