Коротка відповідь: Тому що make
це не добре. Навіть на передній панелі С ви бачите багато альтернатив.
Довга відповідь: make
має кілька недоліків, які роблять її ледь придатною для компіляції на C і зовсім непридатною для компіляції Java. Якщо ви хочете, ви можете змусити його компілювати Java, але очікуйте, що у вас виникнуть проблеми, деякі з яких не мають відповідного рішення чи вирішення. Ось декілька:
Розв’язання залежності
make
по суті очікує, що файли мають деревоподібну залежність один від одного, в якому один файл є результатом побудови декількох інших. Це вже спрацьовує в C при роботі з файлами заголовків. make
вимагає make
-специфічного включення файлу, який повинен бути сформований для представлення залежності файлу С від його заголовкових файлів, тож зміна останнього призведе до того, що попередньо відбудувались. Однак, оскільки сам файл 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 не використовують натур
Ви, можливо, спочатку цього не помічаєте, але програми C зазвичай не постачаються з Makefile
. Вони поставляються з CMakeLists.txt
або bash
скрипт конфігурації, який генерує дійсне Makefile
. На відміну від цього, джерело програми Java, побудованої за допомогою ant
, поставляється із ant
попередньо вбудованим сценарієм. A Makefile
- це продукт інших інструментів - саме стільки make
непридатно бути інструментом збирання самостійно. ant
є автономним та розглядає все необхідне для процесу збирання Java без будь-яких додаткових вимог чи залежностей.
Коли ви працюєте ant
на будь-якій платформі, це просто працює (тм). З цим не можна погодитися make
. Це неймовірно залежить від платформи та конфігурації.
make
. А наявність файлу makefile, який працює лише в одній системі, не дуже приємно для мови на платформі.