Krótka odpowiedź: ponieważ makenie jest dobre. Nawet na froncie C widać wiele alternatyw.
Długa odpowiedź: makema kilka wad, które sprawiają, że ledwie nadaje się do kompilacji C, aw ogóle nie nadaje się do kompilowania Javy. Jeśli chcesz, możesz zmusić go do skompilowania Javy, ale spodziewaj się problemów, z których niektóre nie mają odpowiedniego rozwiązania lub obejścia. Tu jest kilka:
Rozwiązanie zależności
makez natury oczekuje, że pliki będą miały od siebie zależność podobną do drzewa, w której jeden plik jest wynikiem budowania kilku innych. To już działa odwrotnie w C, gdy mamy do czynienia z plikami nagłówkowymi. makewymaga makewygenerowania specyficznego pliku dołączanego, który będzie reprezentował zależność pliku C od jego plików nagłówkowych, więc zmiana tego ostatniego spowodowałaby odbudowanie poprzedniego. Jednak ponieważ sam plik C nie jest odtwarzany (tylko przebudowywany), make często wymaga określenia celu jako .PHONY. Na szczęście GCC obsługuje automatyczne generowanie tych plików.
W Javie zależność może być cykliczna i nie ma narzędzia do automatycznego generowania zależności klas w makeformacie. ant„s Dependzadanie może, zamiast czytać plik klasy bezpośrednio określić, które klasy importuje i usunąć plik klasy, czy któryś z nich są nieaktualne. Bez tego każda nietrywialna zależność może spowodować, że będziesz zmuszony do korzystania z powtarzających się czystych kompilacji, usuwając wszelkie korzyści z używania narzędzia do kompilacji.
Spacje w nazwach plików
Chociaż ani Java, ani C nie zachęcają do używania spacji w nazwach plików kodu źródłowego, makemoże to stanowić problem, nawet jeśli spacje znajdują się w ścieżce pliku. Rozważmy na przykład, czy Twój kod źródłowy istnieje w C:\My Documents\My Code\program\src. To wystarczy, żeby się złamać make. Dzieje się tak, ponieważ maketraktuje nazwy plików jako ciągi. anttraktuje ścieżki jako obiekty specjalne.
Skanowanie plików pod kątem kompilacji
makewymaga jawnego ustawienia, które pliki mają być zbudowane dla każdego celu. antumożliwia określenie folderu, który ma być automatycznie skanowany w poszukiwaniu plików źródłowych. Może się to wydawać niewielkim ułatwieniem, ale weź pod uwagę, że w Javie każda nowa klasa wymaga nowego pliku. Dodawanie plików do projektu może szybko stać się dużym kłopotem.
I największy problem z make:
make jest zależne od POSIX
Mottem Javy jest „kompiluj raz, gdy uruchomisz się wszędzie”. Ale ograniczenie tej kompilacji do systemów opartych na POSIX, w których obsługa języka Java jest w rzeczywistości najgorsza, nie jest intencją.
Reguły budowania w maketo zasadniczo małe bashskrypty. Mimo że istnieje port makesystemu Windows, aby działał poprawnie, musi być dołączony do portu bash, który zawiera warstwę emulacji POSIX dla systemu plików.
Występuje w dwóch odmianach:
MSYS który próbuje ograniczyć translację POSIX do ścieżek plików i dlatego może mieć nieprzyjemne problemy podczas uruchamiania zewnętrznych narzędzi, które nie są specjalnie do tego przeznaczone.
cygwinco zapewnia pełną emulację POSIX. Powstałe programy nadal jednak polegają na tej warstwie emulacji.
Z tego powodu w systemie Windows standardowe narzędzie do kompilacji wcale nie jest wcale make, ale raczej MSBuild, które jest również narzędziem opartym na języku XML, w zasadzie bliższym ant.
W przeciwieństwie do tego, antjest zbudowany w Javie, może działać wszędzie i zawiera wewnętrzne narzędzia, zwane „zadaniami”, do manipulowania plikami i wykonywania poleceń w sposób niezależny od platformy. Jest na tyle wszechstronny, że w rzeczywistości łatwiej jest zbudować program w języku C w systemie Windows przy użyciu antniż przy użyciu make.
I ostatnia drobna:
Nawet programy w C nie używają make natywnie
Możesz tego początkowo nie zauważyć, ale programy C zazwyczaj nie są dostarczane z rozszerzeniem Makefile. Są dostarczane ze skryptem konfiguracyjnym CMakeLists.txtlub bashskryptem konfiguracyjnym, który generuje rzeczywisty plik Makefile. Z kolei źródło programu Java zbudowanego przy użyciu antjest dostarczane z gotowym antskryptem. A Makefilejest produktem innych narzędzi - tyle makenie nadaje się do samodzielnego budowania. antjest samodzielny i obsługuje wszystko, czego potrzebujesz do procesu tworzenia Java, bez żadnych dodatkowych wymagań ani zależności.
Po uruchomieniu antna dowolnej platformie to po prostu działa (tm). Nie możesz tego dostać make. Jest niesamowicie zależny od platformy i konfiguracji.
make. Posiadanie pliku makefile, który działa tylko w jednym systemie, nie jest zbyt przyjemne dla języka wieloplatformowego.