我想在执行配方时生成一个文件,该文件在文件的单独行中列出变量的每个单词。这是规则的开始。 $(OBJ_LIST)中的每个单词都应放入make_temp中。注意:$(OBJ_LIST)是.o文件的列表。注意:使用> .RECIPEPREFIX。
$(MDIR)zzz.exe: $(OBJ_LIST)
> if exist make_temp del make_temp
如果我将这3行放在此下面,那么文件将包含文件中的前3个单词。
> echo $(word 1,$+) >> make_temp
> echo $(word 2,$+) >> make_temp
> echo $(word 3,$+) >> make_temp
我尝试使用foreach和eval来做到这一点。
> $(foreach obj,$+,$(eval > echo $(obj) >> make_temp))
这会出现错误makefile.min:473: * 配方在第一个目标之前开始。停止。 当我用>换行时,会出现同样的错误。在没有规则的行上开始语法之前。因此,似乎这不会继续当前的配方列表,这就是我想要做的事情。
如何使foreach和eval继续使用当前配方列表和/或使用其他方法生成文件列表。
答案 0 :(得分:0)
你试过吗
$(foreach obj,$+,$(shell echo $(obj) >> make_temp))
答案 1 :(得分:0)
使用foreach
以{echo o1; echo o2; ...} > make_temp
形式构建配方:
make_temp : $(OBJ_LIST)
> { $(foreach o,$+,echo '$o';) } > $@
或者,使用shell设施:
make_temp : $(OBJ_LIST)
> for o in $+ do echo $$o; done > $@
答案 2 :(得分:0)
我已经解决了这个问题。
make_temp: makefile.min
> $(shell if exist make_temp del make_temp)
> $(foreach obj,$(OBJ_LIST),$(shell echo $(obj) >> make_temp))
如果我没有把if语句放在shell中,那么在执行foreach循环后执行它会出于未知原因,所以文件会被删除。
生成此文件需要很长时间,因此我只在makefile更改时生成它。
我忘了提到我在Windows上这样做了。我不认为Eldar Abusalimov的第一个解决方案在Windows中具有相同的形式。我将第二个解决方案转换为Windows,如下所示。
make_temp : $(OBJ_LIST)
> for %%a in $(OBJ_LIST) do echo %a
这在我的情况下不起作用,因为$(OBJ_LIST)超过8192个字符,这是Windows中cmd.exe的限制。这就是我想生成这个文件的原因;因为我不能直接使用$(OBJ_LIST)。
感谢您的帮助。