始终处理Makefile规则

时间:2014-04-07 01:37:57

标签: makefile gnu-make

我的食谱$(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))'

1 个答案:

答案 0 :(得分:3)

$(HDAIMG)已将check-env作为先决条件,并且Make始终认为必须重建check-env,因为check-env实际上不是存在的文件。因此,决定必须重建$(HDAIMG)

将检查作为规则中的第一个命令而不是作为先决条件更有意义。