cmake_minimum_required(VERSION 2.6)

set(PROJECT lxfw-update)

project(${PROJECT} C)
set(PROJECT_VERSION 1.0.3)

add_definitions(-DPROJECT_VERSION="${PROJECT_VERSION}")

if(CMAKE_COMPILER_IS_GNUCC)
    set(WARNOPTS
        -Werror=implicit-int -Werror=implicit-function-declaration -Werror=strict-prototypes -Werror=return-type
        -Wall -Wextra
        -Wformat-security -Winit-self -Wstrict-aliasing -Wfloat-equal
        -Wundef -Wshadow -Wunsafe-loop-optimizations -Wpointer-arith -Wcast-align
        -Wwrite-strings  -Wsign-compare -Wlogical-op -Waggregate-return -Winline
        -Wno-unused-parameter -Wno-unused-variable -Wno-aggregate-return)
    add_definitions(${WARNOPTS})
endif(CMAKE_COMPILER_IS_GNUCC)

if(MSVC)
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS,5.01")

    add_definitions(-D_CRT_SECURE_NO_WARNINGS)
    foreach(flag_var
            CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
            CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
       if(${flag_var} MATCHES "/MD")
          string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
       endif(${flag_var} MATCHES "/MD")
    endforeach(flag_var)
endif(MSVC)


#добавляем нужную реализацию таймера
set(LTIMER_DIR lib/ltimer)
set(LCSPEC_DIR lib/lcspec)
include(${LTIMER_DIR}/ltimer.cmake)


set(SOURCES
    src/main.c
    src/firm_check.c
    lib/lcrypt_pgp/lcrypt_pgp_helpers.c
    lib/lcrypt/pgp.c
    lib/lcrypt/rsa_pubkey.c
    lib/lcrypt/sha.c
    lib/lcrypt/vlong_math.c
    lib/crc/fast_crc.c
    lib/radix64/radix64.c
    ${LTIMER_SOURCES}
   )

set(HEADERS
    src/firm_check.h
    src/fast_crc_cfg.h
    src/burn_intf.h
    lib/lcrypt_pgp/lcrypt_pgp_helpers.h
    lib/lcrypt/pgp.h
    lib/lcrypt/rsa_pubkey.h
    lib/lcrypt/sha.h
    lib/lcrypt/vlong_math.h
    lib/lcrypt/lcrypt.h
    lib/radix64/radix64.h
    ${LTIMER_HEADERS}
    )

set(LIBS
    ${LTIMER_LIBS})

set(SOURCES ${SOURCES} src/intfs/pcie/l502_intf.c)

#если есть системная реализация getopt - используем ее, иначе используем свою
find_file(GETOPT_PATH getopt.h PATH_SUFFIXES getopt)
if(NOT GETOPT_PATH)
    message(STATUS "getopt.h - not found. use internal realization of getopt")
    set(SOURCES ${SOURCES} src/getopt/getopt.c src/getopt/getopt1.c)
    set(HEADERS ${HEADERS} src/getopt/getopt.h)
    include_directories(src/getopt)
else(NOT GETOPT_PATH)
    message(STATUS "getopt.h - found : ${GETOPT_PATH}")
endif(NOT GETOPT_PATH)


find_file(HAVE_STDINT stdint.h PATH_SUFFIXES )
if(HAVE_STDINT)
    message(STATUS "stdint.h - found : ${HAVE_STDINT}")
else(HAVE_STDINT)
    message(STATUS "stdint.h - not found. use pstdint.h")
    set(HEADERS ${HEADERS} src/stdint/stdint.h)
    include_directories(src/stdint)
endif(HAVE_STDINT)



find_package(LibXml2 REQUIRED)
include_directories(${LIBXML2_INCLUDE_DIR})
message(STATUS "libxml found: " ${LIBXML2_INCLUDE_DIR})

include_directories(${PROJECT_SOURCE_DIR}/src lib/crc lib/radix64 lib)

include_directories(${X502API_INCLUDE_DIR})

add_executable(${PROJECT} ${HEADERS} ${SOURCES})

target_link_libraries(${PROJECT} ${LIBXML2_LIBRARIES})

link_directories(${X502API_LIBRARIES_DIR})

target_link_libraries(${PROJECT} x502api l502api e502api)


target_link_libraries(${PROJECT} ${LIBS})



install(TARGETS ${PROJECT} DESTINATION bin)
install(DIRECTORY firmware DESTINATION /usr/share/lxfw-update)
install(PROGRAMS l502-fpga-update-all.sh DESTINATION bin)
install(PROGRAMS e502-fpga-update-all.sh DESTINATION bin)


#цели для сборки debian-пакетов
if(UNIX AND CMAKE_EXT_INCLUDE_DIR)
    set(PACKAGE_NAME     ${PROJECT})
    set(PACKAGE_VERSION  ${PROJECT_VERSION})

    include(${CMAKE_EXT_INCLUDE_DIR}/packages/packages.cmake)
endif(UNIX AND CMAKE_EXT_INCLUDE_DIR)




