Jawaban singkat: Karena make
tidak baik. Bahkan di depan C Anda melihat banyak alternatif bermunculan.
Jawaban panjang: make
memiliki 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
make
inheren 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. make
membutuhkan make
file -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 make
format. ant
's Depend
tugas 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 make
hal 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 make
memperlakukan nama file sebagai string. ant
memperlakukan jalur sebagai objek khusus.
Memindai file untuk dibangun
make
membutuhkan pengaturan secara eksplisit file mana yang akan dibangun untuk setiap target. ant
memungkinkan 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 make
dasarnya adalah bash
skrip kecil . Meskipun ada port make
untuk 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.
cygwin
yang 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 make
sama sekali, melainkan MSBuild
, yang juga merupakan alat berbasis XML, pada prinsipnya lebih dekat ant
.
Sebaliknya, ant
dibangun 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 ant
daripada 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 bash
skrip konfigurasi, yang menghasilkan aktual Makefile
. Sebaliknya, sumber program Java yang dibangun menggunakan ant
dikirimkan dengan ant
skrip yang dibuat sebelumnya. A Makefile
adalah produk dari alat lain - Itulah berapa banyak make
yang tidak cocok untuk menjadi alat bangun sendiri. ant
adalah mandiri, dan menangani semua yang Anda butuhkan untuk proses pembangunan Java Anda, tanpa persyaratan atau dependensi tambahan.
Ketika Anda berjalan ant
di 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.