diff --git a/CMake/Modules/Findhamlib.cmake b/CMake/Modules/Findhamlib.cmake index abed74b20..340bde131 100644 --- a/CMake/Modules/Findhamlib.cmake +++ b/CMake/Modules/Findhamlib.cmake @@ -1,59 +1,82 @@ # - Try to find hamlib +# # Once done, this will define: # -# hamlib_FOUND - system has Hamlib-2 -# hamlib_INCLUDE_DIRS - the Hamlib-2 include directories -# hamlib_LIBRARIES - link these to use Hamlib-2 -# hamlib_STATIC_FOUND - system has Hamlib-2 static archive -# hamlib_STATIC_LIBRARIES - link these to use Hamlib-2 static archive +# hamlib_FOUND - system has Hamlib +# hamlib_INCLUDE_DIRS - the Hamlib include directories +# hamlib_LIBRARIES - link these to use Hamlib +# hamlib_LIBRARY_DIRS - required shared/dynamic libraries are here +# +# If hamlib_STATIC is TRUE then static linking will be assumed +# include (LibFindMacros) +set (hamlib_LIBRARY_DIRS) + # pkg-config? find_path (__hamlib_pc_path NAMES hamlib.pc PATH_SUFFIXES lib/pkgconfig -) + ) if (__hamlib_pc_path) set (ENV{PKG_CONFIG_PATH} "${__hamlib_pc_path}" "$ENV{PKG_CONFIG_PATH}") unset (__hamlib_pc_path CACHE) endif () +message (STATUS "ENV{PKG_CONFIG_PATH} $ENV{PKG_CONFIG_PATH}") # Use pkg-config to get hints about paths, libs and, flags unset (__pkg_config_checked_hamlib CACHE) +# pkg_config will fail on Windows if the Hamlib USB backends are +# configured since libusb-1.0 does not ship with a pkg_config file on +# Windows, that's OK because we fix it up below libfind_pkg_check_modules (PC_HAMLIB hamlib) -if (NOT PC_HAMLIB_STATIC_LIBRARIES) - if (WIN32) - set (PC_HAMLIB_STATIC_LIBRARIES hamlib ws2_32) +if (NOT PC_HAMLIB_FOUND) + # The headers + find_path (hamlib_INCLUDEDIR hamlib/rig.h) + # The libraries + if (hamlib_STATIC) + libfind_library (hamlib libhamlib.a) else () - set (PC_HAMLIB_STATIC_LIBRARIES hamlib m dl usb) + libfind_library (hamlib hamlib) + endif () + if (WIN32) + set (hamlib_EXTRA_LIBRARIES ws2_32) + else () + set (hamlib_EXTRA_LIBRARIES m dl) + endif () + + # libusb-1.0 has no pkg-config file on Windows so we have to find it + # ourselves + find_library (LIBUSB NAMES usb-1.0 PATH_SUFFIXES MinGW32/dll) + if (LIBUSB) + set (hamlib_EXTRA_LIBRARIES ${LIBUSB} ${hamlib_EXTRA_LIBRARIES}) + get_filename_component (hamlib_libusb_path ${LIBUSB} PATH) + set (hamlib_LIBRARY_DIRS ${hamlib_LIBRARY_DIRS} ${hamlib_libusb_path}) + endif (LIBUSB) + set (hamlib_PROCESS_INCLUDES hamlib_INCLUDEDIR) + set (hamlib_PROCESS_LIBS hamlib_LIBRARY hamlib_EXTRA_LIBRARIES) +else () + if (hamlib_STATIC) + set (hamlib_PROCESS_INCLUDES PC_HAMLIB_STATIC_INCLUDE_DIRS) + set (hamlib_PROCESS_LIBS PC_HAMLIB_STATIC_LDFLAGS) + set (hamlib_LIBRARY_DIRS ${PC_HAMLIB_STATIC_LIBRARY_DIRS}) + else () + set (hamlib_PROCESS_INCLUDES PC_HAMLIB_INCLUDE_DIRS) + set (hamlib_PROCESS_LIBS PC_HAMLIB_LDFLAGS) + set (hamlib_LIBRARY_DIRS ${PC_HAMLIB_LIBRARY_DIRS}) endif () endif () - -# The libraries -libfind_library (hamlib hamlib) -libfind_library (hamlib_STATIC libhamlib.a) - -find_path (hamlib_INCLUDE_DIR hamlib/rig.h) - -# Set the include dir variables and the libraries and let libfind_process do the rest -set (hamlib_PROCESS_INCLUDES hamlib_INCLUDE_DIR) -set (hamlib_PROCESS_LIBS hamlib_LIBRARY) libfind_process (hamlib) -set (hamlib_STATIC_PROCESS_INCLUDES hamlib_STATIC_INCLUDE_DIR) -set (hamlib_STATIC_PROCESS_LIBS hamlib_STATIC_LIBRARY PC_HAMLIB_STATIC_LIBRARIES) -libfind_process (hamlib_STATIC) - -# make sure we return a full path for the library we return -if (hamlib_FOUND) - list (REMOVE_ITEM hamlib_LIBRARIES hamlib) - if (hamlib_STATIC_LIBRARIES) - list (REMOVE_ITEM hamlib_STATIC_LIBRARIES hamlib) +if (WIN32) + find_path (hamlib_dll_path libhamlib-2.dll) + if (hamlib_dll_path) + set (hamlib_LIBRARY_DIRS ${hamlib_LIBRARY_DIRS} ${hamlib_dll_path}) endif () endif () # Handle the QUIETLY and REQUIRED arguments and set HAMLIB_FOUND to # TRUE if all listed variables are TRUE include (FindPackageHandleStandardArgs) -find_package_handle_standard_args (hamlib DEFAULT_MSG hamlib_INCLUDE_DIRS hamlib_LIBRARY hamlib_LIBRARIES) +find_package_handle_standard_args (hamlib DEFAULT_MSG hamlib_INCLUDE_DIRS hamlib_LIBRARIES hamlib_LIBRARY_DIRS) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9db64f97e..b0024dff5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -786,28 +786,14 @@ find_package (FFTW3 COMPONENTS double single threads REQUIRED) # # libhamlib setup # +set (hamlib_STATIC 1) find_package (hamlib 3 REQUIRED) -if (hamlib_STATIC_LIBRARY) - # static link hamlib if archive library available - set (hamlib_LIBRARY "${hamlib_STATIC_LIBRARY}") - set (hamlib_LIBRARIES "${hamlib_STATIC_LIBRARIES}") -endif () find_program (RIGCTL_EXE rigctl) find_program (RIGCTLD_EXE rigctld) message (STATUS "hamlib_INCLUDE_DIRS: ${hamlib_INCLUDE_DIRS}") -message (STATUS "hamlib_LIBRARY: ${hamlib_LIBRARY}") message (STATUS "hamlib_LIBRARIES: ${hamlib_LIBRARIES}") -message (STATUS "hamlib_STATIC_LIBRARY: ${hamlib_STATIC_LIBRARY}") -message (STATUS "hamlib_STATIC_LIBRARIES: ${hamlib_STATIC_LIBRARIES}") - -# if (WIN32) -# find_library (hamlib_RUNTIME NAMES hamlib hamlib-2 PATH_SUFFIXES bin) -# get_filename_component (_hamlib_runtime_path "${hamlib_RUNTIME}" PATH) -# file (GLOB hamlib_BACKENDS ${_hamlib_runtime_path}/hamlib*.dll) -# find_library (usb_RUNTIME NAMES usb0 PATH_SUFFIXES bin) -# endif (WIN32) - +message (STATUS "hamlib_LIBRARY_DIRS: ${hamlib_LIBRARY_DIRS}") # # Qt5 setup @@ -1355,11 +1341,11 @@ endif () set (CPACK_DEBIAN_PACKAGE_DESCRIPTION "${PROJECT_DESCRIPTION}") set (CPACK_DEBIAN_PACKAGE_HOMEPAGE "${PROJECT_HOMEPAGE}") -set (CPACK_DEBIAN_PACKAGE_DEPENDS "libgfortran3 (>=4.8.2), libqt5serialport5 (>=5.2), libqt5multimedia5-plugins (>=5.2), libqt5widgets5 (>=5.2), libc6 (>=2.19)") +set (CPACK_DEBIAN_PACKAGE_DEPENDS "libgfortran3 (>=4.8.2), libqt5serialport5 (>=5.2), libqt5multimedia5-plugins (>=5.2), libqt5widgets5 (>=5.2), libusb-1.0, libudev, libc6 (>=2.19)") set (CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) set (CPACK_RPM_PACKAGE_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR}) -set (CPACK_RPM_PACKAGE_REQUIRES "qt5-qtserialport >= 5.2, qt5-qtmultimedia >= 5.2, glibc >= 2, libgfortran >= 4.8.2") +set (CPACK_RPM_PACKAGE_REQUIRES "qt5-qtserialport >= 5.2, qt5-qtmultimedia >= 5.2, libusb-1.0, libudev, glibc >= 2, libgfortran >= 4.8.2") set (CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION /usr/share/pixmaps /usr/share/applications /usr/share/man /usr/share/man1) configure_file ("${PROJECT_SOURCE_DIR}/CMakeCPackOptions.cmake.in" diff --git a/INSTALL b/INSTALL index 7291d02ab..c9276ffc8 100644 --- a/INSTALL +++ b/INSTALL @@ -43,6 +43,13 @@ the libfftw library development package. Normally installing the library development package pulls in all the FFTW v3 libraries including the single precision variant. +The Hamlib library optionally requires the libusb-1.0 library, if the +development version (libusb-1.0-dev) is available Hamlib will +configure its custom USB device back end drivers. Most rigs do not +require this so normally you can choose not to install libusb-1.0-dev +but if you have a SoftRock USB or similar SDR that uses a custom USB +interface then it is required. + The Hamlib library is required. Currently WSJT-X needs to be built using a forked version of the Hamlib git master. This fork contains patches not yet accepted by the Hamlib development team which are @@ -62,7 +69,7 @@ $ ../src/autogen.sh --prefix=$HOME/hamlib-prefix \ CFLAGS="-fdata-sections -ffunction-sections" \ LDFLAGS="-Wl,--gc-sections" $ make -$ make install +$ make install-strip This will build a binary hamlib package located at ~/hamlib-prefix so you will need to add that to your CMAKE_PREFIX_PATH variable in your @@ -115,6 +122,13 @@ the JT-SDK the following recipe should help. Reasons for building Hamlib from source might include picking up the very latest patches or building a different branch that you wish to contribute to. +Hamlib optionally depends upon libusb-1.0, see "Building from Source" +above for more details. If you wish to include support for the +optional custom USB Hamlib rig drivers then you must install +libusb-1.0 before building Hamlib. The package may be obtained from +http://libusb.info/, install it in a convenient location like +C:\Tools. + On Windows there is a complication in that the compilers used to build Qt and WSJT-X are the MinGW ones bundled with the Qt package but Hamlib needs to be build from an MSYS shell with the tools required to @@ -138,8 +152,9 @@ $ cd ../build --without-cxx-binding --disable-winradio \ CC=/gcc \ CXX=/g++ \ - CFLAGS="-fdata-sections -ffunction-sections" \ - LDFLAGS="-Wl,--gc-sections" + CFLAGS="-fdata-sections -ffunction-sections -I/include" \ + LDFLAGS="-Wl,--gc-sections" \ + LIBUSB_LIBS="-L/MinGW32/dll -lusb-1.0" $ make $ make install @@ -147,6 +162,10 @@ NOTE: should be substituted with the actual path to your Qt bundled tools e.g on my system it is C:\Tools\Qt\Tools\mingw48_32\bin +NOTE: should be substituted with the actual path +to your libusb-1.0 installation directory e.g. on my system it is +C:\Tools\libusb-1.0.20 + This will leave a Hamlib binary package installed at c:/Users//hamlib-prefix which is what needs to be on your CMAKE_PREFIX_PATH. On Windows you almost certainly will be using a @@ -188,12 +207,13 @@ texinfo gcc49 fftw-3-single +gcc49 asciidoc +libusb-devel These are install by typing: $ sudo port install autoconf automake \ libtool pkgconfig texinfo gcc49 asciidoc \ - fftw-3-single +gcc49 + fftw-3-single +gcc49 libusb-devel Once complete you should have all the tools required to build WSJT-X. @@ -230,7 +250,9 @@ $ cd ~/hamlib-prefix/build --enable-static \ --disable-shared \ --disable-winradio \ - --prefix=$HOME/hamlib-prefix + --prefix=$HOME/hamlib-prefix \ + CFLAGS="-I/opt/local/include" \ + LIBUSB_LIBS="/opt/local/lib/libusb-1.0.la" $ make $ make install-strip