【发布时间】:2020-05-25 14:45:53
【问题描述】:
我正在尝试使用一个 Makefile 来编译许多 .c 文件。我已经写好了所有的规则,我想添加一条规则,上面写着:执行所有依赖 .c 文件的规则。
参考:Compile all C files in a directory into separate programs
PROGRAMS := copy.c sec_soft.c
PROGRAMS_NO_EX := $(basename $(PROGRAMS))
PROGRAMS_TO_CREATE := $(PROGRAMS_NO_EX).elf $(PROGRAMS_NO_EX).dump $(PROGRAMS_NO_EX).bin $(PROGRAMS_NO_EX).hex $(PROGRAMS_NO_EX).mem $(PROGRAMS_NO_EX).coe
RISCV_OPTIONS = -march=rv32if -mabi=ilp32 -o
RISCV_LINK = $(RISCV_GCC) $(CFLAGS) $< -o $@ #produces .elf file!
RISCV_OBJDUMP = $(RISCV_PREFIX)objdump -D $(DFLAGS) #produces a dump file to see the assembly code!
RISCV_OBJCOPY = $(RISCV_PREFIX)objcopy -O binary #produces a bin file!
ALL_RES = $(PROGRAMS:%.c=%.elf)
%.elf: %.c
$(info Generating .elf file from files: $(PROGRAMS_NO_EX))
$(RISCV_LINK)
$(info Success!)
$(info ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~)
%.dump: %.elf
$(info Copying assembly to dump file $(PROGRAMS_NO_EX).dump)
@$(RISCV_OBJDUMP) $< > $@
$(info Success!)
$(info ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~)
%.bin: %.elf
$(info Generating bin file)
@$(RISCV_OBJCOPY) $< $@
$(info Success!)
$(info ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~)
%.hex: %.bin
$(info Generating hex file)
echo cd $(SCRIPTDIR)
$(info Running binary to hex >>>)
python $(SCRIPTDIR)/bin2hex.py -a $(START_ADDRESS) -o $@ $<
$(info Hex Generation Successful!)
$(info ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~)
%.mem: %.bin
$(info Instantiating memory addresses...)
head -c $$(( $(START_ADDRESS))) /dev/zero | cat - $< | xxd -g1 -c4 | awk '{print $$5$$4$$3$$2}' > $@
$(info Memory instantiation Successful!)
$(info ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~)
%.coe: %.bin
$(info Instantiating memory vector...)
python $(SCRIPTDIR)/bin2coe.py $< -o $@
$(info Memory vector instantiation Successful )
$(info ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~)
all: $(ALL_RES);
但是这行 ALL_RES = $(PROGRAMS:%.c=%.elf) 并没有执行所有的规则。我希望在生成 .elf 文件后,下面的所有规则都会执行,但不会执行。
我是 Makefile 新手,如有错误请见谅。
提前谢谢你
【问题讨论】:
-
ALL_RES = ...是一个变量定义,它不会运行任何东西。也许您应该将其添加为规则(单行内容为$(ALL_RES):)? -
您要执行所有规则,还是使用
.c执行所有规则。先决条件,还是什么? -
@Beta 您好,感谢您的评论。是的,我想用 .c 先决条件执行所有规则,但下面回答很粗鲁!
-
@Someprogrammerdude 你好!谢谢您的回答。它确实运行,但只有 .elf 文件扩展名。 Raspy 在下面给出了答案!