#project (%{CurrentProject:Name})
project (test_can)
cmake_minimum_required(VERSION 3.10)

set (CMAKE_CROSSCOMPILING 1)
set (CMAKE_CXX_COMPILER  /usr/bin/arm-none-eabi-gcc)
set (CMAKE_OBJCOPY /usr/bin/arm-none-eabi-objcopy)
set (CMAKE_OBJDUMP /usr/bin/arm-none-eabi-objdump)
set (CMAKE_SIZE_TOOL /usr/bin/arm-none-eabi-size)
set (CMAKE_SYSTEM_NAME Generic)
set (CMAKE_SYSTEM_PROCESSOR ARM)
set (CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
set (STM32_STDPERIPHLIB_DIR ${PROJECT_SOURCE_DIR})

set (MCU_FAMILY STM32F0xx)
set (MCU_LINE STM32F042x6)
set (CPU cortex-m0)
set (MCU_LINKER_SCRIPT_FILE "STM32F042F6Px_FLASH.ld")
add_definitions (-D${MCU_LINE}) # Обязательно иначе QtCreator не увидит библиотеки
add_definitions (-DUSE_HAL_DRIVER) # Обязательно иначе QtCreator не увидит библиотеки

set (CMSIS_DEVICE_INCLUDE ${STM32_STDPERIPHLIB_DIR}/Drivers/CMSIS/Device/ST/${MCU_FAMILY}/Include)
set (CMSIS_INCLUDE ${STM32_STDPERIPHLIB_DIR}/Drivers/CMSIS/Include)
set (HAL_INCLUDE ${STM32_STDPERIPHLIB_DIR}/Drivers/${MCU_FAMILY}_HAL_Driver/Inc)
set (HAL_INCLUDE_LEGACY ${STM32_STDPERIPHLIB_DIR}/Drivers/${MCU_FAMILY}_HAL_Driver/Inc/Legacy)
#set (HAL_MIDDLEWARES_INCLUDE ${STM32_STDPERIPHLIB_DIR}/Middlewares/ST/STM32_USB_Device_Library/Core/Inc)
#set (HAL_MIDDLEWARES_CDC_INCLUDE ${STM32_STDPERIPHLIB_DIR}/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc)

file(GLOB_RECURSE CMSIS_DEVICE_INCLUDE_FILES ${CMSIS_DEVICE_INCLUDE}/*.h)
file(GLOB_RECURSE CMSIS_INCLUDE_FILES ${CMSIS_INCLUDE}/*.h)
file(GLOB_RECURSE HAL_INCLUDE_FILES ${HAL_INCLUDE}/*.h)
#file(GLOB_RECURSE HAL_MIDDLEWARES_INCLUDE_FILES ${HAL_MIDDLEWARES_INCLUDE}/*.h)
#file(GLOB_RECURSE HAL_MIDDLEWARES_CDC_INCLUDE_FILES ${HAL_MIDDLEWARES_CDC_INCLUDE}/*.h)

string(TOLOWER ${MCU_FAMILY} mcu_family)
string(TOLOWER ${MCU_LINE} mcu_line)

file(GLOB HAL_SOURCES_FILES ${STM32_STDPERIPHLIB_DIR}/Drivers/${MCU_FAMILY}_HAL_Driver/Src/*.c)
#file(GLOB HAL_MIDDLEWARES_FILES ${STM32_STDPERIPHLIB_DIR}/Middlewares/ST/STM32_USB_Device_Library/Core/Src/*.c)
#file(GLOB HAL_MIDDLEWARES_CDC_FILES ${STM32_STDPERIPHLIB_DIR}/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/*.c)

set (
     HAL_SOURCES
     ${HAL_SOURCES_FILES}
     ${HAL_MIDDLEWARES_FILES}
     ${HAL_MIDDLEWARES_CDC_FILES}
)

file(GLOB CMSIS_SYSTEM ${PROJECT_SOURCE_DIR}/Src/system_${mcu_family}.c)
file(GLOB CMSIS_STARTUP ${PROJECT_SOURCE_DIR}/startup_${mcu_line}.s)
file(GLOB MCU_LINKER_SCRIPT ${PROJECT_SOURCE_DIR}/${MCU_LINKER_SCRIPT_FILE})

file (GLOB_RECURSE USER_SOURCES_C_FILES ${PROJECT_SOURCE_DIR}/Src/*.c)
file (GLOB_RECURSE USER_SOURCES_CXX_FILES ${PROJECT_SOURCE_DIR}/Src/*.cpp)
file (GLOB_RECURSE USER_HEADERS_FILES ${PROJECT_SOURCE_DIR}/Inc/*.h)
set (USER_HEADERS_INCLUDE ${PROJECT_SOURCE_DIR}/Inc)

set (
    PRJ_SOURCES
    ${USER_SOURCES_C_FILES}
    ${USER_SOURCES_CXX_FILES}
)

set (
    PRJ_HEADERS
    ${USER_HEADERS_FILES}
)

set (
    SOURCES
    ${PRJ_SOURCES}
    ${HAL_SOURCES}
    ${CMSIS_STARTUP}
)

set (
    HEADERS
    ${PRJ_HEADERS}
    ${CMSIS_DEVICE_INCLUDE_FILES}
    ${CMSIS_INCLUDE_FILES}
    ${HAL_INCLUDE_FILES}
    #${HAL_MIDDLEWARES_INCLUDE_FILES}
    #${HAL_MIDDLEWARES_CDC_INCLUDE_FILES}
)

add_custom_target (
    Sources
    DEPENDS ${PROJECT_NAME}
    SOURCES ${SOURCES}
)

add_custom_target (
    Headers
    DEPENDS ${PROJECT_NAME}
    SOURCES ${HEADERS}
)

set (
    OBJ_PARAM
    -c
    -mcpu=${CPU}
    -mthumb
    -DUSE_HAL_DRIVER
    -D${MCU_LINE}
    -Og
    -Wall
    -fdata-sections
    -ffunction-sections
    -g
    -gdwarf-2
    -MMD
    -MP
#    -flto
)

set (
    CMP_PARAM
    -mcpu=${CPU}
    -mthumb
    -specs=nano.specs
    -lc
    -lm
    -lnosys
    -Wl,--gc-sections
#    -u _printf_float
)

set (h_files "")
set (hh_files "")
set (obj_files "")
set (lst_files "")
set (d_files "")
set (elf_file ${PROJECT_NAME}.elf)
set (hex_file ${PROJECT_NAME}.hex)
set (bin_file ${PROJECT_NAME}.bin)
set (map_file ${PROJECT_NAME}.map)
set (lst_file ${PROJECT_NAME}.lst)
set (cbp_file ${PROJECT_NAME}.cbp)

list (APPEND h_files "-I${CMSIS_DEVICE_INCLUDE}")
list (APPEND h_files "-I${CMSIS_INCLUDE}")
list (APPEND h_files "-I${HAL_INCLUDE}")
#list (APPEND h_files "-I${HAL_MIDDLEWARES_INCLUDE}")
#list (APPEND h_files "-I${HAL_MIDDLEWARES_CDC_INCLUDE}")
list (APPEND h_files "-I${USER_HEADERS_INCLUDE}")
list (APPEND h_files "-I${HAL_INCLUDE_LEGACY}")

list (APPEND hh_files ${CMSIS_DEVICE_INCLUDE})
list (APPEND hh_files ${CMSIS_INCLUDE})
list (APPEND hh_files ${HAL_INCLUDE})
#list (APPEND hh_files ${HAL_MIDDLEWARES_INCLUDE})
#list (APPEND hh_files ${HAL_MIDDLEWARES_CDC_INCLUDE})
list (APPEND hh_files ${USER_HEADERS_INCLUDE})
list (APPEND hh_files ${HAL_INCLUDE_LEGACY})

include_directories(${hh_files})

foreach (_file ${SOURCES})
    string (REGEX MATCH "^.*/([^./]*)\\.[^.]*$" dummy ${_file})
    set (file_name ${CMAKE_MATCH_1})
    set (file_obj_name "${file_name}.o")
    set (file_lst_name "${file_name}.lst")
    set (file_d_name "${file_name}.d")
#message("${CMAKE_CXX_COMPILER} ${OBJ_PARAM} ${h_files} -MF\"${file_name}.d\" -Wa,-a,-ad,-alms=${file_name}.lst ${_file} -o ${file_obj_name}")
    add_custom_command (
        OUTPUT ${file_obj_name}
        COMMAND
            ${CMAKE_CXX_COMPILER} ${OBJ_PARAM} ${h_files} -MF"${file_name}.d" -Wa,-a,-ad,-alms=${file_name}.lst ${_file} -o ${file_obj_name}
        DEPENDS ${_file}
    )
list (APPEND obj_files ${file_obj_name})
list (APPEND lst_files ${file_lst_name})
list (APPEND d_files ${file_d_name})
endforeach ()

set_property(DIRECTORY PROPERTY ADDITIONAL_MAKE_CLEAN_FILES
   ${lst_files}
   ${d_files}
   ${lst_file}
   ${map_file}
   ${cbp_file})

#message("${CMAKE_CXX_COMPILER} ${obj_files} ${CMP_PARAM} -T${MCU_LINKER_SCRIPT} -Wl,-Map=${map_file},--cref -o ${elf_file}")
add_custom_command (
    OUTPUT ${elf_file}
    COMMAND
        ${CMAKE_CXX_COMPILER} ${obj_files} ${CMP_PARAM} -T${MCU_LINKER_SCRIPT} -Wl,-Map=${map_file},--cref -o ${elf_file}
    COMMAND
        ${CMAKE_OBJDUMP} -h -S ${elf_file} > ${lst_file}
    DEPENDS ${obj_files}
)

add_custom_command(
   OUTPUT ${hex_file}
   COMMAND
      ${CMAKE_OBJCOPY} -O ihex ${elf_file} ${hex_file}
   DEPENDS ${elf_file}
)

add_custom_command(
   OUTPUT ${bin_file}
   COMMAND
      ${CMAKE_OBJCOPY} -O binary ${elf_file} ${bin_file}
   DEPENDS ${elf_file}
)

add_custom_target(
   ${PROJECT_NAME}
   ALL
   COMMAND
        ${CMAKE_SIZE_TOOL} ${elf_file}
   DEPENDS ${hex_file} ${bin_file}
)
