Respuesta corta: porque make no es bueno. Incluso en el frente C ves muchas alternativas apareciendo.
Respuesta larga: maketiene varias fallas que lo hacen apenas adecuado para compilar C, e inadecuado para compilar Java. Puede forzarlo a compilar Java, si lo desea, pero espere encontrarse con problemas, algunos de los cuales no tienen una solución o solución adecuada. Aquí hay algunos:
Resolución de dependencia
makeInherentemente espera que los archivos tengan una dependencia de árbol entre sí, en la que un archivo es el resultado de construir varios otros. Esto ya falla en C cuando se trata de archivos de encabezado. makerequiere makeque se genere un archivo de inclusión específico para representar la dependencia de un archivo C en sus archivos de encabezado, por lo que un cambio en este último provocaría la reconstrucción del anterior. Sin embargo, dado que el archivo C en sí no se recrea (simplemente se reconstruye), make a menudo requiere especificar el objetivo como.PHONY . Afortunadamente, GCC admite generar esos archivos automáticamente.
En Java, la dependencia puede ser circular, y no existe una herramienta para generar automáticamente las dependencias de clase en makeformato. antEn su Dependlugar, la tarea puede leer el archivo de clase directamente, determinar qué clases importa y eliminar el archivo de clase si alguno de ellos no está actualizado. Sin esto, cualquier dependencia no trivial puede hacer que te veas obligado a usar compilaciones limpias repetidas, eliminando cualquier ventaja de usar una herramienta de compilación.
Espacios en nombres de archivo
Si bien ni Java ni C fomentan el uso de espacios en sus nombres de archivo de código fuente, makeesto puede ser un problema incluso si los espacios están en la ruta del archivo. Considere, por ejemplo, si su código fuente existe en C:\My Documents\My Code\program\src. Esto sería suficiente para romper make. Esto se debe a que maketrata los nombres de archivo como cadenas. anttrata las rutas como objetos especiales.
Escaneo de archivos para construir
makerequiere establecer explícitamente qué archivos se construirán para cada destino. antpermite especificar una carpeta que se escaneará automáticamente en busca de archivos fuente. Puede parecer una conveniencia menor, pero considere que en Java cada nueva clase requiere un nuevo archivo. Agregar archivos al proyecto puede convertirse en una gran molestia rápidamente.
Y el mayor problema con make:
make depende de POSIX
El lema de Java es "compilar una vez que se ejecuta en todas partes". Pero restringir esa compilación a sistemas basados en POSIX, en los que el soporte de Java es realmente el peor, no es la intención.
Las reglas de compilación makeson esencialmente pequeños bashscripts. A pesar de que hay un puerto makepara Windows, para que funcione correctamente, tiene que estar incluido con un puerto de bash, que incluye una capa de emulación POSIX para el sistema de archivos.
Esto viene en dos variedades:
MSYS que intenta limitar la traducción POSIX a rutas de archivo y, por lo tanto, puede tener problemas desagradables al ejecutar herramientas externas que no están hechas especialmente para ello.
cygwinque proporciona una emulación POSIX completa. Sin embargo, los programas resultantes tienden a depender aún de esa capa de emulación.
Por esa razón, en Windows, la herramienta de compilación estándar ni siquiera es make, sino MSBuildque también es una herramienta basada en XML, más cercana en principio ant.
Por el contrario, antestá construido en Java, puede ejecutarse en todas partes y contiene herramientas internas, llamadas "tareas", para manipular archivos y ejecutar comandos de forma independiente de la plataforma. Es lo suficientemente versátil como para que sea más fácil construir un programa C en Windows usando antque usando make.
Y un último menor:
Incluso los programas C no usan make nativamente
Es posible que inicialmente no se dé cuenta de esto, pero los programas C generalmente no se envían con un Makefile. Se envían con un script de configuración CMakeLists.txto bashque genera el actual Makefile. Por el contrario, la fuente de un programa Java creado utilizando antse envía con un antscript precompilado. A Makefilees un producto de otras herramientas: eso es lo makeinadecuado de ser una herramienta de construcción por sí sola. antes independiente y se ocupa de todo lo que necesita para su proceso de compilación de Java, sin requisitos ni dependencias adicionales.
Cuando se ejecuta anten cualquier plataforma, simplemente funciona (tm). No puedes conseguir eso con make. Es increíblemente dependiente de la plataforma y la configuración.
make. Y tener un archivo MAKE que solo funciona en un sistema no es muy bueno para un lenguaje multiplataforma.