Tự Động Quét Đệ Quy Tất Cả Thư Mục Con Bằng GNU Make
Một đồng nghiệp gần đây đã yêu cầu một tính năng tiện lợi: cần có công cụ kiểm tra toàn bộ file XML trong dự án, bao gồm cả các thư mục con. Sau khi cân nhắc, tôi nhận thấy GNU Make là công cụ lý tưởng để xây dựng giải pháp này.
Vấn đề then chốt nằm ở việc làm thế nào để Make có thể xử lý đệ quy tất cả thư mục con. Hàm wildcard mặc định của GNU Make chỉ có thể liệt kê các file trong thư mục hiện tại, không thể tự động dò tìm sâu vào cấu trúc thư mục.
Mặc dù có thể dùng lệnh shell để giải quyết (ví dụ với find trên Unix hay for trên Windows), nhưng tôi muốn xây dựng giải pháp thuần Make để tránh phụ thuộc vào nền tảng. Điều này đòi hỏi phải tận dụng các hàm dựng sẵn của Make một cách sáng tạo.
Ban đầu tôi tin rằng GNU Make - với khả năng sử dụng call, eval và điều kiện if - là ngôn ngữ Turing hoàn chỉnh, đủ sức thực hiện các phép toán phức tạp như đệ quy. Tuy nhiên khi thử nghiệm đoạn mã đệ quy đơn giản, phiên bản Make trên MinGW đã gặp sự cố nghiêm trọng với lỗi:
make: Interrupt/Exception caught (code = 0xc00000fd, addr = 0x7c92e8e7)
Đành phải chuyển sang phương pháp tạo tiến trình con (fork), dù biết rõ hiệu suất sẽ kém trên Windows. Dưới đây là đoạn mã mẫu tôi viết để duyệt đệ quy thư mục hiện tại:
|
|
Bổ sung ngày 8/7: Sau khi kiểm tra kỹ, lỗi trước đó là do mã nguồn viết sai. Phiên bản sửa lỗi có thể duyệt toàn bộ thư mục con hiệu quả như sau:
|
|
Giải pháp này tận dụng cơ chế biến toàn cục và hàm đệ quy để xây dựng danh sách đầy đủ các file cần xử lý, đồng thời tự động bỏ qua các thư mục rỗng. Đây là minh chứng cho khả năng xử lý cấu trúc phức tạp của GNU Make khi kết hợp khéo léo các hàm dựng sẵn.