0

我想在执行配方时生成一个文件,该文件在文件的单独行中列出变量的每个单词。这是规则的开始。$(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: * recipe 在第一个目标之前开始。停止。这与我将带有 > 的行放在前面没有规则起始语法的行上时会出现相同的错误。因此,这似乎不会继续我想要做的当前食谱列表。

如何使 foreach 和 eval 继续当前的配方列表和/或使用替代方法生成文件列表。

4

3 回答 3

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

谢谢您的帮助。

于 2012-07-25T01:02:09.097 回答
0

你有没有尝试过

$(foreach obj,$+,$(shell echo $(obj) >> make_temp))

?

于 2012-07-24T15:38:48.967 回答
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 > $@
于 2012-07-24T16:11:17.737 回答