我有一个要编译的源文件列表。我从不同的目录/子目录中选择它们,最后我有一个列表。我以为我会使用带有eval / call / define的foreach循环。命令信息有效,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))))
这是一个非常简单的案例的屏幕输出,以便将我的问题减少到最清晰的例子(注意:make文件存在于一个目录中,所以你会注意到一些../):
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)' s不会造成任何麻烦。
我尝试过其他替代方案,或者简单的事情,比如添加; (绝望)。我也查看了GNU手册并且一天,但没有成功。我遇到了.SECONDEXPANSION,但也无法让它发挥作用。
有谁知道我在做什么基本错误?非常感谢。
答案 0 :(得分:0)
太棒了,Etan!是的。有用。我把它放在了.PHONY之后。事实上,这个'所有'目标,我已经在过去几个小时内删除了它,想要“集中”在循环本身上。我确实学到了一个基本的东西,不要再忘记如何制作!感谢。