Lệnh make trong Linux

Giới thiệu

Trong lab này, bạn sẽ học cách sử dụng lệnh make của Linux để tự động hóa quá trình xây dựng và biên dịch phần mềm từ mã nguồn. Bạn sẽ bắt đầu bằng cách hiểu mục đích và cú pháp của lệnh make, sau đó tạo một Makefile đơn giản và biên dịch một chương trình C. Cuối cùng, bạn sẽ khám phá việc sử dụng các biến và target của Makefile.

Lab này bao gồm các kỹ năng thiết yếu trong lĩnh vực Scripting and Programming, cung cấp các ví dụ thực tế và kinh nghiệm thực hành với lệnh make. Các bước được nêu trong lab sẽ hướng dẫn bạn quy trình thiết lập Makefile, quản lý các dependency và biên dịch chương trình C của bạn một cách hiệu quả.

Hiểu Mục Đích và Cú Pháp của Lệnh make

Trong bước này, bạn sẽ tìm hiểu về mục đích và cú pháp của lệnh make trong Linux. Lệnh make là một công cụ được sử dụng để tự động hóa quá trình xây dựng và biên dịch phần mềm từ mã nguồn.

Đầu tiên, hãy hiểu mục đích của lệnh make. Lệnh make đọc một file gọi là "Makefile" chứa các hướng dẫn về cách xây dựng một chương trình hoặc dự án. Makefile chỉ định các dependency giữa các file mã nguồn khác nhau, cũng như các lệnh cần thiết để biên dịch và liên kết chương trình.

Cú pháp cơ bản của lệnh make là:

make [target]

Trong đó [target] là tên của target bạn muốn xây dựng. Nếu không có target nào được chỉ định, make sẽ xây dựng target đầu tiên được định nghĩa trong Makefile.

Đây là một ví dụ về một Makefile đơn giản:

all: hello

hello: hello.c
    gcc -o hello hello.c

Trong ví dụ này, target all phụ thuộc vào target hello, đến lượt target này lại phụ thuộc vào file mã nguồn hello.c. Khi bạn chạy make, nó sẽ biên dịch file hello.c và tạo ra file thực thi hello.

Hãy thử nó. Đầu tiên, tạo file hello.c:

nano hello.c

Thêm nội dung sau:

#include <stdio.h>

int main() {
    printf("Hello, world!\n");
    return 0;
}

Lưu và thoát trình soạn thảo.

Bây giờ, hãy chạy lệnh make:

make

Ví dụ đầu ra:

gcc -o hello hello.c

Lệnh make đã biên dịch file hello.c và tạo ra file thực thi hello.

Tạo một Makefile Đơn Giản và Biên Dịch một Chương Trình C

Trong bước này, bạn sẽ học cách tạo một Makefile đơn giản và sử dụng nó để biên dịch một chương trình C.

Đầu tiên, hãy tạo một file C mới có tên hello.c trong thư mục ~/project:

nano ~/project/hello.c

Thêm nội dung sau vào file:

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

Lưu và thoát trình soạn thảo.

Bây giờ, hãy tạo một Makefile đơn giản trong thư mục ~/project:

nano ~/project/Makefile

Thêm nội dung sau vào Makefile:

all: hello

hello: hello.c
    gcc -o hello hello.c

Makefile này định nghĩa một target có tên là hello phụ thuộc vào file hello.c. Lệnh gcc được sử dụng để biên dịch file hello.c và tạo ra file thực thi hello.

Để biên dịch chương trình bằng Makefile, hãy chạy lệnh sau trong thư mục ~/project:

make

Ví dụ đầu ra:

gcc -o hello hello.c

Lệnh make đã biên dịch file hello.c và tạo ra file thực thi hello.

Bây giờ bạn có thể chạy chương trình hello:

./hello

Ví dụ đầu ra:

Hello, World!

Lệnh make đã biên dịch thành công chương trình C bằng Makefile.

Sử Dụng Biến và Target của Makefile

Trong bước này, bạn sẽ học cách sử dụng các biến và target trong Makefile để làm cho quá trình xây dựng của bạn linh hoạt và dễ bảo trì hơn.

Hãy bắt đầu bằng cách sửa đổi Makefile mà chúng ta đã tạo ở bước trước. Mở Makefile trong thư mục ~/project:

nano ~/project/Makefile

Cập nhật Makefile với nội dung sau:

CC = gcc
CFLAGS = -Wall -Wextra -O2

all: hello

hello: hello.c
    $(CC) $(CFLAGS) -o hello hello.c

Trong Makefile đã cập nhật này, chúng ta đã giới thiệu hai biến:

  1. CC: Biến này lưu trữ tên của trình biên dịch C để sử dụng. Chúng ta đã đặt nó thành gcc.
  2. CFLAGS: Biến này lưu trữ các flag biên dịch để sử dụng. Chúng ta đã đặt nó thành -Wall -Wextra -O2, cho phép các cảnh báo trình biên dịch bổ sung và tối ưu hóa mã đã biên dịch.

Chúng ta cũng đã cập nhật lệnh biên dịch để sử dụng các biến này:

    $(CC) $(CFLAGS) -o hello hello.c

Điều này làm cho Makefile linh hoạt hơn, vì bạn có thể dễ dàng thay đổi trình biên dịch hoặc các flag biên dịch bằng cách sửa đổi các giá trị biến.

Bây giờ, hãy thử xây dựng lại chương trình hello bằng Makefile đã cập nhật:

make

Ví dụ đầu ra:

gcc -Wall -Wextra -O2 -o hello hello.c

Lệnh make đã sử dụng các biến được định nghĩa trong Makefile để biên dịch file hello.c.

Bạn cũng có thể định nghĩa các target bổ sung trong Makefile. Ví dụ: hãy thêm target clean để xóa file thực thi hello đã biên dịch:

CC = gcc
CFLAGS = -Wall -Wextra -O2

all: hello

hello: hello.c
    $(CC) $(CFLAGS) -o hello hello.c

clean:
    rm -f hello

Bây giờ, bạn có thể chạy make clean để xóa file thực thi hello:

make clean

Ví dụ đầu ra:

rm -f hello

Lệnh make clean đã xóa file thực thi hello.

Tóm tắt

Trong lab này, bạn đã tìm hiểu về mục đích và cú pháp của lệnh make trong Linux, được sử dụng để tự động hóa quá trình xây dựng và biên dịch phần mềm từ mã nguồn. Bạn đã tạo một Makefile đơn giản và sử dụng nó để biên dịch một chương trình C, hiểu cách định nghĩa các dependency và xây dựng các target. Ngoài ra, bạn đã khám phá việc sử dụng các biến và target của Makefile để làm cho quá trình xây dựng linh hoạt và có thể tái sử dụng hơn.

400+ câu lệnh phổ biến trong Linux