Krótka odpowiedź: ponieważ make
nie jest dobre. Nawet na froncie C widać wiele alternatyw.
Długa odpowiedź: make
ma 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
make
z 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. make
wymaga make
wygenerowania 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 make
formacie. ant
„s Depend
zadanie 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, make
moż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ż make
traktuje nazwy plików jako ciągi. ant
traktuje ścieżki jako obiekty specjalne.
Skanowanie plików pod kątem kompilacji
make
wymaga jawnego ustawienia, które pliki mają być zbudowane dla każdego celu. ant
umoż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 make
to zasadniczo małe bash
skrypty. Mimo że istnieje port make
systemu 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.
cygwin
co 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, ant
jest 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 ant
niż 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.txt
lub bash
skryptem konfiguracyjnym, który generuje rzeczywisty plik Makefile
. Z kolei źródło programu Java zbudowanego przy użyciu ant
jest dostarczane z gotowym ant
skryptem. A Makefile
jest produktem innych narzędzi - tyle make
nie nadaje się do samodzielnego budowania. ant
jest samodzielny i obsługuje wszystko, czego potrzebujesz do procesu tworzenia Java, bez żadnych dodatkowych wymagań ani zależności.
Po uruchomieniu ant
na 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.