即使在更新依赖项后也不会调用目标
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
文件尚未创建)所以可能需要一个为此添加了引导步骤。
在下面的代码中,我预计当 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
文件尚未创建)所以可能需要一个为此添加了引导步骤。