Tại sao tôi cần phải thực hiện make target
trước khi có thể xây dựng mã nguồn của mình?'Làm cho mục tiêu' là gì?
Cụ thể hơn, chính xác là make target là gì?
Tại sao tôi cần phải thực hiện make target
trước khi có thể xây dựng mã nguồn của mình?'Làm cho mục tiêu' là gì?
Cụ thể hơn, chính xác là make target là gì?
Makefiles trông như thế này:
all: mybinary
mybinary: files.o it.o depends.o on.o
[tab]$(CC) $(CFLAGS) files.o it.o depends.o on.o -o mybinary
files.o: files.c files.h
[tab]$(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o [email protected]
...
Điều này có nghĩa, khi bạn gõ make all
(viết tắt là chỉ để gõ make
), nó sẽ đảm bảo rằng các mục tiêu mybinary hoặc tập tin được cập nhật. Để làm điều đó, nó cần phải đảm bảo rằng mybinary là mới hơn so với tất cả các file.o it.o depends.o và on.o. Nếu không, sau đó nó sử dụng các lệnh shell được chỉ định trên dòng tiếp theo để xây dựng mybinary. Nhưng trước khi thực hiện điều đó, trước tiên, hãy đảm bảo rằng các tệp ..v.v .. được cập nhật. Điều này có nghĩa là chúng phải mới hơn files.c và files.h. Nếu không, sau đó nó sử dụng các lệnh shell được chỉ định trên dòng tiếp theo để xây dựng files.o. Sau khi tất cả các tệp * .o được cập nhật, nó có thể xây dựng mybinary. Một khi mybinary được xây dựng, tất cả các mục tiêu là hài lòng.
Mục tiêu thường là tệp. Định dạng của một khối là:
target: list of dependency files
[tab]shell commands to build target if it's older than any of its dependencies
[tab]more shell commands
[tab]still more
mục tiêu cũng có thể được quy định sử dụng ký tự đại diện, ví dụ %.c
nghĩa gì trong vỏ bạn muốn gọi *.c
.
Một số mục tiêu là mục tiêu "giả mạo" có nghĩa là chúng không tương ứng với bất kỳ tệp thực nào. Mục tiêu "tất cả" là thuộc loại này. Vì vậy, cũng là mục tiêu "sạch" (make clean
). Và cứ thế. Bạn không thực sự cần hoặc muốn xây dựng một tệp có tên "tất cả" hoặc "sạch". Có nhiều cách khác nhau để xác định rằng một mục tiêu là giả mạo.
Mục tiêu đầu tiên xuất hiện trong Makefile là mục tiêu sẽ được gọi nếu bạn chỉ cần nhập make
. Một quy ước là đặt tên cho mục tiêu này là "tất cả". Vì vậy, sau đó make
sẽ giống như make all
.
A makefile
thường sẽ bao gồm mã để làm cho chương trình của bạn, cài đặt chương trình của bạn, dọn dẹp sau đó và những thứ khác.
nên từ target
có thể là các từ khóa khác nhau, chẳng hạn như all
, install
, clean
vv
Đó là một cách khác để nói làm một cái gì đó . make all
ngụ ý làm mọi thứ
Nghiêm ngặt, tất nhiên, lệnh '' thực hiện tất cả' 'chỉ ngụ ý (tiểu bang) "thực hiện công việc cần thiết để đảm bảo rằng' tất cả 'được cập nhật". Thông thường, mọi người viết makefile để thực hiện hầu hết những gì bạn muốn (ví dụ, nó không tự động cài đặt). Nhưng đó chỉ là một quy ước. –
Một 'làm cho mục tiêu' về cơ bản là một tệp mà bạn muốn xây dựng lại.
Làm cho không thể thần thánh những gì bạn muốn xây dựng, vì vậy bạn phải nói điều đó, ngầm hoặc rõ ràng, những gì cần xây dựng. Thông thường, mục tiêu đầu tiên trong tệp là tên như 'tất cả' và nếu bạn chạy 'make' mà không có bất kỳ mục tiêu rõ ràng nào, nó sẽ tạo mục tiêu đầu tiên được liệt kê trong makefile. Tuy nhiên, một số makefiles không chỉ định bất kỳ mục tiêu nào; sau đó bạn phải chỉ định một trên dòng lệnh. Hoặc, nếu bạn không muốn mục tiêu mặc định được xây dựng, thì bạn phải chỉ định đích mà bạn muốn xây dựng.
Một mục tiêu cũng có thể là 'giả mạo', theo các điều khoản của GNU. Đó là, nó là một cái tên không tồn tại, và các quy tắc không tạo ra nó, nhưng nó (mục tiêu giả) phụ thuộc vào một số tệp khác có các quy tắc liên kết với chúng. Thật vậy, mục tiêu 'tất cả' thường là mục tiêu giả mạo - không có tệp nào được gọi là 'tất cả' trong hầu hết các thư mục.
make
là một công cụ phát triển chung, kiểm tra ngày tháng tệp giữa các tệp mã nguồn và mã đối tượng được tạo ra từ chúng, và biên dịch tệp nơi nguồn mới hơn. Nó thực hiện điều này bằng cách sử dụng một tệp, được gọi là makefile, nó liệt kê các tệp cần được so sánh.
Cú pháp giữa các ý kiến make /f makefile myprog.exe
Điều đó nói để xây dựng myprog.exe sử dụng danh sách tập tin trong makefile. Các makefile mặc định là makefile.mak
vì vậy nếu bạn sử dụng tên đó, bạn không phải chỉ định nó trên dòng lệnh.
myprog.exe
ở đây được gọi là mục tiêu. Một mẹo là bạn có thể đặt trong makefile một danh sách các hướng dẫn xây dựng cho một tệp không tồn tại. Nếu sau đó bạn nói để xây dựng mục tiêu đó, nó sẽ chạy các lệnh đó. Thông thường, bạn sẽ thấy một cái gì đó như make clean
, đã xóa tệp tạm thời.
"chuẩn" nghĩa là gì? – Pacerier
Có nghĩa là hầu hết các chương trình 'make' sẽ chấp nhận cú pháp đó để làm những gì tôi đã mô tả trong đoạn tiếp theo. Có rất nhiều biến thể của 'make', vì vậy tôi không thể nói cho tất cả chúng, nhưng hầu hết sẽ chấp nhận cú pháp đó. –
Có thực sự bất kỳ "tiêu chuẩn" chính thức được đề nghị nào cho 'make' không? – Pacerier
Re "* nó cần phải đảm bảo rằng mybinary là mới hơn tất cả các tập tin.o it.o depends.o và on.o *" ...; Làm thế nào được thực hiện? Việc này có được thực hiện bằng cách so sánh tệp thời gian sửa đổi lần cuối không? – Pacerier
Có, bằng cách so sánh các lần sửa đổi lần cuối. Trong thực tế, điều này dẫn đến việc tạo ra tiện ích UNIX 'touch' có mục đích là chỉ cập nhật ngày sửa đổi của một tệp, để kích hoạt một bản dựng. –