一些隐式的生成文件?
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 有点像:
- 没有给出目标,所以我们将第一个:atmega328。这需要一个 .hex 文件。
- .hex 文件可以根据最后一条规则从 .elf 文件生成。
- .elf 文件可以通过 %.elf 规则生成(这里看起来你已经打破了模式,因为依赖项中没有 % )。
本文件中没有.o的规则,所以使用默认配方$(CC) $(CPPFLAGS) $(CFLAGS) -c
。由于找到了 .c 文件,此规则适用并生成第一个命令。规则可以这样写(如 suffix rules 所示):
.c.o:
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
回溯此列表,现在已找到源,运行 命令。
如果未设置隐式规则变量,您通常会使用 cc
为您的主机系统构建程序。
我正在尝试理解 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 有点像:
- 没有给出目标,所以我们将第一个:atmega328。这需要一个 .hex 文件。
- .hex 文件可以根据最后一条规则从 .elf 文件生成。
- .elf 文件可以通过 %.elf 规则生成(这里看起来你已经打破了模式,因为依赖项中没有 % )。
本文件中没有.o的规则,所以使用默认配方
$(CC) $(CPPFLAGS) $(CFLAGS) -c
。由于找到了 .c 文件,此规则适用并生成第一个命令。规则可以这样写(如 suffix rules 所示):.c.o: $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
回溯此列表,现在已找到源,运行 命令。
如果未设置隐式规则变量,您通常会使用 cc
为您的主机系统构建程序。