others - makefile -recipe commences在第一个目标之前开始

Error : Makefile:12 : *** recipe commences before first target . Stop .

我的makefile :


objDir := obj


incDir := include


srcDir := src


binDir := bin


files := matrix palindrome encryption



define generateObject


 @nasm -f elf32 -o $(objDir)/$(1).o $(srcDir)/$(1).asm


endef



object: $(addprefix $(srcDir)/,$(addsuffix .asm,$(files)))


 @echo -n"Generating object files..."


 $(foreach file,$(files),$(eval $(call generateObject,$(file))))


 @echo"Done"



我在一篇文章中看到,这可能是由于多余的空格/标签,但是我找不到。

我试过 cat -e -t -v Makefile输出是:


objDir := obj$


incDir := include$


srcDir := src$


binDir := bin$


files := matrix palindrome encryption$


$


define generateObject$


^I@nasm -f elf32 -o $(objDir)/$(1).o $(srcDir)/$(1).asm$


endef$


$


object: $(addprefix $(srcDir)/,$(addsuffix .asm,$(files)))$


^I@echo -n"Generating object files..."$


^I$(foreach file,$(files),$(eval $(call generateObject,$(file))))$


^I@echo"Done"$



时间:

你的问题是使用eval函数,eval用于解析构造,但是你将它传递给shell命令,考虑以下行:


$(foreach file,$(files),$(eval $(call generateObject,$(file))))



每次通过列表,你都会使用文件名调用generateObject ,这将扩展到shell命令; 例如,如果file是矩阵,call将扩展为:


^I@nasm -f elf32 -o obj/matrix.o src/matrix.asm



然后将该文本字符串传递给eval,并将它传递给,它试图读取makefile。因为该行本身是无效的,所以你会得到这个错误。

不要在一个shell命令的结果上运行eval ,尝试这个:


define generateObject


 nasm -f elf32 -o $(objDir)/$(1).o $(srcDir)/$(1).asm


endef



object: $(addprefix $(srcDir)/,$(addsuffix .asm,$(files)))


 @echo -n"Generating object files..."


 @$(foreach file,$(files),$(call generateObject,$(file)) && ) true


 @echo"Done"



但是,这不是"make",你不希望在单个规则内生成多个目标:

你应该像这样编写makefile :


object: $(files:%=$(objDir)/%.o)



$(objDir)/%.o : $(srcDir)/%.asm


 @nasm -f elf32 -o $@ $<



不需要generateObject变量,call或eval,甚至是foreach 。

...