Краткий ответ: потому что make
это не хорошо. Даже на фронте C вы видите много альтернатив.
Длинный ответ: make
имеет несколько недостатков, которые делают его едва пригодным для компиляции C и совсем не подходящим для компиляции Java. Вы можете заставить его скомпилировать Java, если хотите, но ожидаете столкнуться с проблемами, некоторые из которых не имеют подходящего решения или обходного пути. Вот несколько из них:
Разрешение зависимостей
make
по своей природе ожидает, что файлы будут иметь древовидную зависимость друг от друга, в которой один файл является результатом построения нескольких других. Это уже имеет неприятные последствия в C при работе с заголовочными файлами. make
требует, make
чтобы был сгенерирован специфичный включаемый файл для представления зависимости файла C от его заголовочных файлов, поэтому изменение последнего приведет к перестроению предыдущего. Однако, поскольку сам файл C не воссоздается (просто перестраивается), make часто требует указывать цель как .PHONY
. К счастью, GCC поддерживает автоматическое создание этих файлов.
В Java зависимость может быть круговой, и в ней нет инструмента для автоматического создания зависимостей классов. make
формате. ant
«S Depend
задача может, вместо того, чтобы прочитать файл класса непосредственно, определить , какие классы он импортирует, и удалить файл класса , если любой из них устарели. Без этого любая нетривиальная зависимость может привести к тому, что вы будете вынуждены использовать повторные чистые сборки, что исключает любые преимущества использования инструмента сборки.
Пробелы в именах файлов
Хотя ни Java, ни C не поощряют использование пробелов в именах файлов исходного кода, в make
этом может возникнуть проблема, даже если пробелы находятся в пути к файлу. Рассмотрим, например, если ваш исходный код существует в C:\My Documents\My Code\program\src
. Этого было бы достаточно, чтобы сломаться make
. Это потому чтоmake
обрабатывает имена файлов как строки. ant
трактует пути как особые объекты.
Сканирование файлов для сборки
make
требует явного указания, какие файлы должны быть созданы для каждой цели. ant
позволяет указать папку, которая будет автоматически проверяться на наличие исходных файлов. Это может показаться незначительным удобством, но учтите, что в Java каждому новому классу требуется новый файл. Добавление файлов в проект может быстро стать большой проблемой.
И самая большая проблема с make
:
make зависит от POSIX
Девиз Java - «Компилировать один раз, запустить везде». Но ограничивать эту компиляцию системами на основе POSIX, в которых поддержка Java на самом деле является худшей, не является намерением.
Правила сборки в make
основном являются небольшими bash
скриптами. Несмотря на наличие порта make
для Windows, для правильной работы он должен быть связан с портом bash
, который включает в себя уровень эмуляции POSIX для файловой системы.
Это приходит в двух вариантах:
MSYS
который пытается ограничить трансляцию POSIX путями к файлам, и поэтому может иметь неприятные ошибки при запуске внешних инструментов, не предназначенных специально для него.
cygwin
которая обеспечивает полную эмуляцию POSIX. Получающиеся программы, однако, имеют тенденцию полагаться на этот слой эмуляции.
По этой причине в Windows стандартный инструмент сборки даже не является make
, а скорее MSBuild
является инструментом, основанным на XML, в принципе ближе к нему ant
.
Напротив, ant
он построен на Java, может работать везде и содержит внутренние инструменты, называемые «задачами», для манипулирования файлами и выполнения команд независимо от платформы. Он достаточно универсален, так что вы можете на самом деле легче создавать C-программу в Windows, ant
чем использовать make
.
И последний минор:
Даже программы на C не используют make изначально
Вы можете не заметить этого изначально, но программы на C обычно не поставляются с Makefile
. Они поставляются с CMakeLists.txt
или bash
сценарием конфигурации, который генерирует фактический Makefile
. Напротив, исходный код Java-программы ant
поставляется с ant
предварительно созданным сценарием. A Makefile
- это продукт других инструментов - вот почему сам make
по себе инструмент сборки не подходит.ant
является автономным и имеет дело со всем, что вам нужно для процесса сборки Java, без каких-либо дополнительных требований или зависимостей.
Когда вы работаете ant
на любой платформе, она просто работает (тм). Вы не можете получить это с make
. Это невероятно зависит от платформы и конфигурации.
make
. И иметь make-файл, который работает только в одной системе, не очень хорошо для кроссплатформенного языка.