cmake_minimum_required(VERSION 3.26) project(Blink VERSION 0.1.0.0 LANGUAGES C ASM) set(CMAKE_C_STANDARD 17) if(NOT M_TYPE) set(M_TYPE attiny13a) endif() if(NOT P_CLK) set(P_CLK 256kHz) endif() if(NOT P_TYPE) set(P_TYPE usbasp) endif() if(NOT P_PORT) set(P_PORT /dev/usb/lp0) endif() if(NOT F_CPU) set(F_CPU 1000000) endif() set(SOURCE_FILES defs.h main.c) ######################################################################################################################## 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) set(CMAKE_C_COMPILER ${M_CC}) set(CMAKE_CXX_COMPILER ${M_CXX}) 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") ######################################################################################################################## 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") 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) set(CMAKE_C_FLAGS_RELEASE "-Os -fno-asynchronous-unwind-tables") set(CMAKE_CXX_FLAGS_RELEASE "-Os -fno-asynchronous-unwind-tables") 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() 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) add_executable(${elf_file} EXCLUDE_FROM_ALL ${ARGN}) set_target_properties(${elf_file} PROPERTIES COMPILE_FLAGS "-mmcu=${M_TYPE}" LINK_FLAGS "-mmcu=${M_TYPE} -Wl,--gc-sections -mrelax -Wl,-Map,${map_file}") add_custom_command(OUTPUT ${hex_file} COMMAND ${M_OBJCOPY} -j .text -j .data -O ihex ${elf_file} ${hex_file} DEPENDS ${elf_file}) add_custom_command(OUTPUT ${eeprom_file} COMMAND ${M_OBJCOPY} -j .eeprom --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O ihex ${elf_file} ${eeprom_file} DEPENDS ${elf_file}) add_custom_target(upload_hex ${M_UPLOAD_TOOL} ${M_FLAGS} -v -U flash:w:${hex_file} DEPENDS ${hex_file}) add_custom_target(upload_eeprom ${M_UPLOAD_TOOL} ${M_FLAGS} -v -U eeprom:w:${eeprom_file} DEPENDS ${eeprom_file}) endfunction() add_mcu_executable(${PROJECT_NAME} ${SOURCE_FILES})