kulifuli-arduino/makefile

128 lines
3 KiB
Makefile

# We deliberately do not make use of implicit rules, nor the standard variables they use
include local.make
arduino_packages = ~/.arduino15/packages/arduino
arduino_lib = $(arduino_packages)/hardware/avr/1.8.6
# Flags
debug = -g
lto = -flto
mcu = -mmcu=atmega32u4
optimization = -O3
macros = \
-D F_CPU=16000000L \
-D ARDUINO=10607 \
-D ARDUINO_AVR_MICRO \
-D ARDUINO_ARCH_AVR \
-D USB_PRODUCT='"Arduino Micro"' \
-D USB_MANUFACTURER='"Unknown"' \
-D USB_VID=0x2341 \
-D USB_PID=0x8037
header_locations = \
-I $(arduino_lib)/cores/arduino \
-I $(arduino_lib)/variants/micro
# Flag sets
c_flags = $(debug) $(lto) $(mcu) $(optimization) $(macros) $(header_locations) \
-std=gnu11 \
-ffunction-sections \
-fdata-sections \
-fno-fat-lto-objects
cplusplus_flags = $(debug) $(lto) $(mcu) $(optimization) $(macros) $(header_locations) \
-std=gnu++11 \
-ffunction-sections \
-fdata-sections \
-fpermissive \
-fno-exceptions \
-fno-threadsafe-statics \
-Wno-error=narrowing
assembly_flags = $(debug) $(lto) $(mcu) $(macros) $(header_locations)
linking_flags = $(debug) $(lto) $(mcu) $(optimization) \
-fuse-linker-plugin \
-Wl,--gc-sections \
-lm
build/kulifuli-cpp.o : src/main.cpp
mkdir -p build
avr-g++ -c $(cplusplus_flags) -o $@ $<
build/arduino-lib/%-cpp.o : $(arduino_lib)/cores/arduino/%.cpp
mkdir -p build/arduino-lib
avr-g++ -c $(cplusplus_flags) -o $@ $<
build/arduino-lib/%-c.o : $(arduino_lib)/cores/arduino/%.c
mkdir -p build/arduino-lib
avr-gcc -c $(c_flags) -o $@ $<
build/arduino-lib/%-s.o : $(arduino_lib)/cores/arduino/%.S
mkdir -p build/arduino-lib
avr-gcc -c $(assembly_flags) -x assembler-with-cpp -o $@ $<
core_objects = $(addprefix build/arduino-lib/, \
abi-cpp.o \
CDC-cpp.o \
HardwareSerial-cpp.o \
HardwareSerial1-cpp.o \
new-cpp.o \
PluggableUSB-cpp.o \
Print-cpp.o \
Stream-cpp.o \
USBCore-cpp.o \
WMath-cpp.o \
WString-cpp.o \
hooks-c.o \
WInterrupts-c.o \
wiring_analog-c.o \
wiring_digital-c.o \
wiring_pulse-c.o \
wiring_shift-c.o \
wiring-c.o \
wiring_pulse-s.o \
)
build/arduino-lib/core.a : $(core_objects)
avr-gcc-ar rcs $@ $^
# The order of the prerequisites is significant here for GCC
build/kulifuli.elf : build/kulifuli-cpp.o build/arduino-lib/core.a
avr-gcc $(linking_flags) -o $@ $^
build/kulifuli.eep : build/kulifuli.elf
avr-objcopy \
--output-target=ihex \
--only-section=.eeprom \
--set-section-flags=.eeprom=alloc,load \
--no-change-warnings \
--change-section-lma .eeprom=0 \
$< $@
build/kulifuli.hex : build/kulifuli.elf
avr-objcopy \
--output-target=ihex \
--remove-section=.eeprom \
$< $@
.PHONY : build
build : build/kulifuli.eep build/kulifuli.hex
# This target includes the so-called 1200 baud touch, which puts the Arduino into bootloader mode
.PHONY : upload
upload : build/kulifuli.hex
stty --file=$(arduino_serial_port) speed 1200 > /dev/null
sleep 1
avrdude \
--part atmega32u4 \
--programmer avr109 \
--memory flash:w:build/kulifuli.hex:i \
--noverify-memory \
--noerase \
--port $(arduino_serial_port) \
--baud 57600
.PHONY : clean
clean :
rm -rf build/*