Giao diện dòng lệnh Linux Terminal đang hiển thị quá trình cài đặt phần mềm Steam
Máy Tính

Hướng Dẫn Chi Tiết Quy Trình `configure`, `make`, `make install` Khi Biên Dịch Phần Mềm Từ Mã Nguồn Linux

Khi bạn cần cài đặt một phần mềm trên hệ điều hành Linux mà không có sẵn trong các kho lưu trữ gói quen thuộc, hoặc muốn tùy chỉnh phiên bản, việc biên dịch từ mã nguồn (building from source) là một lựa chọn mạnh mẽ. Tuy nhiên, quy trình này thường khiến người dùng mới cảm thấy phức tạp và đáng sợ. May mắn thay, hầu hết các phần mềm mã nguồn mở đều tuân theo một quy trình chuẩn hóa gồm ba bước đơn giản nhưng mạnh mẽ: ./configure, make, và make install. Hiểu rõ ý nghĩa và chức năng của từng bước sẽ giúp bạn làm chủ việc cài đặt phần mềm, nâng cao kinh nghiệm sử dụng Linux.

Biên Dịch Từ Mã Nguồn Là Gì?

Các chương trình chạy trên máy tính của bạn thường được phân loại là chương trình thông dịch (interpreted) hoặc chương trình biên dịch (compiled). Chương trình thông dịch là các tệp văn bản chứa mã nguồn được một chương trình khác – một trình thông dịch – đọc và thực thi khi bạn chạy chúng. Ngược lại, chương trình biên dịch là các tệp nhị phân độc lập chứa mã máy, có thể chạy trực tiếp trên phần cứng.

Các tệp thực thi đã biên dịch rất phổ biến, đặc biệt đối 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 – như gcc (GNU Compiler Collection) – để tạo ra một tệp thực thi từ mã nguồn của ứng dụng, vốn có thể được phân tán trong nhiều tệp riêng lẻ.

Giao diện dòng lệnh Linux Terminal đang hiển thị quá trình cài đặt phần mềm SteamGiao diện dòng lệnh Linux Terminal đang hiển thị quá trình cài đặt phần mềm Steam

Bởi vì việc biên dịch từ mã nguồn có thể là một quá trình 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 tệp 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 tệp Makefile tự chúng trở nên lớn và khó quản lý. Điều này đặc biệt đúng đối với các ứng dụng đa nền tả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 các Makefile của chúng bằng một công cụ gọi là autoconf/automake.

Chu Trình 3 Bước Phổ Biến: configure, make, install

Kết quả của tất cả những điều này là một quy trì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 quy trình này – hoặc một biến thể – bao gồm Apache và Node.js, vốn giải thích quy trình trong các tệp hướng dẫn cài đặt của chúng.

Hình ảnh đoạn trích từ tài liệu BUILDING.md của Node.js, minh họa rõ ràng các bước configure make install để biên dịch mã nguồnHình ảnh đoạn trích từ tài liệu BUILDING.md của Node.js, minh họa rõ ràng các bước configure make install để biên dịch mã nguồn

Mỗi dự án có cách tiếp cận riêng để biên dịch 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 nó với toán tử && (logical AND) 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 biệt nhưng vẫn trên một dòng, sử dụng 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 sự khác biệt lớn về mặ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à thích chạy nó trực tiếp từ thư mục của nó. Điều này hoàn toàn có thể làm được; bạn chỉ cần bỏ qua lệnh make install.

Một số kho lưu trữ chứa sẵn script configure, trong khi những kho khác (như grep) yêu cầu bạn chạy một script khác để tạo tệp configure này trước tiên. Để có lựa chọn dễ dàng nhất, hãy luôn tham khảo tệp INSTALL, BUILD, hoặc README và làm theo khuyến nghị của dự án.

./configure – Khởi Đầu Quan Trọng

Script shell configure thường là điểm khởi đầu của quá trình biên dịch. 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 phù hợp. Chạy ./configure và bạn sẽ nhận được một tệp có tên Makefile, được sử dụng ở giai đoạn tiếp theo.

Bản thân script configure 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 để xem mô tả toàn diện về chúng.

Cả configuremake đề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 để chặn hầu hết đầu ra.

Nếu không có script configure, một dự án có thể cung cấp cách để 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:

Ảnh chụp màn hình hiển thị kết quả của việc chạy script autogen.sh trong mã nguồn htop, chứng minh script này tạo ra tệp configureẢnh chụp màn hình hiển thị kết quả của việc chạy script autogen.sh trong mã nguồn htop, chứng minh script này tạo ra tệp 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 không có 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 đó trong quá trình cài đặt. Đặc biệt, tùy chọn --prefix là phổ biến. Tùy chọn này định nghĩa 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 tệp của mình khác đi.

make – Bộ Não Của Quá Trình Biên Dịch

Khi configure đã tạo ra Makefile, bạn có thể bắt đầu quá trình biên dịch phần mềm thực tế. 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 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 tệp từ một tệp khác, khi tệp sau cũ hơn. Ví dụ, Makefile này mô tả quá trình biên dịch một chương trình rất đơn giản:

program: program.c
    gcc -o program program.c

Ở đây, tệp thực thi program phụ thuộc vào tệp nguồn program.c. Khi make chạy, nó sẽ kiểm tra tệp so 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.cmake sẽ đơn giản thoát, an toàn với giả định rằng không cần phải 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.

Bàn phím cơ Das Keyboard 6 Professional cao cấp, biểu tượng của công việc lập trình và phát triển phần mềmBàn phím cơ Das Keyboard 6 Professional cao cấp, biểu tượng của công việc lập trình và phát triển phần mềm

Có rất nhiều điều cần biết 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 cho chương trình htop dài 2.440 dòng:

Hình ảnh một đoạn trích từ tệp Makefile được tự động tạo cho dự án htop, minh họa độ phức tạp của các quy tắc biên dịchHình ảnh một đoạn trích từ tệp Makefile được tự động tạo cho dự án htop, minh họa độ phức tạp của các quy tắc biên dịch

Nhưng bạn không cần phải lo lắng về điều này. Trừ khi bạn đang “hack” mã nguồn – hoặc tự viết mã nguồn của mình – bạn có thể chạy make mà không cần quá bận tâm đến những gì đang diễn ra bên trong.

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 nhiều 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 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 biên dịch mà không làm mất công việc đã thực hiện.

make install – Hoàn Tất Cài Đặt

Một bản biên dịch điển hình sẽ tạo ra một tệp thực thi đã biên dịch, có thể ở 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ó:

/home/user/myproject/bin/program

Điều này phù hợp cho việc thử nghiệm hoặc làm việc trên 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ó ở một vị trí tiện lợi hơn.

Hầu hết các Makefile đều có một mục tiêu (target) installmake 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 tệp riêng lẻ và đặt các quyền và 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 tệp 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ó.

Minh họa cú pháp của lệnh ECHO trên Linux, liên quan đến các lệnh terminal và quản lý biến môi trường PATHMinh họa cú pháp của lệnh ECHO trên Linux, liên quan đến các lệnh terminal và quản lý biến môi trường PATH

Kết Luận

Hiểu rõ quy trình configure, make, và make install là một kỹ năng thiết yếu đối với bất kỳ ai làm việc với hệ điều hành Linux và phần mềm mã nguồn mở. Nó không chỉ giúp bạn cài đặt các ứng dụng không có trong kho gói tiêu chuẩn mà còn cung cấp cái nhìn sâu sắc về cách các ứng dụng được xây dựng và đóng gói. Với kiến thức này, bạn có thể tự tin hơn trong việc tùy chỉnh, khắc phục sự cố và quản lý phần mềm trên hệ thống của mình. Hãy thử áp dụng quy trình này cho dự án mã nguồn mở tiếp theo của bạn và trải nghiệm sự mạnh mẽ của việc kiểm soát trực tiếp quá trình biên dịch!

Related posts

Khắc phục Sự Cố Windows Dễ Dàng Với Reliability Monitor: Hướng Dẫn Toàn Diện Từ A Đến Z

Administrator

Từ Sưu Tầm Đĩa Vật Lý Đến Thư Viện Plex: Lý Do Tôi Không Quay Lại

Administrator

ASUS ROG Zephyrus G16 (2024) RTX 4070: Ưu Đãi Khủng Cho Game Thủ Việt

Administrator