AVR-Blink/CMakeLists.txt

123 lines
3.8 KiB
CMake
Raw Normal View History

2023-11-02 21:53:55 +03:00
cmake_minimum_required(VERSION 3.26)
2023-11-02 23:20:04 +03:00
project(Blink VERSION 0.1.0.0 LANGUAGES C ASM)
2023-11-02 21:53:55 +03:00
set(CMAKE_C_STANDARD 17)
2023-11-19 12:25:21 +03:00
if(NOT M_TYPE)
set(M_TYPE attiny13a)
2023-11-02 21:53:55 +03:00
endif()
2023-11-19 12:25:21 +03:00
if(NOT P_CLK)
set(P_CLK 256kHz)
2023-11-02 21:53:55 +03:00
endif()
2023-11-19 12:25:21 +03:00
if(NOT P_TYPE)
set(P_TYPE usbasp)
2023-11-02 21:53:55 +03:00
endif()
2023-11-19 12:25:21 +03:00
if(NOT P_PORT)
set(P_PORT /dev/usb/lp0)
2023-11-02 21:53:55 +03:00
endif()
2023-11-19 12:25:21 +03:00
if(NOT F_CPU)
set(F_CPU 1000000)
endif()
set(SOURCE_FILES defs.h main.c)
2023-11-02 21:53:55 +03:00
########################################################################################################################
2023-11-19 12:25:21 +03:00
find_program(M_CC avr-gcc REQUIRED)
find_program(M_CXX avr-g++ REQUIRED)
find_program(M_UPLOAD_TOOL avrdude REQUIRED)
find_program(M_OBJCOPY avr-objcopy REQUIRED)
find_program(M_SIZE avr-size REQUIRED)
find_program(M_OBJDUMP avr-objdump REQUIRED)
2023-11-02 21:53:55 +03:00
2023-11-19 12:25:21 +03:00
set(CMAKE_C_COMPILER ${M_CC})
set(CMAKE_CXX_COMPILER ${M_CXX})
2023-11-02 21:53:55 +03:00
if(DEFINED $ENV{AVR_ROOT_PATH})
set(AVR_ROOT_PATH $ENV{AVR_ROOT_PATH})
else()
if(EXISTS "/usr/avr")
set(AVR_ROOT_PATH "/usr/avr")
elseif(EXISTS "/opt/local/avr")
set(AVR_ROOT_PATH "/opt/local/avr")
elseif(EXISTS "/usr/lib/avr")
set(AVR_ROOT_PATH "/usr/lib/avr")
else()
message(FATAL_ERROR "Please set AVR_ROOT_PATH in your environment.")
endif()
endif()
set(CMAKE_SYSTEM_INCLUDE_PATH "${AVR_ROOT_PATH}/include")
set(CMAKE_SYSTEM_LIBRARY_PATH "${AVR_ROOT_PATH}/lib")
########################################################################################################################
2023-11-19 12:25:21 +03:00
set(M_FLAGS -c ${P_TYPE} -p ${M_TYPE} -P ${P_PORT} -B ${P_CLK})
add_definitions("-DF_CPU=${F_CPU}")
add_definitions("-fpack-struct")
add_definitions("-fshort-enums")
add_definitions("-funsigned-char")
add_definitions("-funsigned-bitfields")
add_definitions("-ffunction-sections")
add_definitions("-Wall")
add_definitions("-Werror")
2023-11-02 21:53:55 +03:00
if(NOT CMAKE_BUILD_TYPE OR NOT (CMAKE_BUILD_TYPE MATCHES Release OR CMAKE_BUILD_TYPE MATCHES Debug))
set(CMAKE_BUILD_TYPE Debug)
endif()
if(CMAKE_BUILD_TYPE MATCHES Release)
2023-11-19 12:25:21 +03:00
set(CMAKE_C_FLAGS_RELEASE "-Os -fno-asynchronous-unwind-tables")
set(CMAKE_CXX_FLAGS_RELEASE "-Os -fno-asynchronous-unwind-tables")
2023-11-02 21:53:55 +03:00
endif()
if(CMAKE_BUILD_TYPE MATCHES Debug)
set(CMAKE_C_FLAGS_DEBUG "-O0 -save-temps -g -gdwarf-3 -gstrict-dwarf")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -save-temps -g -gdwarf-3 -gstrict-dwarf")
endif()
########################################################################################################################
function(add_mcu_executable EXECUTABLE_NAME)
if(NOT ARGN)
message(FATAL_ERROR "No source files given for ${EXECUTABLE_NAME}")
endif()
2023-11-19 12:25:21 +03:00
set(elf_file ${M_TYPE}-${EXECUTABLE_NAME}.elf)
set(map_file ${M_TYPE}-${EXECUTABLE_NAME}.map)
set(hex_file ${M_TYPE}-${EXECUTABLE_NAME}.hex)
set(eeprom_file ${M_TYPE}-${EXECUTABLE_NAME}-eeprom.hex)
2023-11-02 21:53:55 +03:00
add_executable(${elf_file} EXCLUDE_FROM_ALL ${ARGN})
set_target_properties(${elf_file} PROPERTIES
2023-11-19 12:25:21 +03:00
COMPILE_FLAGS "-mmcu=${M_TYPE}"
LINK_FLAGS "-mmcu=${M_TYPE} -Wl,--gc-sections -mrelax -Wl,-Map,${map_file}")
2023-11-02 21:53:55 +03:00
add_custom_command(OUTPUT ${hex_file}
2023-11-19 12:25:21 +03:00
COMMAND ${M_OBJCOPY} -j .text -j .data -O ihex ${elf_file} ${hex_file}
2023-11-02 21:53:55 +03:00
DEPENDS ${elf_file})
add_custom_command(OUTPUT ${eeprom_file}
2023-11-19 12:25:21 +03:00
COMMAND ${M_OBJCOPY} -j .eeprom --set-section-flags=.eeprom=alloc,load
2023-11-02 21:53:55 +03:00
--change-section-lma .eeprom=0 --no-change-warnings
-O ihex ${elf_file} ${eeprom_file}
DEPENDS ${elf_file})
add_custom_target(upload_hex
2023-11-19 12:25:21 +03:00
${M_UPLOAD_TOOL} ${M_FLAGS} -v -U flash:w:${hex_file}
2023-11-02 21:53:55 +03:00
DEPENDS ${hex_file})
add_custom_target(upload_eeprom
2023-11-19 12:25:21 +03:00
${M_UPLOAD_TOOL} ${M_FLAGS} -v -U eeprom:w:${eeprom_file}
2023-11-02 21:53:55 +03:00
DEPENDS ${eeprom_file})
endfunction()
2023-11-19 12:25:21 +03:00
add_mcu_executable(${PROJECT_NAME} ${SOURCE_FILES})