#
# Copyright 2010-2015 Ettus Research LLC
# Copyright 2018 Ettus Research, a National Instruments Company
#
# SPDX-License-Identifier: GPL-3.0-or-later
#

set(CONFIG_PATH "${CMAKE_INSTALL_PREFIX}/${PKG_DATA_DIR}")

########################################################################
# First, only utilities which get installed with ENABLE_PYMOD_UTILS.
# These require Mako and ruamel.yaml.
########################################################################
if(ENABLE_PYMOD_UTILS)
    ### RFNoC Image Builder
    UHD_INSTALL(PROGRAMS
        ${CMAKE_CURRENT_SOURCE_DIR}/rfnoc_image_builder.py
        RENAME rfnoc_image_builder
        DESTINATION ${CMAKE_INSTALL_BINDIR}
        COMPONENT utilities
    )

    ### RFNoC modtool. Note this also requires the RFNoC gain OOT.
    UHD_INSTALL(PROGRAMS
        ${CMAKE_CURRENT_SOURCE_DIR}/rfnoc_modtool.py
        RENAME rfnoc_modtool
        DESTINATION ${CMAKE_INSTALL_BINDIR}
        COMPONENT utilities
    )

    file(GLOB_RECURSE RFNOC_GAIN_OOT_FILES
        ${CMAKE_CURRENT_SOURCE_DIR}/../examples/rfnoc-gain/apps/CMakeLists.txt
        ${CMAKE_CURRENT_SOURCE_DIR}/../examples/rfnoc-gain/cmake/*
        ${CMAKE_CURRENT_SOURCE_DIR}/../examples/rfnoc-gain/CMakeLists.txt
        ${CMAKE_CURRENT_SOURCE_DIR}/../examples/rfnoc-gain/examples/CMakeLists.txt
        ${CMAKE_CURRENT_SOURCE_DIR}/../examples/rfnoc-gain/fpga/gain/CMakeLists.txt
        ${CMAKE_CURRENT_SOURCE_DIR}/../examples/rfnoc-gain/include/rfnoc/gain/CMakeLists.txt
        ${CMAKE_CURRENT_SOURCE_DIR}/../examples/rfnoc-gain/lib/CMakeLists.txt
        ${CMAKE_CURRENT_SOURCE_DIR}/../examples/rfnoc-gain/python/*
        ${CMAKE_CURRENT_SOURCE_DIR}/../examples/rfnoc-gain/README.md
        ${CMAKE_CURRENT_SOURCE_DIR}/../examples/rfnoc-gain/rfnoc/CMakeLists.txt
        ${CMAKE_CURRENT_SOURCE_DIR}/../examples/rfnoc-gain/rfnoc/blocks/CMakeLists.txt
        )

    add_custom_target(
        rfnoc_newmod ALL
        DEPENDS ${RFNOC_GAIN_OOT_FILES}
        COMMAND
        "${PYTHON_EXECUTABLE}" "${UHD_SOURCE_DIR}/cmake/Modules/copy_rfnoc_newmod.py"
        "--source" "${CMAKE_CURRENT_SOURCE_DIR}/../examples/rfnoc-gain"
        "--dest" "${CMAKE_CURRENT_BINARY_DIR}/rfnoc-newmod"
        "--module-dir" "${CMAKE_CURRENT_SOURCE_DIR}/../python/uhd"
        COMMENT "Generating rfnoc-newmod"
    )
    install(DIRECTORY
        ${CMAKE_CURRENT_BINARY_DIR}/rfnoc-newmod
        DESTINATION ${PKG_DATA_DIR}
        COMPONENT utilities)
endif(ENABLE_PYMOD_UTILS)

########################################################################
# Now, utilities which do not depend on Mako or ruamel.yaml
########################################################################
# Decide if we install all utilities into the runtime path
if(LINUX OR BSD OR CMAKE_SYSTEM_NAME STREQUAL "GNU")
    set(UHD_INSTALL_ALL_UTILS TRUE)
else()
    set(UHD_INSTALL_ALL_UTILS FALSE)
endif()


# This section must only include Python utilities that do not depend on uhd
if(ENABLE_PYMOD_UTILS OR ENABLE_UTILS)
    ### UHD Images downloader
    # Configure the scripts
    file(READ ${CMAKE_CURRENT_SOURCE_DIR}/../../images/manifest.txt CMAKE_MANIFEST_CONTENTS)
    configure_file(
        ${CMAKE_CURRENT_SOURCE_DIR}/uhd_images_downloader.py.in
        ${CMAKE_CURRENT_BINARY_DIR}/uhd_images_downloader.py
    @ONLY)
    # TODO: FIXME when know how.
    # This is a hack to force cmake regenerate uhd_images_downloader.py
    # whenever manifest.txt file changed.
    configure_file(
        ${CMAKE_CURRENT_SOURCE_DIR}/../../images/manifest.txt
        ${CMAKE_CURRENT_SOURCE_DIR}/../../images/manifest.txt
    COPYONLY)

    UHD_INSTALL(PROGRAMS
        ${CMAKE_CURRENT_BINARY_DIR}/uhd_images_downloader.py
        DESTINATION ${PKG_LIB_DIR}/utils
        COMPONENT utilities
    )
    # On Linux/Unix systems, also install into $PATH
    if(UHD_INSTALL_ALL_UTILS)
        UHD_INSTALL(PROGRAMS
            ${CMAKE_CURRENT_BINARY_DIR}/uhd_images_downloader.py
            RENAME uhd_images_downloader
            DESTINATION ${CMAKE_INSTALL_BINDIR}
            COMPONENT utilities
        )
    endif()
    if(NOT HAVE_PYTHON_MODULE_REQUESTS)
        message(WARNING
            "Python module `requests' not found -- uhd_images_downloader.py "
            "will not work without it.")
        message(WARNING
            "You may be able to install this by running 'pip install requests'")
    endif(NOT HAVE_PYTHON_MODULE_REQUESTS)

    ### USRP2 Card Burner
    if(ENABLE_USRP2)
        if(WIN32 AND UHD_RELEASE_MODE) #include dd.exe
            file(DOWNLOAD
                "http://files.ettus.com/dd.exe"
                ${CMAKE_CURRENT_BINARY_DIR}/dd.exe
            )
            UHD_INSTALL(FILES
                ${CMAKE_CURRENT_BINARY_DIR}/dd.exe
                DESTINATION ${PKG_LIB_DIR}/utils
                COMPONENT utilities
            )
        endif(WIN32 AND UHD_RELEASE_MODE)
        if(UHD_INSTALL_ALL_UTILS)
            UHD_INSTALL(PROGRAMS
                usrp2_recovery.py
                DESTINATION ${PKG_LIB_DIR}/utils
                COMPONENT utilities
            )
            UHD_INSTALL(PROGRAMS
                usrp2_card_burner.py
                RENAME usrp2_card_burner
                DESTINATION ${CMAKE_INSTALL_BINDIR}
                COMPONENT utilities
            )
        endif()
        UHD_INSTALL(PROGRAMS
            usrp2_card_burner.py
            DESTINATION ${PKG_LIB_DIR}/utils
            COMPONENT utilities
        )
    endif(ENABLE_USRP2)

endif(ENABLE_PYMOD_UTILS OR ENABLE_UTILS)

if(NOT ENABLE_UTILS)
    return()
endif()

########################################################################
# Utilities that get installed into the runtime path
########################################################################
set(util_runtime_sources
    uhd_config_info.cpp
    uhd_find_devices.cpp
    uhd_usrp_probe.cpp
    uhd_image_loader.cpp
    uhd_cal_rx_iq_balance.cpp
    uhd_cal_tx_dc_offset.cpp
    uhd_cal_tx_iq_balance.cpp
    uhd_adc_self_cal.cpp
)

#for each source: build an executable and install
foreach(util_source ${util_runtime_sources})
    get_filename_component(util_name ${util_source} NAME_WE)
    add_executable(${util_name} ${util_source})
    target_link_libraries(${util_name} PUBLIC uhd Boost::program_options)
    UHD_INSTALL(TARGETS ${util_name} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT utilities)
endforeach(util_source)

if(ENABLE_PYTHON_API)
    configure_file(
        "${CMAKE_CURRENT_SOURCE_DIR}/usrpctl.py"
        "${CMAKE_CURRENT_BINARY_DIR}/usrpctl"
    )
    UHD_INSTALL(PROGRAMS
        ${CMAKE_CURRENT_BINARY_DIR}/usrpctl
        RENAME usrpctl
        DESTINATION ${CMAKE_INSTALL_BINDIR}
        COMPONENT utilities
    )
endif()

########################################################################
# Utilities that get installed into the share path
########################################################################
set(util_share_sources
    converter_benchmark.cpp
    query_gpsdo_sensors.cpp
    usrp_burn_db_eeprom.cpp
    usrp_burn_mb_eeprom.cpp
)
set(util_share_sources_py
    converter_benchmark.py
)
if(ENABLE_USB)
    find_package(LIBUSB)
    list(APPEND util_share_sources
        fx2_init_eeprom.cpp
    )
    include_directories(${LIBUSB_INCLUDE_DIRS})
    if(ENABLE_B200)
        list(APPEND util_share_sources
            b2xx_fx3_utils.cpp
        )
        # Additional include directories for b2xx_fx3_utils
        include_directories(
            ${CMAKE_CURRENT_SOURCE_DIR}/../lib/include
            ${CMAKE_CURRENT_SOURCE_DIR}/../lib/usrp/b200
            ${CMAKE_CURRENT_SOURCE_DIR}/../lib/usrp/common
            ${CMAKE_CURRENT_SOURCE_DIR}/../lib/usrp/common/ad9361_driver
        )
    endif(ENABLE_B200)
endif(ENABLE_USB)
if(ENABLE_OCTOCLOCK)
    list(APPEND util_share_sources
        octoclock_burn_eeprom.cpp
    )
endif(ENABLE_OCTOCLOCK)

if(LINUX AND ENABLE_USB)
    UHD_INSTALL(FILES
        uhd-usrp.rules
        DESTINATION ${PKG_LIB_DIR}/utils
        COMPONENT utilities
    )
endif(LINUX AND ENABLE_USB)

#for each source: build an executable and install
foreach(util_source ${util_share_sources})
    get_filename_component(util_name ${util_source} NAME_WE)
    add_executable(${util_name} ${util_source})
    target_link_libraries(${util_name} PUBLIC uhd Boost::program_options)
    UHD_INSTALL(TARGETS ${util_name} RUNTIME DESTINATION ${PKG_LIB_DIR}/utils COMPONENT utilities)
endforeach(util_source)
foreach(util_source ${util_share_sources_py})
    UHD_INSTALL(PROGRAMS
        ${CMAKE_CURRENT_SOURCE_DIR}/${util_source}
        DESTINATION ${PKG_LIB_DIR}/utils
        COMPONENT utilities
    )
endforeach(util_source)

########################################################################
# Other files that are not utilities or executables
########################################################################
if(WIN32)
    set(windows_extra_files
        FastSendDatagramThreshold.reg
    )
    UHD_INSTALL(
        FILES ${windows_extra_files}
        DESTINATION ${PKG_DATA_DIR}
        COMPONENT utilities
    )
endif(WIN32)

add_subdirectory(latency)
