2015-05-19 194 views
0

我有一個要編譯的源文件列表。我從不同的目錄/子目錄中選擇它們,最後我有一個列表。我以爲我會用eval/call/define來使用foreach循環。命令info有效,make的第一遍看到所有這些。makefile foreach在第一次迭代停止

這裏是一塊makefile文件的相關代碼:

define cmp-one 
$(info $2) 
$2:$1 
     $(CMP) $(CMP_FLGS) $(INCL) -c $1 -o $2 
endef 

$(foreach src_tmp,$(SRC),$(info $(src_tmp))) 
$(foreach src_tmp,$(SRC),$(eval $(call cmp-one,$(src_tmp),$(src_tmp:%.cpp=%.o)))) 

這裏是屏幕輸出的一個非常簡單的例子,以減少我的問題最明顯的例子(注意:在做文件都在一個目錄,所以你會注意到一些../):

make --debug -Bf makefile_proj_1 


GNU Make 3.81 
Copyright (C) 2006 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. 
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A 
PARTICULAR PURPOSE. 

This program built for x86_64-redhat-linux-gnu 
Reading makefiles... 
../src/proj_1/proj_1_f1.cpp 
../src/proj_1/proj_1_f2.cpp 
../src/proj_1/proj_1_f3.cpp 
../src/main_proj_1.cpp 
../src/proj_1/proj_1_f1.o 
../src/proj_1/proj_1_f2.o 
../src/proj_1/proj_1_f3.o 
../src/main_proj_1.o 
Updating goal targets.... 
Must remake target `../src/proj_1/proj_1_f1.o'. 
g++-4.9 -std=c++11 -Wall -I../incl/top -I../incl/proj_1 -c ../src/proj_1/proj_1_f1.cpp -o ../src/proj_1/proj_1_f1.o 
Successfully remade target file `../src/proj_1/proj_1_f1.o'. 

只有第一個文件被編譯。如果我洗牌文件列表的元素,只有第一個完成(除了main,當然,因爲其他人沒有編譯)。包含$(info)不會導致任何麻煩。

我已經嘗試過其他替代方法失敗,或簡單的事情,如添加; (絕望)。我也查閱了GNU手冊和一天左右,但沒有成功。我遇到了.SECONDEXPANSION,但也無法使它成功。

有誰知道我在做什麼基本錯誤?非常感謝。

+0

這裏的問題是隻有一個文件被編譯?你有一個需要所有輸出文件的目標嗎? make的默認目標是第一個列出的目標。如果這是你的整個makefile,那將成爲'$(SRC)'中的第一個文件。嘗試將'.PHONY:all'和'all:$(SRC:.cpp = .o)'添加到makefile的頂部,看看是否有幫助。 –

回答

0

太棒了,Etan!是的。有用。我把它放在了.PHONY之後。這個'全部'目標,事實上,我已經在過去的幾個小時內刪除了它,想着專注於循環本身。我已經學會了一件基本的事情,不要再忘記如何製作作品!謝謝。

+0

不要忘記你可以「接受」你自己的答案來解決問題。 –