我的食谱$(HDAIMG)总是被处理,即使文件夹中已有$(HDAIMG)文件。 我做错了什么?
HDAIMG := $(TESTDIR)/$(PROJECT)-hda.img
HDAIMG值实际上是 test / project-hda.img
PHONY: $(PROJECT)
all: $(PROJECT) $(HDAIMG)
$(PROJECT): check-env
$(call v_exec, 1, $(MAKE) -C $(SRCDIR) $@)
$(HDAIMG): $(PROJECT) check-env
$(call print_white_init, HDAIMG)
$(call print, Creating $@)
$(call v_exec, 2, dd if=/dev/zero of=$@ count=0 bs=1 seek=$(HDAIMGSIZE) &> /dev/null)
$(call print, Partitioning $@)
$(call v_exec, 2, parted --script $@ mklabel msdos mkpart primary ext4 1 100%)
$(call print, Creating $@ device maps)
$(call v_exec, 2, sudo kpartx -a $@ -s)
$(call v_exec, 2, sudo mkfs.ext4 /dev/mapper/loop0p1 -q)
$(call v_exec, 2, sudo mount /dev/mapper/loop0p1 $(TESTDIR)/mnt)
$(call v_exec, 2, sudo umount $(TESTDIR)/mnt)
$(call v_exec, 2, sudo kpartx -d $@)
$(call print_white_done, HDAIMG)
check-env:
ifneq ($(ERROR),)
$(call print_error, $(ERROR))
exit 1
endif
被调用的函数用于打印颜色或用选择的详细执行;在我的Makeconfig.mk中已经包含了。一些:
v_exec = $(V$(strip $(1)))$(strip $(2))
print = @echo -e '$(LEAD_SUB_STR) $(strip $(1))'
print_white_init= @echo -e '$(subst PATTERN,$(strip $(1)),$(WHITE_INIT)) $(strip $(2))'
print_white_done= @echo -e '$(subst PATTERN,$(strip $(1)),$(WHITE_DONE)) $(strip $(2))'
答案 0 :(得分:3)
$(HDAIMG)
已将check-env
作为先决条件,并且Make始终认为必须重建check-env
,因为check-env
实际上不是存在的文件。因此,决定必须重建$(HDAIMG)
。
将检查作为规则中的第一个命令而不是作为先决条件更有意义。