Làm thế nào để ứng dụng này làm cho ứng dụng có thể biết mục tiêu mặc định để xây dựng nếu không có mục tiêu nào được chỉ định?


185

Hầu hết các ứng dụng linux được biên dịch với:

make
make install clean

Theo tôi hiểu, hãy lấy tên của các mục tiêu xây dựng làm đối số. Vì vậy, installmột mục tiêu sao chép một số tệp và sau đó cleanlà một mục tiêu loại bỏ các tệp tạm thời.

Nhưng mục tiêu nào sẽ makexây dựng nếu không có đối số nào được chỉ định (ví dụ lệnh đầu tiên trong ví dụ của tôi)?

Câu trả lời:


230

Theo mặc định, nó bắt đầu bằng cách xử lý mục tiêu đầu tiên không bắt đầu bằng .aka mục tiêu mặc định ; để làm điều đó, nó có thể phải xử lý các mục tiêu khác - cụ thể, những mục tiêu đầu tiên phụ thuộc vào.

Các GNU Make tay bìa tất cả các công cụ này, và là một đọc đáng ngạc nhiên dễ dàng và thông tin.


61
Gọi mục tiêu đầu tiên allchỉ là một quy ước.
Tobu

1
Thật hữu ích khi chạy chúng một cách riêng biệt nếu bạn đang cài đặt cho người dùng khác, vì khi đó bạn chỉ cần chạy make installsudo, thay vì toàn bộ bản dựng.
Scott Wales

2
FYI mục nhập người đàn ông mặc định để thực hiện không đề cập đến những gì xảy ra khi bạn không chỉ định mục tiêu ..
Sekm

2
Nếu GNU làm hướng dẫn sử dụng bao gồm những thứ này, tại sao câu hỏi này được hỏi? Hướng dẫn này rất tốt trong việc ghi lại cách viết quy tắc, nhưng không đề cập đến cách viết Makefile.
Nick

1
Tôi đang xem một tập tin tạo một tệp tạo tệp includekhác, mục tiêu đầu tiên là %.o : %.cpp. Vậy mục tiêu mặc định là ... để xây dựng tất cả các tệp .cpp?
Qwertie

174

Để cứu người khác vài giây và để cứu họ khỏi phải đọc hướng dẫn, đây là câu trả lời ngắn. Thêm phần này vào đầu tệp tạo của bạn:

.DEFAULT_GOAL := mytarget

mytarget bây giờ sẽ là mục tiêu được chạy nếu "make" được thực thi và không có mục tiêu nào được chỉ định.

Nếu bạn có phiên bản cũ hơn (<= 3.80), thì phiên bản này sẽ không hoạt động. Nếu đây là trường hợp, thì bạn có thể làm những gì anon đề cập, chỉ cần thêm phần này vào đầu tệp tạo của bạn:

.PHONY: default
default: mytarget ;

Tài liệu tham khảo: https://www.gnu.org/software/make/manual/html_node/How-Make-Works.html


1
@nathan Nó làm cho mytarget trở thành mục tiêu mặc định nếu ai đó chạy "make" mà không có bất kỳ tham số nào.
Samuel

1
Lưu ý rằng .DEFAULT_GOAL dường như không được hỗ trợ trong GNU tạo v3.80 và tôi cũng sẽ giả sử các phiên bản trước đó (v3.81 cũng hỗ trợ nó). Nếu bạn đang chạy phiên bản cũ hơn, bạn sẽ phải đảm bảo mục tiêu mặc định của mình là mục tiêu đầu tiên / trên cùng trong tệp tạo của bạn.
Samuel

4
"... Để cứu họ khỏi phải đọc hướng dẫn" là một trong những điểm của SO: câu trả lời nhanh cho các câu hỏi sẽ mất một thời gian để đào sâu trong tài liệu cổ.
WattsInABox

1
"Thêm phần này vào đầu tệp tạo của bạn": Thêm vào đầu trang dường như không phải là một yêu cầu.
Aman Deep Gautam

2
Đây phải là câu trả lời chính xác. Rõ ràng hơn chiến thắng ngầm trong trường hợp này.
Sion

34

GNU Make cũng cho phép bạn chỉ định mục tiêu tạo mặc định bằng cách sử dụng một biến đặc biệt được gọi là .DEFAULT_GOAL . Bạn thậm chí có thể bỏ đặt biến này ở giữa Makefile, khiến mục tiêu tiếp theo trong tệp trở thành mục tiêu mặc định.

Tham khảo: Hướng dẫn sử dụng Gnu - Biến đặc biệt

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.