Kısa cevap: Çünkü make iyi değil. C cephesinde bile birçok alternatif ortaya çıkıyor.
Uzun cevap: makeC 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üğü
makedoğ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 makeiçin özel bir makeiç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 makebiçimlendirmek için bir araç yoktur . ant'nin Dependgö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. antyolları özel nesneler olarak görür.
Derleme için dosyaları tarama
makeher hedef için hangi dosyaların oluşturulacağını açıkça ayarlamayı gerektirir. antkaynak 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ı makeaslında küçük bashkomut dosyalarıdır. makeWindows'un bir bağlantı noktası olmasına rağmen , düzgün çalışması bashiç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.
cygwintam 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 makedeğil MSBuild, prensip olarak daha yakın olan XML tabanlı bir araçtır ant.
Buna karşılık, antJava'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 antkullanmaktan 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.txtbir bashyapılandırma komut dosyasıyla gönderilir Makefile. Bunun aksine, kullanılarak oluşturulan bir Java programının kaynağı önceden antoluşturulmuş bir antkomut dosyasıyla gönderilir . A Makefile, diğer araçların bir ürünüdür - Tek makebaşına bir yapı aracı olmak için ne kadar uygun değildir. antbağı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.
antHerhangi 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.