如何避免重复命令,例如目标规则中的cd?

问题描述 投票:0回答:3

在我的makefile中,我有很多cd $(d)命令,每个命令对应一个目标命令。有什么方法可以减少cd $(d)命令的数量?

all:
    cd $(d); command1
    cd $(d); command2
    cd $(d); command3
    cd $(d); command4
    cd $(d); command5
gnu-make
3个回答
0
投票

您可以使用行继续并将外壳仅传递一行,其中命令之间用分号分隔:

all:
    cd $(d); \
    command1; \
    command2; \
    command3; \
    command4; \
    command5

甚至

all:
    cd $(d); command1; command2; command3; command4; command5

0
投票

递归生成?

.PHONY: all
all: ; ${MAKE} -C $d all-in-d

PHONY: all-in-d
all-in-d:
    command1
    command2
    command3
    command4

0
投票

使用首先作为CD的Shell脚本作为make$d

${SHELL}

我们使用目标特定的变量,以免干扰makefile中的其他命令。

但是,如果我们添加创建.PHONY: all all: SHELL := ./cd-to-d all: .SHELLFLAGS := all: command1 command2 command3 command4 的规则,就会有点混乱。

cd-to-d

为什么所有cd-to-d: SHELL := ${SHELL} cd-to-d: .SHELLFLAGS := ${.SHELLFLAGS} cd-to-d: echo '#!/bin/bash' >$@-tmp echo 'cd "$d"' >>$@-tmp echo 'exec "$$@"' >>$@-tmp chmod a+x $@-tmp mv $@-tmp $@ .PHONY: all all: SHELL := ./cd-to-d all: .SHELLFLAGS := all: cd-to-d all: command1 command2 command3 command4 噪声?如果在创建$@-tmp时遇到错误,我们不想留下一个旧的。您可以改用cd-to-d(我总是这样做)。

为什么.DELETE_ON_ERROR:噪音?当makeSHELL := ${SHELL}建立为cd-to-d的依赖项时,它将继承all的目标特定定义。我们需要取消那些担心使用哪个shell的问题。

Yuk。

© www.soinside.com 2019 - 2024. All rights reserved.