在下面的代码中,我希望当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
文件中生成适当的数组。
答案 0 :(得分:0)
依赖$(VARLISTS)
的唯一目标是all
。因此,因app/outputs.list
文件更改而将要运行的唯一目标是all
目标。但all
目标也是.PHONY
,因此无论如何都会一直运行。
制作规则的一般格式为:
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
哪个应该涵盖重建案例。初始(clean slate)构建可能不起作用,因为头文件不会被列为任何地方的先决条件(.d
文件还没有创建)所以可能需要为此添加一个自举步骤。