Tôi có một dự án có makefile sử dụng các tính năng độc quyền với GNU Make. Đáng buồn thay, có những nền tảng chúng ta phải hỗ trợ nơi mà GNU thực hiện vẫn không phải là mặc định khi chạy make
.Phát hiện (không phải) GNU Thực hiện khi ai đó chạy `make`
Một trong những đồng nghiệp của tôi bị cắn bởi điều này, khi một người không phải GNU thực hiện âm thầm không xây dựng mã của chúng tôi một cách chính xác (nó mở rộng một biến tự động thành một chuỗi rỗng). Tôi muốn ngăn chặn điều đó xảy ra lần nữa, bằng cách tạo ra một thông báo lỗi rõ ràng để thay thế.
Tôi có thể viết gì trong một số Makefile
để phân biệt GNU được tạo từ không phải GNU, in ra lỗi rõ ràng và thoát?
Tôi đã tìm ra cách giải quyết để đổi tên makefile thực thành GNUmakefile
và đặt một nhánh nhỏ trong Makefile
, nhưng tôi muốn có một thứ gì đó trực tiếp hơn.
Những câu trả lời của Beta và Dan khuôn trông thật sự tốt đẹp và đơn giản, nhưng trên AIX 6.1, làm cho thực hiện không thể xử lý một trong hai trong số họ:
$ cat testmake
foo:
touch foo
ifeq ($(shell $(MAKE) -v | grep GNU),)
$(error this is not GNU Make)
endif
ifeq "${MAKE_VERSION}" ""
$(info GNU Make not detected)
$(error ${MIN_MAKE_VER_MSG})
endif
$ /usr/bin/make -f testmake
"testmake", line 5: make: 1254-055 Dependency line needs colon or double colon operator.
"testmake", line 6: make: 1254-055 Dependency line needs colon or double colon operator.
"testmake", line 7: make: 1254-055 Dependency line needs colon or double colon operator.
"testmake", line 8: make: 1254-055 Dependency line needs colon or double colon operator.
"testmake", line 11: make: 1254-055 Dependency line needs colon or double colon operator.
"testmake", line 12: make: 1254-055 Dependency line needs colon or double colon operator.
"testmake", line 13: make: 1254-055 Dependency line needs colon or double colon operator.
make: 1254-058 Fatal errors encountered -- cannot continue.
tôi chạy vào các vấn đề tương tự trên cả hai cổ xưa và hiện đại phiên bản (Solaris 8 & 10) của Sun làm. Điều đó ít quan trọng hơn, nhưng sẽ rất tốt để quản lý.
Phiên bản GNU nào bạn đang chạy? – bta
Bạn đúng. Cách tiếp cận tôi đã thực hiện dựa quá nhiều vào GNU, vì vậy có thể không hoạt động * ở tất cả * với việc thực hiện không phải GNU. Tôi bây giờ nghi ngờ rằng có một cách di động để đạt được mục tiêu của bạn bằng cách sử dụng chỉ một Makefile (tức là mà không cần đến một kịch bản shell hoặc tài nguyên bên ngoài khác). Tôi đã hủy bỏ câu trả lời của mình. –