在我的makefile中,我有很多cd $(d)
命令,每个命令对应一个目标命令。有什么方法可以减少cd $(d)
命令的数量?
all:
cd $(d); command1
cd $(d); command2
cd $(d); command3
cd $(d); command4
cd $(d); command5
您可以使用行继续并将外壳仅传递一行,其中命令之间用分号分隔:
all:
cd $(d); \
command1; \
command2; \
command3; \
command4; \
command5
甚至
all:
cd $(d); command1; command2; command3; command4; command5
递归生成?
.PHONY: all
all: ; ${MAKE} -C $d all-in-d
PHONY: all-in-d
all-in-d:
command1
command2
command3
command4
使用首先作为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:
噪音?当make将SHELL := ${SHELL}
建立为cd-to-d
的依赖项时,它将继承all
的目标特定定义。我们需要取消那些担心使用哪个shell的问题。
Yuk。