从大型Makefile变量创建文件

从大型Makefile变量创建文件,makefile,Makefile,我在一个名为objects的Makefile变量中有一个对象列表,它对于命令缓冲区来说太大了。因此,我使用以下方法创建一个列出对象的文件(传递给ar): 虽然这样做非常慢(至少在Cygwin上是这样),但我不喜欢依赖shell命令和重定向 另外,foreach不是用于此目的的-它在运行任何命令之前进行计算,这意味着我不能在附加之前执行,例如rm-f objects.lst 有更好的办法吗?我不想使用增量归档,因为这会导致多个作业出现问题 我唯一能想到的就是用一个单独的脚本解析Makefile来读

我在一个名为objects的Makefile变量中有一个对象列表,它对于命令缓冲区来说太大了。因此,我使用以下方法创建一个列出对象的文件(传递给ar):

虽然这样做非常慢(至少在Cygwin上是这样),但我不喜欢依赖shell命令和重定向

另外,foreach不是用于此目的的-它在运行任何命令之前进行计算,这意味着我不能在附加之前执行,例如
rm-f objects.lst

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

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

尝试以下方法:

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

echo>$@像这样的东西怎么样:

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)">>$@)

您可能需要将其拆分一到两次,但并没有那么糟糕,尤其是当文件名的分布不经常更改时。

在下面的示例中,我还用一个简单的Perl脚本替换了echo,以将参数拆分为新行,但这就是它的jist

objects.lst:
    echo $(wordlist 1,99,$(OBJECTS))>$@
    echo $(wordlist 100,199,$(OBJECTS))>>$@
    echo $(wordlist 200,299,$(OBJECTS))>>$@
    echo $(wordlist 300,399,$(OBJECTS))>>$@
    ...

下面是gnu make的一个补丁,它允许您直接将变量写入文件。 它创建了一个新的“writefile”函数,与现有的“info”函数类似,只是它接受一个filename参数并写入文件:


感谢这一点,它启发了我自己使用wordlist的解决方案,确保每个变量中对象的数量一致。仍然使用make:execvp:/bin/sh:Argument list太长make:**[objects.lst]错误127
objects.lst:
    echo $(wordlist 1,99,$(OBJECTS))>$@
    echo $(wordlist 100,199,$(OBJECTS))>>$@
    echo $(wordlist 200,299,$(OBJECTS))>>$@
    echo $(wordlist 300,399,$(OBJECTS))>>$@
    ...