Réponse courte: parce que ce make
n'est pas bon. Même sur le front C, vous voyez apparaître de nombreuses alternatives.
Réponse longue: make
a plusieurs défauts qui le rendent à peine adapté à la compilation C, et inadapté du tout à la compilation Java. Vous pouvez le forcer à compiler Java, si vous le souhaitez, mais attendez-vous à rencontrer des problèmes, dont certains n'ont pas de solution ou de contournement appropriée. Voici quelques-uns:
Résolution des dépendances
make
s'attend par nature à ce que les fichiers aient une dépendance semblable à une arborescence les uns sur les autres, dans lequel un fichier est le résultat de la construction de plusieurs autres. Cela se retourne déjà en C lors du traitement des fichiers d'en-tête. make
nécessite qu'un make
fichier d'inclusion spécifique soit généré pour représenter la dépendance d'un fichier C sur ses fichiers d'en-tête, donc une modification de ce dernier entraînerait la reconstruction du fichier antérieur. Cependant, comme le fichier C lui-même n'est pas recréé (simplement reconstruit), make nécessite souvent de spécifier la cible comme .PHONY
. Heureusement, GCC prend en charge la génération automatique de ces fichiers.
En Java, la dépendance peut être circulaire et il n'y a pas d'outil pour générer automatiquement des dépendances de classe au make
format. ant
La Depend
tâche de la tâche peut, à la place, lire directement le fichier de classe, déterminer les classes qu'elle importe et supprimer le fichier de classe si l'une d'entre elles est obsolète. Sans cela, toute dépendance non triviale peut vous obliger à utiliser des générations propres répétées, supprimant tout avantage lié à l'utilisation d'un outil de génération.
Espaces dans les noms de fichiers
Bien que ni Java ni C n'encouragent l'utilisation d'espaces dans vos noms de fichiers de code source, make
cela peut poser problème même si les espaces sont dans le chemin du fichier. Considérez, par exemple, si votre code source existe dans C:\My Documents\My Code\program\src
. Ce serait suffisant pour casser make
. En effet, make
les noms de fichiers sont traités comme des chaînes. ant
traite les tracés comme des objets spéciaux.
Analyse des fichiers pour la construction
make
nécessite de définir explicitement les fichiers à créer pour chaque cible. ant
permet de spécifier un dossier qui doit être analysé automatiquement pour les fichiers source. Cela peut sembler une commodité mineure, mais considérez qu'en Java, chaque nouvelle classe nécessite un nouveau fichier. L'ajout de fichiers au projet peut devenir très fastidieux.
Et le plus gros problème avec make
:
make dépend de POSIX
La devise de Java est "compiler une fois exécuté partout". Mais limiter cette compilation aux systèmes basés sur POSIX, dans lesquels le support Java est en fait le pire, n'est pas l'intention.
Les règles de construction dans make
sont essentiellement de petits bash
scripts. Même s'il existe un port de make
vers Windows, pour qu'il fonctionne correctement, il doit être associé à un port de bash
, qui comprend une couche d'émulation POSIX pour le système de fichiers.
Cela se décline en deux variétés:
MSYS
qui tente de limiter la traduction POSIX aux chemins de fichiers, et peut donc avoir des pièges désagréables lors de l'exécution d'outils externes qui ne sont pas spécialement conçus pour cela.
cygwin
qui fournit une émulation POSIX complète. Les programmes résultants, cependant, ont tendance à toujours s'appuyer sur cette couche d'émulation.
Pour cette raison, sous Windows, l'outil de construction standard n'est même pas make
du tout, mais plutôt MSBuild
, qui est également un outil basé sur XML, plus proche en principe de ant
.
En revanche, il ant
est construit en Java, peut s'exécuter partout et contient des outils internes, appelés «tâches», pour manipuler des fichiers et exécuter des commandes d'une manière indépendante de la plate-forme. Il est suffisamment polyvalent pour que vous puissiez en fait avoir plus de facilité à créer un programme C dans Windows en utilisant ant
qu'avec make
.
Et un dernier mineur:
Même les programmes C n'utilisent pas make nativement
Vous ne le remarquerez peut-être pas initialement, mais les programmes C ne sont généralement pas livrés avec un fichier Makefile
. Ils sont livrés avec un CMakeLists.txt
, ou un bash
script de configuration, qui génère le fichier réel Makefile
. En revanche, la source d'un programme Java construit en utilisant ant
est livrée avec un ant
script pré-construit. A Makefile
est un produit d'autres outils - C'est à quel point il make
ne convient pas d'être un outil de construction à lui seul. ant
est autonome et traite tout ce dont vous avez besoin pour votre processus de construction Java, sans aucune exigence ou dépendance supplémentaire.
Lorsque vous exécutez ant
sur n'importe quelle plate-forme, cela fonctionne (tm). Vous ne pouvez pas obtenir cela avec make
. Cela dépend incroyablement de la plate-forme et de la configuration.
make
. Et avoir un makefile qui ne fonctionne que sur un seul système n'est pas très agréable pour un langage multiplateforme.