makefile foreach在第一次迭代时停止

makefile foreach在第一次迭代时停止,makefile,g++,Makefile,G++,我有一个要编译的源文件列表。我从不同的目录/子目录中选择它们,最后我有一个列表。我想我应该使用一个带有eval/call/define的foreach循环。命令info起作用,make的第一个过程可以看到所有这些 下面是makefile的一段相关代码: define cmp-one $(info $2) $2:$1 $(CMP) $(CMP_FLGS) $(INCL) -c $1 -o $2 endef $(foreach src_tmp,$(SRC),$(info $(src

我有一个要编译的源文件列表。我从不同的目录/子目录中选择它们,最后我有一个列表。我想我应该使用一个带有eval/call/define的foreach循环。命令info起作用,make的第一个过程可以看到所有这些

下面是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))))
下面是一个非常简单的案例的屏幕输出,以将我的问题简化为最清晰的示例(注意:使文件位于目录中,因此您会注意到一些../):

只编译第一个文件。如果我洗牌文件列表中的元素,只会完成第一个(当然,除了main,因为其他人没有编译)。包含$(info)不会引起任何问题

我尝试过其他选择,但没有成功,或者简单的事情,比如添加;(绝望)。我还查阅了GNU手册并四处查看了一天,但没有成功。我遇到了第二次扩张,但也没能成功


有人知道我犯了什么基本错误吗?非常感谢。

太棒了,伊坦!是的。它起作用了。我把它放在后面了,假的。“全部”目标,事实上,在过去的几个小时里,我已经删除了它,我想“集中”在循环本身上。我确实学到了一件基本的事情,那就是不要再忘记make是如何工作的!谢谢。

这里的问题是只有一个文件被编译?您是否有需要所有输出文件的目标?make的默认目标是列出的第一个目标。如果这是整个makefile,那么它将是
$(SRC)
中的第一个文件。尝试将
.PHONY:all
all:$(SRC:.cpp=.o)
添加到makefile的顶部,看看这是否有帮助。别忘了你可以“接受”自己的答案来结束问题。
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'.