Respuesta corta: porque make
no es bueno. Incluso en el frente C ves muchas alternativas apareciendo.
Respuesta larga: make
tiene 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
make
Inherentemente 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. make
requiere make
que 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 make
formato. ant
En su Depend
lugar, 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, make
esto 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 make
trata los nombres de archivo como cadenas. ant
trata las rutas como objetos especiales.
Escaneo de archivos para construir
make
requiere establecer explícitamente qué archivos se construirán para cada destino. ant
permite 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 make
son esencialmente pequeños bash
scripts. A pesar de que hay un puerto make
para 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.
cygwin
que 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 MSBuild
que también es una herramienta basada en XML, más cercana en principio ant
.
Por el contrario, ant
está 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 ant
que 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.txt
o bash
que genera el actual Makefile
. Por el contrario, la fuente de un programa Java creado utilizando ant
se envía con un ant
script precompilado. A Makefile
es un producto de otras herramientas: eso es lo make
inadecuado de ser una herramienta de construcción por sí sola. ant
es 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 ant
en 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.