Make system in Linux
Tài liệu này mô tả chung về Makefile, trong đó nhắc đến các khái niệm quan trọng để có thể đọc được các Makefile phức tạp.
make
Khái niệm
"make" là một "build tool" được sử dụng để gọi đến các thành phần trong một toolchain (như compiler, linker) để build ra executable programs từ source code.
"make" tự động phát hiện được phần nào của source code được sửa đổi để tiến hành build lại cục bộ từng bộ phận đó. Tránh được trường hợp phải build lại toàn bộ hệ thống khi chỉ một phần được thay đổi.
"make" cần một file đặc biệt để mô tả các bước để build ra image, được gọi là: Makefile. Thông thường khi được gọi đến, "make" sẽ tìm kiếm trong thư mục hiện tại các tên file như sau: makefile, Makefile hoặc GNUmakefile. Trong trường hợp makefile không được đặt theo chuẩn trên, khai báo makefile với "make" bằng chỉ dẫn –f <filename> hoặc –file=<name>.
Makefile
Makefile là tập hợp các đoạn lệnh mô tả cho "make" biết phải làm gì để build chương trình. Các đoạn lệnh mô tả này được gọi là Rules.
Rules
Một Rules có dạng như sau
target … : prerequisites …
recipe
…
…
Target: thông thường là đầu ra (executable hoặc object file) của make. Ngoài ra trong make định nghĩa thêm một loại target đặc biệt: Phony Targets.
Một target được định nghĩa out-of-date khi:
- Target đó không tồn tại.
- Các prerequisites bị thay đổi.
Implicit Rules
Để thuận tiện cho người dùng cũng như làm đơn giản Makefile, "make" định nghĩa các Implicit Rules. Trong một số Rules, nếu recipe không được định nghĩa, "make" sẽ thực hiện build theo một số luật ngầm đã được định nghĩa trước.
Ví dụ như khi rule có dạng
main: main.c
Hoặc đơn giản hơn nữa
main:
Trong rule trên không mô tả recipe để "make" có thể tiến hành build, do đó "make" sử dụng implicit rule khi build với C source và sẽ gọi đến:
cc main.c –o main
Trong đó cc là system compiler.
Variables
Biến (hoặc cũng có thể gọi là macro) được định nghĩa trong Makefile để đại diện cho một chuỗi ký tự.
Trong Makefile có thể sử dụng các Automatic Variables.
- $@: là target của rules
- $<: là tên của prerequisites
- $^: tên của tất cả các prerequisites được các nhau bằng dấu cách trắng.