Коротка відповідь: Тому що 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, який працює лише в одній системі, не дуже приємно для мови на платформі.