Câu trả lời ngắn gọn: Bởi vì make
không tốt. Ngay cả trên mặt trước C, bạn thấy nhiều lựa chọn thay thế xuất hiện.
Câu trả lời dài: make
có một số sai sót khiến nó hầu như không phù hợp để biên dịch C và hoàn toàn không phù hợp để biên dịch Java. Bạn có thể buộc nó biên dịch Java, nếu bạn muốn, nhưng mong đợi gặp vấn đề, một số trong đó không có giải pháp hoặc giải pháp phù hợp. Ở đây có một ít:
Nghị quyết phụ thuộc
make
vốn dĩ mong muốn các tệp có sự phụ thuộc giống như cây với nhau, trong đó một tệp là đầu ra của việc xây dựng một số tệp khác. Điều này đã phản tác dụng trong C khi xử lý các tệp tiêu đề. make
yêu cầu một make
tệp bao gồm cụ thể được tạo để thể hiện sự phụ thuộc của tệp C vào các tệp tiêu đề của nó, do đó, một thay đổi đối với tệp sau sẽ khiến cho trước được xây dựng lại. Tuy nhiên, vì bản thân tệp C không được tạo lại (chỉ được xây dựng lại), nên thường yêu cầu chỉ định mục tiêu là .PHONY
. May mắn thay, GCC hỗ trợ tạo các tệp đó tự động.
Trong Java, sự phụ thuộc có thể là vòng tròn và không có công cụ nào để tự động tạo các phụ thuộc lớp theo make
định dạng. ant
's Depend
nhiệm vụ có thể, thay vào đó, đọc các tập tin lớp trực tiếp, xác định các lớp học nó nhập khẩu, và xóa các tập tin lớp nếu có của họ hết hạn. Không có điều này, bất kỳ sự phụ thuộc không tầm thường nào cũng có thể dẫn đến việc bạn bị buộc phải sử dụng các bản dựng sạch lặp đi lặp lại, loại bỏ bất kỳ lợi thế nào khi sử dụng công cụ xây dựng.
Dấu cách trong tên tệp
Mặc dù cả Java và C đều không khuyến khích sử dụng khoảng trắng trong tên tệp mã nguồn của bạn, nhưng make
điều này có thể là vấn đề ngay cả khi khoảng trắng nằm trong đường dẫn tệp. Xem xét, ví dụ, nếu mã nguồn của bạn tồn tại C:\My Documents\My Code\program\src
. Điều này sẽ đủ để phá vỡ make
. Điều này là do make
coi tên tập tin là chuỗi. ant
coi đường dẫn là đối tượng đặc biệt.
Quét tập tin để xây dựng
make
yêu cầu thiết lập rõ ràng những tập tin nào sẽ được xây dựng cho từng mục tiêu. ant
cho phép chỉ định thư mục được quét tự động cho các tệp nguồn. Nó có vẻ như là một tiện lợi nhỏ, nhưng hãy xem xét rằng trong Java, mỗi lớp mới yêu cầu một tệp mới. Thêm tệp vào dự án có thể trở thành một rắc rối lớn nhanh chóng.
Và vấn đề lớn nhất với make
:
làm cho phụ thuộc POSIX
Phương châm của Java là "biên dịch một lần chạy ở mọi nơi". Nhưng việc hạn chế biên dịch đó sang các hệ thống dựa trên POSIX, trong đó hỗ trợ Java thực sự là tồi tệ nhất, không phải là ý định.
Xây dựng quy tắc về make
cơ bản là các bash
tập lệnh nhỏ . Mặc dù có một cổng của make
Windows, để nó hoạt động chính xác, nó phải được đóng gói với một cổng bash
, bao gồm một lớp mô phỏng POSIX cho hệ thống tệp.
Điều này có hai loại:
MSYS
trong đó cố gắng giới hạn bản dịch POSIX thành đường dẫn tệp và do đó có thể có các vấn đề khó chịu khi chạy các công cụ bên ngoài không được thực hiện đặc biệt cho nó.
cygwin
cung cấp một mô phỏng POSIX hoàn chỉnh. Tuy nhiên, các chương trình kết quả có xu hướng vẫn dựa vào lớp mô phỏng đó.
Vì lý do đó, trên Windows, công cụ xây dựng tiêu chuẩn thậm chí không hoàn make
toàn, mà thay vào MSBuild
đó, đây cũng là một công cụ dựa trên XML, gần hơn về nguyên tắc ant
.
Ngược lại, ant
được xây dựng bằng Java, có thể chạy ở mọi nơi và chứa các công cụ nội bộ, được gọi là "tác vụ", để thao tác các tệp và thực thi các lệnh theo cách độc lập với nền tảng. Nó đủ linh hoạt để bạn thực sự có thể dễ dàng xây dựng chương trình C trong Windows ant
hơn là sử dụng make
.
Và một trong những thứ yếu cuối cùng:
Ngay cả các chương trình C không sử dụng thực hiện tự nhiên
Ban đầu bạn có thể không nhận thấy điều này, nhưng các chương trình C thường không được cung cấp với a Makefile
. Chúng được vận chuyển với một CMakeLists.txt
, hoặc một bash
kịch bản cấu hình, tạo ra thực tế Makefile
. Ngược lại, nguồn của một chương trình Java được xây dựng bằng cách sử dụng ant
được cung cấp với một ant
tập lệnh được xây dựng sẵn. A Makefile
là sản phẩm của các công cụ khác - Đó là bao nhiêu make
không phù hợp để tự mình trở thành một công cụ xây dựng. ant
là độc lập và xử lý mọi thứ bạn cần cho quá trình xây dựng Java của bạn, không có bất kỳ yêu cầu hoặc phụ thuộc bổ sung nào.
Khi bạn chạy ant
trên bất kỳ nền tảng nào, nó chỉ hoạt động (tm). Bạn không thể có được điều đó với make
. Đó là nền tảng và cấu hình vô cùng phụ thuộc.
make
. Và có một tệp tạo tệp chỉ hoạt động trên một hệ thống không phù hợp với ngôn ngữ đa nền tảng.