在makefile中自动生成配方继续

时间:2012-07-24 07:06:43

标签: makefile gnu-make

我想在执行配方时生成一个文件,该文件在文件的单独行中列出变量的每个单词。这是规则的开始。 $(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继续使用当前配方列表和/或使用其他方法生成文件列表。

3 个答案:

答案 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)。

感谢您的帮助。

相关问题