从大型Makefile变量创建文件

3

我有一个Makefile变量叫做OBJECTS,其中包含一系列对象,但由于命令缓冲区太小,无法全部存储。因此,我使用以下方法创建一个文件来列出这些对象(以便传递给ar):

objects.lst:
    $(foreach OBJ,$(OBJECTS),$(shell echo "$(OBJ)">>$@))

虽然这种方法可行,但非常缓慢(至少在Cygwin上),而且我不喜欢依赖shell命令和重定向。

此外,foreach不是为此目的而设计的-它在运行任何命令之前就已经被评估了,这意味着我无法在追加之前执行例如rm -f objects.lst的命令。

有更好的方法吗?我不想使用增量归档,因为这会导致多个任务出现问题。

我唯一能想到的是使用单独的脚本解析Makefile以读取对象列表,或者将对象列表存储在单独的文件中。不过这两种解决方案都有自己的问题。

4个回答

1
在下面的例子中,我还用一个简单的Perl脚本替换了echo,将参数分割成新行,但这就是它的要点。
objects.lst:
    echo $(wordlist 1,99,$(OBJECTS))>$@
    echo $(wordlist 100,199,$(OBJECTS))>>$@
    echo $(wordlist 200,299,$(OBJECTS))>>$@
    echo $(wordlist 300,399,$(OBJECTS))>>$@
    ...

1

尝试类似这样的内容:

OBJECTS:=a b c d
objects.lst:
        echo > $@ <<EOF      $(OBJECTS)

也就是利用内置于 shell 中的 <<EOF 功能。它没有任何最大长度限制。


仍然遇到以下错误: make: execvp: /bin/sh: 参数列表太长 make: *** [objects.lst] 错误 127 - sholte

0
这是一个关于GNU Make的补丁,它允许你直接将变量写入文件中。 它创建了一个新的'writefile'函数,类似于现有的'info'函数,但它接受一个文件名参数并将内容写入文件中。

https://savannah.gnu.org/bugs/?35384


0

这样怎么样:

OBJECTS_AM=$(filter a% b% c% d% e% f% g% h% i% j% k% l% m%,$(OBJECTS))
OBJECTS_NZ=$(filter-out a% b% c% d% e% f% g% h% i% j% k% l% m%,$(OBJECTS))

objects.lst:
$(shell echo "$(OBJECTS_AM)">$@)
$(shell echo "$(OBJECTS_NZ)">>$@)

你可能需要再分割一两次,但这并不难,特别是文件名的分布并不经常改变。


谢谢,这激发了我使用词表的解决方案,确保每个变量中都有相同数量的对象。 - Martin Fido

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接