@ -36,6 +36,8 @@ LUFA_BUILD_PROVIDED_MACROS +=
# output files
# output files
# mostlyclean - Remove intermediatary output files, but
# mostlyclean - Remove intermediatary output files, but
# preserve binaries
# preserve binaries
# <filename>.s - Compile C/C++ source file into an assembly file
# for manual code inspection
#
#
# MANDATORY PARAMETERS:
# MANDATORY PARAMETERS:
#
#
@ -207,14 +209,17 @@ endif
size : SIZE_MCU_FLAG := $( shell $ ( CROSS ) -size --help | grep -- --mcu > /dev /null && echo --mcu =$ ( MCU ) )
size : SIZE_MCU_FLAG := $( shell $ ( CROSS ) -size --help | grep -- --mcu > /dev /null && echo --mcu =$ ( MCU ) )
size : SIZE_FORMAT_FLAG := $( shell $ ( CROSS ) -size --help | grep -- --format =.*avr > /dev /null && echo --format =avr )
size : SIZE_FORMAT_FLAG := $( shell $ ( CROSS ) -size --help | grep -- --format =.*avr > /dev /null && echo --format =avr )
# Pre-build informational target, to give compiler and project name information when building
build_begin :
build_begin :
@echo $( MSG_INFO_MESSAGE) Begin compilation of project \" $( TARGET) \" ...
@echo $( MSG_INFO_MESSAGE) Begin compilation of project \" $( TARGET) \" ...
@echo ""
@echo ""
@$( CROSS) -gcc --version
@$( CROSS) -gcc --version
# Post-build informational target, to project name information when building has completed
build_end :
build_end :
@echo $( MSG_INFO_MESSAGE) Finished building project \" $( TARGET) \" .
@echo $( MSG_INFO_MESSAGE) Finished building project \" $( TARGET) \" .
# Checks all target source files and provides information on whether they exist or not
check-source :
check-source :
@for f in $( SRC) ; do \
@for f in $( SRC) ; do \
if [ ! -f $$ f ] ; then \
if [ ! -f $$ f ] ; then \
@ -223,77 +228,100 @@ check-source:
fi ; \
fi ; \
done
done
# Prints size information of a compiled application (FLASH, RAM and EEPROM usages)
size : $( TARGET ) .elf
size : $( TARGET ) .elf
@echo $( MSG_SIZE_CMD) Determining size of \" $<\"
@echo $( MSG_SIZE_CMD) Determining size of \" $<\"
@echo ""
@echo ""
$( CROSS) -size $( SIZE_MCU_FLAG) $( SIZE_FORMAT_FLAG) $< ; 2>/dev/null;
$( CROSS) -size $( SIZE_MCU_FLAG) $( SIZE_FORMAT_FLAG) $< ; 2>/dev/null;
# Prints size information on the symbols within a compiled application in decimal bytes
symbol-sizes : $( TARGET ) .elf
symbol-sizes : $( TARGET ) .elf
@echo $( MSG_NM_CMD) Extracting \" $<\" symbols with decimal byte sizes
@echo $( MSG_NM_CMD) Extracting \" $<\" symbols with decimal byte sizes
$( CROSS) -nm --size-sort --demangle --radix= d $<
$( CROSS) -nm --size-sort --demangle --radix= d $<
# Cleans intermediatary build files, leaving only the compiled application files
mostlyclean :
mostlyclean :
@echo $( MSG_REMOVE_CMD) Removing object files of \" $( TARGET) \"
@echo $( MSG_REMOVE_CMD) Removing object files of \" $( TARGET) \"
rm -f $( OBJECT_FILES)
rm -f $( OBJECT_FILES)
@echo $( MSG_REMOVE_CMD) Removing dependency files of \" $( TARGET) \"
@echo $( MSG_REMOVE_CMD) Removing dependency files of \" $( TARGET) \"
rm -f $( DEPENDENCY_FILES)
rm -f $( DEPENDENCY_FILES)
# Cleans all build files, leaving only the original source code
clean : mostlyclean
clean : mostlyclean
@echo $( MSG_REMOVE_CMD) Removing output files of \" $( TARGET) \"
@echo $( MSG_REMOVE_CMD) Removing output files of \" $( TARGET) \"
rm -f $( TARGET) .elf $( TARGET) .hex $( TARGET) .eep $( TARGET) .map $( TARGET) .lss $( TARGET) .sym $( TARGET) .a
rm -f $( TARGET) .elf $( TARGET) .hex $( TARGET) .eep $( TARGET) .map $( TARGET) .lss $( TARGET) .sym $( TARGET) .a
all : build_begin check -source elf hex lss sym size build_end
# Performs a complete build of the user application and prints size information afterwards
all : build_begin elf hex lss sym size build_end
# Helper targets, to build a specific type of output file without having to know the project target name
lib : lib $( TARGET ) .a
lib : lib $( TARGET ) .a
elf : $( TARGET ) .elf
elf : $( TARGET ) .elf
hex : $( TARGET ) .hex $( TARGET ) .eep
hex : $( TARGET ) .hex $( TARGET ) .eep
lss : $( TARGET ) .lss
lss : $( TARGET ) .lss
sym : $( TARGET ) .sym
sym : $( TARGET ) .sym
# Default target to *create* the user application's specified source files; if this rule is executed by
# make, the input source file doens't exist and an error needs to be presented to the user
$(SRC) :
$( error Source file does not exist: $@ )
# Compiles an input C source file and generates an assembly listing for it
%.s : %.c $( MAKEFILE_LIST )
%.s : %.c $( MAKEFILE_LIST )
@echo $( MSG_COMPILE_CMD) Generating assembly from C file \" $( notdir $<) \"
@echo $( MSG_COMPILE_CMD) Generating assembly from C file \" $( notdir $<) \"
$( CROSS) -gcc -S $( BASE_CC_FLAGS) $( BASE_C_FLAGS) $( CC_FLAGS) $( C_FLAGS) $< -o $@
$( CROSS) -gcc -S $( BASE_CC_FLAGS) $( BASE_C_FLAGS) $( CC_FLAGS) $( C_FLAGS) $< -o $@
# Compiles an input C++ source file and generates an assembly listing for it
%.s : %.cpp $( MAKEFILE_LIST )
%.s : %.cpp $( MAKEFILE_LIST )
@echo $( MSG_COMPILE_CMD) Generating assembly from C++ file \" $( notdir $<) \"
@echo $( MSG_COMPILE_CMD) Generating assembly from C++ file \" $( notdir $<) \"
$( CROSS) -gcc -S $( BASE_CC_FLAGS) $( BASE_CPP_FLAGS) $( CC_FLAGS) $( CPP_FLAGS) $< -o $@
$( CROSS) -gcc -S $( BASE_CC_FLAGS) $( BASE_CPP_FLAGS) $( CC_FLAGS) $( CPP_FLAGS) $< -o $@
# Compiles an input C source file and generates a linkable object file for it
$(OBJDIR)/%.o : %.c $( MAKEFILE_LIST )
$(OBJDIR)/%.o : %.c $( MAKEFILE_LIST )
@echo $( MSG_COMPILE_CMD) Compiling C file \" $( notdir $<) \"
@echo $( MSG_COMPILE_CMD) Compiling C file \" $( notdir $<) \"
$( CROSS) -gcc -c $( BASE_CC_FLAGS) $( BASE_C_FLAGS) $( CC_FLAGS) $( C_FLAGS) -MMD -MP -MF $( @:%.o= %.d) $< -o $@
$( CROSS) -gcc -c $( BASE_CC_FLAGS) $( BASE_C_FLAGS) $( CC_FLAGS) $( C_FLAGS) -MMD -MP -MF $( @:%.o= %.d) $< -o $@
# Compiles an input C++ source file and generates a linkable object file for it
$(OBJDIR)/%.o : %.cpp $( MAKEFILE_LIST )
$(OBJDIR)/%.o : %.cpp $( MAKEFILE_LIST )
@echo $( MSG_COMPILE_CMD) Compiling C++ file \" $( notdir $<) \"
@echo $( MSG_COMPILE_CMD) Compiling C++ file \" $( notdir $<) \"
$( CROSS) -gcc -c $( BASE_CC_FLAGS) $( BASE_CPP_FLAGS) $( CC_FLAGS) $( CPP_FLAGS) -MMD -MP -MF $( @:%.o= %.d) $< -o $@
$( CROSS) -gcc -c $( BASE_CC_FLAGS) $( BASE_CPP_FLAGS) $( CC_FLAGS) $( CPP_FLAGS) -MMD -MP -MF $( @:%.o= %.d) $< -o $@
# Assembles an input ASM source file and generates a linkable object file for it
$(OBJDIR)/%.o : %.S $( MAKEFILE_LIST )
$(OBJDIR)/%.o : %.S $( MAKEFILE_LIST )
@echo $( MSG_ASSEMBLE_CMD) Assembling \" $( notdir $<) \"
@echo $( MSG_ASSEMBLE_CMD) Assembling \" $( notdir $<) \"
$( CROSS) -gcc -c $( BASE_CC_FLAGS) $( BASE_ASM_FLAGS) $( CC_FLAGS) $( ASM_FLAGS) -MMD -MP -MF $( @:%.o= %.d) $< -o $@
$( CROSS) -gcc -c $( BASE_CC_FLAGS) $( BASE_ASM_FLAGS) $( CC_FLAGS) $( ASM_FLAGS) -MMD -MP -MF $( @:%.o= %.d) $< -o $@
# Generates a library archive file from the user application, which can be linked into other applications
.PRECIOUS : $( OBJECT_FILES )
.PRECIOUS : $( OBJECT_FILES )
.SECONDARY : %.a
.SECONDARY : %.a
%.a : $( OBJECT_FILES )
%.a : $( OBJECT_FILES )
@echo $( MSG_ARCHIVE_CMD) Archiving object files into \" $@ \"
@echo $( MSG_ARCHIVE_CMD) Archiving object files into \" $@ \"
$( CROSS) -ar rcs $@ $( OBJECT_FILES)
$( CROSS) -ar rcs $@ $( OBJECT_FILES)
# Generates an ELF debug file from the user application, which can be further processed for FLASH and EEPROM data
# files, or used for programming and debugging directly
.PRECIOUS : $( OBJECT_FILES )
.PRECIOUS : $( OBJECT_FILES )
.SECONDARY : %.elf
.SECONDARY : %.elf
%.elf : $( OBJECT_FILES )
%.elf : $( OBJECT_FILES )
@echo $( MSG_LINK_CMD) Linking object files into \" $@ \"
@echo $( MSG_LINK_CMD) Linking object files into \" $@ \"
$( CROSS) -gcc $( BASE_LD_FLAGS) $( LD_FLAGS) $^ -o $@
$( CROSS) -gcc $( BASE_LD_FLAGS) $( LD_FLAGS) $^ -o $@
# Extracts out the loadable FLASH memory data from the project ELF file, and creates an Intel HEX format file of it
%.hex : %.elf
%.hex : %.elf
@echo $( MSG_OBJCPY_CMD) Extracting HEX file data from \" $<\"
@echo $( MSG_OBJCPY_CMD) Extracting HEX file data from \" $<\"
$( CROSS) -objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@
$( CROSS) -objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@
# Extracts out the loadable EEPROM memory data from the project ELF file, and creates an Intel HEX format file of it
%.eep : %.elf
%.eep : %.elf
@echo $( MSG_OBJCPY_CMD) Extracting EEP file data from \" $<\"
@echo $( MSG_OBJCPY_CMD) Extracting EEP file data from \" $<\"
$( CROSS) -objcopy -j .eeprom --set-section-flags= .eeprom= "alloc,load" --change-section-lma .eeprom= 0 --no-change-warnings -O ihex $< $@ || exit 0
$( CROSS) -objcopy -j .eeprom --set-section-flags= .eeprom= "alloc,load" --change-section-lma .eeprom= 0 --no-change-warnings -O ihex $< $@ || exit 0
# Creates an assembly listing file from an input project ELF file, containing interleaved assembly and source data
%.lss : %.elf
%.lss : %.elf
@echo $( MSG_OBJDMP_CMD) Extracting LSS file data from \" $<\"
@echo $( MSG_OBJDMP_CMD) Extracting LSS file data from \" $<\"
$( CROSS) -objdump -h -S -z $< > $@
$( CROSS) -objdump -h -S -z $< > $@
# Creates a symbol file listing the loadable and discarded symbols from an input project ELF file
%.sym : %.elf
%.sym : %.elf
@echo $( MSG_NM_CMD) Extracting SYM file data from \" $<\"
@echo $( MSG_NM_CMD) Extracting SYM file data from \" $<\"
$( CROSS) -nm -n $< > $@
$( CROSS) -nm -n $< > $@