Quy Tắc Trong Makefile
Tổng Quan
Một quy tắc trong Makefile bao gồm hai phần chính:
- Phần phụ thuộc (prerequisites): các tệp tin mà target cần để hoạt động.
- Phương thức tạo mục tiêu (commands): các lệnh để tạo hoặc cập nhật target.
Thứ tự của các rules trong Makefile rất quan trọng, vì chỉ nên có một target cuối cùng, và các mục tiêu khác sẽ được liên kết thông qua mục tiêu này.
- Các target trong Makefile có thể được định nghĩa nhiều, nhưng target đầu tiên sẽ là mục tiêu chính được thực hiện khi chạy lệnh
make
. - Nếu target đầu tiên có nhiều mục tiêu, target đứng đầu sẽ được chọn để thực hiện đầu tiên.
I. Ví dụ Cụ thể
foo.o: foo.c defs.h
gcc -c -g foo.c
Trong ví dụ này:
foo.o
là mục tiêu (target).foo.c
vàdefs.h
là các file nguồn cần thiết (prerequisites).- Lệnh để tạo mục tiêu là
gcc -c -g foo.c
, với mỗi lệnh phải bắt đầu bằng phím Tab.
II. Cú Pháp Của Rules
targets : prerequisites
command
...
Giải thích Các Thành Phần:
- targets: Tên file hoặc mục tiêu cần tạo ra, có thể là một hoặc nhiều file, ngăn cách bằng khoảng trắng.
- prerequisites: Các file mà targets phụ thuộc vào. Nếu bất kỳ file nào mới hơn target, hoặc nếu target chưa tồn tại, Make sẽ thực hiện lệnh để cập nhật.
- command: Các dòng lệnh dùng để tạo hoặc cập nhật targets, phải bắt đầu bằng phím Tab.
III. Sử Dụng Ký Tự Đại Diện (Wildcards)
1. Các Ký Tự Đại Diện Thông Dụng
Make hỗ trợ ba ký tự đại diện:
- "*": Khớp với chuỗi ký tự bất kỳ. Ví dụ:
*.c
khớp với tất cả tệp có phần mở rộng.c
. - "?": Khớp với một ký tự bất kỳ. Ví dụ:
file?.c
khớp vớifile1.c
, không khớp vớifile12.c
. - "~": Đại diện cho thư mục home của người dùng.
2. Ví Dụ Về Ký Tự Đại Diện
clean:
rm -f *.o
Khi chạy make clean
, lệnh này sẽ xóa tất cả các file có phần mở rộng .o
trong thư mục hiện tại.
IV. Tìm Kiếm File Phụ Thuộc Bằng VPATH
VPATH
là một biến đặc biệt giúp Make tìm kiếm các file trong nhiều thư mục khác nhau. Sử dụng cú pháp:
VPATH = <directory_1>:<directory_2>
Ví dụ cấu trúc thư mục:
project/
├── Makefile
├── src/
│ ├── main.c
│ └── helper.c
└── include/
└── utils.h
Makefile Ví Dụ:
VPATH = src:include
all: main.o helper.o
gcc main.o helper.o -o my_program
%.o: %.c
gcc -c $< -o $@
V. Phony Targets Trong Makefile
Phony targets là những mục tiêu không tương ứng với file nào trong hệ thống. Để xác định một phony target, sử dụng:
.PHONY: clean
clean:
rm *.o
VI. Quy Tắc Mẫu Trong Makefile
Quy tắc mẫu giúp giảm thiểu số lượng quy tắc viết trong Makefile. Ví dụ với фонAggregation:
%.o : %.c
$(CC) -c $(CFLAGS) $< -o $@
VII. Tạo Tự Động Phụ Thuộc
Sử dụng lệnh gcc -MM
để tự động phát hiện các file header mà file nguồn cần thiết. Điều này giúp giữ cho Makefile luôn cập nhật mà không cần chỉnh sửa thủ công.
Ví Dụ:
all: main
main: $(OBJS)
$(CC) $(OBJS) -o main
Kết Luận
Bài viết này đã trình bày các quy tắc quan trọng trong Makefile. Việc hiểu rõ về chúng có thể giúp bạn xây dựng các dự án lập trình nhanh chóng và hiệu quả hơn.
source: viblo