一些隐式的生成文件?

Some implicit makefile?

我正在尝试理解 makefile。 我使用了 atmega168 引导加载程序的 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 的第一个输出。 What/How 已生成第一个命令? 是否使用了第二个 makefile?如果是,如何找到它的位置?

更新: 如果我将 ATmegaBOOT_168.c 重命名为 ATmegaBOOT_1681.c。 运行 $ make atmega328 给出:

make: *** No rule to make target 'ATmegaBOOT_168_atmega328.hex', needed by 'atmega328'.  Stop.

但规则存在。

CC 和 CFLAGS 是 GNU make built in implicit rules 中使用的变量。当你 运行 make 时,它​​读取你的 makefile 有点像:

  1. 没有给出目标,所以我们将第一个:atmega328。这需要一个 .hex 文件。
  2. .hex 文件可以根据最后一条规则从 .elf 文件生成。
  3. .elf 文件可以通过 %.elf 规则生成(这里看起来你已经打破了模式,因为依赖项中没有 % )。
  4. 本文件中没有.o的规则,所以使用默认配方$(CC) $(CPPFLAGS) $(CFLAGS) -c。由于找到了 .c 文件,此规则适用并生成第一个命令。规则可以这样写(如 suffix rules 所示):

    .c.o:
       $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
    
  5. 回溯此列表,现在已找到源,运行 命令。

如果未设置隐式规则变量,您通常会使用 cc 为您的主机系统构建程序。