Kısa cevap: Çünkü make
iyi değil. C cephesinde bile birçok alternatif ortaya çıkıyor.
Uzun cevap: make
C derlemek için zar zor uygun hale getiren ve Java derlemek için hiç uygun olmayan birkaç kusura sahiptir. İsterseniz Java'yı derlemeye zorlayabilirsiniz, ancak bazıları uygun bir çözüm veya geçici çözümü olmayan sorunlarla karşılaşmayı bekleyebilirsiniz. Burda biraz var:
Bağımlılık çözünürlüğü
make
doğası gereği dosyaların birbirine ağaç benzeri bir bağımlılığa sahip olmasını bekler, burada bir dosya diğerlerini inşa etmenin çıktısıdır. Bu, başlık dosyalarıyla uğraşırken C'de zaten geri teper. bir C dosyasının başlık dosyalarına bağımlılığını temsil etmek make
için özel bir make
içerme dosyası oluşturulmasını gerektirir ; Ancak, C dosyasının kendisi yeniden oluşturulmadığından (yalnızca yeniden oluşturulduğundan), genellikle hedefi hedef olarak belirtmeyi gerektirir .PHONY
. Neyse ki, GCC bu dosyaların otomatik olarak oluşturulmasını destekler.
Java'da bağımlılık dairesel olabilir ve sınıf bağımlılıklarını otomatik olarak make
biçimlendirmek için bir araç yoktur . ant
'nin Depend
görevi bunun yerine sınıf dosyasını doğrudan okuyabilir, hangi sınıfları içe aktardığını belirleyebilir ve bunlardan herhangi biri güncel değilse sınıf dosyasını silebilir. Bu olmadan, önemsiz olmayan bir bağımlılık, tekrarlanan temiz yapıları kullanmaya zorlanmanıza ve bir oluşturma aracı kullanmanın herhangi bir avantajını ortadan kaldırmanıza neden olabilir.
Dosya adlarındaki boşluklar
Ne Java ne de C kaynak kodu dosya adlarınızda boşluk kullanmayı teşvik etmese de make
, boşluklar dosya yolunda olsa bile bu sorun olabilir. Örneğin, kaynak kodunuzun içinde olup olmadığını düşünün C:\My Documents\My Code\program\src
. Bu kırmak için yeterli olurdu make
. Bunun nedeni make
, dosya adlarını dize olarak ele alır. ant
yolları özel nesneler olarak görür.
Derleme için dosyaları tarama
make
her hedef için hangi dosyaların oluşturulacağını açıkça ayarlamayı gerektirir. ant
kaynak dosyalar için otomatik olarak taranacak bir klasör belirtmeye izin verir. Küçük bir kolaylık gibi görünebilir, ancak Java'da her yeni sınıfın yeni bir dosya gerektirdiğini düşünün. Projeye dosya eklemek büyük bir güçlük haline gelebilir.
Ve en büyük sorun make
:
make POSIX bağımlı
Java'nın sloganı "her yerde çalıştırıldığında derleme" dir. Ancak bu derlemeyi, Java desteğinin aslında en kötü olduğu POSIX tabanlı sistemlerle sınırlamak niyet değildir.
Oluşturma kuralları make
aslında küçük bash
komut dosyalarıdır. make
Windows'un bir bağlantı noktası olmasına rağmen , düzgün çalışması bash
için, dosya sistemi için bir POSIX öykünme katmanı içeren bir bağlantı noktasıyla paketlenmesi gerekir .
Bu iki çeşittir:
MSYS
POSIX çevirisini dosya yollarıyla sınırlandırmaya çalışır ve bu nedenle özellikle bunun için yapılmayan harici araçları çalıştırırken hoş olmayan gotcha'lara sahip olabilir.
cygwin
tam bir POSIX emülasyonu sağlar. Bununla birlikte, sonuçta ortaya çıkan programlar hala bu emülasyon tabakasına güvenme eğilimindedir.
Bu nedenle, Windows'ta standart oluşturma aracı hiç de make
değil MSBuild
, prensip olarak daha yakın olan XML tabanlı bir araçtır ant
.
Buna karşılık, ant
Java'da yerleşiktir, her yerde çalışabilir ve dosyaları işlemek ve komutları platformdan bağımsız bir şekilde yürütmek için "görevler" adı verilen dahili araçlar içerir. Gerçekte daha kolay bir saati kullanarak Windows'ta C programı bina olabileceğini yeterince çok yönlü olduğunu ant
kullanmaktan daha make
.
Ve son bir küçük:
C programları bile yerel olarak
Başlangıçta bunu fark etmeyebilirsiniz, ancak C programları genellikle a ile birlikte gönderilmez Makefile
. Bunlar , gerçek olanı oluşturan CMakeLists.txt
bir bash
yapılandırma komut dosyasıyla gönderilir Makefile
. Bunun aksine, kullanılarak oluşturulan bir Java programının kaynağı önceden ant
oluşturulmuş bir ant
komut dosyasıyla gönderilir . A Makefile
, diğer araçların bir ürünüdür - Tek make
başına bir yapı aracı olmak için ne kadar uygun değildir. ant
bağımsızdır ve herhangi bir ek gereksinim veya bağımlılık olmadan Java oluşturma işleminiz için ihtiyacınız olan her şeyle ilgilenir.
ant
Herhangi bir platformda çalıştırdığınızda Just Works (tm). Bunu alamazsın make
. Platform ve yapılandırmaya inanılmaz derecede bağımlı.
make
. Ve sadece tek bir sistemde çalışan bir makefile'a sahip olmak, platformlar arası bir dil için çok hoş değil.