Ad
Thủ Thuật Công Nghệ

Makefile là gì? Một số ví dụ cụ thể

Pinterest LinkedIn Tumblr

Trong quá trình biên dịch một chương trình đơn giản việc số lượng file tăng, chương trình phức tạp, nhiều lệnh, module hơn thì việc Makefile là vô cùng cần thiết. Trong bài viết ngày hôm nay chúng ta cùng tìm hiểu rõ khái niệm Makefile là gì và cùng nghiên cứu các ví dụ về khái niệm này.

Makefile là gì?

Makefile là một tập tin script chứa thông tin về cấu trúc dự án, bao gồm các tệp tin và sự phụ thuộc giữa chúng, cũng như các lệnh cần thiết để tạo ra các tệp tin. Các tệp tin được tạo ra thông qua quy trình này được gọi là Target, trong khi các tệp tin phụ thuộc được gọi là Dependence. Lệnh được sử dụng để biên dịch mã nguồn được gọi là Action. Mỗi quy tắc bao gồm Target, Dependence và Action tạo nên quy tắc (Rule) trong Makefile.

Makefile là gì?
Makefile là gì?

Các ví dụ về Makefile

Sau đây sẽ là một số ví dụ cơ bản để mọi người hiểu hơn về Makefile là gì. Đầu tiên ta có chương trình đơn giản in ra “Hello” được tạo thành 3 file sau:

File 1: hellomake.c

#include <hellomake.h>


int main() {
  // call a function in another file
  myPrintHelloMake();

  return(0);
}

File 2: hellofunc.c

#include <stdio.h>
#include <hellomake.h>

void myPrintHelloMake(void) {

printf("Hello makefiles!\n");

return;
}

File 3: hellomake.h

/*

example include file

*/

void myPrintHelloMake(void);

Ta bỏ 3 file vào chung một thư mục tên hellomake.c coi là chương trình chính. Đây là file hàm có nhiệm vụ in thông báo trong khi đó file hellomake.h là file header có nhiệm vụ khai báo hàm in. Thông thường chúng ta có thể xem kết quả đơn bằng cách compile code theo lệnh:

$ gcc -o hellomake hellomake.c hellofunc.c -I.

$ ./hellomake

Lệnh này sẽ compile 2 file .c. -I. hay include gcc thực hiện tìm trong thư mục hiện tại để bổ sung file hellomake.h.

Trong trường hợp không có Makefile thì đối với mỗi compile chúng ta sẽ phải mở terminal rồi gõ lệnh gcc – o… Các thao tác này sẽ khá khó khăn nhất là khi chúng ta phải add nhiều file .c hay sửa lại code trong các file .c. Để khắc phục những hạn chế này, Makefile đã ra đời và tối ưu hóa quy trình hơn.

Makefile 1

Đầu tiên, ta cần tạo file có tên Makefile hay sử dụng Makefile có trong thư mục chứa code hiện có với nội dung như sau:

CC=gcc
CFLAGS=-I.

hellomake: hellomake.c hellofunc.c
$(CC) -o hellomake hellomake.c hellofunc.c -I.

Một cấu trúc Makefile sẽ bao gồm:

Makefile 1

Trong đó:

  • Rule: các quy tắc cần thực hiện khi Compile
  • Dependency: Các file cần thiết khi tạo Target
  • Action: Lệnh Compile nhằm tạo Target từ Dependency. Thường thì Action sẽ lùi 1 tab so với Target
  • Target: File đích được hình thành sau quá trình make xong. Chúng ta sẽ có 4 file gồm: hellomake.h hellofunc.c hellomake.c và cả Makefile. Bạn cần chạy chương trình với lệnh:
$ make

$ ./hellomake

Makefile 2

Sử dụng lệnh sau đây:

CC=gcc
CFLAGS=-I.

hellomake: hellomake.o hellofunc.o
$(CC) -o hellomake hellomake.o hellofunc.o -I.

Chúng ta phát triển thêm CC và CFLAGS vào Makefile, trong đó:

  • CC: Compiler C
  • CFLAGS: danh sách flag của Compiler

Một điểm khác là thêm 2 file object là hellofunc.o và hellomake.o trong danh sách dependency và cả trong rule nhằm cho make biết đây là lần đầu biên dịch. Bằng việc sử dụng Makefile như vậy thì ta có thể thực hành các project nhỏ tuy nhiên vẫn thiếu file include. Giả sử ta thay đổi file hellomake.h thì make không biên dịch lại file.c, nhằm hạn chế lỗi này ta phải thông báo make rằng mọi file .c đều phụ thuộc .h

Makefile 3

Dùng lệnh:

CC=gcc
CFLAGS=-I.
DEPS = hellomake.h

%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)

hellomake: hellomake.o hellofunc.o 
gcc -o hellomake hellomake.o hellofunc.o -I.

Makefile này có nhiệm vụ tạo macro là DEPS nhằm chỉ ra file.h mà file .c phụ thuộc. Ngoài ra, có một quy tắc áp dụng cho tất cả các tệp .o. Quy tắc này thông báo rằng các tệp .o phụ thuộc vào các tệp .c và .h được xác định trong macro DEPS (dòng 5). Quy tắc sẽ tạo ra các tệp .o bằng cách sử dụng trình biên dịch C được xác định trong CC để biên dịch các tệp .c (dòng 6).

Lưu ý:

  • -c tạo object file
  • -o $@ tạo output quá trình biên dịch tệp tin trái dấu
  • $< là thành phần đầu trong danh sách dependency còn CFLAGS là macro được định nghĩa ở dòng 2

Tiếp theo, chúng ta sử dụng các macro đặc biệt như $@ và @^ để trích xuất thông tin từ phía trái và phía phải của dấu :. Điều này giúp quá trình biên dịch trở nên tổng quát hơn, đặc biệt là khi các tệp include được liệt kê trong macro DEPS và tất cả các tệp object được thêm vào macro OBJ, như trong makefile 4.

Makefile 4

CC=gcc

CFLAGS=-I.

DEPS = hellomake.h

OBJ = hellomake.o hellofunc.o 


%.o: %.c $(DEPS)

$(CC) -c -o $@ $< $(CFLAGS)



hellomake: $(OBJ)

gcc -o $@ $^ $(CFLAGS)

Sau khi dùng lệnh ta sẽ thấy các file như hình sau đây:

Makefile 4
Makefile 4

Tầm quan trọng của Makefile 

Makefile là một tệp tin chứa các hướng dẫn và quy tắc để xây dựng, biên dịch và quản lý dự án phần mềm. Nó được sử dụng trong quá trình phát triển phần mềm để tự động hóa các công đoạn của quá trình xây dựng và biên dịch mã nguồn. Thông qua các quy tắc và hướng dẫn trong Makefile, người phát triển có thể định nghĩa cách thức xây dựng chương trình, quản lý phụ thuộc, và thực hiện các công việc liên quan đến quá trình phát triển phần mềm một cách hiệu quả.

Makefile thường đi kèm với các ngôn ngữ lập trình như C, C++ và nhiều ngôn ngữ khác, nhằm giúp tự động hóa quy trình biên dịch và xây dựng. Makefile cung cấp các quy tắc (rules) để xác định cách tạo ra các file đối tượng từ mã nguồn, cách liên kết chúng thành các chương trình thực thi hay các công việc khác như làm sạch dự án hoặc cài đặt chương trình.

Kết luận

Trên đây là tổng quan về Makefile là gì, hy vọng với những ví dụ mà Wiki Lanit đưa ra có thể giúp bạn hiểu rõ hơn về khái niệm này. Đừng quên nhấn theo dõi để cập nhật các thông tin hữu ích khác nhé!

Mình là Tú Anh - Hiện mình đang đảm nhận một số mảng trong chiến dịch Marketing tại LANIT. Mình đã có kinh nghiệm nhiều năm trong mảng kinh doanh online, nên rất hy vọng với những kiến thức mình chia sẻ về lĩnh vực này sẽ thật sự hữu ích đối với các bạn.

Comments are closed.