Réponse courte: parce que ce maken'est pas bon. Même sur le front C, vous voyez apparaître de nombreuses alternatives.
Réponse longue: makea 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
makes'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. makenécessite qu'un makefichier 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 makeformat. antLa Dependtâ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, makecela 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, makeles noms de fichiers sont traités comme des chaînes. anttraite les tracés comme des objets spéciaux.
Analyse des fichiers pour la construction
makenécessite de définir explicitement les fichiers à créer pour chaque cible. antpermet 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 makesont essentiellement de petits bashscripts. Même s'il existe un port de makevers 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.
cygwinqui 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 makedu tout, mais plutôt MSBuild, qui est également un outil basé sur XML, plus proche en principe de ant.
En revanche, il antest 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 antqu'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 bashscript de configuration, qui génère le fichier réel Makefile. En revanche, la source d'un programme Java construit en utilisant antest livrée avec un antscript pré-construit. A Makefileest un produit d'autres outils - C'est à quel point il makene convient pas d'être un outil de construction à lui seul. antest 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 antsur 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.