# See https://thinkingonthinking.com/an-arduino-sketch-from-scratch/ # Instead of using arduino-builder or any of the generic Makefiles for Arduino # (none seem to work satisfactorily), we'll build one from scratch. # Builders AVR_PREFIX := /usr/bin/avr CC = $(AVR_PREFIX)-gcc CXX = $(AVR_PREFIX)-g++ AR = $(AVR_PREFIX)-gcc-ar OBJCOPY = $(AVR_PREFIX)-objcopy # Upload AVRDUDE := /usr/bin/avrdude ASMFLAGS := -c -g -x assembler-with-cpp -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR CFLAGS := -Wall -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR CXXFLAGS := -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR LDFLAGS := -mmcu=atmega328p -Wl,-gc-sections -Os ARDUINO_CORE := /usr/share/arduino/hardware/arduino/avr/cores/arduino INCLUDES := -I$(ARDUINO_CORE)/ -I/usr/share/arduino/hardware/arduino/avr/variants/standard/ # Core ASM things obj-asmcore += wiring_pulse.S.o # Core CC things obj-ccore += WInterrupts.o obj-ccore += hooks.o obj-ccore += wiring.o obj-ccore += wiring_analog.o obj-ccore += wiring_digital.o obj-ccore += wiring_pulse.o obj-ccore += wiring_shift.o obj-cxxcore += CDC.o obj-cxxcore += HardwareSerial.o obj-cxxcore += HardwareSerial0.o obj-cxxcore += HardwareSerial1.o obj-cxxcore += HardwareSerial2.o obj-cxxcore += HardwareSerial3.o obj-cxxcore += IPAddress.o obj-cxxcore += PluggableUSB.o obj-cxxcore += Print.o obj-cxxcore += Stream.o obj-cxxcore += Tone.o obj-cxxcore += USBCore.o obj-cxxcore += WMath.o obj-cxxcore += WString.o obj-cxxcore += abi.o obj-cxxcore += new.o %.S.o: $(ARDUINO_CORE)/%.S $(CC) $(ASMFLAGS) $(INCLUDES) $< -o $@ %.o: $(ARDUINO_CORE)/%.cpp $(CXX) $(CXXFLAGS) $(INCLUDES) $< -o $@ %.o: $(ARDUINO_CORE)/%.c $(CC) $(CFLAGS) $(INCLUDES) $< -o $@ core.a: $(obj-asmcore) $(obj-ccore) $(obj-cxxcore) $(AR) rcs $@ $^ dactylino.o: dactylino.cpp $(CXX) $(CXXFLAGS) $(INCLUDES) $< -o $@ dactylino.elf: dactylino.o core.a $(CC) $(LDFLAGS) -o $@ $^ -lc -lm dactylino.hex: dactylino.elf $(OBJCOPY) -O ihex -R .eeprom $< $@ @./sizes.sh $< upload: dactylino.hex $(AVRDUDE) -C/etc/avrdude.conf -v -patmega328p -carduino -P/dev/ttyACM0 -b115200 -D -Uflash:w:$<:i clean: rm -f *.o core.a dactylino.{elf,hex,} # Locations we're interested in in relation to ARDUINO_DIR # LIBRARIES = $(ARDUINO_DIR)/lib # HARDWARE = $(ARDUINO_DIR)/hardware # TOOLS = $(ARDUINO_DIR)/hardware/tools/avr # Rules to define: # .ino -> .cpp # # NOTE I could also just decide to script .ino files and program everything as # .cpp, then all I'd need to figure out is how to do that... # # add headers # $ echo ‘#include “Arduino.h”’ > blink.cpp # # add sketch # $ cat blink.ino >> blink.cpp # # add int main() # $ cat /Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino/main.cpp >> blink.cpp # # build binary # $ avr-g++ -x c++ -MMD -c -mmcu=atmega328p -Wall -DF_CPU=16000000L -DARDUINO=160 -DARDUINO_ARCH_AVR -D__PROG_TYPES_COMPAT__ -I/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino/ -I/Applications/Arduino.app/Contents/Java//hardware/arduino/avr/variants/standard -Wall -Os blink.cpp # # add arduino core libraries # $ avr-ar rcs libcore.a hooks.o wiring.o wiring_digital.o # # create elf # $ avr-gcc -mmcu=atmega328p -Wl,–gc-sections -Os -o blink.elf blink.o libcore.a -lc -lm # # create hex # $ avr-objcopy -O ihex -R .eeprom blink.elf blink.hex # Upload # /usr/bin/avrdude -C/etc/avrdude.conf -v -patmega328p -carduino -P/dev/ttyACM0 -b115200 -D -Uflash:w:blink.hex:i # file = main.ino # %.cpp: %.ino # @echo Converting $< → $@ # build: $(file) # echo "Building" # test: # @echo $(CC) # @echo $(CXX) # @echo $(AR) # @echo $(OBJCOPY) # Taken from linux/Makefile, but doesn't appear to work # ifeq ("$(origin V)", "command line") # VERBOSE = "-verbose" # endif # ifndef VERBOSE # VERBOSE = "" # endif D = $(CURDIR) B = $(D)/build # arduino-builder -verbose -libraries /usr/share/arduino/lib -hardware /usr/share/arduino/hardware -tools /usr/share/arduino/hardware/tools/avr -fqbn arduino:avr:uno -compile helloworld.ino # Using board 'uno' from platform in folder: /usr/share/arduino/hardware/arduino/avr # Using core 'arduino' from platform in folder: /usr/share/arduino/hardware/arduino/avr # Detecting libraries used... # "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/sketch/helloworld.ino.cpp" -o "/dev/null" # Generating function prototypes... # "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/sketch/helloworld.ino.cpp" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/preproc/ctags_target_for_gcc_minus_e.cpp" # "/usr/bin/arduino-ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/preproc/ctags_target_for_gcc_minus_e.cpp" # Compiling sketch... # "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/sketch/helloworld.ino.cpp" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/sketch/helloworld.ino.cpp.o" # Compiling libraries... # Compiling core... # "/usr/bin/avr-gcc" -c -g -x assembler-with-cpp -flto -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/wiring_pulse.S" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/wiring_pulse.S.o" # "/usr/bin/avr-gcc" -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/WInterrupts.c" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/WInterrupts.c.o" # "/usr/bin/avr-gcc" -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/hooks.c" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/hooks.c.o" # "/usr/bin/avr-gcc" -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/wiring.c" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/wiring.c.o" # "/usr/bin/avr-gcc" -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/wiring_analog.c" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/wiring_analog.c.o" # "/usr/bin/avr-gcc" -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/wiring_digital.c" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/wiring_digital.c.o" # "/usr/bin/avr-gcc" -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/wiring_pulse.c" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/wiring_pulse.c.o" # "/usr/bin/avr-gcc" -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/wiring_shift.c" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/wiring_shift.c.o" # "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/CDC.cpp" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/CDC.cpp.o" # "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/HardwareSerial.cpp" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/HardwareSerial.cpp.o" # "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/HardwareSerial0.cpp" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/HardwareSerial0.cpp.o" # "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/HardwareSerial1.cpp" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/HardwareSerial1.cpp.o" # "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/HardwareSerial2.cpp" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/HardwareSerial2.cpp.o" # "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/HardwareSerial3.cpp" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/HardwareSerial3.cpp.o" # "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/IPAddress.cpp" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/IPAddress.cpp.o" # "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/PluggableUSB.cpp" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/PluggableUSB.cpp.o" # "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/Print.cpp" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/Print.cpp.o" # "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/Stream.cpp" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/Stream.cpp.o" # "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/Tone.cpp" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/Tone.cpp.o" # "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/USBCore.cpp" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/USBCore.cpp.o" # "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/WMath.cpp" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/WMath.cpp.o" # "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/WString.cpp" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/WString.cpp.o" # "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/abi.cpp" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/abi.cpp.o" # "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/main.cpp" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/main.cpp.o" # "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/new.cpp" -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/new.cpp.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/wiring_pulse.S.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/WInterrupts.c.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/hooks.c.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/wiring.c.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/wiring_analog.c.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/wiring_digital.c.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/wiring_pulse.c.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/wiring_shift.c.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/CDC.cpp.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/HardwareSerial.cpp.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/HardwareSerial0.cpp.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/HardwareSerial1.cpp.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/HardwareSerial2.cpp.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/HardwareSerial3.cpp.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/IPAddress.cpp.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/PluggableUSB.cpp.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/Print.cpp.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/Stream.cpp.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/Tone.cpp.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/USBCore.cpp.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/WMath.cpp.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/WString.cpp.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/abi.cpp.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/main.cpp.o" # "/usr/bin/avr-gcc-ar" rcs "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/new.cpp.o" # Linking everything together... # "/usr/bin/avr-gcc" -w -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections -mmcu=atmega328p -o "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/helloworld.ino.elf" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/sketch/helloworld.ino.cpp.o" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/core/core.a" "-L/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA" -lm # "/usr/bin/avr-objcopy" -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/helloworld.ino.elf" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/helloworld.ino.eep" # "/usr/bin/avr-objcopy" -O ihex -R .eeprom "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/helloworld.ino.elf" "/tmp/arduino-sketch-1DF0F9844FA0FFF1A5AE7E504676F1DA/helloworld.ino.hex" # # # # >>> This sizing information comes from knowing a few things: First the # >>> compiler toolchain appropriate version of the "size" program, in this case # >>> it's "avr-size" as "avr-size -A path/to/binary.elf" which prints sizes of # >>> different sections of an executable. The "sketch" size is .text and # >>> "Global variables" is .data. The maximums vary for the boards. # >>> # >>> const PROPERTY_UPLOAD_MAX_SIZE = "upload.maximum_size" # >>> const PROPERTY_UPLOAD_MAX_DATA_SIZE = "upload.maximum_data_size" # >>> # >>> In our case, we're concerned with the Arduino Uno: # >>> # >>> hardware/arduino/avr/boards.txt # >>> 62:uno.upload.maximum_size=32256 # >>> 63:uno.upload.maximum_data_size=2048 # >>> # >>> # # Sketch uses 976 bytes (3%) of program storage space. Maximum is 32256 bytes. # Global variables use 9 bytes (0%) of dynamic memory, leaving 2039 bytes for local variables. Maximum is 2048 bytes.