2015-03-24 32 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

相關問題