【问题标题】:How to order tasks and subtasks with make?如何使用 make 对任务和子任务进行排序?
【发布时间】:2019-03-13 08:00:43
【问题描述】:

我使用 GNU make 作为执行某些任务的工具。 假设我有两个任务,A 和 B,它们有子任务。 我必须在任务 A 之前执行任务 B(及其子任务)。

我有这个最小的工作示例

all: task1

task1: task2    

task1: task1.1
    @echo task1

task1.1: task1.2
    @echo task1.1

task1.2:
    @echo task1.2

task2: task2.1
    @echo task2

task2.1: task2.2
    @echo task2.1

task2.2:
    @echo task2.2

无论如何,这不能按预期工作,因为输出是这样的:

task1.2
task1.1
task2.2
task2.1
task2
task1

相反,我想拥有

task2.2
task2.1
task2
task1.2
task1.1
task1

只需指定依赖task1:task2,即不涉及子任务。

我已经能够获得这种行为,将 task1:task2 放在 task1:task1.1 下,但建议以不依赖顺序的方式设计依赖项。

有没有其他方法可以实现这一点?

谢谢。

【问题讨论】:

    标签: gnu-make


    【解决方案1】:

    您可以使用order-only prerequisites。由于您想在task1.2 之前运行task2,您可以添加| task2 作为task1.2 的订购前提。

    all: task1
    
    task1: task2    
    
    task1: task1.1
        @echo task1
    
    task1.1: task1.2
        @echo task1.1
    
    task1.2: | task2
        @echo task1.2
    
    task2: task2.1
        @echo task2
    
    task2.1: task2.2
        @echo task2.1
    
    task2.2:
        @echo task2.2
    

    【讨论】:

    • 只要拥有 task1.2: task2
    【解决方案2】:

    我尝试回答我自己的问题。 这按预期工作:

    all: task1
    
    task1.depends: task2
    
    tasks1 = task1.1 task1.2
    
    tasks2 = task2.1 task2.2
    
    task1: task1.1
        @echo task1
    
    task1.1: task1.2
        @echo task1.1
    
    task1.2:
        @echo task1.2
    
    task1.depends:
    
    $(tasks1): task1.depends
    
    task2: task2.1
        @echo task2
    
    task2.1: task2.2
        @echo task2.1
    
    task2.2:
        @echo task2.2
    
    task2.depends:
    
    $(tasks2): task2.depends
    

    您有什么改进建议吗?

    【讨论】:

      猜你喜欢
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      • 1970-01-01
      • 2016-09-13
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      相关资源
      最近更新 更多