【问题标题】:How to call a make dependency after the others如何在其他人之后调用 make 依赖项
【发布时间】:2014-05-29 23:59:10
【问题描述】:

例如:

build: ...
        do some building

clean:
        do some cleaning

build_and_clean: build clean

在build_and_clean 中,如何确保clean 在build 之后运行?除了作为依赖项之外,还有其他方法可以调用 clean 吗?我想避免对make 进行递归调用,并且我还想避免重复clean 规则中的代码。

【问题讨论】:

  • 没关系,由于make build_and_clean,make会先make build再make clean。
  • 嗯...我想你的意思是清理然后构建。
  • @laune 未指定依赖顺序
  • @Beta,不,我的意思是构建然后清理所有中间文件,但这无关紧要,因为一个解决方案也解决另一个问题
  • Make 有删除中间文件的方法,但对于一般问题,我想不出比定义一系列清理命令更优雅的方法,供clean 和build_and_clean 使用.

标签: build makefile dependencies


【解决方案1】:

有多种方法可以做到这一点。您可以使用双冒号规则:

build: ...
        do some building

clean:
        do some cleaning

build_and_clean:: build 
build_and_clean:: clean

documentation states

目标的双冒号规则按照它们在 makefile 中出现的顺序执行。然而,双冒号规则真正有意义的情况是那些执行配方的顺序无关紧要的情况。

一般来说,我同意他们在那里所说的话,因为在复杂的构建中,通常情况下,单个目标的双冒号规则将从各种来源组装而成,并且解析这些来源的顺序可能不能保证。然而,在手头的案例中,我们知道所有规则的来源。而且 make 不能随意对它们进行重新排序。

这也可以做到,而无需大量重复代码。我已经使用echo 命令来模拟构建命令的执行:

define CLEAN
echo clean
endef

build:
    echo build

clean:
    $(call CLEAN)

build_and_clean: build
    $(call CLEAN)

【讨论】:

    【解决方案2】:

    我更喜欢您自己想避免的解决方案之一,但作为替代方案 有这种相当费力的事情:

    .PHONY: any build clean build_and_clean
    
    any:
        @if [ ! -z "$(dobuild)" ]; \
        then \
            echo "doing some building"; \
        fi
        @if [ ! -z "$(doclean)" ]; \
        then \
            echo "doing some cleaning"; \
        fi
    
    build: dobuild = 1
    build: any
    
    clean: doclean = 1
    clean: any
    
    build_and_clean: dobuild = 1
    build_and_clean: doclean = 1
    build_and_clean: any
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-13
      • 2022-10-04
      • 1970-01-01
      • 2020-08-17
      • 2014-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多