Việc cài đặt phần mềm trên hệ điều hành Linux thông qua các trình quản lý gói (package manager) đã trở nên vô cùng tiện lợi. Tuy nhiên, có những lúc bạn cần cài đặt một phiên bản cụ thể, một phần mềm mới chưa có trong kho gói, hoặc đơn giản là muốn tùy chỉnh ứng dụng theo ý muốn. Khi đó, “biên dịch từ mã nguồn” là con đường bạn cần đi. Quá trình này thoạt nhìn có vẻ phức tạp và đầy thử thách, nhưng thực chất lại tuân theo một quy trình 3 bước cốt lõi: ./configure
, make
, và make install
.
Bài viết này của tincongngheso.com sẽ đi sâu vào từng bước, giúp bạn không chỉ thực hiện được mà còn hiểu rõ ý nghĩa và vai trò của mỗi lệnh trong việc xây dựng phần mềm từ mã nguồn trên Linux. Nắm vững quy trình này sẽ trang bị cho bạn kiến thức chuyên sâu, giúp bạn tự tin hơn trong thế giới mã nguồn mở và kiểm soát hoàn toàn các ứng dụng trên hệ thống của mình.
1. Biên Dịch Từ Mã Nguồn Là Gì?
Để hiểu về quá trình “biên dịch từ mã nguồn” (building from source), chúng ta cần phân biệt giữa hai loại chương trình chính: được thông dịch và được biên dịch. Chương trình được thông dịch là các file văn bản chứa mã lệnh, cần một chương trình khác – trình thông dịch – để đọc và thực thi chúng. Ngược lại, chương trình được biên dịch là các file nhị phân độc lập, chứa mã máy và có thể chạy trực tiếp trên hệ thống.
Các file thực thi đã biên dịch rất phổ biến, đặc biệt với các chương trình lớn. Khi bạn “biên dịch từ mã nguồn”, bạn sử dụng một trình biên dịch (compiler) như gcc
để tạo ra một file thực thi từ mã nguồn của ứng dụng, vốn có thể được phân tán trong nhiều file riêng lẻ.
Cửa sổ terminal Linux hiển thị quá trình cài đặt Steam, minh họa việc sử dụng dòng lệnh trên Linux.
Vì quá trình “biên dịch từ mã nguồn” có thể phức tạp và tốn thời gian, nó thường được tự động hóa thông qua một chương trình khác, phổ biến nhất là Make. Bạn có thể viết các Makefile để kiểm soát cách một dự án xây dựng chương trình thực thi cuối cùng của nó.
Trong các dự án phức tạp hơn, các Makefile tự chúng có thể trở nên rất lớn và khó quản lý. Điều này đặc biệt đúng đối với các ứng dụng di động cần hoạt động trên nhiều kiến trúc và môi trường khác nhau. Để đáp ứng những tình huống này, nhiều dự án tự động tạo Makefile của họ bằng cách sử dụng một công cụ gọi là Autoconf/Automake.
2. Quy Trình 3 Bước Cốt Lõi: configure
, make
, install
Kết quả của tất cả những công cụ và khái niệm trên là một mẫu hình chung mà nhiều phần mềm sử dụng để “biên dịch từ mã nguồn”:
./configure && make && make install
Nhiều chương trình phổ biến sử dụng mẫu hình này – hoặc một biến thể của nó – bao gồm cả Apache, với hướng dẫn chi tiết trong file INSTALL của họ.
Một đoạn trích từ file BUILDING.md của Node.js giải thích quy trình ./configure, make, make install trong việc xây dựng ứng dụng.
Node.js là một ví dụ khác về phần mềm sử dụng mẫu hình này. File BUILDING.md của nó chứa các hướng dẫn liên quan.
Mỗi dự án có cách tiếp cận riêng để xây dựng mã nguồn của mình, ngay cả khi đó chỉ là một biến thể đơn giản của quy trình ba bước. Một điểm khác biệt quan trọng là cách bạn chạy chuỗi lệnh. Chạy với toán tử AND logic (&&
) sẽ khiến chuỗi lệnh dừng lại nếu một trong các phần của nó thất bại:
./configure && make && make install
Ngoài ra, bạn có thể chạy từng lệnh riêng lẻ, nhưng vẫn trên một dòng duy nhất, với dấu chấm phẩy:
./configure; make; make install
Cách này sẽ khiến mỗi phần chạy, ngay cả khi các bước trước đó đã thất bại. Lựa chọn của bạn không phải lúc nào cũng tạo ra nhiều khác biệt thực tế, và bạn cũng có thể chạy chúng dưới dạng ba lệnh riêng biệt:
./configure
make
make install
Bạn có thể không muốn cài đặt hoàn chỉnh phần mềm, mà chỉ muốn chạy nó trực tiếp từ thư mục của nó. Điều này hoàn toàn có thể thực hiện được; bạn chỉ cần bỏ qua lệnh make install.
Một số kho lưu trữ chứa script configure
trực tiếp, trong khi những kho khác (như grep
) lại yêu cầu bạn chạy một script khác trước để tạo ra file configure
này. Nếu bạn tìm kiếm tùy chọn dễ dàng nhất, hãy luôn tham khảo file INSTALL
, BUILD
, hoặc README
và làm theo khuyến nghị của dự án.
3. Lệnh ./configure
Khởi Tạo Mọi Thứ Ra Sao
Script shell configure
thường là điểm khởi đầu của quá trình “biên dịch từ mã nguồn”. Nó thiết lập phần còn lại của quy trình cho môi trường cụ thể của bạn.
Script này kiểm tra các phụ thuộc (dependencies) khác nhau mà dự án yêu cầu. Nó đảm bảo rằng tất cả các yếu tố cần thiết đều có mặt và chính xác, ở các phiên bản thích hợp. Khi chạy ./configure, bạn sẽ nhận được một file có tên Makefile
được sử dụng bởi giai đoạn tiếp theo.
Bản thân script configure
cũng có khả năng cấu hình cao, thông qua các tùy chọn dòng lệnh. Chạy ./configure –help để có mô tả toàn diện về chúng.
Cả configure
và make
đều tạo ra rất nhiều đầu ra. Nếu bạn chỉ muốn chạy các lệnh này và bỏ qua những gì chúng làm đằng sau hậu trường, bạn có thể sử dụng tùy chọn –quiet để loại bỏ hầu hết đầu ra.
Nếu không có script configure
, một dự án có thể cung cấp phương tiện để tạo ra nó. Ví dụ, kho lưu trữ htop
bao gồm một script autogen.sh
. Chạy script này sẽ tạo ra một script configure
:
Đầu ra từ script autogen.sh đang chạy trong mã nguồn của kho lưu trữ htop, cho thấy nó tạo ra một script configure.
Các dự án rất đơn giản, và những dự án không được viết bằng ngôn ngữ C, có thể hoàn toàn thiếu script configure
. Trong trường hợp này, quy trình ba bước trở thành hai bước: chỉ cần chạy make && make install.
Script configure
thường kiểm soát những gì xảy ra sau này trong quá trình cài đặt. Đặc biệt, tùy chọn --prefix
rất phổ biến. Tùy chọn này xác định thư mục gốc mà phần mềm sẽ được cài đặt. Theo mặc định, đây là /usr/local
, nhưng bạn có thể cung cấp một đường dẫn thay thế nếu bạn muốn tổ chức các file của mình theo cách khác.
4. make
: Công Đoạn Biên Dịch Chính
Sau khi configure
đã tạo ra một Makefile, bạn có thể bắt đầu quá trình xây dựng phần mềm thực sự. Chương trình make
đọc Makefile và kiểm tra một loạt các quy tắc để quyết định những gì cần biên dịch.
Các Makefile được viết thủ công thường dễ đọc, một khi bạn quen thuộc với cú pháp của chúng. Trong trường hợp đơn giản nhất, một Makefile mô tả cách tạo một file từ một file khác, khi file sau cũ hơn. Ví dụ, Makefile này mô tả quá trình xây dựng của một chương trình rất đơn giản:
program: program.c
gcc -o program program.c
Ở đây, file thực thi program
phụ thuộc vào file nguồn program.c
. Khi make
chạy, nó sẽ kiểm tra file đối với các phụ thuộc của nó. Nếu không có gì thay đổi kể từ lần biên dịch cuối cùng – tức là program
mới hơn program.c
– make
sẽ đơn giản thoát, an toàn trong giả định rằng không cần làm gì. Tuy nhiên, nếu program.c
đã thay đổi, nó sẽ chạy gcc
và biên dịch chương trình.
Có nhiều điều phức tạp hơn về make
ngoài trường hợp đơn giản này, và các Makefile được tạo ra có xu hướng phức tạp hơn nhiều. Ví dụ, Makefile được tạo tự động cho chương trình htop
dài tới 2.440 dòng:
Một đoạn trích từ Makefile tự động tạo cho dự án htop, minh họa cấu trúc phức tạp của các Makefile được tạo tự động.
Nhưng bạn không cần phải lo lắng về điều này. Trừ khi bạn đang chỉnh sửa mã nguồn – hoặc viết mã của riêng mình – bạn có thể chạy make
mà không cần quá bận tâm về những gì đang xảy ra bên dưới.
Bước make
có thể mất một thời gian dài để chạy, đặc biệt đối với phần mềm phức tạp liên quan đến một số thành phần. Hãy kiên nhẫn và đừng lo lắng nếu make
thất bại. Nguyên nhân thường là do thiếu một phụ thuộc, và một trong những lợi ích của make
là nó sẽ tiếp tục quá trình xây dựng mà không mất đi công việc đã thực hiện.
5. Hoàn Tất Cài Đặt với make install
Một bản “biên dịch từ mã nguồn” điển hình sẽ tạo ra một file thực thi đã biên dịch, hoặc ở thư mục gốc của dự án hoặc thường là trong một thư mục con có tên bin
. Đây thường là một chương trình độc lập mà bạn có thể chạy thông qua đường dẫn đầy đủ của nó.
Điều này rất tốt cho việc kiểm thử hoặc làm việc với phần mềm của riêng bạn, nhưng cuối cùng bạn sẽ muốn cài đặt nó vào một vị trí thuận tiện hơn.
Hầu hết các Makefile đều có mục tiêu install
mà make
sẽ kiểm tra khi bạn chạy make install
. Lệnh này thường sử dụng lệnh install
để sao chép các file riêng lẻ và đặt các quyền cũng như quyền sở hữu thích hợp.
Vị trí cài đặt sẽ phụ thuộc vào cách bạn chạy configure
. Hãy nhớ rằng vị trí mặc định cho các file thực thi là /usr/local/bin
, mà bạn có thể không có quyền ghi vào đó. Nếu người dùng của bạn không thể ghi vào vị trí cài đặt, bạn sẽ cần chạy sudo make install và cung cấp mật khẩu root để tiếp tục.
Bất kể vị trí cài đặt là gì, nó phải nằm trong biến môi trường PATH
của bạn để bạn có thể chạy chương trình chỉ bằng cách gõ tên của nó trên dòng lệnh, thay vì đường dẫn đầy đủ của nó.
Kết Luận
Việc “biên dịch từ mã nguồn” trên Linux với quy trình ./configure
, make
, make install
là một kỹ năng giá trị, giúp bạn kiểm soát sâu hơn phần mềm trên hệ thống. Từ việc thiết lập môi trường với configure
, biên dịch mã nguồn thành file thực thi với make
, cho đến việc tích hợp chúng vào hệ thống bằng make install
, mỗi bước đều đóng vai trò quan trọng.
Nắm vững các lệnh này không chỉ giúp bạn giải quyết các vấn đề cài đặt mà còn mở ra cánh cửa để hiểu rõ hơn về cách các ứng dụng được xây dựng và hoạt động. Hãy luôn tham khảo tài liệu INSTALL
hoặc README
của từng dự án để có hướng dẫn cụ thể nhất. Bạn đã từng “biên dịch phần mềm từ mã nguồn” chưa? Hãy chia sẻ kinh nghiệm và những mẹo nhỏ của bạn dưới phần bình luận để cộng đồng của tincongngheso.com cùng học hỏi!