# Copyright 2012 Jared Boone
# Copyright 2013 Benjamin Vernoux
#
# This file is part of HackRF.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; see the file COPYING.  If not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Boston, MA 02110-1301, USA.

cmake_minimum_required(VERSION 3.10.0)
project(
  libhackrf
  LANGUAGES C
  VERSION 0.9.1)
include(GNUInstallDirs)
include(${PROJECT_SOURCE_DIR}/../cmake/set_release.cmake)
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/../cmake/modules)

if(MSVC)
  set(THREADS_USE_PTHREADS_WIN32 true)
else()
  include(TestBigEndian)
  test_big_endian(BIGENDIAN)
  if(${BIGENDIAN})
    add_definitions(-DHACKRF_BIG_ENDIAN)
  endif(${BIGENDIAN})
endif()

find_package(LIBUSB REQUIRED)
find_package(Threads REQUIRED)
find_package(PThreads4W QUIET)

add_subdirectory(src)

# ##############################################################################
# Create Cmake Config-file package interface
# ##############################################################################
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
  "${CMAKE_CURRENT_BINARY_DIR}/HackRF/HackRFConfigVersion.cmake"
  VERSION ${PROJECT_VERSION}
  COMPATIBILITY AnyNewerVersion)

export(
  EXPORT HackRFTargets
  FILE "${CMAKE_CURRENT_BINARY_DIR}/HackRF/HackRFTargets.cmake"
  NAMESPACE HackRF::)
configure_file(HackRFConfig.cmake
               "${CMAKE_CURRENT_BINARY_DIR}/HackRF/HackRFConfig.cmake" COPYONLY)

set(CONFIG_PACKAGE_LOCATION ${CMAKE_INSTALL_LIBDIR}/cmake/HackRF)
install(
  EXPORT HackRFTargets
  FILE HackRFTargets.cmake
  NAMESPACE HackRF::
  DESTINATION ${CONFIG_PACKAGE_LOCATION})
install(
  FILES HackRFConfig.cmake ../cmake/modules/FindLIBUSB.cmake
        "${CMAKE_CURRENT_BINARY_DIR}/HackRF/HackRFConfigVersion.cmake"
  DESTINATION ${CONFIG_PACKAGE_LOCATION}
  COMPONENT Devel)

# ##############################################################################
# Create Pkg Config File
# ##############################################################################
foreach(inc ${LIBUSB_INCLUDE_DIR})
  list(APPEND HACKRF_PC_CFLAGS "-I${inc}")
endforeach(inc)

# use space-separation format for the pc file
string(REPLACE ";" " " HACKRF_PC_CFLAGS "${HACKRF_PC_CFLAGS}")
string(REPLACE ";" " " HACKRF_PC_LIBS "${HACKRF_PC_LIBS}")

# unset these vars to avoid hard-coded paths to cross environment
if(CMAKE_CROSSCOMPILING)
  unset(HACKRF_PC_CFLAGS)
  unset(HACKRF_PC_LIBS)
endif(CMAKE_CROSSCOMPILING)

set(prefix ${CMAKE_INSTALL_PREFIX})
set(exec_prefix \${prefix})
set(libdir \${exec_prefix}/lib${LIB_SUFFIX})
set(includedir \${prefix}/include)
set(libpkgdata lib${LIB_SUFFIX})

if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
  set(libpkgdata "libdata")
endif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libhackrf.pc.in
               ${CMAKE_CURRENT_BINARY_DIR}/libhackrf.pc @ONLY)

install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libhackrf.pc
        DESTINATION ${libpkgdata}/pkgconfig)

# ##############################################################################
# Handle udev rules file
# ##############################################################################

if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
  set(SYSTEM_IS_LINUX TRUE)
  set(UDEV_OPTION_DEFAULT ON)
else()
  set(SYSTEM_IS_LINUX FALSE)
  set(UDEV_OPTION_DEFAULT OFF)
endif()

option(INSTALL_UDEV_RULES "Install udev rules for the HackRF"
       ${UDEV_OPTION_DEFAULT})

set(UDEV_RULES_PATH
    "/etc/udev/rules.d"
    CACHE STRING "Target directory for udev rule installation.
 Ensure you have permissions to write to this directory.")

if(SYSTEM_IS_LINUX)
  if(INSTALL_UDEV_RULES)
    if(NOT DEFINED UDEV_RULES_GROUP)
      foreach(group usb plugdev)
        execute_process(
          COMMAND "getent" group "${group}"
          RESULT_VARIABLE _GETENT_RESULT
          OUTPUT_QUIET ERROR_QUIET)
        if(NOT _GETENT_RESULT)
          message(STATUS "Setting udev rule group to - ${group}")
          set(UDEV_RULES_GROUP ${group})
          break()
        endif(NOT _GETENT_RESULT)
      endforeach(group)
    endif(NOT DEFINED UDEV_RULES_GROUP)
    if(DEFINED UDEV_RULES_GROUP)
      set(HACKRF_GROUP
          "${UDEV_RULES_GROUP}"
          CACHE STRING "Group to associate HackRF devices with in udev rules")
      configure_file(${CMAKE_CURRENT_SOURCE_DIR}/53-hackrf.rules.in
                     ${CMAKE_CURRENT_BINARY_DIR}/53-hackrf.rules @ONLY)
      message(
        STATUS "HackRF udev rules will be installed to '${UDEV_RULES_PATH}'")
      install(
        FILES ${CMAKE_CURRENT_BINARY_DIR}/53-hackrf.rules
        DESTINATION ${UDEV_RULES_PATH}
        COMPONENT "udev_rules")
    else(UDEV_RULES_GROUP)
      message(
        STATUS
          "HackRF udev rules will not be installed because no group was found")
      message(STATUS "A group can be specified with -DUDEV_RULES_GROUP=<group>")
    endif(DEFINED UDEV_RULES_GROUP)
  else(INSTALL_UDEV_RULES)
    message(
      STATUS
        "HackRF udev rules will not be installed because INSTALL_UDEV_RULES=OFF"
    )
  endif(INSTALL_UDEV_RULES)
else(SYSTEM_IS_LINUX)
  if(INSTALL_UDEV_RULES)
    message(STATUS "udev rules not supported on this platform.")
    message(STATUS "Hide this message via -DINSTALL_UDEV_RULES=Off")
  endif(INSTALL_UDEV_RULES)
endif(SYSTEM_IS_LINUX)

# ##############################################################################
# Create uninstall target
# ##############################################################################
if(NOT HackRF_SOURCE_DIR)
  configure_file(${PROJECT_SOURCE_DIR}/../cmake/cmake_uninstall.cmake.in
                 ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake @ONLY)

  add_custom_target(
    uninstall
    COMMENT "Provide libhackrf uninstall target"
    COMMAND ${CMAKE_COMMAND} -P
            ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
endif()
