即使在更新依赖项后也不会调用目标

target is not called even after updating dependency

在下面的代码中,我预计当 app/outputs.list 更新时,相关脚本 运行 以及当上次 make 未触及时,不会调用脚本。最后,必须调用编译器。

但是,即使我编辑 app/outputs.list,也不会以任何方式调用脚本。我哪里弄错了?

生成文件:

SOURCES := main.cpp
OUTDIR:= ./out
BINDIR:= ./bin
OBJDIR:= ./bin/obj
OBJECTS := $(addprefix $(OBJDIR)/,$(SOURCES:.cpp=.o))
DEPFILES:= $(OBJECTS:.o=.d)
VARLISTS:= app/outputs.list

CXX := g++
CXXFLAGS := -c -g -MD -MP
LIBS:= -lboost_filesystem -lboost_system 

.PHONY: all

# default
all: $(VARLISTS) $(BINDIR)/sim
    @echo "done"

app/outputs.list:
    bash ./scripts/outputs.bash
    bash ./scripts/sim_outputs.bash

$(BINDIR)/sim: $(OBJECTS)
    $(CXX) $(LDFLAGS) $^ -o $@ $(LIBS)

$(OBJDIR)/%.o: %.cpp
    @if [ ! -d "$(OBJDIR)" ]; then mkdir -p $(OBJDIR) && echo "$(OBJDIR) directory created: $(OBJDIR)";  fi
    $(CXX) $(CXXFLAGS) -MF $(OBJDIR)/$*.d -o $@  $<

-include $(DEPFILES)

这是输出:

$ make
./bin/obj directory created: ./bin/obj
g++ -c -g -MD -MP -MF ./bin/obj/main.d -o bin/obj/main.o  main.cpp
g++  bin/obj/main.o -o bin/sim -lboost_filesystem -lboost_system 
done

但是脚本有一个 echo 来证明它们已被调用:

#!/bin/bash

echo "outputs called"

好像没有叫他们。

app/outputs.list 文件包含变量列表,脚本应该在自动生成的 .hpp 文件中生成适当的数组。

唯一依赖 $(VARLISTS) 的目标是 all。所以唯一的目标是 运行 因为 app/outputs.list 文件更改是 all 目标。但是 all 目标也是 .PHONY,所以它总是会 运行,无论如何。

make规则的一般格式为:

output-file: input-file
    commands to generate output-file from input-file

所以在这种情况下,输出文件是生成的头文件,输入文件是 apps/output.list 文件。所以规则应该是这样的:

sim_outputs.hpp: app/outputs.list
    bash ./scripts/sim_outputs.bash

outputs.hpp: app/outputs.list
    bash ./scripts/outputs.bash

其中应涵盖重建案例。初始(干净的平板)构建可能无法正常工作,因为头文件不会被列为任何地方的先决条件(.d 文件尚未创建)所以可能需要一个为此添加了引导步骤。