“Tất cả” có nghĩa là gì trong makefile?


105

Tôi đã đọc một số hướng dẫn liên quan đến Makefiles nhưng đối với tôi vẫn chưa rõ ràng về mục tiêu "tất cả" là viết tắt của gì và nó làm gì.

Bất kỳ ý tưởng?

Câu trả lời:


116

Như Makefile hiểu, một bản dựng bao gồm rất nhiều mục tiêu. Ví dụ: để xây dựng một dự án, bạn có thể cần

  1. Tạo file1.o ra khỏi file1.c
  2. Tạo file2.o ra khỏi file2.c
  3. Tạo file3.o ra khỏi file3.c
  4. Xây dựng tệp thực thi1 từ tệp1.o và tệp3.o
  5. Xây dựng tệp thi hành 2 từ tệp tin2.o

Nếu bạn triển khai quy trình làm việc này với makefile, bạn có thể tạo từng mục tiêu riêng biệt. Ví dụ, nếu bạn đã viết

make file1.o

nó sẽ chỉ xây dựng tệp đó, nếu cần thiết.

Tên của allkhông cố định. Nó chỉ là một cái tên thông thường; alltarget biểu thị rằng nếu bạn gọi nó, make sẽ xây dựng tất cả những gì cần thiết để tạo ra một bản dựng hoàn chỉnh . Đây thường là một mục tiêu giả, không tạo ra bất kỳ tệp nào mà chỉ phụ thuộc vào các tệp khác. Đối với ví dụ trên, việc xây dựng tất cả những gì cần thiết là xây dựng tệp thực thi, các tệp khác được kéo vào dưới dạng tệp phụ thuộc. Vì vậy, trong makefile nó trông như thế này:

all: executable1 executable2

alltarget thường là cái đầu tiên trong makefile, vì nếu bạn chỉ viết maketrong dòng lệnh, mà không xác định target, nó sẽ tạo target đầu tiên. Và bạn mong đợi nó được all.

allthường cũng là một .PHONYmục tiêu. Tìm hiểu thêm tại đây .


31

Hướng dẫn sử dụng GNU Make đưa ra định nghĩa rõ ràng cho danh sách các mục tiêu tiêu chuẩnall của nó .

Nếu tác giả của Makefile tuân theo quy ước đó thì đích allnên:

  1. Biên dịch toàn bộ chương trình, nhưng không biên dịch tài liệu.
  2. Là mục tiêu mặc định. Như trong chạy chỉ makenên làm tương tự như make all.

Để đạt được 1 allthường được định nghĩa là một .PHONYmục tiêu phụ thuộc vào (các) tệp thực thi tạo thành toàn bộ chương trình:

.PHONY : all
all : executable

Để đạt được 2 mục tiêu allphải là mục tiêu đầu tiên được xác định trong tệp tạo hoặc được chỉ định làm mục tiêu mặc định:

.DEFAULT_GOAL := all

3

Không chắc nó là viết tắt của bất cứ điều gì đặc biệt. Nó chỉ là một quy ước mà bạn cung cấp một quy tắc 'tất cả' và nói chung nó được sử dụng để liệt kê tất cả các mục tiêu phụ cần thiết để xây dựng toàn bộ dự án, do đó có tên là 'tất cả'. Điều đặc biệt duy nhất của nó là thường mọi người sẽ đặt nó làm mục tiêu đầu tiên trong makefile, có nghĩa là chỉ cần gõ 'make' một mình sẽ làm được điều tương tự như 'make all'.


2

Đích "tất cả" là một ví dụ về đích giả - không có gì trên đĩa được gọi là "tất cả". Điều này có nghĩa là khi bạn thực hiện "tạo tất cả", make luôn nghĩ rằng nó cần phải xây dựng nó và do đó thực thi tất cả các lệnh cho mục tiêu đó. Những lệnh đó thường sẽ là những lệnh xây dựng tất cả các sản phẩm cuối cùng mà makefile biết, nhưng nó có thể làm bất cứ điều gì.

Các ví dụ khác về mục tiêu giả là "sạch" và "cài đặt", và chúng hoạt động theo cùng một cách.

Nếu bạn chưa đọc nó, bạn nên đọc GNU Make Manual , đây cũng là một hướng dẫn tuyệt vời.

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.