我有一個要編譯的源文件列表。我從不同的目錄/子目錄中選擇它們,最後我有一個列表。我以爲我會用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,但也無法使它成功。
有誰知道我在做什麼基本錯誤?非常感謝。
這裏的問題是隻有一個文件被編譯?你有一個需要所有輸出文件的目標嗎? make的默認目標是第一個列出的目標。如果這是你的整個makefile,那將成爲'$(SRC)'中的第一個文件。嘗試將'.PHONY:all'和'all:$(SRC:.cpp = .o)'添加到makefile的頂部,看看是否有幫助。 –