Makefile變量作為先決條件


Answers

你可以創建一個隱式的防護目標,它檢查干涉中的變量是否被定義,如下所示:

guard-%:
    @ if [ "${${*}}" = "" ]; then \
        echo "Environment variable $* not set"; \
        exit 1; \
    fi

然後,您可以在任何想要聲明變量已定義的位置添加guard-ENVVAR目標,如下所示:

change-hostname: guard-HOSTNAME
        ./changeHostname.sh ${HOSTNAME}

如果你調用'make change-hostname',而不在調用中添加HOSTNAME = somehostname,那麼你會得到一個錯誤,並且構建失敗。

Question

在Makefile中, deploy配方需要設置一個環境變量ENV來正確執行它自己,而另一些則不關心,例如:

ENV = 

.PHONY: deploy hello

deploy:
    rsync . $(ENV).example.com:/var/www/myapp/

hello:
    echo "I don't care about ENV, just saying hello!"

我如何確保設置這個變量,例如:是否有辦法將此makefile變量聲明為部署配方的先決條件,如:

deploy: make-sure-ENV-variable-is-set

謝謝。




您可以使用ifdef而不是其他目標。

.PHONY: deploy
deploy:
    ifdef ENV
        rsync . $(ENV).example.com:/var/www/myapp/
    else
        @echo 1>&2 "ENV must be set"
        false                            # Cause deploy to fail
    endif



正如我看到命令本身需要ENV變量,因此您可以在命令本身中檢查它:

.PHONY: deploy check-env

deploy: check-env
    rsync . $(ENV).example.com:/var/www/myapp/

check-env:
    if test "$(ENV)" = "" ; then \
        echo "ENV not set"; \
        exit 1; \
    fi





Links