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

########################################################################
# 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
)

#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} uhd ${Boost_LIBRARIES})
    UHD_INSTALL(TARGETS ${util_name} RUNTIME DESTINATION ${RUNTIME_DIR} COMPONENT utilities)
endforeach(util_source)

########################################################################
# 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)
    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} uhd ${Boost_LIBRARIES})
    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)

#UHD images downloader configuration
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
)
if(LINUX)
    UHD_INSTALL(PROGRAMS
        ${CMAKE_CURRENT_BINARY_DIR}/uhd_images_downloader.py
        RENAME uhd_images_downloader
        DESTINATION ${RUNTIME_DIR}
        COMPONENT utilities
    )
endif(LINUX)
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)

if(ENABLE_USRP2)
    set(burners
        usrp2_card_burner.py
    )

    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(LINUX)
        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 ${RUNTIME_DIR}
            COMPONENT utilities
        )
    endif(LINUX)
    foreach(burner ${burners})
        UHD_INSTALL(PROGRAMS
            ${burner}
            DESTINATION ${PKG_LIB_DIR}/utils
            COMPONENT utilities
        )
    endforeach(burner ${burners})

endif(ENABLE_USRP2)

########################################################################
# Python rfnoc package
########################################################################
set(RFNOC_PKG_FILES "")
add_subdirectory(rfnoc)

set(OUTPUT      "${CMAKE_CURRENT_BINARY_DIR}/build/timestamp")
set(SETUP_PY_IN "${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in")
set(SETUP_PY    "${CMAKE_CURRENT_BINARY_DIR}/setup.py")
set(CONFIG_PATH "${CMAKE_INSTALL_PREFIX}/${PKG_DATA_DIR}")

# construct site-package folder from install prefix
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c
    "from __future__ import print_function; from distutils import sysconfig; print(sysconfig.get_python_lib(plat_specific=True, prefix='${CMAKE_INSTALL_PREFIX}'))"
    OUTPUT_VARIABLE RFNOC_PACKAGE_DIR OUTPUT_STRIP_TRAILING_WHITESPACE
)

configure_file(${SETUP_PY_IN} ${SETUP_PY})
# rfnoc_image_builder uses RFNOC_PACKAGE_DIR to find python package location
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/bin/rfnoc_image_builder" "${CMAKE_CURRENT_BINARY_DIR}/bin/rfnoc_image_builder")

add_custom_command(OUTPUT ${OUTPUT}
     COMMENT "build rfnoc package"
     COMMAND ${CMAKE_COMMAND}  -DSOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}" -DBINARY_DIR="${CMAKE_CURRENT_BINARY_DIR}"  -P ${CMAKE_CURRENT_SOURCE_DIR}/copy_python_module.cmake
     COMMAND ${PYTHON_EXECUTABLE} ${SETUP_PY} -q build
     COMMAND ${CMAKE_COMMAND} -E touch ${OUTPUT}
     DEPENDS ${RFNOC_PKG_FILES})
add_custom_target(rfnoc ALL DEPENDS ${OUTPUT})

get_filename_component(SETUP_FOLDER ${SETUP_PY} DIRECTORY)
install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} ${SETUP_PY} install --force --prefix ${CMAKE_INSTALL_PREFIX} WORKING_DIRECTORY ${SETUP_FOLDER})")

########################################################################
# 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)