我想制作一个makefile来编译arduino的c程序。我对make有点熟悉,但从未在avr-gcc中使用它。我可以将下面的命令放在makefile中的最简单方法是什么?
$ avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o led.o led.c
$ avr-gcc -mmcu=atmega328p led.o -o led
$ avr-objcopy -O ihex -R .eeprom led led.hex
$ avrdude -F -V -c arduino -p ATMEGA328P -P /dev/ttyACM0 -b 115200 -U flash:w:led.hex
答案 0 :(得分:2)
简单的meataxe方法就是将命令包装在配方中:
.PHONY: all
all:
avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o led.o led.c
avr-gcc -mmcu=atmega328p led.o -o led
avr-objcopy -O ihex -R .eeprom led led.hex
avrdude -F -V -c arduino -p ATMEGA328P -P /dev/ttyACM0 -b 115200 -U flash:w:led.hex
只需输入make
即可运行。它有效,但它只是一个愚蠢的脚本。更好的方法是将每个命令包装在规则中,并使用正确的名称和先决条件:
# I still don't know what this one does. ("flashing"?)
.PHONY: flash
flash: led.hex
avrdude -F -V -c arduino -p ATMEGA328P -P /dev/ttyACM0 -b 115200 -U flash:w:led.hex
led.o: led.c
avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o led.o led.c
led: led.o
avr-gcc -mmcu=atmega328p led.o -o led
led.hex: led
avr-objcopy -O ihex -R .eeprom led led.hex
这样可以防止大量不必要的工作,例如重建led
和led.o
时他们已经更新了。我们可以通过将一些规则制作成模式规则来进一步改进它,以便以后如果要将servo.c
添加到项目中,您将不得不编写所有内容的新版本:
# Can other things "flash"? Or be "flashed"? The word has several definitions.
.PHONY: flash
flash: led.hex
avrdude -F -V -c arduino -p ATMEGA328P -P /dev/ttyACM0 -b 115200 -U flash:w:led.hex
%.o: %.c
avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o $@ $<
%: %.o
avr-gcc -mmcu=atmega328p $< -o $@
%.hex: %
avr-objcopy -O ihex -R .eeprom $< $@
可以进一步改进,但很大程度上取决于您打算如何使用此makefile以及您打算扩展项目的方向。