【问题标题】:Makefile PHONY usage in large fileMakefile PHONY 在大文件中的使用
【发布时间】:2024-04-30 06:35:01
【问题描述】:

我有使用 .Phony 的 Makefile,它工作正常 我的问题是有更简洁的方式来编写它而不是在每个目标之前编写它

all: app1 app2 

.PHONY: app1
app1:
    echo "from app 1"

.PHONY: app2
app2:
    echo "from app 2"

我还有很多其他的目标(看起来都一样),有没有更简洁的方法可以在每个目标之前一遍又一遍地编写它?

【问题讨论】:

    标签: linux bash shell makefile gnu-make


    【解决方案1】:

    .PHONY 可以有任意多的先决条件:

    .PHONY: all app1 app2
    

    您可以将它放在 Makefile 中的任何位置,而不仅仅是在虚假目标规则之前:

    .PHONY: all app1 app2
    
    all: app1 app2
    
    app1:
        echo "from app 1"
    
    app2:
        echo "from app 2"
    

    请注意,如果您有“许多看起来相同的其他目标”,则 make 有一些不错的功能,您可以使用这些功能来分解相似之处:

    APPS := app1 app2
    
    .PHONY: all $(APPS)
    
    all: $(APPS)
    
    $(APPS): app%:
        echo "from app $*"
    

    $*,在配方中,扩展为 app% 模式的词干)。

    Make 非常聪明,您甚至可以让它自动检测潜在目标,而不必明确列出它们 (APPS := app1 app2...)。但是在这里,我们需要更多地了解您的真实项目组织。例如,假设每个appX 都有一个对应的appX.todo 文件,并且构建命令类似于buildapp appX.todo appX。然后,以下 Makefile 将自动执行所有操作:

    TODO := $(wildcard *.todo)
    APPS := $(patsubst %.todo,%,$(TODO))
    
    .PHONY: all $(APPS)
    
    all: $(APPS)
    
    $(APPS):
        buildapp $@.todo $@
    

    $@ 扩展为规则的目标)。

    【讨论】:

      【解决方案2】:

      你可以在目标中使用all

      .PHONY: all
      

      这甚至显示在documentation 中的一个示例中:

      all : prog1 prog2 prog3
      .PHONY : all
      
      prog1 : prog1.o utils.o
              cc -o prog1 prog1.o utils.o
      
      prog2 : prog2.o
              cc -o prog2 prog2.o
      
      prog3 : prog3.o sort.o utils.o
              cc -o prog3 prog3.o sort.o utils.o
      

      【讨论】:

      • 谢谢,但如果不是所有目标都应该使用 .PHONY 怎么办?
      • 然后列出具体目标.PHONY: prog1 prog2