在make中,如何只运行一次前提条件?

时间:2014-03-20 20:17:18

标签: makefile

让我假装我有两个服务器A和B,我希望能够在Makefile目标中单独和一起部署。我们还要说有一个准备步骤,我希望在任何部署之前运行一次,无论是一个还是两个。我怎么能这样做?

这是我到目前为止所拥有的,但它不是干的。

clean:
    # do cleanup stuff

deploy:
    make clean
    ssh $(SERVER) do-remote-deployment-stuff

deploy-to-a:
    deploy SERVER=myservera

deploy-to-b:
    deploy SERVER=myserverb

deploy-all:
    deploy-to-a
    deploy-to-b

看看它如何运行'干净'两次?

2 个答案:

答案 0 :(得分:3)

不要使用递归,只需将目标只想作为先决条件运行一次:

deploy-to-a: clean
        ...
deploy-to-b: clean
        ...

但是,您尝试设置SERVER =等不会有效,您的deploy-all规则也不会。你不能把制作目标放到制作食谱中。您可以使用模式规则:

SERVERS = A B

A_SERVER = myservera
B_SERVER = myserverb

deploy-all: $(SERVERS:%=deploy-to-%)

deploy-to-%: clean
        ssh $($*_SERVER) do-remote-deployment-stuff

clean:
        # do cleanup stuff

答案 1 :(得分:1)

您可以将clean目标指定为其他目标的依赖关系。为了让它保持干爽,你可以在Makefile

中找到类似的内容
SERVERLIST = myservera myserverb

.PHONY: clean deploy-all $(SERVERLIST)

clean:
    # do cleanup stuff

$(SERVERLIST): clean
    ssh $@ do-remote-deployment-stuff

deploy-all: $(SERVERLIST)

您可以使用SERVERLIST变量定义任意数量的服务器。

运行make -n deploy-all会显示将要运行的命令:

# do cleanup stuff
ssh myservera do-remote-deployment-stuff
ssh myserverb do-remote-deployment-stuff

要部署到一台服务器,您可以运行make myservera等。您当然可以创建一个"别名"对于您的服务器:

SERVERLIST = my.longservername.com someother.server.somewhere.else.com

myservera: someother.server.somewhere.else.com