почему «заставляют» удалять целевые файлы, только если неявные - PullRequest
0 голосов
/ 24 января 2019

Предположим, у меня есть Makefile, подобный этому

B1.txt: A1.txt
    python big_long_program.py A1.txt > $@

correct1.txt: B1.txt reference.txt
    diff -q B1.txt reference.txt
    touch $@

Тогда результат, когда я создаю correct1.txt, довольно хорош, как я ожидал:

python big_long_program.py A1.txt > B1.txt
diff -q B1.txt reference.txt
touch correct1.txt

Теперь, если у меня многофайлов, B1.txt, B2.txt, B3.txt и т. д., поэтому создайте неявное правило:

B%.txt: A%.txt
    python big_long_program.py A$*.txt > $@

correct%.txt: B%.txt reference.txt
    diff -q B$*.txt reference.txt
    touch $@

Вместо этого это происходит, когда я делаю правильное 1.txt:

python big_long_program.py A1.txt > B1.txt
diff -q B1.txt reference.txt
touch correct1.txt
rm B1.txt

то есть разница в том, что теперь файл B1.txt был удален, что во многих случаях действительно плохо.

Так почему же неявные правила отличаются?Или я что-то не так делаю?

1 Ответ

0 голосов
/ 24 января 2019

Вы не делаете ничего плохого. Поведение, которое вы наблюдаете и анализируете, задокументировано в 10.4 Цепи неявных правил . В нем говорится, что промежуточные файлы действительно обрабатываются по-разному.

Второе отличие состоит в том, что если make создает b для обновления что-то еще, он удаляет b позже, когда он больше не нужен. Следовательно, промежуточный файл, который не существовал ранее, также создает не существует после make make сообщает об удалении вам вывод команды rm -f, показывающей, какой файл он удаляет.

В документации явно не объясняется , почему ведет себя так. Глядя в файл ChangeLog.1 , есть ссылка на функцию remove_intermediates еще в 1988 году. В то время дисковое пространство было дорогим и стоило очень дорого.

Если вы не хотите такого поведения, укажите цели, которые вы хотите сохранить где-то в make-файле, в качестве явного предварительного условия или цели или используйте специальные .PRECIOUS или .SECONDARY специальные встроенные цели за это.

Благодарю MadScientist за дополнительные комментарии, см. Ниже.

...