我想了解makefile。 我拿了atmega168 bootloader的makefile并将其简化为:
CC = avr-gcc
override CFLAGS = -g -Wall -Os -mmcu=atmega328p -DF_CPU=16000000L '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -DBAUD_RATE=57600
atmega328: ATmegaBOOT_168_atmega328.hex
%.elf: ATmegaBOOT_168.o
avr-gcc -g -Wall -Os -mmcu=atmega328p -DF_CPU=16000000L '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -DBAUD_RATE=57600 -Wl,--section-start=.text=0x7800 -o $@ $<
clean:
rm -rf *.o *.elf *.lst *.map *.sym *.lss *.eep *.srec *.bin *.hex
%.hex: %.elf
avr-objcopy -j .text -j .data -O ihex $< $@
当我跑$ make atmega328
时,我得到了:
avr-gcc -g -Wall -Os -mmcu=atmega328p -DF_CPU=16000000L '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -DBAUD_RATE=57600 -c -o ATmegaBOOT_168.o ATmegaBOOT_168.c
avr-gcc -g -Wall -Os -mmcu=atmega328p -DF_CPU=16000000L '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -DBAUD_RATE=57600 -Wl,--section-start=.text=0x7800 -o ATmegaBOOT_168_atmega328.elf ATmegaBOOT_168.o
avr-objcopy -j .text -j .data -O ihex ATmegaBOOT_168_atmega328.elf ATmegaBOOT_168_atmega328.hex
rm ATmegaBOOT_168_atmega328.elf ATmegaBOOT_168.o
为什么我不能删除CC或CFLAGS?
我理解makefile的一些基础知识。我在网上看了很多,加上了gnu手册,但我无法理解ATmegaBOOT_168.c的第一个输出。什么/如何生成第一个命令? 有没有使用过第二个makefile?如果是,如何找到它的位置?
更新:
如果我将ATmegaBOOT_168.c重命名为ATmegaBOOT_1681.c。正在运行$ make atmega328
会:
make: *** No rule to make target 'ATmegaBOOT_168_atmega328.hex', needed by 'atmega328'. Stop.
但规则存在。
答案 0 :(得分:2)
CC和CFLAGS是GNU make的built in implicit rules中使用的变量。当你运行make时,它会读取你的makefile:
此文件中没有.o规则,因此使用默认配方$(CC) $(CPPFLAGS) $(CFLAGS) -c
。由于找到.c文件,此规则适用并生成第一个命令。该规则可以写成(如suffix rules所示):
.c.o:
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
回溯此列表,现在已找到源,并运行命令。
如果未设置隐式规则变量,您通常会使用cc
获取为主机系统构建的程序。