NK
Зависимость от параметров командной строки
Когда строка параметров какой-либо программы изменяется, её результаты также могут измениться (например, изменение в -Doption, которое передаётся в препроцессор языка C). make не будет перекомпилировать в этом случае, что приведёт к некорректной промежуточной перекомпиляции.
Вы можете попробовать защититься от этого, если внесёте в зависимость для каждой цели файл Makefile. Однако, этот подход ненадёжен, так как вы можете пропустить какую-нибудь цель. Более того, Makefile может включать другие Makefile’ы, которые тоже могут включать ещё Makefile’ы. Вы должны будете перечислить их все и поддерживать этот список в актуальном состоянии. Кроме того, многие изменения в makefile’ах являются незначительными. Вы, скорее всего, не хотите перекомпиляции всего проекта только из-за того, что вы изменили комментарий в makefile’е.
Наследование переменных окружения и зависимость от них
Не только каждая переменная окружения становится переменной make’а, но также эти переменные передаются в каждую программу, которую make запускает. Так как каждый пользователь имеет свой собственный набор переменных окружения, два пользователя, запускающих одну и туже сборку могут получать разные результаты.
Изменение какой-нибудь переменной окружения, передаваемой в дочерний процесс, может изменить его вывод. То есть, такая ситуация должная инициировать пересборку, но make не будет этого делать.
Множественные одновременные сессии
Если вы запустите два экземпляра make’а в одной директории одновременно, они столкнутся между собой, когда попытаются компилировать одни и те же файлы. Скорее всего, один из них (или даже оба) аварийно завершат работу.
Редактирование файлов во время пересборки.
Если вы редактировали и сохранили файл во время работы make’а, то результат невозможно будет предсказать. Может быть, make корректно подхватит эти изменения, а может и нет — и вам надо будет запустить make снова. Или, если вам не повезло, сохранение может произойти в такой момент, что некоторые из целей потребуют пересборки, но последующие запуски make не обнаружат этого.
Удаление ненужных файлов
Предположим, ваш проект изначально использовал файл foo.c, но позже этот файл был удалён из проекта и из makefile’а. Временный объектный файл foo.o останется. Обычно, это допустимо, но такие файлы могут накапливаться с течением времени и иногда приводить к проблемам. Например, они могут быть ошибочно выбраны во время поиска по vpath. Другой пример: допустим один из файлов, ранее генерируемый make’ом во время сборки, теперь положен в систему версионного контроля. Правило, которое генерировало этот файл, также удалено из makefile’а. Однако, системы версионного контроля обычно не перезаписывают файлы, если видят, что не-версионный файл с таким же именем уже существует (из боязни удалить что-нибудь важное). Если вы не обратили внимание на сообщение о такой ошибке, не удалили этот файл вручную и не обновили повторно каталог с исходниками, то вы будете использовать устаревшую версию этого файла.
Нормализация имён файлов
К одному и тому же файлу можно обратиться, используя разные пути. Даже не беря во внимание жёсткие и символические ссылки, foo.c, ./foo.c, ../bar/foo.c, /home/user/bar/foo.c могут указывать на один и тот же файл. make’у следует обрабатывать их соответствующе, однако он этого не делает.
Проблема ещё хуже под Windows, где файловая система не регистро-зависима.
Последствия прерванной или сбойнувшей пересборки