makefile cd到dir并执行命令

时间:2017-05-17 16:15:36

标签: makefile

我有几个AWS lambda函数,我想构建和部署它们并具有以下Makefile

#!/bin/bash
#SHELL:=/bin/bash --login
functions = $(sort $(dir $(wildcard */)))

define deploy
  cd $1 && npm deploy-dev
endef

deploy:
    $(foreach fn,$(functions),$(eval $(call deploy,$(fn))))

基本上每个函数都是node.js项目,在package.json

中有以下条目
  "scripts": {
    "deploy-dev": "npm build && rm -rf node_modules && npm i --production  --legacy-bundling && AWS_PROFILE=dev SLS_DEBUG=* sls deploy --stage dev --region us-east-1"

cd进入dir并运行npm deploy-dev按预期工作,但如何自动执行此操作?

我收到错误:

➜  new_ingest git:(feature/organise) ✗ make deploy                                                                                                    (git)-[feature/organise] 
Makefile:11: *** missing separator. Stop.

1 个答案:

答案 0 :(得分:1)

为了找到问题,我们可以将其减少为一个函数,改变这个:

deploy:
    $(foreach fn,$(functions),$(eval $(call deploy,$(fn))))

到此:

deploy:
    $(eval $(call deploy,foo))

(其中foo/是您的目录之一。)现在我们可以看到问题。 $(call ...)部分扩展为cd foo && npm deploy-dev。这是一个传递给shell的命令,由Make解释的mot。所以,当你告诉Make eval时,Make说“这是乱码”。如果删除eval,它就可以了。

恢复foreach会导致问题:所有命令都连接成一行(cd foo && npm deploy-dev cd bar && npm deploy-dev ...)。要解决此问题,您可以破解deploy

define deploy
  cd $(1) && pwd ; cd - ;
endef

或者您可以修改该方案,为每个功能提供自己的规则。