Заставьте зависимости выполняться несколько раз, даже если зависимость была запущена заранее - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть make-файл, состоящий из нескольких целей с некоторыми зависимостями. небольшая структура выглядит следующим образом

pgdynamic_setup:
    cd $(PGDYNAMICDIR);  . /opt/Modules/init/sh; module load <tool_name>; totem2 -lmwait $(PGDYNAMIC_APACHE_LN) $(BATCH_NOBATCH) dynamic_setup.tcl | tee -i ./logs/$@.log

pgdynamic_current: pgdynamic_setup
    cd $(PGDYNAMICDIR);  . /opt/Modules/init/sh; module load <tool_name>; <tool_name> dynamic_current.tcl | tee -i ./logs/$@.log

pgdynamic_cdev: pgdynamic_setup
    cd $(PGDYNAMICDIR);  . /opt/Modules/init/sh; module load <tool_name>; <tool_name> dynamic_cdev.tcl | tee -i ./logs/$@.log

pgdynamic_tool: pgdynamic_current
    cd $(PGDYNAMICDIR);  . /opt/Modules/init/sh; module load <tool_name>; <tool_name> dynamic.tcl | tee -i ./logs/$@.log

У меня не так много опыта написания Makefiles. Проблема в том, что когда я запускаю make pgdynamic_setup, а затем make pgdynamic_current make выполняет обе цели (pgdynamic_setup и pgdynamic_current). Но так как я явно запустил pgdynamic_setup, я ожидал бы, что make выполняет только цель pgdynamic_current.

Это не MWE. когда я пробую ту же концепцию с некоторыми командами touch, cat, она просто работает как положено. Я думаю, что-то не так в этой структуре. Кто-нибудь может мне помочь на структурной основе, так как я не могу предоставить работающий MWE. извините и заранее спасибо.

1 Ответ

0 голосов
/ 18 ноября 2018

Делайте работы, сравнивая временные метки файлов, которые существуют на вашем компьютере. Он не поддерживает внутреннюю базу данных о том, какие правила были выполнены: он сравнивает временные метки необходимых файлов с временными метками целевых файлов.

Если вы пишете этот make-файл с использованием touch, вы создаете цели в виде файлов на локальном диске, поэтому make может видеть, какие правила были выполнены, а какие - нет.

В вашем "реальном" примере вы не создаете никаких файлов (ваши правила не делают файлы с именами pgdynamic_tool, pgdynamic_current, ec.), И поэтому make не знает, когда эти правила выполнялись в последний раз.

Если вы хотите, чтобы make пропустил уже запущенные правила, вам нужно создавать файлы с этими именами на диске, когда они запускаются, чтобы make знал об этом. Для этого вы можете использовать touch $@.

ETA Вы хотите что-то вроде этого:

pgdynamic_setup:
        cd $(PGDYNAMICDIR);  . /opt/Modules/init/sh; module load <tool_name>; totem2 -lmwait $(PGDYNAMIC_APACHE_LN) $(BATCH_NOBATCH) dynamic_setup.tcl | tee -i ./logs/$@.log
        touch $@
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...