我有一个名为OBJECTS的Makefile变量中的对象列表,这对于命令缓冲区来说太大了。因此我使用以下方法创建列出对象的文件(传递给ar):
objects.lst:
$(foreach OBJ,$(OBJECTS),$(shell echo "$(OBJ)">>$@))
虽然这很有效,但它至少非常慢(至少在Cygwin上),我不喜欢依赖shell命令和重定向。
另外foreach不是为了这个目的 - 它在任何命令运行之前进行评估,这意味着在附加之前我不能举例rm -f objects.lst
。
有更好的方法吗?我不想使用增量归档,因为这会导致多个作业出现问题。
我唯一能想到的是使用单独的脚本解析Makefile以读取对象列表或将对象列表存储在单独的文件中。但这两种解决方案都有其自身的问题。
答案 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'函数,除了它接受一个文件名参数并写入文件: