从大型Makefile变量创建文件

时间:2009-02-04 18:06:39

标签: makefile

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

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

虽然这很有效,但它至少非常慢(至少在Cygwin上),我不喜欢依赖shell命令和重定向。

另外foreach不是为了这个目的 - 它在任何命令运行之前进行评估,这意味着在附加之前我不能举例rm -f objects.lst

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

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

4 个答案:

答案 0 :(得分:1)

尝试类似:

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

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

答案 1 :(得分: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))>>$@
    ...

答案 2 :(得分: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)">>$@)

您可能需要将其拆分一次或两次,但这并不是那么糟糕,特别是因为文件名的分布不会经常改变。

答案 3 :(得分:0)

这是gnu make的补丁,可让您直接将变量写入文件。 它创建了一个新的'writefile'函数,类似于现有的'info'函数,除了它接受一个文件名参数并写入文件:

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