Ошибка создания файла: make [1]: *** Нет правила для создания целевого «промежуточного». Остановка

#linux #makefile

#linux #makefile

Вопрос:

Вытаскиваю волосы из этого. Я уверен, что это очень просто. Когда я запускаю:

make django_servers ENV="staging"

В приведенном ниже Makefile я получаю следующую ошибку, когда она попадает в строку $(MAKE) scoring_worker_servers ${ENV} :

make[1]: *** No rule to make target 'staging'. Stop.

Я включил весь Makefile.

 # Put any command that doesn't create a file here (almost all of the commands)
.PHONY: 
    help 
    beat_servers 
    database_servers 
    default_celery_worker_servers 
    django_servers 
    webapp_servers 
    rabbit_servers 
    renew_ssl 
    scoring_worker_servers 

usage:
    @echo "Available commands:"
    @echo "help                     Display available commands"
    @echo "beat_servers             Push ansible config to beat_servers"
    @echo "database_servers         Push ansible config to database servers"
    @echo "default_celery_worker_servers    Push ansible config to default celery worker servers"
    @echo "django_servers           Push ansible config to django servers"
    @echo "webapp_servers           Push ansible config to webapp servers"
    @echo "rabbit_servers           Push ansible config to rabbit servers"
    @echo "renew_ssl                Renew SSL certificates and push to required servers"
    @echo "scoring_worker_servers   Push ansible config to scoring worker servers"

help:
    $(MAKE) usage

beat_servers:
    @ansible-playbook ansible/beat_servers.yml -i ansible/inventories/${ENV}/beat --vault-id ansible/password.txt

database_servers:
    @ansible-playbook ansible/database_servers.yml -i ansible/inventories/${ENV}/database --vault-id ansible/password.txt

default_celery_worker_servers:
    @ansible-playbook ansible/default_celery_worker_servers.yml -i ansible/inventories/${ENV}/default_celery_worker --vault-id ansible/password.txt

scoring_worker_servers:
    @ansible-playbook ansible/scoring_worker_servers.yml -i ansible/inventories/${ENV}/scoring_worker --vault-id ansible/password.txt

django_servers:
    @ansible-playbook ansible/django_servers.yml -i ansible/inventories/${ENV}/django --vault-id ansible/password.txt
    $(MAKE) default_celery_worker_servers ${ENV}
    $(MAKE) scoring_worker_servers ${ENV}
    $(MAKE) beat_servers ${ENV}

webapp_servers:
    @ansible-playbook ansible/webapp_servers.yml -i ansible/inventories/${ENV}/webapp --vault-id ansible/password.txt

rabbit_servers:
    @ansible-playbook ansible/rabbit_servers.yml -i ansible/inventories/${ENV}/rabbit --vault-id ansible/password.txt

renew_ssl:
    @certbot renew --dns-cloudflare-credentials /cloudflare/cloudflare.ini
    $(MAKE) django_servers ${ENV}
    $(MAKE) webapp_servers ${ENV}

  

Комментарии:

1. Похоже, вы пишете императивную программу, в которой вы указываете кучу шагов, которые должны быть выполнены по порядку. Bash лучше подходит для такого рода вещей. Вот пример того, как написать скрипт с выбираемыми подкомандами: gist.github.com/waylan/4080362

Ответ №1:

Вы не можете передать значение ENV в качестве параметра make . Но вы можете установить для него переменную:

 $(MAKE) scoring_worker_servers ENV=$(ENV)
  

Комментарии:

1. … голоса, поданные лицами с репутацией менее 15, записываются, но не изменяют публично отображаемую оценку публикации: (