Краткий ответ: потому что 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-файл, который работает только в одной системе, не очень хорошо для кроссплатформенного языка.