python/CMakeLists.txt: rework Python development files detection master
authorYegor Yefremov <yegorslists@googlemail.com>
Mon, 23 Jun 2025 12:44:13 +0000 (14:44 +0200)
committerThomas Jarosch <thomas.jarosch@intra2net.com>
Mon, 30 Jun 2025 11:28:35 +0000 (13:28 +0200)
Both the FindPythonInterp and FindPythonLibs modules were removed. Use
find_package(Python3 COMPONENTS Interpreter Development) to find both
the interpreter and the library.

The old modules have been deprecated since CMake 3.12.

Resolves the following warning:

CMake Warning (dev) at python/CMakeLists.txt:11 (find_package):
  Policy CMP0148 is not set: The FindPythonInterp and FindPythonLibs modules
  are removed.  Run "cmake --help-policy CMP0148" for policy details.  Use
  the cmake_policy command to set the policy and suppress this warning.

25 files changed:
.editorconfig [new file with mode: 0644]
.gitignore
CMakeLists.txt
CMakeOptions.txt
README.build
cmake/FindLibUSB.cmake [moved from cmake/FindUSB1.cmake with 76% similarity]
doc/CMakeLists.txt [new file with mode: 0644]
doc/Doxyfile.in
doc/Doxyfile.xml.in
examples/CMakeLists.txt
examples/async.c
examples/cmake_example/CMakeLists.txt
examples/eeprom.c
ftdi_eeprom/CMakeLists.txt
ftdipp/CMakeLists.txt
ftdipp/ftdi.hpp
packages/CMakeLists.txt
python/CMakeLists.txt
python/examples/CMakeLists.txt
python/ftdi1.i
src/CMakeLists.txt
src/ftdi.c
src/ftdi.h
src/ftdi_stream.c
test/CMakeLists.txt

diff --git a/.editorconfig b/.editorconfig
new file mode 100644 (file)
index 0000000..afa4632
--- /dev/null
@@ -0,0 +1,16 @@
+root = true
+
+[*]
+end_of_line = lf
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[{CMakeLists.txt,*.cmake}]
+indent_style = space
+indent_size = 2
+tab_width = 2
+
+[{*.c,*.h}]
+indent_style = space
+indent_size = 4
+tab_width = 4
index b652e9f..4d57cba 100644 (file)
@@ -9,7 +9,6 @@
 .deps/
 .libs/
 .kdev4/
-build/
 
 # kdevelop
 *.kdevelop.pcs
@@ -54,3 +53,13 @@ opt
 
 # ctags
 tags
+
+# clangd specific files
+.cache
+compile_commands.json
+
+# VSCode
+.vscode
+
+# CLion
+.idea/
index 58f664a..105f83a 100644 (file)
@@ -1,3 +1,7 @@
+cmake_minimum_required(VERSION 3.15 FATAL_ERROR)
+
+message(STATUS "CMake version: ${CMAKE_VERSION}")
+
 # Project
 project(libftdi1 C)
 set(MAJOR_VERSION 1)
@@ -5,14 +9,28 @@ set(MINOR_VERSION 5)
 set(PACKAGE libftdi1)
 set(VERSION_STRING ${MAJOR_VERSION}.${MINOR_VERSION})
 set(VERSION ${VERSION_STRING})
-set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
+set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
+
+# Target link properties INTERFACE_LINK_OPTIONS, INTERFACE_LINK_DIRECTORIES
+# and INTERFACE_LINK_DEPENDS are now transitive over private dependencies
+# of static libraries
+if (POLICY CMP0099)
+    cmake_policy(SET CMP0099 NEW)
+endif ()
 
 # CMake
-if("${CMAKE_BUILD_TYPE}" STREQUAL "")
-   set(CMAKE_BUILD_TYPE     RelWithDebInfo)
-endif("${CMAKE_BUILD_TYPE}" STREQUAL "")
-set(CMAKE_COLOR_MAKEFILE ON)
-cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
+if ("${CMAKE_BUILD_TYPE}" STREQUAL "")
+    set(CMAKE_BUILD_TYPE RelWithDebInfo)
+endif ("${CMAKE_BUILD_TYPE}" STREQUAL "")
+
+set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
+
+if (NOT PROJECT_SOURCE_DIR STREQUAL PROJECT_BINARY_DIR)
+    # Auto-create a .gitignore in the out-of-source build directory.
+    file(GENERATE OUTPUT .gitignore CONTENT "*")
+endif ()
+
+include(GNUInstallDirs)
 
 add_definitions(-Wall)
 
@@ -20,18 +38,18 @@ include(CMakeOptions.txt)
 
 # Debug build
 message("-- Build type: ${CMAKE_BUILD_TYPE}")
-if(${CMAKE_BUILD_TYPE} STREQUAL Debug)
-   add_definitions(-DDEBUG)
-endif(${CMAKE_BUILD_TYPE} STREQUAL Debug)
+if (${CMAKE_BUILD_TYPE} STREQUAL Debug)
+    add_definitions(-DDEBUG)
+endif (${CMAKE_BUILD_TYPE} STREQUAL Debug)
 
-# find libusb
-find_package ( USB1 REQUIRED )
-include_directories ( ${LIBUSB_INCLUDE_DIR} )
+# Find libusb
+find_package(LibUSB REQUIRED)
+include_directories(${LIBUSB_INCLUDE_DIR})
 
 # Find Boost
-if (FTDIPP OR BUILD_TESTS)
-  find_package( Boost REQUIRED )
-endif()
+if (BUILD_TESTS)
+    find_package(Boost REQUIRED)
+endif ()
 
 # Set components
 set(CPACK_COMPONENTS_ALL sharedlibs staticlibs headers)
@@ -40,207 +58,211 @@ set(CPACK_COMPONENT_STATICLIBS_DISPLAY_NAME "Static libraries")
 set(CPACK_COMPONENT_HEADERS_DISPLAY_NAME "C++ Headers")
 
 set(CPACK_COMPONENT_SHAREDLIBS_DESCRIPTION
-"Shared library for general use.")
+        "Shared library for general use.")
 set(CPACK_COMPONENT_STATICLIBS_DESCRIPTION
-"Static library, good if you want to embed libftdi1 in your application.")
+        "Static library, good if you want to embed libftdi1 in your application.")
 set(CPACK_COMPONENT_HEADERS_DESCRIPTION
-"C/C++ header files.")
+        "C/C++ header files.")
 
 set(CPACK_COMPONENT_SHAREDLIBS_GROUP "Development")
 set(CPACK_COMPONENT_STATICLIBS_GROUP "Development")
-set(CPACK_COMPONENT_HEADERS_GROUP    "Development")
-
-# guess LIB_SUFFIX, don't take debian multiarch into account 
-if ( NOT DEFINED LIB_SUFFIX )
-  if( CMAKE_SYSTEM_NAME MATCHES "Linux"
-      AND NOT CMAKE_CROSSCOMPILING
-      AND NOT EXISTS "/etc/debian_version"
-      AND NOT EXISTS "/etc/arch-release" )
-    if ( "${CMAKE_SIZEOF_VOID_P}" EQUAL "8" )
-      set ( LIB_SUFFIX 64 )
+set(CPACK_COMPONENT_HEADERS_GROUP "Development")
+
+# guess LIB_SUFFIX, don't take debian multiarch into account
+if (NOT DEFINED LIB_SUFFIX)
+    if (CMAKE_SYSTEM_NAME MATCHES "Linux"
+            AND NOT CMAKE_CROSSCOMPILING
+            AND NOT EXISTS "/etc/debian_version"
+            AND NOT EXISTS "/etc/arch-release")
+        if ("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
+            set(LIB_SUFFIX 64)
+        endif ()
     endif ()
-  endif ()
 endif ()
 
-if(NOT APPLE)
-  if(CMAKE_SIZEOF_VOID_P EQUAL 4)
-      SET(PACK_ARCH "")
-    else(CMAKE_SIZEOF_VOID_P EQUAL 8)
-      SET(PACK_ARCH .x86_64)
-  endif(CMAKE_SIZEOF_VOID_P EQUAL 4)
-else(NOT APPLE)
-  SET(PACK_ARCH "")
-endif(NOT APPLE)
+if (NOT APPLE)
+    if (CMAKE_SIZEOF_VOID_P EQUAL 4)
+        SET(PACK_ARCH "")
+    elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
+        SET(PACK_ARCH .x86_64)
+    endif (CMAKE_SIZEOF_VOID_P EQUAL 4)
+else (NOT APPLE)
+    SET(PACK_ARCH "")
+endif (NOT APPLE)
 
 # Package information
-set(CPACK_PACKAGE_VERSION              ${VERSION_STRING})
-set(CPACK_PACKAGE_CONTACT              "Intra2net AG <libftdi@developer.intra2net.com>")
-set(CPACK_PACKAGE_DESCRIPTION          "libftdi1 library.")
-set(CPACK_PACKAGE_DESCRIPTION_SUMMARY  ${CPACK_PACKAGE_DESCRIPTION}
-                                       )
+set(CPACK_PACKAGE_VERSION ${VERSION_STRING})
+set(CPACK_PACKAGE_CONTACT "Intra2net AG <libftdi@developer.intra2net.com>")
+set(CPACK_PACKAGE_DESCRIPTION "libftdi1 library.")
+set(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${CPACK_PACKAGE_DESCRIPTION})
+
 # Package settings
-if ( UNIX )
-  set(CPACK_GENERATOR                    "DEB;RPM")
-  set(CPACK_CMAKE_GENERATOR              "Unix Makefiles")
-  set(CPACK_PACKAGE_NAME                 ${PROJECT_NAME})
-  set(CPACK_PACKAGE_FILE_NAME            ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}${PACK_ARCH})
+if (UNIX)
+    set(CPACK_GENERATOR "DEB;RPM")
+    set(CPACK_CMAKE_GENERATOR "Unix Makefiles")
+    set(CPACK_PACKAGE_NAME ${PROJECT_NAME})
+    set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}${PACK_ARCH})
 endif ()
 
-if ( WIN32 )
-  set ( CPACK_GENERATOR                    "NSIS" )
-  set ( CPACK_CMAKE_GENERATOR              "MinGW Makefiles" )
-  set ( CPACK_PACKAGE_NAME                 "${PROJECT_NAME}" )
-  set ( CPACK_PACKAGE_VENDOR               "" )
-  set ( CPACK_PACKAGE_INSTALL_DIRECTORY    "libftdi1" )
-  set ( CPACK_PACKAGE_FILE_NAME            "${PROJECT_NAME}-${VERSION_STRING}-win32")
-  set ( CPACK_NSIS_DISPLAY_NAME            "libftdi1" )
-  set ( CPACK_NSIS_MODIFY_PATH             ON )
+if (WIN32)
+    set(CPACK_GENERATOR "NSIS")
+    set(CPACK_CMAKE_GENERATOR "MinGW Makefiles")
+    set(CPACK_PACKAGE_NAME "${PROJECT_NAME}")
+    set(CPACK_PACKAGE_VENDOR "")
+    set(CPACK_PACKAGE_INSTALL_DIRECTORY "libftdi1")
+    set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${VERSION_STRING}-win32")
+    set(CPACK_NSIS_DISPLAY_NAME "libftdi1")
+    set(CPACK_NSIS_MODIFY_PATH ON)
 endif ()
 
-set(CPACK_RESOURCE_FILE_LICENSE        ${CMAKE_SOURCE_DIR}/LICENSE)
+set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE)
 
-set(CPACK_SOURCE_GENERATOR             TGZ)
-set(CPACK_SOURCE_IGNORE_FILES          "\\\\.git;~$;build/")
-set(CPACK_SOURCE_PACKAGE_FILE_NAME     ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION})
+set(CPACK_SOURCE_GENERATOR TGZ)
+set(CPACK_SOURCE_IGNORE_FILES "\\\\.git;~$;build/")
+set(CPACK_SOURCE_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION})
 
 # Subdirectories
-if ( UNIX )
-  set ( CPACK_SET_DESTDIR ON )
+if (UNIX)
+    set(CPACK_SET_DESTDIR ON)
 endif ()
 
 # "make dist" target
 set(ARCHIVE_NAME ${CMAKE_PROJECT_NAME}-${VERSION_STRING})
 add_custom_target(dist
-    COMMAND git archive --prefix=${ARCHIVE_NAME}/ HEAD
-            | bzip2 > ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar.bz2
-    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
-
-if ( DOCUMENTATION )
-   find_package ( Doxygen REQUIRED)
-
-   # Copy doxy.config.in
-   set(top_srcdir ${CMAKE_SOURCE_DIR})
-   configure_file(${CMAKE_SOURCE_DIR}/doc/Doxyfile.in ${CMAKE_BINARY_DIR}/Doxyfile )
-   configure_file(${CMAKE_SOURCE_DIR}/doc/Doxyfile.xml.in ${CMAKE_BINARY_DIR}/Doxyfile.xml )
-
-   # Run doxygen
-   add_custom_command(
-    OUTPUT ${CMAKE_BINARY_DIR}/doc/html/index.html
-    COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/doc
-    COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/Doxyfile
-    DEPENDS ${c_headers};${c_sources};${cpp_sources};${cpp_headers}
-   )
-
-   add_custom_target(docs ALL DEPENDS ${CMAKE_BINARY_DIR}/doc/html/index.html)
-endif ()
+        COMMAND git archive --prefix=${ARCHIVE_NAME}/ HEAD
+        | bzip2 > ${PROJECT_BINARY_DIR}/${ARCHIVE_NAME}.tar.bz2
+        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
 
 add_subdirectory(src)
-if ( FTDIPP )
-  project(libftdi1 C CXX)
-  add_subdirectory(ftdipp)
-endif ()
-if ( PYTHON_BINDINGS )
-add_subdirectory(python)
-endif ()
-if ( FTDI_EEPROM )
-  add_subdirectory(ftdi_eeprom)
-endif ()
-if ( EXAMPLES )
-  add_subdirectory(examples)
-endif ()
 add_subdirectory(packages)
-if ( BUILD_TESTS )
-  project(libftdi1 C CXX)
-  add_subdirectory(test)
-endif ()
+
+if (DOCUMENTATION)
+    add_subdirectory(doc)
+endif (DOCUMENTATION)
+
+if (FTDIPP)
+    project(libftdi1 C CXX)
+    add_subdirectory(ftdipp)
+endif (FTDIPP)
+
+if (PYTHON_BINDINGS)
+    add_subdirectory(python)
+endif (PYTHON_BINDINGS)
+
+if (FTDI_EEPROM)
+    add_subdirectory(ftdi_eeprom)
+endif (FTDI_EEPROM)
+
+if (EXAMPLES)
+    add_subdirectory(examples)
+endif (EXAMPLES)
+
+if (BUILD_TESTS)
+    project(libftdi1 C CXX)
+    add_subdirectory(test)
+endif (BUILD_TESTS)
 
 # PkgConfig
-set(prefix      ${CMAKE_INSTALL_PREFIX})
+set(prefix ${CMAKE_INSTALL_PREFIX})
 set(exec_prefix ${CMAKE_INSTALL_PREFIX}/bin)
-set(includedir  ${CMAKE_INSTALL_PREFIX}/include/${PROJECT_NAME})
-
-if(${UNIX})
-   set(libdir      ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX})
-endif(${UNIX})
-if(${WIN32})
-   set(libdir      ${CMAKE_INSTALL_PREFIX}/bin)
-endif(${WIN32})
+set(includedir ${CMAKE_INSTALL_PREFIX}/include/${PROJECT_NAME})
+
+if (${UNIX})
+    set(libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
+endif (${UNIX})
+if (${WIN32})
+    set(libdir ${CMAKE_INSTALL_PREFIX}/bin)
+    if (STATICLIBS)
+        list(APPEND libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
+    endif ()
+endif (${WIN32})
 
-configure_file(${CMAKE_SOURCE_DIR}/libftdi1.pc.in ${CMAKE_BINARY_DIR}/libftdi1.pc @ONLY)
-configure_file(${CMAKE_SOURCE_DIR}/libftdipp1.pc.in ${CMAKE_BINARY_DIR}/libftdipp1.pc @ONLY)
-install(FILES ${CMAKE_BINARY_DIR}/libftdi1.pc ${CMAKE_BINARY_DIR}/libftdipp1.pc
-        DESTINATION lib${LIB_SUFFIX}/pkgconfig)
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libftdi1.pc.in ${CMAKE_CURRENT_BINARY_DIR}/libftdi1.pc @ONLY)
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libftdipp1.pc.in ${CMAKE_CURRENT_BINARY_DIR}/libftdipp1.pc @ONLY)
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libftdi1.pc ${CMAKE_CURRENT_BINARY_DIR}/libftdipp1.pc
+        DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
 
 if (UNIX OR MINGW)
-  configure_file ( libftdi1-config.in ${CMAKE_CURRENT_BINARY_DIR}/libftdi1-config @ONLY )
-  install ( PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libftdi1-config
-            DESTINATION bin )
+    configure_file(libftdi1-config.in ${CMAKE_CURRENT_BINARY_DIR}/libftdi1-config @ONLY)
+    install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libftdi1-config
+            DESTINATION bin)
 endif ()
 
 # config script install path
-if ( NOT DEFINED LIBFTDI_CMAKE_CONFIG_DIR )
-  set ( LIBFTDI_CMAKE_CONFIG_DIR lib${LIB_SUFFIX}/cmake/libftdi1 )
+if (NOT DEFINED LIBFTDI_CMAKE_CONFIG_DIR)
+    set(LIBFTDI_CMAKE_CONFIG_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/libftdi1)
 endif ()
 
-set ( LIBFTDI_INCLUDE_DIR ${includedir} )
-set ( LIBFTDI_INCLUDE_DIRS ${LIBFTDI_INCLUDE_DIR} )
-set ( LIBFTDI_LIBRARY ftdi1 )
-set ( LIBFTDI_LIBRARIES ${LIBFTDI_LIBRARY} )
-list ( APPEND LIBFTDI_LIBRARIES ${LIBUSB_LIBRARIES} )
-set ( LIBFTDI_STATIC_LIBRARY ftdi1.a )
-set ( LIBFTDI_STATIC_LIBRARIES ${LIBFTDI_STATIC_LIBRARY} )
-list ( APPEND LIBFTDI_STATIC_LIBRARIES ${LIBUSB_LIBRARIES} )
-if ( FTDIPP )
-  set ( LIBFTDIPP_LIBRARY ftdipp1 )
-  set ( LIBFTDIPP_LIBRARIES ${LIBFTDIPP_LIBRARY} )
-  list ( APPEND LIBFTDIPP_LIBRARIES ${LIBUSB_LIBRARIES} )
-endif ()
-set ( LIBFTDI_LIBRARY_DIRS ${libdir} )
-set ( LIBFTDI_ROOT_DIR ${prefix} )
-set ( LIBFTDI_VERSION_STRING ${VERSION_STRING} )
-set ( LIBFTDI_VERSION_MAJOR ${MAJOR_VERSION} )
-set ( LIBFTDI_VERSION_MINOR ${MINOR_VERSION} )
-
-set ( LIBFTDI_USE_FILE ${CMAKE_INSTALL_PREFIX}/${LIBFTDI_CMAKE_CONFIG_DIR}/UseLibFTDI1.cmake )
-
-if(CMAKE_VERSION VERSION_LESS 2.8.8) 
-  configure_file ( cmake/LibFTDI1Config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/LibFTDI1Config.cmake @ONLY )
-  configure_file ( cmake/LibFTDI1ConfigVersion.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/LibFTDI1ConfigVersion.cmake @ONLY )
-else ()
-  include(CMakePackageConfigHelpers)
-
-  configure_package_config_file (
-    cmake/LibFTDI1Config.cmake.in
-    ${CMAKE_CURRENT_BINARY_DIR}/LibFTDI1Config.cmake
-    INSTALL_DESTINATION ${LIBFTDI_CMAKE_CONFIG_DIR}
-    PATH_VARS
-      LIBFTDI_USE_FILE
-      LIBFTDI_ROOT_DIR
-      LIBFTDI_INCLUDE_DIR
-      LIBFTDI_INCLUDE_DIRS
-      LIBFTDI_LIBRARY_DIRS
-    NO_CHECK_REQUIRED_COMPONENTS_MACRO
-  )
-  write_basic_package_version_file (
-    LibFTDI1ConfigVersion.cmake 
-    VERSION ${LIBFTDI_VERSION_STRING} 
-    COMPATIBILITY AnyNewerVersion
-  )
+set(LIBFTDI_INCLUDE_DIR ${includedir})
+set(LIBFTDI_INCLUDE_DIRS ${LIBFTDI_INCLUDE_DIR})
+
+# Set up library variables based on what's being built
+if (SHAREDLIBS)
+    set(LIBFTDI_LIBRARY ftdi1)
+    set(LIBFTDI_LIBRARIES ${LIBFTDI_LIBRARY})
+    list(APPEND LIBFTDI_LIBRARIES ${LIBUSB_LIBRARIES})
 endif ()
 
+if (STATICLIBS)
+    set(LIBFTDI_STATIC_LIBRARY ftdi1.a)
+    set(LIBFTDI_STATIC_LIBRARIES ${LIBFTDI_STATIC_LIBRARY})
+    list(APPEND LIBFTDI_STATIC_LIBRARIES ${LIBUSB_LIBRARIES})
+endif ()
 
-install ( FILES 
-            ${CMAKE_CURRENT_BINARY_DIR}/LibFTDI1Config.cmake
-            ${CMAKE_CURRENT_BINARY_DIR}/LibFTDI1ConfigVersion.cmake
-            cmake/UseLibFTDI1.cmake
+if (FTDIPP)
+    if (SHAREDLIBS)
+        set(LIBFTDIPP_LIBRARY ftdipp1)
+        set(LIBFTDIPP_LIBRARIES ${LIBFTDIPP_LIBRARY})
+        list(APPEND LIBFTDIPP_LIBRARIES ${LIBUSB_LIBRARIES})
+    endif ()
+    if (STATICLIBS)
+        set(LIBFTDIPP_STATIC_LIBRARY ftdipp1.a)
+        set(LIBFTDIPP_STATIC_LIBRARIES ${LIBFTDIPP_STATIC_LIBRARY})
+        list(APPEND LIBFTDIPP_STATIC_LIBRARIES ${LIBUSB_LIBRARIES})
+    endif ()
+endif ()
 
-          DESTINATION ${LIBFTDI_CMAKE_CONFIG_DIR}
-        )
+set(LIBFTDI_LIBRARY_DIRS ${libdir})
+set(LIBFTDI_ROOT_DIR ${prefix})
+set(LIBFTDI_VERSION_STRING ${VERSION_STRING})
+set(LIBFTDI_VERSION_MAJOR ${MAJOR_VERSION})
+set(LIBFTDI_VERSION_MINOR ${MINOR_VERSION})
+
+set(LIBFTDI_USE_FILE ${CMAKE_INSTALL_PREFIX}/${LIBFTDI_CMAKE_CONFIG_DIR}/UseLibFTDI1.cmake)
+
+include(CMakePackageConfigHelpers)
+
+configure_package_config_file(
+        cmake/LibFTDI1Config.cmake.in
+        ${CMAKE_CURRENT_BINARY_DIR}/LibFTDI1Config.cmake
+        INSTALL_DESTINATION ${LIBFTDI_CMAKE_CONFIG_DIR}
+        PATH_VARS
+        LIBFTDI_USE_FILE
+        LIBFTDI_ROOT_DIR
+        LIBFTDI_INCLUDE_DIR
+        LIBFTDI_INCLUDE_DIRS
+        LIBFTDI_LIBRARY_DIRS
+        NO_CHECK_REQUIRED_COMPONENTS_MACRO
+)
+write_basic_package_version_file(
+        LibFTDI1ConfigVersion.cmake
+        VERSION ${LIBFTDI_VERSION_STRING}
+        COMPATIBILITY AnyNewerVersion
+)
+
+install(
+        FILES
+        ${CMAKE_CURRENT_BINARY_DIR}/LibFTDI1Config.cmake
+        ${CMAKE_CURRENT_BINARY_DIR}/LibFTDI1ConfigVersion.cmake
+        cmake/UseLibFTDI1.cmake
+        DESTINATION ${LIBFTDI_CMAKE_CONFIG_DIR}
+)
 
 include(CPack)
 
-message (STATUS "Summary of build options:
+message(STATUS "Summary of build options:
 
+  Build shared libs: ${SHAREDLIBS}
   Build static libs: ${STATICLIBS}
   Build C++ bindings: ${FTDIPP}
   Build Python bindings: ${PYTHON_BINDINGS}
index 07b5887..b4d3cfa 100644 (file)
@@ -1,8 +1,9 @@
-option ( STATICLIBS "Build static libraries" ON )
-option ( BUILD_TESTS "Build unit tests with Boost Unit Test framework" OFF )
-option ( DOCUMENTATION "Generate API documentation with Doxygen" OFF )
-option ( EXAMPLES "Build example programs" ON )
-option ( FTDIPP "Build C++ binding library libftdi1++" OFF )
-option ( FTDI_EEPROM "Build ftdi_eeprom" ON )
-option ( PYTHON_BINDINGS "Build python bindings via swig" OFF )
-option ( LINK_PYTHON_LIBRARY "Link against python libraries" OFF )
+option(STATICLIBS "Build static libraries" ON)
+option(SHAREDLIBS "Build shared/dynamic libraries" ON)
+option(BUILD_TESTS "Build unit tests with Boost Unit Test framework" OFF)
+option(DOCUMENTATION "Generate API documentation with Doxygen" OFF)
+option(EXAMPLES "Build example programs" ON)
+option(FTDIPP "Build C++ binding library libftdi1++" OFF)
+option(FTDI_EEPROM "Build ftdi_eeprom" ON)
+option(PYTHON_BINDINGS "Build python bindings via swig" OFF)
+option(LINK_PYTHON_LIBRARY "Link against python libraries" OFF)
index e130ca0..54c253f 100644 (file)
@@ -14,7 +14,7 @@ earlier, it is recommended you build libusbx-1.0.14 or later).
 
 sudo apt-get install libconfuse-dev (for ftdi-eeprom) (yum install libconfuse-devel)
 sudo apt-get install swig python-dev (for python bindings) (yum install swig python-devel)
-sudo apt-get install libboost-all-dev (for C++ binding and unit test) (yum install boost-devel)
+sudo apt-get install libboost-all-dev (for unit test) (yum install boost-devel)
 
 3) Clone the git repository
 mkdir libftdi
similarity index 76%
rename from cmake/FindUSB1.cmake
rename to cmake/FindLibUSB.cmake
index b90e297..8bb3b11 100644 (file)
@@ -1,4 +1,4 @@
-# - Try to find the freetype library
+# - Try to find the libusb library
 # Once done this defines
 #
 #  LIBUSB_FOUND - system has libusb
@@ -10,7 +10,6 @@
 # Redistribution and use is allowed according to the terms of the BSD license.
 # For details see the accompanying COPYING-CMAKE-SCRIPTS file.
 
-
 if (LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES)
 
   # in cache already
@@ -22,16 +21,18 @@ else (LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES)
   find_package(PkgConfig)
   pkg_check_modules(PC_LIBUSB libusb-1.0)
 
-  FIND_PATH(LIBUSB_INCLUDE_DIR libusb.h
+  find_path(LIBUSB_INCLUDE_DIR libusb.h
     PATH_SUFFIXES libusb-1.0
     PATHS ${PC_LIBUSB_INCLUDEDIR} ${PC_LIBUSB_INCLUDE_DIRS})
 
-  FIND_LIBRARY(LIBUSB_LIBRARIES NAMES usb-1.0
+  find_library(LIBUSB_LIBRARIES NAMES ${PC_LIBUSB_LIBRARIES}
     PATHS ${PC_LIBUSB_LIBDIR} ${PC_LIBUSB_LIBRARY_DIRS})
 
   include(FindPackageHandleStandardArgs)
-  FIND_PACKAGE_HANDLE_STANDARD_ARGS(LIBUSB DEFAULT_MSG LIBUSB_LIBRARIES LIBUSB_INCLUDE_DIR)
+  find_package_handle_standard_args(
+    LibUSB DEFAULT_MSG LIBUSB_LIBRARIES LIBUSB_INCLUDE_DIR
+  )
 
-  MARK_AS_ADVANCED(LIBUSB_INCLUDE_DIR LIBUSB_LIBRARIES)
+  mark_as_advanced(LIBUSB_INCLUDE_DIR LIBUSB_LIBRARIES)
 
 endif (LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES)
diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt
new file mode 100644 (file)
index 0000000..8e83711
--- /dev/null
@@ -0,0 +1,26 @@
+ find_package(Doxygen REQUIRED)
+
+ # Copy doxy.config.in
+ configure_file(
+         ${PROJECT_SOURCE_DIR}/doc/Doxyfile.in
+         ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
+ )
+
+ configure_file(
+         ${PROJECT_SOURCE_DIR}/doc/Doxyfile.xml.in
+         ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile.xml
+ )
+
+ # Run doxygen
+ add_custom_command(
+         OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/html/index.html
+         COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
+         COMMENT "Generating API documentation"
+         DEPENDS ${c_headers};${c_sources};${cpp_sources};${cpp_headers}
+ )
+
+ add_custom_target(
+         docs ALL
+         COMMENT "Documentation target docs"
+         DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/html/index.html
+ )
index a4f59ee..a05fe57 100644 (file)
@@ -58,7 +58,7 @@ PROJECT_LOGO           =
 # entered, it will be relative to the location where doxygen was started. If
 # left blank the current directory will be used.
 
-OUTPUT_DIRECTORY       = doc
+OUTPUT_DIRECTORY       = @CMAKE_CURRENT_BINARY_DIR@
 
 # If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
 # directories (in 2 levels) under the output directory of each output format and
@@ -230,12 +230,6 @@ TAB_SIZE               = 4
 
 ALIASES                =
 
-# This tag can be used to specify a number of word-keyword mappings (TCL only).
-# A mapping has the form "name=value". For example adding "class=itcl::class"
-# will allow you to use the command class in the itcl::class meaning.
-
-TCL_SUBST              =
-
 # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
 # only. Doxygen will then generate output that is more tailored for C. For
 # instance, some of the names that are used will be different. The list of all
@@ -765,8 +759,8 @@ WARN_LOGFILE           =
 # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
 # Note: If this tag is empty the current directory is searched.
 
-INPUT                  = @top_srcdir@/src \
-                         @top_srcdir@/ftdipp
+INPUT                  = @PROJECT_SOURCE_DIR@/src \
+                         @PROJECT_SOURCE_DIR@/ftdipp
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
@@ -839,7 +833,7 @@ EXCLUDE_SYMBOLS        =
 # that contain example code fragments that are included (see the \include
 # command).
 
-EXAMPLE_PATH           = @top_srcdir@/examples
+EXAMPLE_PATH           = @PROJECT_SOURCE_DIR@/examples
 
 # If the value of the EXAMPLE_PATH tag contains directories, you can use the
 # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
@@ -1006,13 +1000,6 @@ VERBATIM_HEADERS       = YES
 
 ALPHABETICAL_INDEX     = NO
 
-# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
-# which the alphabetical index list will be split.
-# Minimum value: 1, maximum value: 20, default value: 5.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
-COLS_IN_ALPHA_INDEX    = 5
-
 # In case all classes in a project start with a common prefix, all classes will
 # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
 # can be used to specify a prefix (or a list of prefixes) that should be ignored
@@ -1615,7 +1602,7 @@ COMPACT_LATEX          = NO
 # The default value is: a4.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
-PAPER_TYPE             = a4wide
+PAPER_TYPE             = a4
 
 # The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
 # that should be included in the LaTeX output. The package can be specified just
@@ -2072,12 +2059,6 @@ EXTERNAL_GROUPS        = YES
 
 EXTERNAL_PAGES         = YES
 
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of 'which perl').
-# The default file (with absolute path) is: /usr/bin/perl.
-
-PERL_PATH              = /usr/bin/perl
-
 #---------------------------------------------------------------------------
 # Configuration options related to the dot tool
 #---------------------------------------------------------------------------
@@ -2091,15 +2072,6 @@ PERL_PATH              = /usr/bin/perl
 
 CLASS_DIAGRAMS         = YES
 
-# You can define message sequence charts within doxygen comments using the \msc
-# command. Doxygen will then run the mscgen tool (see:
-# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where
-# the mscgen tool resides. If left empty the tool is assumed to be found in the
-# default search path.
-
-MSCGEN_PATH            =
-
 # You can include diagrams made with dia in doxygen documentation. Doxygen will
 # then run dia to produce the diagram and insert it in the documentation. The
 # DIA_PATH tag allows you to specify the directory where the dia binary resides.
index 8a32509..ab57478 100644 (file)
@@ -2,7 +2,7 @@
 
 # xml generation only
 # keep settings but shut off all other generation
-@INCLUDE = Doxyfile
+@INCLUDE = doc/Doxyfile
 
 GENERATE_TODOLIST      = NO
 GENERATE_TESTLIST      = NO
index dd8ffbe..08e1e53 100644 (file)
@@ -1,7 +1,7 @@
 # Includes
-include_directories( ${CMAKE_CURRENT_SOURCE_DIR}
-               ${CMAKE_CURRENT_BINARY_DIR}
-               )
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}
+        ${CMAKE_CURRENT_BINARY_DIR}
+)
 
 # Targets
 add_executable(simple simple.c)
@@ -15,9 +15,9 @@ add_executable(baud_test baud_test.c)
 add_executable(stream_test stream_test.c)
 add_executable(eeprom eeprom.c)
 add_executable(async async.c)
-if(NOT MINGW)
+if (NOT MINGW)
     add_executable(purge_test purge_test.c)
-endif(NOT MINGW)
+endif (NOT MINGW)
 
 # Linkage
 target_link_libraries(simple ftdi1)
@@ -31,21 +31,21 @@ target_link_libraries(baud_test ftdi1)
 target_link_libraries(stream_test ftdi1)
 target_link_libraries(eeprom ftdi1)
 target_link_libraries(async ftdi1)
-if(NOT MINGW)
+if (NOT MINGW)
     target_link_libraries(purge_test ftdi1)
-endif(NOT MINGW)
+endif (NOT MINGW)
 
 # libftdi++ examples
-if( FTDIPP )
-       include_directories(BEFORE ${CMAKE_SOURCE_DIR}/ftdipp
-                       ${Boost_INCLUDE_DIRS})
+if (FTDIPP)
+    include_directories(BEFORE ${PROJECT_SOURCE_DIR}/ftdipp
+    )
 
-       # Target
-       add_executable(find_all_pp find_all_pp.cpp)
+    # Target
+    add_executable(find_all_pp find_all_pp.cpp)
 
-       # Linkage
-       target_link_libraries(find_all_pp ftdipp1)
-endif( FTDIPP )
+    # Linkage
+    target_link_libraries(find_all_pp ftdipp1)
+endif (FTDIPP)
 
 # Source includes
-include_directories(BEFORE ${CMAKE_SOURCE_DIR}/src)
+include_directories(BEFORE ${PROJECT_SOURCE_DIR}/src)
index 241bb7f..63933c8 100644 (file)
@@ -19,8 +19,6 @@
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
 #include <unistd.h>
 #include <getopt.h>
 #include <ftdi.h>
@@ -30,7 +28,7 @@ int main(int argc, char **argv)
     struct ftdi_context *ftdi;
     int do_read = 0;
     int do_write = 0;
-    int i, f, retval;
+    int i, f, retval = EXIT_SUCCESS;
 
     if ((ftdi = ftdi_new()) == 0)
     {
index fe203ed..acd3880 100644 (file)
@@ -1,13 +1,13 @@
-cmake_minimum_required ( VERSION 2.8 )
+cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
 
-project ( example C )
+project(example C)
 
-find_package ( LibFTDI1 NO_MODULE REQUIRED )
-include ( ${LIBFTDI_USE_FILE} )
+find_package(LibFTDI1 NO_MODULE REQUIRED)
+include(${LIBFTDI_USE_FILE})
 
-add_executable ( example main.c )
-target_link_libraries( example ${LIBFTDI_LIBRARIES} )
+add_executable(example main.c)
+target_link_libraries(example ${LIBFTDI_LIBRARIES})
 
-install ( TARGETS example
-          DESTINATION bin )
-          
+install(TARGETS example
+        DESTINATION bin
+)
index 247589a..3d03ac3 100644 (file)
@@ -90,6 +90,8 @@ int main(int argc, char **argv)
         return EXIT_FAILURE;
     }
 
+    ftdi->module_detach_mode = AUTO_DETACH_REATACH_SIO_MODULE;
+
     while ((i = getopt(argc, argv, "d::ev:p:l:P:S:w")) != -1)
     {
         switch (i)
@@ -151,14 +153,14 @@ int main(int argc, char **argv)
         if (res > 1)
         {
             int i = 1;
-            fprintf(stderr, "%d FTDI devices found: Only Readout on EEPROM done. ",res);
+            fprintf(stderr, "%d FTDI devices found: Only Readout on EEPROM done. \n",res);
             fprintf(stderr, "Use VID/PID/desc/serial to select device\n");
             for (curdev = devlist; curdev != NULL; curdev= curdev->next, i++)
             {
                 f = ftdi_usb_open_dev(ftdi,  curdev->dev);
                 if (f<0)
                 {
-                    fprintf(stderr, "Unable to open device %d: (%s)",
+                    fprintf(stderr, "Unable to open device %d: (%s)\n",
                             i, ftdi_get_error_string(ftdi));
                     continue;
                 }
@@ -175,7 +177,7 @@ int main(int argc, char **argv)
             f = ftdi_usb_open_dev(ftdi,  devlist[0].dev);
             if (f<0)
             {
-                fprintf(stderr, "Unable to open device %d: (%s)",
+                fprintf(stderr, "Unable to open device %d: (%s)\n",
                         i, ftdi_get_error_string(ftdi));
             }
         }
@@ -200,7 +202,7 @@ int main(int argc, char **argv)
             fprintf(stderr, "\n");
             fprintf(stderr, "unable to open ftdi device: %d (%s)\n",
                     f, ftdi_get_error_string(ftdi));
-            
+
             retval = -1;
             goto done;
         }
@@ -210,7 +212,7 @@ int main(int argc, char **argv)
         f = ftdi_erase_eeprom(ftdi); /* needed to determine EEPROM chip type */
         if (f < 0)
         {
-            fprintf(stderr, "Erase failed: %s",
+            fprintf(stderr, "Erase failed: %s\n",
                     ftdi_get_error_string(ftdi));
             retval =  -2;
             goto done;
@@ -277,7 +279,7 @@ int main(int argc, char **argv)
         f=(ftdi_eeprom_build(ftdi));
         if (f < 0)
         {
-            fprintf(stderr, "Erase failed: %s",
+            fprintf(stderr, "Erase failed: %s\n",
                     ftdi_get_error_string(ftdi));
             retval = -2;
             goto done;
index 8737c4b..38147b5 100644 (file)
@@ -1,44 +1,52 @@
-find_package ( Confuse REQUIRED )
-find_package ( Libintl )
+find_package(Confuse REQUIRED)
+find_package(Libintl)
 
 # determine docdir
 include(GNUInstallDirs)
-if(NOT CMAKE_INSTALL_DOCDIR)
-  if(WIN32)
-    set(CMAKE_INSTALL_DOCDIR .)
-  else(WIN32)
-    set(CMAKE_INSTALL_DOCDIR ${CMAKE_INSTALL_DATAROOTDIR}/doc/${PROJECT_NAME})
-  endif(WIN32)
-endif(NOT CMAKE_INSTALL_DOCDIR)
+if (NOT CMAKE_INSTALL_DOCDIR)
+    if (WIN32)
+        set(CMAKE_INSTALL_DOCDIR .)
+    else (WIN32)
+        set(CMAKE_INSTALL_DOCDIR ${CMAKE_INSTALL_DATAROOTDIR}/doc/${PROJECT_NAME})
+    endif (WIN32)
+endif (NOT CMAKE_INSTALL_DOCDIR)
 
 message(STATUS "Building ftdi_eeprom")
 
-include_directories ( ${CONFUSE_INCLUDE_DIRS} )
-list ( APPEND libs ${CONFUSE_LIBRARIES} )
+include_directories(${CONFUSE_INCLUDE_DIRS})
+list(APPEND libs ${CONFUSE_LIBRARIES})
 
-if ( LIBINTL_FOUND )
-  include_directories ( ${LIBINTL_INCLUDE_DIR} )
-  list ( APPEND libs ${LIBINTL_LIBRARIES} )
+if (LIBINTL_FOUND)
+    include_directories(${LIBINTL_INCLUDE_DIR})
+    list(APPEND libs ${LIBINTL_LIBRARIES})
 endif ()
 
 
 # Version defines
-set ( EEPROM_MAJOR_VERSION 0 )
-set ( EEPROM_MINOR_VERSION 17 )
-set ( EEPROM_VERSION_STRING ${EEPROM_MAJOR_VERSION}.${EEPROM_MINOR_VERSION} )
+set(EEPROM_MAJOR_VERSION 0)
+set(EEPROM_MINOR_VERSION 17)
+set(EEPROM_VERSION_STRING ${EEPROM_MAJOR_VERSION}.${EEPROM_MINOR_VERSION})
 
-include_directories ( BEFORE ${CMAKE_SOURCE_DIR}/src )
-include_directories ( BEFORE ${CMAKE_CURRENT_BINARY_DIR} )
+include_directories(BEFORE ${PROJECT_SOURCE_DIR}/src)
+include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR})
 
 configure_file(
-               ftdi_eeprom_version.h.in
-              ${CMAKE_CURRENT_BINARY_DIR}/ftdi_eeprom_version.h
+        ftdi_eeprom_version.h.in
+        ${CMAKE_CURRENT_BINARY_DIR}/ftdi_eeprom_version.h
 )
 
-add_executable ( ftdi_eeprom main.c )
-target_link_libraries ( ftdi_eeprom ftdi1 ${CONFUSE_LIBRARIES} )
-if ( LIBINTL_FOUND )
-  target_link_libraries ( ftdi_eeprom ${LIBINTL_LIBRARIES} )
+add_executable(ftdi_eeprom main.c)
+if (NOT SHAREDLIBS AND STATICLIBS)
+    target_link_libraries(ftdi_eeprom ftdi1-static)
+else()
+    target_link_libraries(ftdi_eeprom ftdi1)
 endif ()
-install ( TARGETS ftdi_eeprom DESTINATION bin )
-install ( FILES example.conf DESTINATION ${CMAKE_INSTALL_DOCDIR} )
+target_link_libraries(ftdi_eeprom ${CONFUSE_LIBRARIES})
+if (LIBINTL_FOUND)
+    target_link_libraries(ftdi_eeprom ${LIBINTL_LIBRARIES})
+endif ()
+if (NOT SHAREDLIBS AND STATICLIBS)
+    target_link_libraries(ftdi_eeprom ${LIBUSB_LIBRARIES})
+endif ()
+install(TARGETS ftdi_eeprom DESTINATION bin)
+install(FILES example.conf DESTINATION ${CMAKE_INSTALL_DOCDIR})
index fac5bcc..272b8f6 100644 (file)
@@ -1,47 +1,42 @@
-# vim: ts=2:sw=2:sts=2
-
 # Targets
-set(cpp_sources ${CMAKE_CURRENT_SOURCE_DIR}/ftdi.cpp CACHE INTERNAL "List of cpp sources" )
-set(cpp_headers ${CMAKE_CURRENT_SOURCE_DIR}/ftdi.hpp CACHE INTERNAL "List of cpp headers" )
+set(cpp_sources ${CMAKE_CURRENT_SOURCE_DIR}/ftdi.cpp CACHE INTERNAL "List of cpp sources")
+set(cpp_headers ${CMAKE_CURRENT_SOURCE_DIR}/ftdi.hpp CACHE INTERNAL "List of cpp headers")
 
 # Includes
 include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}
-       ${CMAKE_CURRENT_SOURCE_DIR}
-       ${CMAKE_SOURCE_DIR}/src)
-
-include_directories(${Boost_INCLUDE_DIRS})
+        ${CMAKE_CURRENT_SOURCE_DIR}
+        ${PROJECT_SOURCE_DIR}/src
+)
 
 # Shared library
-add_library(ftdipp1 SHARED ${cpp_sources})
-
-math(EXPR VERSION_FIXUP "${MAJOR_VERSION} + 1")    # Compatibility with previous releases
-set_target_properties(ftdipp1 PROPERTIES VERSION ${VERSION_FIXUP}.${MINOR_VERSION}.0 SOVERSION 3)
-
-# Prevent clobbering each other during the build
-set_target_properties(ftdipp1 PROPERTIES CLEAN_DIRECT_OUTPUT 1)
-
-# Dependencies
-target_link_libraries(ftdipp1 ftdi1 ${LIBUSB_LIBRARIES} ${BOOST_LIBRARIES})
-
-install ( TARGETS ftdipp1
-                                       RUNTIME DESTINATION bin
-                                       LIBRARY DESTINATION lib${LIB_SUFFIX}
-                                       ARCHIVE DESTINATION lib${LIB_SUFFIX}
-                               )
+if (SHAREDLIBS)
+    add_library(ftdipp1 SHARED ${cpp_sources})
+    math(EXPR VERSION_FIXUP "${MAJOR_VERSION} + 1")    # Compatibility with previous releases
+    set_target_properties(ftdipp1 PROPERTIES VERSION ${VERSION_FIXUP}.${MINOR_VERSION}.0 SOVERSION 3)
+    # Prevent clobbering each other during the build
+    set_target_properties(ftdipp1 PROPERTIES CLEAN_DIRECT_OUTPUT 1)
+    # Dependencies
+    target_link_libraries(ftdipp1 ftdi1 ${LIBUSB_LIBRARIES})
+    install(TARGETS ftdipp1
+            RUNTIME DESTINATION bin
+            LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+    )
+endif ()
 
 # Static library
-if ( STATICLIBS )
-       add_library(ftdipp1-static STATIC ${cpp_sources})
-       set_target_properties(ftdipp1-static PROPERTIES OUTPUT_NAME "ftdipp1")
-       set_target_properties(ftdipp1-static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
-
-       install ( TARGETS ftdipp1-static
-                                               ARCHIVE DESTINATION lib${LIB_SUFFIX}
-                                               COMPONENT staticlibs
-                                       )
+if (STATICLIBS)
+    add_library(ftdipp1-static STATIC ${cpp_sources})
+    set_target_properties(ftdipp1-static PROPERTIES OUTPUT_NAME "ftdipp1")
+    set_target_properties(ftdipp1-static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
+    target_link_libraries(ftdipp1-static ftdi1-static ${LIBUSB_LIBRARIES})
+    install(TARGETS ftdipp1-static
+            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+            COMPONENT staticlibs
+    )
 endif ()
 
-install ( FILES ${cpp_headers}
-                                       DESTINATION include/${PROJECT_NAME}
-                                       COMPONENT headers
-                               )
+install(FILES ${cpp_headers}
+        DESTINATION include/${PROJECT_NAME}
+        COMPONENT headers
+)
index f569cce..2458327 100644 (file)
@@ -31,7 +31,7 @@ on this file might be covered by the GNU General Public License.
 
 #include <list>
 #include <string>
-#include <boost/shared_ptr.hpp>
+#include <memory>
 #include <ftdi.h>
 
 namespace Ftdi
@@ -145,7 +145,7 @@ protected:
 
 private:
     class Private;
-    boost::shared_ptr<Private> d;
+    std::shared_ptr<Private> d;
 };
 
 /*! \brief Device EEPROM.
@@ -168,7 +168,7 @@ public:
 
 private:
     class Private;
-    boost::shared_ptr<Private> d;
+    std::shared_ptr<Private> d;
 };
 
 /*! \brief Device list.
@@ -214,7 +214,7 @@ public:
 
 private:
     class Private;
-    boost::shared_ptr<Private> d;
+    std::shared_ptr<Private> d;
 };
 
 }
index 4bf58d2..ea4a171 100644 (file)
@@ -1,21 +1,21 @@
 # Debian
-if("${PACKAGE}" STREQUAL "Debian")
+if ("${PACKAGE}" STREQUAL "Debian")
 
-   # Settings
-   set(REVISION                           0)
-   set(CPACK_GENERATOR                    "DEB" PARENT_SCOPE)
-   set(CPACK_PACKAGE_VERSION              ${CPACK_PACKAGE_VERSION}-${REVISION} PARENT_SCOPE)
+    # Settings
+    set(REVISION 0)
+    set(CPACK_GENERATOR "DEB" PARENT_SCOPE)
+    set(CPACK_PACKAGE_VERSION ${CPACK_PACKAGE_VERSION}-${REVISION} PARENT_SCOPE)
 
-   # Dependencies
-   set(CPACK_DEBIAN_PACKAGE_DEPENDS       "libusb-1.0-0" PARENT_SCOPE)
-   set(DEBIAN_PACKAGE_BUILDS_DEPENDS      "cmake, libusb2-dev" PARENT_SCOPE)
+    # Dependencies
+    set(CPACK_DEBIAN_PACKAGE_DEPENDS "libusb-1.0-0" PARENT_SCOPE)
+    set(DEBIAN_PACKAGE_BUILDS_DEPENDS "cmake, libusb2-dev" PARENT_SCOPE)
 
-   # Bundles
-   message("-- Installing udev rules to /etc/udev/rules.d")
-   install(FILES 99-libftdi.rules
-           DESTINATION /etc/udev/rules.d)
+    # Bundles
+    message("-- Installing udev rules to /etc/udev/rules.d")
+    install(FILES 99-libftdi.rules
+            DESTINATION /etc/udev/rules.d)
 
-endif("${PACKAGE}" STREQUAL "Debian")
+endif ("${PACKAGE}" STREQUAL "Debian")
 
 # General RPM rules
-set(CPACK_RPM_PACKAGE_DEPENDS       "libusb1" PARENT_SCOPE)
+set(CPACK_RPM_PACKAGE_DEPENDS "libusb1" PARENT_SCOPE)
index 5b6f420..d312fae 100644 (file)
@@ -1,81 +1,74 @@
-# 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 ()
-
 # 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 )
+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 ()
+    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 ( PythonInterp REQUIRED )
-find_package ( PythonLibs REQUIRED )
+find_package(Python3 COMPONENTS Interpreter Development)
 
-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 ${PROJECT_SOURCE_DIR}/src)
+include_directories(${Python3_INCLUDE_DIRS})
+link_directories(${CMAKE_CURRENT_BINARY_DIR}/../src)
 
-if ( DOCUMENTATION )
-  set(CMAKE_SWIG_FLAGS -DDOXYGEN=${DOXYGEN_FOUND})
-  # manually add dependency for new cmake / swig versions
-  set_property(SOURCE ftdi1.i PROPERTY DEPENDS ftdi1_doc.i)
-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 )
-endif()
-swig_link_libraries ( ftdi1 ftdi1 )
+if (DOCUMENTATION)
+    set(CMAKE_SWIG_FLAGS -DDOXYGEN=${DOXYGEN_FOUND})
+    # manually add dependency for new cmake / swig versions
+    set_property(SOURCE ftdi1.i PROPERTY DEPENDS doc_i)
+endif ()
+swig_add_library(pyftdi1 LANGUAGE python SOURCES ftdi1.i)
+swig_link_libraries(pyftdi1 ftdi1)
 
-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" )
+if (LINK_PYTHON_LIBRARY)
+    swig_link_libraries(pyftdi1 ${PYTHON_LIBRARIES})
+elseif (APPLE)
+    set_target_properties(pyftdi1 PROPERTIES LINK_FLAGS "-undefined dynamic_lookup")
 endif ()
 
-set_target_properties ( ${SWIG_MODULE_ftdi1_REAL_NAME} PROPERTIES NO_SONAME ON )
+set_target_properties(pyftdi1 PROPERTIES NO_SONAME ON)
 
-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 )
+execute_process(COMMAND ${Python3_EXECUTABLE} -c "import sysconfig; print( sysconfig.get_path( 'platlib', vars={'platbase': '${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} )
+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} )
+set(PYTHON_MODULE_PATH ${_REL_PYTHON_MODULE_PATH})
 
-install ( FILES ${CMAKE_CURRENT_BINARY_DIR}/ftdi1.py DESTINATION ${PYTHON_MODULE_PATH} )
-install ( TARGETS ${SWIG_MODULE_ftdi1_REAL_NAME} LIBRARY DESTINATION ${PYTHON_MODULE_PATH} )
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ftdi1.py DESTINATION ${PYTHON_MODULE_PATH})
+install(TARGETS pyftdi1 LIBRARY DESTINATION ${PYTHON_MODULE_PATH})
 
-if ( DOCUMENTATION )
+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}
+    add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/doc/xml/ftdi_8c.xml
+            COMMAND ${DOXYGEN_EXECUTABLE} ${PROJECT_BINARY_DIR}/doc/Doxyfile.xml
+            WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
+            COMMENT "Generating ftdi_8c.xml"
+            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
+    add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ftdi1_doc.i
+            COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/doxy2swig.py -n
+            ${PROJECT_BINARY_DIR}/doc/xml/ftdi_8c.xml
             ${CMAKE_CURRENT_BINARY_DIR}/ftdi1_doc.i
-        DEPENDS ${CMAKE_BINARY_DIR}/doc/xml/ftdi_8c.xml
+            COMMENT "Generating ftdi1_doc.i from ftdi_8c.xml"
+            DEPENDS ${PROJECT_BINARY_DIR}/doc/xml/ftdi_8c.xml
+    )
+    add_custom_target(doc_i
+            COMMENT "Python API bindings documentation"
+            DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/ftdi1_doc.i
     )
-    add_custom_target ( doc_i DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/ftdi1_doc.i )
-    add_dependencies( ${SWIG_MODULE_ftdi1_REAL_NAME} doc_i )
+    add_dependencies(pyftdi1 doc_i)
 
-endif ()
+endif (DOCUMENTATION)
 
-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
+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 )
+add_subdirectory(examples)
index b4ed93d..904fd4e 100644 (file)
@@ -1,5 +1,4 @@
-install ( FILES simple.py complete.py cbus.py
-          DESTINATION share/libftdi/examples
-          PERMISSIONS OWNER_READ GROUP_READ WORLD_READ 
-        )
-
+ install(FILES simple.py complete.py cbus.py
+         DESTINATION share/libftdi/examples
+         PERMISSIONS OWNER_READ GROUP_READ WORLD_READ
+ )
index 8b179f9..fac4d16 100644 (file)
@@ -52,7 +52,7 @@ char * str2charp_size(PyObject* pyObj, int * size)
 %enddef
 %feature("autodoc", ftdi_usb_find_all_docstring) ftdi_usb_find_all;
 %typemap(in,numinputs=0) SWIGTYPE** OUTPUT ($*ltype temp) %{ $1 = &temp; %}
-%typemap(argout) SWIGTYPE** OUTPUT %{ $result = SWIG_Python_AppendOutput($result, SWIG_NewPointerObj((void*)*$1,$*descriptor,0)); %}
+%typemap(argout,noblock=1) SWIGTYPE** OUTPUT { $result = SWIG_AppendOutput($result, SWIG_NewPointerObj((void*)*$1,$*descriptor,0)); }
 %apply SWIGTYPE** OUTPUT { struct ftdi_device_list **devlist };
     int ftdi_usb_find_all(struct ftdi_context *ftdi, struct ftdi_device_list **devlist,
                           int vendor, int product);
@@ -92,12 +92,12 @@ char * str2charp_size(PyObject* pyObj, int * size)
 %enddef
 %feature("autodoc", ftdi_read_data_docstring) ftdi_read_data;
 %typemap(in,numinputs=1) (unsigned char *buf, int size) %{ $2 = PyInt_AsLong($input);$1 = (unsigned char*)malloc($2*sizeof(char)); %}
-%typemap(argout) (unsigned char *buf, int size) %{
+%typemap(argout,noblock=1) (unsigned char *buf, int size) {
         if(result<0)
                 $2=0;
-        $result = SWIG_Python_AppendOutput($result, charp2str((char*)$1, $2));
+        $result = SWIG_AppendOutput($result, charp2str((char*)$1, $2));
         free($1);
-%}
+}
     int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size);
 %clear (unsigned char *buf, int size);
 
@@ -119,12 +119,12 @@ char * str2charp_size(PyObject* pyObj, int * size)
 %enddef
 %feature("autodoc", ftdi_read_pins_docstring) ftdi_read_pins;
 %typemap(in,numinputs=0) unsigned char *pins ($*ltype temp) %{ $1 = &temp; %}
-%typemap(argout) (unsigned char *pins) %{ $result = SWIG_Python_AppendOutput($result, charp2str((char*)$1, 1)); %}
+%typemap(argout,noblock=1) (unsigned char *pins) { $result = SWIG_AppendOutput($result, charp2str((char*)$1, 1)); }
     int ftdi_read_pins(struct ftdi_context *ftdi, unsigned char *pins);
 %clear unsigned char *pins;
 
 %typemap(in,numinputs=0) unsigned char *latency ($*ltype temp) %{ $1 = &temp; %}
-%typemap(argout) (unsigned char *latency) %{ $result = SWIG_Python_AppendOutput($result, charp2str((char*)$1, 1)); %}
+%typemap(argout,noblock=1) (unsigned char *latency) { $result = SWIG_AppendOutput($result, charp2str((char*)$1, 1)); }
     int ftdi_get_latency_timer(struct ftdi_context *ftdi, unsigned char *latency);
 %clear unsigned char *latency;
 
@@ -137,12 +137,12 @@ char * str2charp_size(PyObject* pyObj, int * size)
 %clear int* value;
 
 %typemap(in,numinputs=1) (unsigned char *buf, int size) %{ $2 = PyInt_AsLong($input);$1 = (unsigned char*)malloc($2*sizeof(char)); %}
-%typemap(argout) (unsigned char *buf, int size) %{
+%typemap(argout,noblock=1) (unsigned char *buf, int size) {
         if(result<0)
                 $2=0;
-        $result = SWIG_Python_AppendOutput($result, charp2str((char*)$1, $2));
+        $result = SWIG_AppendOutput($result, charp2str((char*)$1, $2));
         free($1);
-%}
+}
     int ftdi_get_eeprom_buf(struct ftdi_context *ftdi, unsigned char * buf, int size);
 %clear (unsigned char *buf, int size);
 
index 17b3617..7e81bea 100644 (file)
@@ -1,55 +1,81 @@
 # Includes
 include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}
-                     ${CMAKE_CURRENT_SOURCE_DIR}
-                     )
+        ${CMAKE_CURRENT_SOURCE_DIR}
+)
 
 # Version information
 set(SNAPSHOT_VERSION "unknown")
 execute_process(COMMAND git describe
-                OUTPUT_VARIABLE GIT_DESCRIBE_OUTPUT
-                RESULT_VARIABLE GIT_DESCRIBE_RESULT
-                OUTPUT_STRIP_TRAILING_WHITESPACE
-                )
-if(${GIT_DESCRIBE_RESULT} STREQUAL 0)
-  set(SNAPSHOT_VERSION ${GIT_DESCRIBE_OUTPUT})
+        OUTPUT_VARIABLE GIT_DESCRIBE_OUTPUT
+        RESULT_VARIABLE GIT_DESCRIBE_RESULT
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+)
+if (${GIT_DESCRIBE_RESULT} STREQUAL 0)
+    set(SNAPSHOT_VERSION ${GIT_DESCRIBE_OUTPUT})
 endif ()
 message(STATUS "Detected git snapshot version: ${SNAPSHOT_VERSION}")
 
 configure_file(ftdi_version_i.h.in "${CMAKE_CURRENT_BINARY_DIR}/ftdi_version_i.h" @ONLY)
 
-# Targets
-set(c_sources     ${CMAKE_CURRENT_SOURCE_DIR}/ftdi.c ${CMAKE_CURRENT_SOURCE_DIR}/ftdi_stream.c CACHE INTERNAL "List of c sources" )
-set(c_headers     ${CMAKE_CURRENT_SOURCE_DIR}/ftdi.h CACHE INTERNAL "List of c headers" )
+if (MSVC)
+    # Disable some overly-verbose warnings activated by -Wall
+
+    # '<name>': function not inlined
+    add_compile_options(/wd4710)
+
+    # function '<name>' selected for automatic inline expansion
+    add_compile_options(/wd4711)
+
+    # Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified
+    add_compile_options(/wd5045)
 
-add_library(ftdi1 SHARED ${c_sources})
+    # '<type>': '4' bytes padding added after data member '<name>'
+    add_compile_options(/wd4820)
 
-math(EXPR VERSION_FIXUP "${MAJOR_VERSION} + 1")    # Compatibility with previous releases
-set_target_properties(ftdi1 PROPERTIES VERSION ${VERSION_FIXUP}.${MINOR_VERSION}.0 SOVERSION 2)
-# Prevent clobbering each other during the build
-set_target_properties ( ftdi1 PROPERTIES CLEAN_DIRECT_OUTPUT 1 )
+    # conversion from '<type1>' to '<type2>', possible loss of data
+    add_compile_options(/wd4242 /wd4244 /wd4267)
 
+    # Disable warning on unsafe string functions
+    add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
 
-# Dependencies
-target_link_libraries(ftdi1 ${LIBUSB_LIBRARIES})
+    if (MSVC_VERSION GREATER_EQUAL 1913)
+        # Disable warnings from system headers
+        add_compile_options(/external:anglebrackets /external:W0)
+    endif ()
+endif ()
+
+# Targets
+set(c_sources ${CMAKE_CURRENT_SOURCE_DIR}/ftdi.c ${CMAKE_CURRENT_SOURCE_DIR}/ftdi_stream.c CACHE INTERNAL "List of c sources")
+set(c_headers ${CMAKE_CURRENT_SOURCE_DIR}/ftdi.h CACHE INTERNAL "List of c headers")
 
-install ( TARGETS ftdi1
-          RUNTIME DESTINATION bin
-          LIBRARY DESTINATION lib${LIB_SUFFIX}
-          ARCHIVE DESTINATION lib${LIB_SUFFIX}
-        )
+# Shared library
+if (SHAREDLIBS)
+    add_library(ftdi1 SHARED ${c_sources})
+    math(EXPR VERSION_FIXUP "${MAJOR_VERSION} + 1")    # Compatibility with previous releases
+    set_target_properties(ftdi1 PROPERTIES VERSION ${VERSION_FIXUP}.${MINOR_VERSION}.0 SOVERSION 2)
+    # Prevent clobbering each other during the build
+    set_target_properties(ftdi1 PROPERTIES CLEAN_DIRECT_OUTPUT 1)
+    target_link_libraries(ftdi1 ${LIBUSB_LIBRARIES})
+    install(TARGETS ftdi1
+            RUNTIME DESTINATION bin
+            LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+    )
+endif ()
 
-if ( STATICLIBS )
-  add_library(ftdi1-static STATIC ${c_sources})
-  target_link_libraries(ftdi1-static ${LIBUSB_LIBRARIES})
-  set_target_properties(ftdi1-static PROPERTIES OUTPUT_NAME "ftdi1")
-  set_target_properties(ftdi1-static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
-  install ( TARGETS ftdi1-static
-            ARCHIVE DESTINATION lib${LIB_SUFFIX}
+# Static library
+if (STATICLIBS)
+    add_library(ftdi1-static STATIC ${c_sources})
+    target_link_libraries(ftdi1-static ${LIBUSB_LIBRARIES})
+    set_target_properties(ftdi1-static PROPERTIES OUTPUT_NAME "ftdi1")
+    set_target_properties(ftdi1-static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
+    install(TARGETS ftdi1-static
+            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
             COMPONENT staticlibs
-          )
+    )
 endif ()
 
-install ( FILES ${c_headers}
-          DESTINATION include/${PROJECT_NAME}
-          COMPONENT headers
-        )
+install(FILES ${c_headers}
+        DESTINATION include/${PROJECT_NAME}
+        COMPONENT headers
+)
index 92c5fae..de07d6e 100644 (file)
@@ -83,7 +83,7 @@ static void ftdi_usb_close_internal (struct ftdi_context *ftdi)
 
     \retval  0: all fine
     \retval -1: couldn't allocate read buffer
-    \retval -2: couldn't allocate struct  buffer
+    \retval -2: couldn't allocate struct buffer
     \retval -3: libusb_init() failed
 
     \remark This should be called before all functions
@@ -112,7 +112,7 @@ int ftdi_init(struct ftdi_context *ftdi)
         ftdi_error_return(-3, "libusb_init() failed");
 
     ftdi_set_interface(ftdi, INTERFACE_ANY);
-    ftdi->bitbang_mode = 1; /* when bitbang is enabled this holds the number of the mode  */
+    ftdi->bitbang_mode = 1; /* when bitbang is enabled this holds the number of the mode */
 
     eeprom = (struct ftdi_eeprom *)malloc(sizeof(struct ftdi_eeprom));
     if (eeprom == 0)
@@ -298,7 +298,7 @@ struct ftdi_version_info ftdi_get_library_version(void)
 /**
     Finds all ftdi devices with given VID:PID on the usb bus. Creates a new
     ftdi_device_list which needs to be deallocated by ftdi_list_free() after
-    use.  With VID:PID 0:0, search for the default devices
+    use. With VID:PID 0:0, search for the default devices
     (0x403:0x6001, 0x403:0x6010, 0x403:0x6011, 0x403:0x6014, 0x403:0x6015)
 
     \param ftdi pointer to ftdi_context
@@ -639,7 +639,7 @@ int ftdi_usb_open_dev(struct ftdi_context *ftdi, libusb_device *dev)
         ftdi_error_return(-12, "libusb_get_configuration () failed");
     // set configuration (needed especially for windows)
     // tolerate EBUSY: one device with one configuration, but two interfaces
-    //    and libftdi sessions to both interfaces (e.g. FT2232)
+    // and libftdi sessions to both interfaces (e.g. FT2232)
     if (desc.bNumConfigurations > 0 && cfg != cfg0)
     {
         if (libusb_set_configuration(ftdi->usb_dev, cfg0) < 0)
@@ -1316,7 +1316,7 @@ static int ftdi_to_clkbits_AM(int baudrate, unsigned long *encoded_divisor)
     return best_baud;
 }
 
-/*  ftdi_to_clkbits Convert a requested baudrate for a given system clock  and predivisor
+/*  ftdi_to_clkbits Convert a requested baudrate for a given system clock and predivisor
                     to encoded divisor and the achievable baudrate
     Function is only used internally
     \internal
@@ -2218,6 +2218,24 @@ int ftdi_set_bitmode(struct ftdi_context *ftdi, unsigned char bitmask, unsigned
 }
 
 /**
+    Set module detach mode.
+
+    \param ftdi pointer to ftdi_context
+    \param mode detach mode to use.
+
+    \retval  0: all fine
+    \retval -1: can't enable bitbang mode
+*/
+int ftdi_set_module_detach_mode(struct ftdi_context *ftdi, enum ftdi_module_detach_mode mode)
+{
+    if (ftdi == NULL)
+        ftdi_error_return(-1, "FTDI context invalid");
+
+    ftdi->module_detach_mode = mode;
+    return 0;
+}
+
+/**
     Disable bitbang mode.
 
     \param ftdi pointer to ftdi_context
@@ -2900,8 +2918,12 @@ static unsigned char type2bit(unsigned char type, enum ftdi_chip_type chip)
             }
         }
         case TYPE_230X: /* FT230X is only UART */
+        case TYPE_AM:
+        case TYPE_BM:
+        case TYPE_4232H:
         default: return 0;
     }
+    /* fallback */
     return 0;
 }
 
@@ -3049,7 +3071,7 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
     // Dynamic content
     // Strings start at 0x94 (TYPE_AM, TYPE_BM)
     // 0x96 (TYPE_2232C), 0x98 (TYPE_R) and 0x9a (TYPE_x232H)
-    // 0xa0 (TYPE_232H)
+    // 0xa0 (TYPE_232H, TYPE_230X)
     i = 0;
     switch (ftdi->type)
     {
@@ -3072,7 +3094,7 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
             i = 0xa0;
             break;
     }
-    /* Wrap around 0x80 for 128 byte EEPROMS (Internale and 93x46) */
+    /* Wrap around 0x80 for 128 byte EEPROMS (Internal and 93x46) */
     eeprom_size_mask = eeprom->size -1;
     free_end = i & eeprom_size_mask;
 
@@ -3103,16 +3125,16 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
 
     if (eeprom->use_serial) {
         // Addr 12: Offset of the serial string + 0x80, calculated later
-         // Addr 13: Length of serial string
-         output[0x12] = i | 0x80; // calculate offset
-         output[i & eeprom_size_mask] = serial_size*2 + 2, i++;
-         output[i & eeprom_size_mask] = 0x03, i++;
-         for (j = 0; j < serial_size; j++)
-         {
-             output[i & eeprom_size_mask] = eeprom->serial[j], i++;
-             output[i & eeprom_size_mask] = 0x00, i++;
-         }
-         output[0x13] = serial_size*2 + 2;
+        // Addr 13: Length of serial string
+        output[0x12] = i | 0x80; // calculate offset
+        output[i & eeprom_size_mask] = serial_size*2 + 2, i++;
+        output[i & eeprom_size_mask] = 0x03, i++;
+        for (j = 0; j < serial_size; j++)
+        {
+            output[i & eeprom_size_mask] = eeprom->serial[j], i++;
+            output[i & eeprom_size_mask] = 0x00, i++;
+        }
+        output[0x13] = serial_size*2 + 2;
     }
 
     // Legacy port name and PnP fields for FT2232 and newer chips
@@ -3125,6 +3147,8 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
         i++;
         output[i & eeprom_size_mask] = eeprom->is_not_pnp; /* as seen when written with FTD2XX */
         i++;
+        output[i & eeprom_size_mask] = 0x00;
+        i++;
     }
 
     if (ftdi->type > TYPE_AM) /* use_serial not used in AM devices */
@@ -3136,7 +3160,7 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
     }
 
     /* Bytes and Bits specific to (some) types
-       Write linear, as this allows easier fixing*/
+       Write linear, as this allows easier fixing */
     switch (ftdi->type)
     {
         case TYPE_AM:
@@ -3208,7 +3232,7 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
 
             if (eeprom->external_oscillator)
                 output[0x00] |= 0x02;
-            output[0x01] = 0x40; /* Hard coded Endpoint Size*/
+            output[0x01] = 0x40; /* Hard coded Endpoint Size */
 
             if (eeprom->suspend_pull_downs)
                 output[0x0A] |= 0x4;
@@ -3440,7 +3464,7 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
         case TYPE_230X:
             output[0x00] = 0x80; /* Actually, leave the default value */
             /*FIXME: Make DBUS & CBUS Control configurable*/
-            output[0x0c] = 0;    /* DBUS drive 4mA, CBUS drive 4 mA like factory default */
+            output[0x0c] = 0;    /* DBUS drive 4mA, CBUS drive 4mA like factory default */
             for (j = 0; j <= 6; j++)
             {
                 output[0x1a + j] = eeprom->cbus_function[j];
@@ -3497,12 +3521,14 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
             i = 0x40;
         }
         if ((ftdi->type == TYPE_230X) && (i >=  0x40) && (i < 0x50)) {
-            uint16_t data;
+            uint16_t data = 0;
             if (ftdi_read_eeprom_location(ftdi, i, &data)) {
                 fprintf(stderr, "Reading Factory Configuration Data failed\n");
                 i = 0x50;
             }
             value = data;
+            output[i * 2] = data;
+            output[(i * 2) + 1] = data >> 8;
         }
         else {
             value = output[i*2];
@@ -3876,11 +3902,18 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose)
                     (eeprom->data_order)?"LSB":"MSB",
                     (eeprom->flow_control)?"":"No ");
         }
-        if ((ftdi->type == TYPE_2232H) || (ftdi->type == TYPE_4232H))
+        if ((ftdi->type == TYPE_2232H) || (ftdi->type == TYPE_4232H) || (ftdi->type == TYPE_2232C))
             fprintf(stdout,"Channel B has Mode %s%s%s\n",
                     channel_mode[eeprom->channel_b_type],
                     (eeprom->channel_b_driver)?" VCP":"",
                     (eeprom->high_current_b)?" High Current IO":"");
+        if (ftdi->type == TYPE_4232H)
+        {
+            fprintf(stdout,"Channel C has Mode UART%s\n",
+                    (eeprom->channel_c_driver)?" VCP":"");
+            fprintf(stdout,"Channel D has Mode UART%s\n",
+                    (eeprom->channel_d_driver)?" VCP":"");
+        }
         if (((ftdi->type == TYPE_BM) || (ftdi->type == TYPE_2232C)) &&
                 eeprom->use_usb_version)
             fprintf(stdout,"Use explicit USB Version %04x\n",eeprom->usb_version);
@@ -4172,6 +4205,9 @@ int ftdi_get_eeprom_value(struct ftdi_context *ftdi, enum ftdi_eeprom_value valu
         case EXTERNAL_OSCILLATOR:
             *value = ftdi->eeprom->external_oscillator;
             break;
+        case USER_DATA_ADDR:
+            *value = ftdi->eeprom->user_data_addr;
+            break;
         default:
             ftdi_error_return(-1, "Request for unknown EEPROM value");
     }
@@ -4593,7 +4629,7 @@ int ftdi_write_eeprom_location(struct ftdi_context *ftdi, int eeprom_addr,
     switch (ftdi->type)
     {
         case TYPE_BM:
-        case  TYPE_2232C:
+        case TYPE_2232C:
             chip_type_location = 0x14;
             break;
         case TYPE_2232H:
@@ -4603,6 +4639,9 @@ int ftdi_write_eeprom_location(struct ftdi_context *ftdi, int eeprom_addr,
         case TYPE_232H:
             chip_type_location = 0x1e;
             break;
+        case TYPE_AM:
+        case TYPE_R:
+        case TYPE_230X:
         default:
             ftdi_error_return(-4, "Device can't access unprotected area");
     }
index 0603335..ffeb452 100644 (file)
@@ -520,6 +520,7 @@ extern "C"
     int ftdi_init(struct ftdi_context *ftdi);
     struct ftdi_context *ftdi_new(void);
     int ftdi_set_interface(struct ftdi_context *ftdi, enum ftdi_interface interface);
+    int ftdi_set_module_detach_mode(struct ftdi_context *ftdi, enum ftdi_module_detach_mode mode);
 
     void ftdi_deinit(struct ftdi_context *ftdi);
     void ftdi_free(struct ftdi_context *ftdi);
index f5f1287..d146afd 100644 (file)
@@ -241,16 +241,17 @@ ftdi_readstream(struct ftdi_context *ftdi,
     {
         FTDIProgressInfo  *progress = &state.progress;
         const double progressInterval = 1.0;
-        struct timeval timeout = { 0, ftdi->usb_read_timeout * 1000};
+        struct timeval timeout = { ftdi->usb_read_timeout / 1000,
+            (ftdi->usb_read_timeout % 1000) * 1000 };
         struct timeval now;
 
-        int err = libusb_handle_events_timeout(ftdi->usb_ctx, &timeout);
-        if (err ==  LIBUSB_ERROR_INTERRUPTED)
+        int xfer_err = libusb_handle_events_timeout(ftdi->usb_ctx, &timeout);
+        if (xfer_err ==  LIBUSB_ERROR_INTERRUPTED)
             /* restart interrupted events */
-            err = libusb_handle_events_timeout(ftdi->usb_ctx, &timeout);
+            xfer_err = libusb_handle_events_timeout(ftdi->usb_ctx, &timeout);
         if (!state.result)
         {
-            state.result = err;
+            state.result = xfer_err;
         }
         if (state.activity == 0)
             state.result = 1;
index 392c910..c44c614 100644 (file)
@@ -2,7 +2,7 @@ find_package(Boost COMPONENTS unit_test_framework REQUIRED)
 
 enable_testing()
 
-INCLUDE_DIRECTORIES(BEFORE ${CMAKE_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS})
+INCLUDE_DIRECTORIES(BEFORE ${PROJECT_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS})
 
 set(cpp_tests basic.cpp baudrate.cpp)