Makefile 如何在GNU make中收集过期依赖项列表?

Makefile 如何在GNU make中收集过期依赖项列表?,makefile,Makefile,我有一些XML源文件需要由Ruby脚本处理,以创建生成的c文件,然后才能构建我的主要目标。脚本的启动成本远远大于处理每个文件所需的时间,因此像在make文件中通常那样逐个处理它们是非常低效的。我要做的是将它们收集在一起,并将它们作为列表传递给脚本,该脚本在更新主目标之前执行 我现在拥有的是: _generated_/%.xml.cs : %.cs #execute ruby script to generate .cs file out.exe : a.cs b.cs _generat

我有一些XML源文件需要由Ruby脚本处理,以创建生成的c文件,然后才能构建我的主要目标。脚本的启动成本远远大于处理每个文件所需的时间,因此像在make文件中通常那样逐个处理它们是非常低效的。我要做的是将它们收集在一起,并将它们作为列表传递给脚本,该脚本在更新主目标之前执行

我现在拥有的是:

_generated_/%.xml.cs : %.cs
    #execute ruby script to generate .cs file

out.exe : a.cs b.cs _generated_/e.xml.cs ....
    #compile .cs files
我想到了使用eval的想法,因此,如果处理的文件后缀为.s,并且在脚本处理时生成后缀为.t的文件,我的想法是这样做:

%.xml : _generated_/%.xml.cs        
    $(eval SOURCE_FILES += $<)
然而,除非eval echo之后有shell命令,否则这个规则不会触发——我想这是因为make知道简单地调用函数不可能生成文件。我的另一个想法是将文件列表收集到一个临时文件中

    .INTERMEDIATE source_list.txt

   %.xml : _generated_/%.xml.cs        
        echo $< >> source_list.txt
虽然这两种方法可能都有效,但我想知道是否有更好的方法来实现这一点

更新:

我最后做的是类似于下面的事情-eval函数上的@prefix使傻瓜相信正在执行shell命令

_generated_/%.xml.cs : %.cs
        @ $(eval DIRTY_XML += $(<))

out.exe : a.cs b.cs _generated_/e.xml.cs ....
        # Create generated cs files 
        # by running ruby script with DIRTY_XML as input 
        # Compile all .cs files

您可以在$?-$上使用$过滤器?是比目标更新的先决条件列表。

使用一个名为ruby marker的空文件,表示所有xml文件都已处理。其修改时间可与x.s文件的修改时间进行比较。那么使用$?仅选择自上次运行ruby脚本以来已更改的必备x.s文件

main-target: ruby-marker
    whatever...

ruby-marker: foo.s bar.s baz.s
    ruby-script $?
    @touch $@

我对我的问题进行了编辑,以使我所做的更加清晰。我尝试过这个方法,但是如果尝试从$构建过时xml文件的列表?在编译.cs文件然后生成投诉的规则中,它不知道如何生成生成的.cs文件。一种方法是使用另一个规则,其中生成的.cs文件依赖于.xml文件,并且该规则只执行touch来创建虚拟生成的.cs文件,这样第二个规则就可以在编译之前成批生成所有这些文件。