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

时间:2015-03-24 23:25:45

标签: makefile dependencies

在下面的代码中,我希望当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文件中生成适当的数组。

1 个答案:

答案 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文件还没有创建)所以可能需要为此添加一个自举步骤。