以下 makefile 命令的作用是什么? /无符号控制文件

What does the following makefile command do? /no-symbols-control-file

我在 makefile 中看到了以下命令:

%-nosyms.$(TARGET).elf: %.co $(PROJECT_OBJECTFILES) $(INTERRUPT_OBJECTFILES) contiki-$(TARGET).a
$(CC) $(CFLAGS) -o $@ $(filter-out %.a,$^) $(filter %.a,$^) $(filter %.a,$^) $(LDFLAGS)

来源:Contiki/cpu/arm/stm32f103/Makefile.stm32f103 .

此命令是否生成无符号控制文件?没有符号的图片文件有什么用?

逐条分析:

Makefile 的目标是:

%-nosyms.$(TARGET).elf

先决条件列表为:

%.co $(PROJECT_OBJECTFILES) $(INTERRUPT_OBJECTFILES) contiki-$(TARGET).a

目标配方是:

$(CC) $(CFLAGS) -o $@ $(filter-out %.a,$^) $(filter %.a,$^) $(filter %.a,$^) $(LDFLAGS)

Makefile 的逻辑是:

  1. 如果 *-nosyms.$(TARGET).elf 文件存在,将文件的时间戳与 所有 其先决条件的时间戳进行比较。如果任何先决条件更新,则重建此文件(即 运行 给定的配方)。如果目标被标记为.PHONY)(似乎不是这样),不检查时间戳就重建。

  2. 否则,转到每个先决条件配方并一个一个执行(或者并行执行,如果 -j 选项提供给 make):

    • %.co
    • $(PROJECT_OBJECTFILES)
    • $(INTERRUPT_OBJECTFILES)
    • contiki-$(TARGET).a
  3. 然后,通过调用处理当前目标的配方:

$(CC) $(CFLAGS) -o $@ $(filter-out %.a,$^) $(filter %.a,$^) $(filter %.a,$^) $(LDFLAGS)

其中:

  • $@:当前目标的名称(即*-nosyms.$(TARGET).elf
  • $^:先决条件列表(即%.co $(PROJECT_OBJECTFILES) $(INTERRUPT_OBJECTFILES) contiki-$(TARGET).a
  • $(filter-out %.a,$^):先决条件列表中的非 *.a 文件。
  • $(filter %.a,$^):先决条件列表中的 *.a 个文件。