Makefile này tạo chương trình C như thế nào mà không chỉ định trình biên dịch?


41

Tôi đã sử dụng Makefile từ cuốn sách " Advanced Linux Lập trình (2001)" [code] . Thật kỳ lạ đối với tôi khi thấy GNU make thực hiện biên dịch mã chính xác mà không chỉ định trình biên dịch trong Makefile. Nó giống như nướng mà không có bất kỳ công thức!

Đây là phiên bản tối thiểu của mã:

kiểm tra

int main(){}

Makefile

all:            test

và làm cho thực sự hoạt động! Đây là lệnh nó thực thi:

cc     test.c   -o test

Tôi không thể tìm thấy bất cứ điều gì hữu ích trong tài liệu. Làm thế nào điều này là có thể?


PS Một lưu ý bổ sung: Ngay cả ngôn ngữ không được chỉ định; Vì test.ccó sẵn, GNU makesử dụng cc. Nếu có tồn tại test.cpphoặc test.cc(khi không có test.c), nó sử dụng g++(và không c++).


4
"Nó giống như nướng mà không có bất kỳ công thức!" Một công thức sẽ cho bạn biết đun sôi nước, nhưng không nên đun nước bằng chảo trên bếp gas, chảo trên bếp cảm ứng, ấm đun nước điện hay vạc đặt trên giá ba chân trên lửa. Nó thậm chí sẽ không nói cho bạn biết nơi bạn nên lấy nước. Điều này giống như nói makeđể đun sôi nước, và sử dụng các quy tắc nội bộ của nó, makesẽ chỉ ra cách làm;)
Rhymoid

1
@Rhymoid Nó giống như hét lên: Tôi muốn có một chiếc bánh! Và sau đó, một robot được gọi makekiểm tra tủ lạnh của bạn và phát hiện ra có sẵn một số bột, sau đó nướng một chiếc bánh mặc định cho bạn từ công thức nội bộ của nó. :-)
Ho1

@ Ho1: Robot có thể hỏi, bạn muốn có chiếc bánh nào? :): D
Do đó,

Câu trả lời:


68

Thực hiện điều này bằng cách sử dụng các quy tắc tích hợp của nó . Chúng đặc biệt nói cho nó cách biên dịch mã C và cách liên kết các chương trình đối tượng đơn.

Bạn thực sự thậm chí không cần Makefile:

make test

sẽ làm việc mà không có một.

Để xem các quy tắc ẩn làm cho tất cả những điều này có thể, hãy sử dụng -ptùy chọn không có Makefile:

make -p -f /dev/null

Như alephzero đã chỉ ra , Make đã có các quy tắc tích hợp trong một thời gian rất dài (nếu không luôn luôn như vậy); Phiên bản đầu tiên của Stuart Feldman trong Unix V7 định nghĩa chúngfiles.cbài báo năm 1979 của ông đề cập đến chúng. Chúng cũng là một phần của đặc tả POSIX . (Điều này không có nghĩa là tất cả các triển khai Make đều hỗ trợ chúng - Borland Make for DOS cũ không, ít nhất là lên đến phiên bản 3.0.)


2
Tôi cũng nghĩ vậy, nhưng POSIX cũng chỉ định chúng !
Stephen Kitt

5
@KingZoingo Make thực chất là một công cụ suy luận: nó có một bộ quy tắc (tích hợp và từ Makefile), các tạo phẩm hiện có (các tệp trong thư mục hiện tại hoặc được đặt tên trong Makefile) và các tạo phẩm được yêu cầu (các mục tiêu trong Makefile); nó chỉ đơn giản là cố gắng khớp các quy tắc và các tạo phẩm hiện có để xác định xem nó có thể sử dụng chúng để lấy các tạo phẩm được yêu cầu hay không. Các quy tắc tích hợp cho biết nó test.ccó thể được sử dụng để sản xuất test. make -dsẽ chỉ cho bạn quá trình một cách chi tiết ...
Stephen Kitt

4
@ Ho1 @StephenKitt Điều này đã có maketừ rất lâu trước khi GNU hoặc POSIX được phát minh. Phiên bản đầu tiên được viết cách đây gần 40 năm và có một số phiên bản nguyên mẫu được xây dựng từ các kịch bản shell ngay cả trước đó.
alephzero

3
@jamesqf CPPvẫn gọi bộ tiền xử lý ( cc -Ethông thường); trình biên dịch C ++ là CXX.
Stephen Kitt

3
@ Ho1 CXXtrong ngữ cảnh này là biến Make, không phải lệnh - $(CXX)trong Makefile sẽ được thay thế bằng lệnh để chạy trình biên dịch C ++.
Stephen Kitt
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.