Jawaban singkat: Karena maketidak baik. Bahkan di depan C Anda melihat banyak alternatif bermunculan.
Jawaban panjang: makememiliki beberapa kelemahan yang membuatnya hampir tidak cocok untuk mengkompilasi C, dan sama sekali tidak cocok untuk mengkompilasi Java. Anda dapat memaksanya untuk mengkompilasi Java, jika Anda mau, tetapi mengharapkan mengalami masalah, beberapa di antaranya tidak memiliki solusi atau solusi yang cocok. Berikut ini beberapa di antaranya:
Resolusi ketergantungan
makeinheren mengharapkan file memiliki ketergantungan seperti pohon pada satu sama lain, di mana satu file adalah output dari membangun beberapa file lainnya. Ini sudah menjadi bumerang di C saat berurusan dengan file header. makemembutuhkan makefile -specific spesifik yang akan dihasilkan untuk mewakili ketergantungan file C pada file header-nya, sehingga perubahan pada yang terakhir akan menyebabkan sebelum dibangun kembali. Namun, karena file C itu sendiri tidak diciptakan kembali (hanya dibuat kembali), make sering kali mengharuskan menetapkan target sebagai .PHONY. Untungnya, GCC mendukung pembuatan file-file itu secara otomatis.
Di Jawa, dependensi bisa berbentuk lingkaran, dan tidak ada alat untuk dependensi kelas yang menghasilkan otomatis dalam makeformat. ant's Dependtugas dapat, sebaliknya, membaca file kelas langsung, menentukan kelas itu impor, dan menghapus file kelas jika salah satu dari mereka adalah dari tanggal. Tanpa ini, ketergantungan non-sepele dapat menyebabkan Anda dipaksa untuk menggunakan build bersih berulang, menghilangkan keuntungan menggunakan tool build.
Spasi dalam nama file
Meskipun Java atau C tidak menganjurkan menggunakan spasi dalam nama file kode sumber Anda, dalam makehal ini dapat menjadi masalah bahkan jika spasi ada di jalur file. Pertimbangkan, misalnya, jika kode sumber Anda ada di C:\My Documents\My Code\program\src. Ini sudah cukup untuk dipatahkan make. Ini karena makememperlakukan nama file sebagai string. antmemperlakukan jalur sebagai objek khusus.
Memindai file untuk dibangun
makemembutuhkan pengaturan secara eksplisit file mana yang akan dibangun untuk setiap target. antmemungkinkan menentukan folder yang akan dipindai secara otomatis untuk file sumber. Ini mungkin tampak seperti kenyamanan kecil, tetapi pertimbangkan bahwa di Jawa setiap kelas baru membutuhkan file baru. Menambahkan file ke proyek dapat menjadi kerumitan besar dengan cepat.
Dan masalah terbesar dengan make:
make adalah POSIX-dependent
Moto Java adalah "kompilasi sekali dijalankan di mana-mana". Tetapi membatasi kompilasi itu ke sistem berbasis POSIX, di mana dukungan Java sebenarnya yang terburuk, bukanlah niatnya.
Membangun aturan pada makedasarnya adalah bashskrip kecil . Meskipun ada port makeuntuk Windows, agar dapat berfungsi dengan baik, ia harus dibundel dengan port bash, yang mencakup lapisan emulasi POSIX untuk sistem file.
Ini datang dalam dua varietas:
MSYS yang mencoba membatasi terjemahan POSIX ke jalur file, dan karenanya dapat memiliki gotcha yang tidak menyenangkan ketika menjalankan alat eksternal yang tidak dibuat khusus untuk itu.
cygwinyang menyediakan emulasi POSIX lengkap. Program yang dihasilkan, bagaimanapun, cenderung masih mengandalkan lapisan emulasi itu.
Untuk alasan itu, pada Windows, alat bantu pembuatan standar bahkan tidak makesama sekali, melainkan MSBuild, yang juga merupakan alat berbasis XML, pada prinsipnya lebih dekat ant.
Sebaliknya, antdibangun di Jawa, dapat berjalan di mana-mana, dan berisi alat internal, yang disebut "tugas", untuk memanipulasi file dan mengeksekusi perintah dengan cara platform-independen. Cukup fleksibel bahwa Anda sebenarnya bisa lebih mudah membangun program C di Windows antdaripada menggunakan make.
Dan satu minor terakhir:
Bahkan program C tidak menggunakan make native
Anda mungkin awalnya tidak memperhatikan ini, tetapi program C umumnya tidak dikirimkan bersama a Makefile. Mereka dikirim dengan CMakeLists.txt,, atau bashskrip konfigurasi, yang menghasilkan aktual Makefile. Sebaliknya, sumber program Java yang dibangun menggunakan antdikirimkan dengan antskrip yang dibuat sebelumnya. A Makefileadalah produk dari alat lain - Itulah berapa banyak makeyang tidak cocok untuk menjadi alat bangun sendiri. antadalah mandiri, dan menangani semua yang Anda butuhkan untuk proses pembangunan Java Anda, tanpa persyaratan atau dependensi tambahan.
Ketika Anda berjalan antdi platform apa pun, itu Hanya Bekerja (tm). Anda tidak bisa mendapatkannya make. Ini sangat tergantung platform dan konfigurasi.
make. Dan memiliki makefile yang hanya berfungsi pada satu sistem tidak terlalu bagus untuk bahasa lintas platform.