Xây dựng phần mềm Linux từ nguồn trong 3 bước dễ dàng

Tác giả Starlink, T.Tư 27, 2025, 11:45:14 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Cấu hình, Thực hiện, Cài đặt.

    Hầu hết các phần mềm đều tuân theo quy trình 3 bước để xây dựng từ nguồn:./configure && make && make install.
    Tập lệnh configure kiểm tra các phụ thuộc, trong khi make tạo ra một tệp thực thi; autoconf/automake giúp tự động hóa việc này.
    Việc cài đặt thường là tùy chọn và chủ yếu là để thuận tiện, cho phép bạn chạy các lệnh được sao chép vào thư mục PATH.


Cài đặt từ nguồn có vẻ hơi đáng sợ hơn so với việc sử dụng trình quản lý gói của bạn. Nhưng ba lệnh đơn giản giúp đảm bảo quá trình này vẫn không gặp rắc rối.

1. Xây dựng từ nguồn là gì?

Các chương trình bạn chạy trên máy tính của mình được biên dịch hoặc diễn giải. Các chương trình trước là các tệp văn bản chứa mã mà một chương trình khác—trình biên dịch—sẽ đọc và thực thi khi bạn chạy chúng. Các chương trình sau là các tệp nhị phân độc lập chứa mã máy và chạy trực tiếp.

Các tệp thực thi được biên dịch rất phổ biến, đặc biệt là đối với các chương trình lớn hơn. Khi bạn xây dựng từ nguồn, bạn sử dụng trình biên dịch—như gcc—để tạo tệp thực thi từ mã nguồn của ứng dụng, có thể được phân phối trên nhiều tệp riêng lẻ.

Vì việc xây dựng từ nguồn có thể là một quá trình phức tạp và kéo dài, nên nó thường được tự động hóa thông qua một chương trình khác, thường là Make. Bạn có thể viết các tệp make để 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, bản thân các makefile trở nên lớn và khó sử dụng. Đ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 các tình huống này, nhiều dự án tự động tạo makefile của mình bằng một công cụ có tên là autoconf/automake.

2. Quy trình xây dựng 3 bước: Cấu hình, Thực hiện, Cài đặt

Kết quả của tất cả những điều này là một mô hình chung mà nhiều phần mềm sử dụng để xây dựng từ nguồn:

Mã nguồn [Chọn]
./configure && make && make install
Nhiều chương trình phổ biến sử dụng mẫu này hoặc một biến thể khác, bao gồm Apache, giải thích quy trình này trong tệp INSTALL của chương trình:


Node.js là một ví dụ khác về phần mềm sử dụng mẫu này. Tệp   Đăng nhập để xem liên kết của nó chứa các hướng dẫn có liên quan:


Mỗi dự án có cách tiếp cận riêng để xây dựng nguồn của mình, ngay cả khi đó là một biến thể đơn giản của mô hì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ử logic AND (&&) sẽ khiến chuỗi dừng lại nếu một trong các phần của nó bị lỗi:
       
Mã nguồn [Chọn]
./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 chỉ sử dụng một dòng, với dấu chấm phẩy:

Mã nguồn [Chọn]
./configure; make; make install
Điều này sẽ khiến từng 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:
       
Mã nguồn [Chọn]
./configure
make
make install

Bạn có thể không muốn cài đặt hoàn toàn phần mềm, mà muốn chạy trực tiếp từ thư mục riêng của nó. Điều này hoàn toàn ổn; bạn chỉ cần bỏ lệnh make install.

Một số repo chứa một tập lệnh configure, một số khác (như grep) yêu cầu bạn chạy một tập lệnh khác tạo tệp configure này trước. Nếu bạn đang tìm kiếm tùy chọn dễ nhất, hãy luôn tham khảo tệp INSTALL hoặc BUILD hoặc README và làm theo khuyến nghị của dự án.

3. Cách./configure khởi động mọi thứ

Tập lệnh shell configure thường là điểm bắt đầu của quá trình xây dựng. Nó thiết lập phần còn lại của quá trình cho môi trường cụ thể của bạn.

Tập lệnh kiểm tra các phụ thuộc khác nhau mà dự án yêu cầu. Nó đảm bảo rằng tất cả các thành phần bắt buộc đề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ẽ có một tệp có tên Makefile được sử dụng ở giai đoạn tiếp theo.

Bản thân tập lệnh configure có thể cấu hình cao thông qua các tùy chọn dòng lệnh. Chạy./configure --help để biết mô tả toàn diện về chúng.

Cả configure và make đều tạo ra 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 để ngăn chặn hầu hết đầu ra.

Nếu không có tập lệnh configure, một dự án có thể cung cấp phương tiện để tạo một tập lệnh. Ví dụ, kho lưu trữ htop bao gồm một tập lệnh   Đăng nhập để xem liên kết. Chạy tập lệnh này sẽ tạo ra một tập lệnh configure:


Các dự án rất đơn giản và không được viết bằng ngôn ngữ C có thể hoàn toàn thiếu một tập lệnh cấu hình. Trong trường hợp này, quy trình ba bước trở thành quy trình hai bước: chỉ cần chạy make && make install.

Tập lệnh cấu hình 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 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 tùy chọn thay thế nếu bạn muốn sắp xếp các tệp của mình theo cách khác.

4. Lệnh make làm phần lớn công việc

Sau khi configure tạo ra makefile, bạn có thể bắt đầu quá trình thực tế xây dựng phần mềm. Chương trình make đọc trong makefile và kiểm tra một loạt các quy tắc để quyết định xây dựng cái gì.

Makefile viết tay 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, makefile mô tả cách tạo một tệp từ tệp khác, khi tệp sau cũ hơn. Ví dụ, makefile này mô tả quá trình xây dựng một chương trình rất đơn giản:
       
Mã nguồn [Chọ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 dựa trên các phụ thuộc của nó. Nếu không có gì thay đổi kể từ lần xây dựng cuối cùng—tức là program mới hơn program.c—make sẽ chỉ cần thoát, an toàn trong giả định rằng không cần phải làm gì cả. 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 thứ hơn để làm ngoài trường hợp đơn giản nhất 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 ra này cho chương trình htop dài 2.440 dòng:


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—bạn có thể chạy make mà không thực sự lo lắng về những gì đang xảy ra bên dưới.

Bước make có thể mất nhiều thời gian để chạy, đặc biệt là đố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 không thành công. Nguyên nhân thường là do thiếu sự 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 làm mất công việc đã thực hiện.

5. Kết thúc với make install

Một bản dựng thông thường sẽ tạo ra một tệp thực thi đã biên dịch, hoặc trong thư mục gốc của dự án hoặc thường trong một thư mục con có tên là bin. Đây thường là một chương trình độc lập mà bạn có thể chạy qua đường dẫn đầy đủ của nó:


Điều này phù hợp để 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ó ở vị trí thuận tiện hơn.

Hầu hết các makefile đều có mục tiêu cài đặt 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 tệp riêng lẻ và đặt quyền và quyền sở hữu phù 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 PATH để bạn có thể chạy chương trình chỉ bằng cách nhập tên chương trình vào dòng lệnh, thay vì đường dẫn đầy đủ.