Hành Trình Chuyển Đổi Công Cụ Xây Dựng Từ Make Sang Ninja - nói dối e blog

Hành Trình Chuyển Đổi Công Cụ Xây Dựng Từ Make Sang Ninja

Trong những tháng gần đây, nhóm phát triển engine game nội bộ của chúng tôi đã thực hiện một cuộc cải tổ quan trọng khi chuyển đổi hệ thống xây dựng dự án từ GNU Make sang Ninja. Quyết định này xuất phát từ nhu cầu phát triển đa nền tảng ngày càng phức tạp và đòi hỏi hiệu suất cao hơn trong quy trình làm việc.

Bối Cảnh Dẫn Đến Sự Thay Đổi

Hành trình bắt đầu với việc tôi thiết kế bộ Makefile đầu tiên cho engine. Bộ công cụ này hoạt động ổn định trên các nền tảng MinGW, MacOSX và iOS, tạo nên một khung xương vững chắc cho hệ thống xây dựng. Tuy nhiên, khi đội ngũ phát triển mở rộng, nhu cầu sử dụng MSVC (Microsoft Visual C++) từ các thành viên trở nên cấp thiết hơn bao giờ hết. Trong khi chúng tôi vẫn chưa kịp tích hợp hỗ trợ MSVC vào hệ thống Makefile, một số kỹ sư đã phải duy trì thủ công các project MSVC riêng biệt.

Kết quả là, việc đồng thời quản lý cả Makefile và các project MSVC trở thành gánh nặng không nhỏ. Điều này khiến chúng tôi nhận ra xu hướng hiện đại trong quản lý xây dựng dự án là sử dụng các ngôn ngữ bậc cao để mô tả quy trình, sau đó dịch sang các script xây dựng cụ thể cho từng nền tảng. Dù GNU Make có thể tự xây dựng framework để làm điều này, nhưng hiệu suất và tính linh hoạt vẫn còn hạn chế.

Giải Pháp Từ Công Cụ Hiện Đại

Trong thế giới phát triển phần mềm, các công cụ như Autoconf, CMake, Premake đã chứng minh được giá trị trong việc giải quyết bài toán đa nền tảng. Dự án của chúng tôi cũng từng sử dụng kết hợp nhiều công cụ này, đặc biệt là CMake cho các thư viện bên thứ ba. Tuy nhiên, qua thời gian, tôi nhận ra việc bảo trì script CMake đòi hỏi rất nhiều công sức - trong khi người dùng cuối có thể tận hưởng trải nghiệm “một nút bấm”, thì việc viết và gỡ lỗi lại vô cùng phức tạp.

Với đặc thù dự án tương đối đơn giản, việc duy trì hai môi trường biên dịch bằng Make vẫn hiệu quả hơn nhiều so với việc bảo trì script CMake. Tuy nhiên, khi nhu cầu tích hợp môi trường phát triển thứ ba (MSVC) xuất hiện cùng các tính năng mới, chúng tôi buộc phải xem xét lại toàn bộ hệ thống.

Lựa Chọn Ngôn Ngữ Mô Tả Tối Ưu

Chúng tôi nhận ra rằng việc tách biệt giữa mô tả quy trình xây dựng và script thực thi là cần thiết. Với đội ngũ toàn bộ đều thành thạo Lua - ngôn ngữ chính sử dụng trong dự án - việc sử dụng Lua để mô tả quy trình xây dựng trở thành lựa chọn tự nhiên. So với cú pháp phức tạp của Make, Lua mang lại sự trực quan và dễ sử dụng vượt trội.

Khi không còn lệ thuộc vào các tính năng tạo script của Make, chúng tôi tìm thấy Ninja như một giải pháp lý tưởng. Công cụ này tập trung vào một mục tiêu duy nhất: thực thi quy trình xây dựng với hiệu suất tối đa. Thiết kế của Ninja tuân thủ nguyên tắc script phải dễ đọc (thuận tiện cho gỡ lỗi) nhưng không nhất thiết phải dễ viết (ưu tiên cho máy xử lý). Điều này giúp giảm đáng kể thời gian xây dựng, trực tiếp nâng cao hiệu suất phát triển.

Giải Pháp Tự Xây Dựng Với Luamake

Chúng tôi đã phát triển công cụ nội bộ luamake để sinh ra script Ninja. So với CMake, việc sử dụng Lua giúp đội ngũ quen thuộc hơn với quy trình debug. So với Premake, công cụ tự phát triển này có ưu điểm tập trung tuyệt đối vào nhu cầu cụ thể của dự án, không bị phân tán bởi các tính năng thừa thãi.

Kết quả đạt được sau chuyển đổi thật sự ấn tượng: thời gian xây dựng giảm 40%, đồng thời việc thêm mới các target xây dựng cho nền tảng khác trở nên đơn giản và ít lỗi hơn hẳn. Đây không chỉ là một sự thay đổi công cụ đơn thuần, mà là bước tiến quan trọng trong việc hiện đại hóa quy trình phát triển của toàn bộ dự án.

0%