cmake_minimum_required(VERSION 3.12)

project(picotool)

if (NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
endif()

if (DEFINED ENV{PICO_SDK_PATH} AND (NOT PICO_SDK_PATH))
    set(PICO_SDK_PATH $ENV{PICO_SDK_PATH})
    message("Using PICO_SDK_PATH from environment ('${PICO_SDK_PATH}')")
endif ()
if (NOT PICO_SDK_PATH)
    message(FATAL_ERROR "PICO_SDK_PATH is not defined")
endif()
get_filename_component(PICO_SDK_PATH "${PICO_SDK_PATH}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}")
if (NOT EXISTS ${PICO_SDK_PATH})
    message(FATAL_ERROR "Directory '${PICO_SDK_PATH}' not found")
endif ()
include(${PICO_SDK_PATH}/pico_sdk_version.cmake)

if (PICO_SDK_VERSION_STRING VERSION_LESS "1.3.0")
    message(FATAL_ERROR "Raspberry Pi Pico SDK version 1.3.0 (or later) required. Your version is ${PICO_SDK_VERSION_STRING}")
endif()

set(CMAKE_CXX_STANDARD 14)

list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake)

add_subdirectory(picoboot_connection)

find_package(LIBUSB)
if (NOT LIBUSB_FOUND)
    message(FATAL_ERROR "picotool cannot be built because libUSB is not found")
else()
    add_subdirectory(${PICO_SDK_PATH}/src/common/pico_binary_info pico_binary_info)
    add_subdirectory(${PICO_SDK_PATH}/src/common/boot_uf2 boot_uf2_headers)
    add_subdirectory(${PICO_SDK_PATH}/src/common/boot_picoboot boot_picoboot_headers)
    add_subdirectory(${PICO_SDK_PATH}/src/common/pico_usb_reset_interface pico_usb_reset_interface)
    add_subdirectory(${PICO_SDK_PATH}/src/host/pico_platform pico_platform)

    add_executable(picotool main.cpp)
    set(PICOTOOL_VERSION 1.1.1)
    set(SYSTEM_VERSION "${CMAKE_SYSTEM_NAME} ${CMAKE_SYSTEM_VERSION}")
    set(COMPILER_INFO "${CMAKE_C_COMPILER_ID}-${CMAKE_C_COMPILER_VERSION}, ${CMAKE_BUILD_TYPE}")
    target_compile_definitions(picotool PRIVATE
            PICOTOOL_VERSION="${PICOTOOL_VERSION}"
            SYSTEM_VERSION="${SYSTEM_VERSION}"
            COMPILER_INFO="${COMPILER_INFO}"
            )
    target_include_directories(picotool PRIVATE ${LIBUSB_INCLUDE_DIR})
    # todo, this is a bit of an abstraction failure; but don't want to rev the SDK just for this right now
    target_include_directories(picotool PRIVATE ${PICO_SDK_PATH}/src/rp2_common/pico_stdio_usb/include)
    target_link_libraries(picotool
            pico_binary_info
            boot_uf2_headers
            boot_picoboot_headers
            pico_platform_headers
            pico_usb_reset_interface_headers
            picoboot_connection_cxx
            ${LIBUSB_LIBRARIES})
    # allow `make install`
    install(TARGETS picotool RUNTIME DESTINATION bin)
endif()
