一些隐含的makefile?

时间:2016-02-15 13:09:52

标签: makefile gnu-make avr

我想了解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.

但规则存在。

1 个答案:

答案 0 :(得分:2)

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. 回溯此列表,现在已找到源,并运行命令。

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