cmake_minimum_required(VERSION 3.5)

project(tedswriter-burn VERSION 1.0)


set(PRJ_APP_TITLE  "TEDS Editor")
set(PRJ_DESCR_EN   "Tool for burn tedswriter firmware")
set(PRJ_DESCR_RU   "Утилита записи прошивки модуля tedswriter")

if(NOT ${CMAKE_VERSION}  VERSION_LESS "3.0.0")
    string(TIMESTAMP CURRENT_YEAR "%Y")
endif()


set(PROJECT_APP_TITLE ${PROJECT_NAME})

if(WIN32)
    SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS,5.01")
endif(WIN32)



configure_file(version.h.in ${CMAKE_CURRENT_BINARY_DIR}/version.h)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_AUTOMOC ON)

include_directories(${CMAKE_CURRENT_BINARY_DIR}
                    ${CMAKE_CURRENT_SOURCE_DIR}
                    )



include_directories(subs/LQError)

set(SOURCES
    main.cpp
    tedswriter_fw_suffix.h
    sha.h
    sha.c

    ProgressLog.h
    subs/LQError/LQError.h
    subs/LQError/LQError.cpp

    protocol/BurnProtocol.h
    protocol/BurnProtocol.cpp
    protocol/BurnDeviceInfo.h
    protocol/BurnDeviceInfo.cpp
    protocol/dfu/dfu_defs.h
    protocol/dfu/BurnProtocolDfuErrors.h
    protocol/dfu/BurnProtocolDfuErrors.cpp
    protocol/dfu/BurnProtocolDfu.h
    protocol/dfu/BurnProtocolDfu.cpp
    protocol/dfu/DfuDevice.h
    protocol/dfu/DfuDevice.cpp
    protocol/dfu/DfuDeviceErrors.h
    protocol/dfu/DfuDeviceErrors.cpp
    protocol/dfu/stm32/stm_dfu_defs.h
    protocol/dfu/stm32/BurnProtocolDfuSTM32.h
    protocol/dfu/stm32/BurnProtocolDfuSTM32.cpp

    PortLoader.h
    PortLoader.cpp
    PortLoaderErrors.h
    PortLoaderErrors.cpp
)


include(CheckIncludeFiles)
include(CheckFunctionExists)
include(CheckLibraryExists)
include(CheckTypeSize)
include(CheckSymbolExists)

find_package(Qt5 COMPONENTS Core)

set(LIBS Qt5::Core)


#добавляем путь к модулям cmake в path для cmake
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/subs/cmake_modules/")

find_package(LibUSB REQUIRED)
include_directories(${LIBUSB_INCLUDE_DIR})
set(LIBS ${LIBS} ${LIBUSB_LIBRARIES})

set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${LIBUSB_INCLUDE_DIR})
set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${LIBUSB_LIBRARIES})
check_function_exists(libusb_error_name HAVE_LIBUSB_ERROR_NAME)


add_executable(${PROJECT_NAME} ${SOURCES})

target_link_libraries(${PROJECT_NAME} ${LIBS})

source_group("Sources" ${PROJECT_SOURCE_DIR})


if(UNIX)
    install(TARGETS ${PROJECT_NAME} DESTINATION bin)

    if(NOT UDEV_RULES_DIR)
        set(UDEV_RULES_DIR lib/udev/rules.d)
    endif(NOT UDEV_RULES_DIR)
    install(FILES stm32dfu.rules DESTINATION ${UDEV_RULES_DIR})


    set(PACKAGE_NAME     ${PROJECT_NAME})
    set(PACKAGE_VERSION  ${PROJECT_VERSION})

    execute_process(COMMAND "date" "+%Y" OUTPUT_VARIABLE PACKAGE_BUILD_YEAR)
    string(STRIP ${PACKAGE_BUILD_YEAR} PACKAGE_BUILD_YEAR)


    set(PACKAGE_VER_NAME ${PACKAGE_NAME}-${PACKAGE_VERSION})
    set(PACKAGE_SRC_TAR_NAME     ${PACKAGE_NAME}_${PACKAGE_VERSION}.tar.gz)

    if(NOT PACKAGE_SRC_DIR)
        set(PACKAGE_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
    endif(NOT PACKAGE_SRC_DIR)

    if(EXISTS ${PACKAGE_SRC_DIR}/debian/changelog.in)
        configure_file(${PACKAGE_SRC_DIR}/debian/changelog.in
                   ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_VER_NAME}/debian/changelog @ONLY)
    endif()

    if(EXISTS ${PACKAGE_SRC_DIR}/debian/control.in)
        configure_file(${PACKAGE_SRC_DIR}/debian/control.in
                   ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_VER_NAME}/debian/control @ONLY)
    endif()

    if(EXISTS ${PACKAGE_SRC_DIR}/debian/copyright.in)
        configure_file(${PACKAGE_SRC_DIR}/debian/copyright.in
                   ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_VER_NAME}/debian/copyright @ONLY)
    endif()

    add_custom_target(${PACKAGE_NAME}-src-prepare
            #копируем исходники, чтобы не засорять исходную папку результатами
            COMMAND cmake -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_VER_NAME}
            COMMAND cp -r ${CMAKE_CURRENT_SOURCE_DIR}/* ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_VER_NAME}
            COMMAND chmod -f +x ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_VER_NAME}/debian/rules || :
            COMMAND tar -caf ${PACKAGE_SRC_TAR_NAME} ${PACKAGE_VER_NAME}
            WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
            )

    #цель для создания бинарного deb-пакета
    add_custom_target(${PACKAGE_NAME}-deb
        COMMAND debuild -us -uc -Zgzip -d
        DEPENDS ${PACKAGE_NAME}-src-prepare
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_VER_NAME}
        )
    #цель для сборки deb-пакета с исходниками
    add_custom_target(${PACKAGE_NAME}-deb-src
        COMMAND debuild -us -uc -Zgzip -S -d
        DEPENDS ${PACKAGE_NAME}-src-prepare
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_VER_NAME}
        )

    if(NOT OSC_PROJECT)
        set(OSC_PROJECT      home:l-card:testing)
    endif(NOT OSC_PROJECT)

    set(OSC_COPY_FILES ${OSC_COPY_FILES}
            ${PACKAGE_NAME}_${PACKAGE_VERSION}.dsc
            ${PACKAGE_SRC_TAR_NAME}
        )
    #получение текущего пакета с сервера и замена файлов
    add_custom_target(${PACKAGE_NAME}-osc-prepare
        #удаляем старые файлы
        COMMAND rm -rf ${OSC_PROJECT}
        #получаем текущую версию с сервера
        #COMMAND osc checkout ${OSC_PROJECT} ${PACKAGE_NAME}
        #удаляем из нее все файлы
        COMMAND rm -rf ${OSC_PROJECT}/${PACKAGE_NAME}
        COMMAND osc checkout -M ${OSC_PROJECT} ${PACKAGE_NAME}
        COMMAND rm ${OSC_PROJECT}/${PACKAGE_NAME}/_meta
        #копируем нужные файлы
        COMMAND cp ${PACKAGE_NAME}_${PACKAGE_VERSION}.dsc ${OSC_PROJECT}/${PACKAGE_NAME}
        COMMAND cp ${PACKAGE_SRC_TAR_NAME} ${OSC_PROJECT}/${PACKAGE_NAME}
        DEPENDS ${PACKAGE_NAME}-deb-src
        DEPENDS ${OSC_COPY_FILES}
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
        VERBATIM
        )
    #фиксирование изменений и заливка измененного пакета на сервер
    add_custom_target(${PACKAGE_NAME}-osc
        COMMAND osc addremove
        COMMAND osc commit -v -m "new version"
        DEPENDS ${PACKAGE_NAME}-osc-prepare
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${OSC_PROJECT}/${PACKAGE_NAME}
        )

endif(UNIX)
