Ghi Chú Sử Dụng Công Cụ Make
Dự án của chúng tôi đã chuyển từ công cụ xây dựng boost jam sang gnu make từ đầu năm nay. Việc viết makefile không phải là điều dễ dàng, nhưng các quy tắc của make đơn giản hơn nhiều so với jam (dễ hiểu và trực quan hơn boost jam nhiều). Điều này hoàn toàn phù hợp với triết lý KISS của hệ điều hành unix. Khi đã thành thạo công cụ make, phương pháp lập trình của bạn sẽ được mở rộng đáng kể, linh hoạt hơn nhiều so với thời chỉ dùng IDE. Đặc biệt, bạn có thể tự động sinh mã nguồn hoặc dùng công cụ tạo file dữ liệu một cách dễ dàng - những việc này làm trong IDE sẽ phức tạp hơn nhiều. Nhờ đó, quy trình phát triển cũng không còn bị giới hạn bởi vài ngôn ngữ lập trình nhất định nữa.
Cá nhân tôi tiếp cận make theo kiểu一边学一边用一边实践边做边学边改. Chính vì vậy, các file makefile tôi viết ban đầu thường khá rối mắt. Tuy nhiên điều này không quá quan trọng, bởi việc viết makefile cũng giống như viết code - sau này có thể refactoring lại bất kỳ lúc nào. Hơn nữa, việc sử dụng makefile lại cực kỳ thuận lợi để tự động hóa mọi công việc.
Dưới đây là một vài vấn đề gần đây tôi gặp phải cùng cách giải quyết:
Vấn đề đa nền tảng Dự án của chúng tôi cần hỗ trợ đa nền tảng, do đó tôi mong muốn makefile có thể tự nhận diện hệ điều hành cụ thể. Trên Windows, việc nhận diện tương đối đơn giản vì chúng tôi không cần hỗ trợ Windows 9x (chỉ cần chạy được là được). Trên hệ điều hành Windows NT, có thể kiểm tra biến môi trường OS=Windows_NT. Nếu tồn tại biến này thì chắc chắn là nền tảng Win32.
Với các hệ thống posix-compliant, phần lớn mã nguồn có thể biên dịch trực tiếp, tuy nhiên một số thành phần vẫn cần phân biệt phiên bản cụ thể. Ban đầu tôi thử dùng biến môi trường OSTYPE nhưng phát hiện ra biến này chứa luôn cả phiên bản hệ điều hành (ví dụ freebsd6.2 trên máy tôi hay Linux kèm theo phiên bản). Sau đó chúng tôi chuyển sang dùng lệnh shell uname để giải quyết. Trong makefile chỉ cần viết OS=$(shell uname) là xong - trên freebsd sẽ trả về FreeBSD, trên linux thống nhất trả về Linux.
Vấn đề tạo file dữ liệu qua pipeline Chúng tôi yêu cầu tất cả các file dữ liệu trong dự án phải ở dạng văn bản đọc được bằng mắt thường trong giai đoạn phát triển. Quyết định này được đưa ra vài tháng trước và đã chứng minh hiệu quả qua thực tế sử dụng. Việc dùng văn bản thuần giúp phát hiện nhanh chóng các lỗi trong công cụ phát triển, khi dữ liệu đầu ra có vấn đề thì rất dễ tìm ra nguyên nhân.
Tuy nhiên vì nhiều lý do (không chỉ vì hiệu suất), các file dữ liệu cuối cùng vẫn cần qua một số bước chuyển đổi định dạng từ văn bản gốc. Vì vậy chúng tôi đã viết một số công cụ chuyển đổi dữ liệu chuyên dụng. Ngoài ra còn có các công cụ sinh mã nguồn xử lý văn bản để tạo ra dữ liệu đầu ra.
Dự án hiện tại sử dụng nhiều công cụ xử lý văn bản, có cái tận dụng sẵn các công cụ unix, có cái tự phát triển. Với các công cụ tự viết, để đơn giản chúng tôi thường không dùng tham số dòng lệnh mà chỉ xử lý qua stdin/stdout. Ví dụ:
cat xxx.src | my_processor.exe > xxx.obj
(trên windows dùng type thay cat)
Trong đó my_processor.exe là bộ xử lý văn bản tự viết. Nếu công cụ này chưa được build thành công hoặc xảy ra lỗi khi xử lý, file xxx.obj sẽ không được tạo đúng cách.
Khi có lỗi, make sẽ dừng quy trình nhưng shell vẫn tạo ra file đích xxx.obj dù chỉ là file rỗng (độ dài 0). Lần make tiếp theo sẽ bỏ qua vì hệ thống nhận xxx.obj đã tồn tại. Để giải quyết, tôi áp dụng cách sau:
cat xxx.src | my_processor.exe > xxx.obj.tmp && mv xxx.obj.tmp xxx.obj
(trên windows dùng type và move /Y)
Bằng cách này, file đích chỉ được tạo khi toàn bộ quá trình xử lý thành công.
Nhân tiện, tuần trước tôi đã thuyết phục thành công đồng nghiệp cài Ubuntu lên laptop của anh ấy. Sau trải nghiệm thực tế, anh ấy đã quyết định từ bỏ Windows. Cá nhân tôi vẫn trung thành với freebsd làm hệ điều hành desktop.
Tôi không phản đối Windows, nhưng tôi hy vọng thế giới có thêm nhiều lựa chọn hơn. Cộng đồng mã nguồn mở với các công cụ như gcc, kde, gnome chưa thể đe dọa Windows vì đa số người dùng vẫn thấy Visual Studio tiện lợi hơn và giao diện Windows thân thiện hơn. Firefox hay Opera giành thị phần từ IE chủ yếu vì vấn đề bảo mật của IE. Thật sự đe dọa Windows là sự gia tăng các ứng dụng người dùng cuối có thể chạy trên các hệ điều hành khác - ví dụ như tựa game mà chúng tôi đang phát triển.