2015-03-24 61 views
0

在下面的代码中,我期望app/outputs.list进行更新时,相关的脚本会运行,并且在最后一次make时未触及脚本时,不会调用脚本。最后,编译器必须被调用。即使在更新依赖关系后也不会调用目标

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

的Makefile:

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 [email protected] $(LIBS) 

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

-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

什么目标应该取决于'app/outputs.list'文件? – 2015-03-24 23:42:47

+0

@EtanReisner'app/outputs.list'包含一个变量名称列表,脚本根据列表生成相应的'.hpp'文件。我已更新我的帖子。你有什么建议吗? – ar2015 2015-03-25 01:16:58

+0

你错过了这一点。哪些目标应该将该文件作为必备任务,以便它们在更改时应该重新运行?现在唯一的目标就是“全部”(正如我的答案所示)。 – 2015-03-25 01:46:46

回答

0

取决于$(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 

这应该涵盖重建案例。初始(clean slate)构建可能不起作用,这仅仅是因为头文件不会被列为任何地方任何东西的先决条件(.d文件尚未创建),因此可能需要添加一个引导步骤那。

+0

你相信它会一直运行。而我所经历的却说它没有运行。我喜欢找到这种分歧的根源。当脚本运行时,两个新的'.hpp'文件被更新。因为'-include $(DEPFILES)'使用了自动生成的'.d'文件,所以它们在先决条件列表中。这些'.hpp'文件包含在我的程序中,它们必须自动添加到先决条件列表中。这正是你在评论中所表达的意思吗? – ar2015 2015-03-25 02:20:04

+0

'DEPFILES'中的文件是'.d'文件而不是'.hpp'文件,因此'-include'指令在这里没有意义。不,我说“全部”目标将始终运行。 'app/outputs.list'目标只会运行一次**,因为它没有先决条件,因此文件将始终保持最新,就make而言。删除'app/outputs.list'文件,它会在下一次运行'make'或'make all'时再次运行,但不会再运行。你需要给它先决条件或标记'。PHONY'(或者更好地使用强制规则,请参阅手册)。但这只是你最终问题的一部分。 – 2015-03-25 02:25:13

+0

但是,如果我将它标记为'.PHONY',它将始终运行。只有当这个文件从运行'make'的最后一次更新时才有任何方法来运行'app/outputs.list'目标? – ar2015 2015-03-25 02:29:10

相关问题