代码之家  ›  专栏  ›  技术社区  ›  Martin Fido

从大型Makefile变量创建文件

  •  3
  • Martin Fido  · 技术社区  · 17 年前

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

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

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

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

    4 回复  |  直到 17 年前
        1
  •  1
  •   an0nym0usc0ward    17 年前

    尝试以下方法:

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

    <<EOF

        2
  •  1
  •   Martin Fido    17 年前

    在下面的示例中,我还用一个简单的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))>>$@
        ...
    
        3
  •  0
  •   florin    17 年前

    像这样的怎么样:

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

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

        4
  •  0
  •   jpc    14 年前

    它创建了一个新的“writefile”函数,与现有的“info”函数类似,只是它接受一个filename参数并写入文件:

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