Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在makefile中自动生成配方延续_Makefile_Gnu Make - Fatal编程技术网

在makefile中自动生成配方延续

在makefile中自动生成配方延续,makefile,gnu-make,Makefile,Gnu Make,我想在配方执行时生成一个文件,在文件的单独一行中列出变量的每个字。这是规则的开始。$(OBJ_列表)中的每个单词都应放入make_temp。注意:$(OBJ_LIST)是.o文件的列表。注意:对.RECIPEPREFIX使用> $(MDIR)zzz.exe: $(OBJ_LIST) > if exist make_temp del make_temp 如果我把这3行放在下面,那么这个文件将有文件中的前3个字 > echo $(word 1,$+) >> make_t

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

您尝试过吗

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

使用
foreach
{echo o1;echo o2;…}>make_temp
的形式构造配方:

make_temp : $(OBJ_LIST)
>   { $(foreach o,$+,echo '$o';) } > $@
或者,使用壳牌设施:

make_temp : $(OBJ_LIST)
>   for o in $+ do echo $$o; done > $@

我已经解决了这个问题如下

make_temp: makefile.min
>  $(shell if exist make_temp del make_temp)
>  $(foreach obj,$(OBJ_LIST),$(shell echo $(obj) >> make_temp))
make_temp : $(OBJ_LIST)
>  for %%a in $(OBJ_LIST) do echo %a
如果我没有将If语句放在shell中,它将在foreach循环由于未知原因执行之后执行,因此文件将被删除

生成这个文件需要很长时间,因此我只在修改makefile时生成它

我忘了说我是在Windows上做这件事的。我认为Eldar Abusalimov的第一个解决方案在Windows中没有同等的形式。我将第二个解决方案转换为windows,如下所示

make_temp: makefile.min
>  $(shell if exist make_temp del make_temp)
>  $(foreach obj,$(OBJ_LIST),$(shell echo $(obj) >> make_temp))
make_temp : $(OBJ_LIST)
>  for %%a in $(OBJ_LIST) do echo %a
这在我的情况下不起作用,因为$(OBJ_LIST)超过8192个字符,这是Windows中cmd.exe的限制。这就是为什么我要生成这个文件;因为我不能直接使用$(OBJ_列表)


谢谢您的帮助。

我认为
make
做不到这一点,您考虑过使用
tr
吗?例如:
echo$(word)|tr''\n'>make_temp
。是的,在Windows和Unix上,环境缓冲区大小可能是一个问题。