Правила вывода nmake ограничены глубиной 1 - PullRequest
3 голосов
/ 26 января 2011

Я заметил, что nmake.exe ограничивает поиск правил вывода одним отсутствующим файлом.Я не нахожу упоминания о проблеме в Интернете.Я что-то пропустил?

$ <em>cat Makefile</em>
.SUFFIXES: .a .b .d .e

all: abc.e

.a.b:
        copy $** $@

.b.d:
        copy $** $@

.d.e:
        copy $** $@

$ <em>touch abc.a</em>

$ <em>nmake</em>
NMAKE : fatal error U1073: don't know how to make 'abc.e'
Stop.

$ <em>nmake -n abc.a</em>
'abc.a' is up-to-date

$ <em>nmake -n abc.b</em>
        copy abc.a abc.b

$ <em>nmake -n abc.d</em>
NMAKE : fatal error U1073: don't know how to make 'abc.d'
Stop.

Этот же Makefile выдает следующее с GNU make:,;-)

Ваша версия nmake.exe справляется с этим лучше?Есть ли магический переключатель?Или это действительно так сломано, как кажется?

1 Ответ

4 голосов
/ 19 февраля 2011

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

В GNU make используется метод одновременного моделирования всего дерева зависимостей и отслеживания измененных файлов вплоть до вывода.Это замечательно, если make - единственный инструмент для сборки, который вы используете.Это не очень хорошо работает, если у вас очень большие проекты, поэтому вам нужно сделать их в определенном порядке.Это не очень хорошо работает, если make не поддерживает некоторые инструменты вашего процесса сборки, поэтому вам все равно придется запускать make несколько раз.: Делать только один проход за раз.Предполагается, что он станет частью более широкой цепочки инструментов.Поэтому, если у вас есть многопроходные зависимости, вам понадобится несколько проходов nmake.Если ваш процесс сборки требует более 3 проходов, вы, вероятно, делаете A Bad Thing, и вам следует исправить свой процесс.А чтобы громко кричать, если вам нужно несколько проходов, просто напишите сценарий, чтобы сделать это.

...