Makefile là gì ? | Học ARM

Makefile là gì ? Những vấn đề có liên quan tới makefile và bí quyết đơn giản để tiếp cận và làm cho quen có makefile là như thế nào ? Mình cùng tìm hiểu qua những dí dụ đơn giản sau nhé.

Lúc biên dịch 1 chương trình đơn giản như bài viết trước thì quá khỏe, chỉ có 1 vài file. Trường hợp số lượng file cần biên dịch nâng cao lên, chương trình phức tạp hơn, nhiều lệnh hơn, nhiều modul hơn và nhiều người tham dự viết hơn thì sẽ có vấn đề phát sinh:

  • Khó quản lý 1 file lớn (cả người và máy)
  • Từng thay đổi đổi cần thời kì biên dịch nhiều ngày
  • Nhiều người lập trình ko thể thay đổi đổi cùng 1 file đồng thời
  • Chương trình được phân ra thành nhiều module

Giải pháp cho vấn đề này là gì ?

  • Chia undertaking ra thành những modul 1 bí quyết đúng đắn
  • Thời kì biên dịch cần ngắn trường hợp có sự thay đổi đổi
  • Dễ dàng bảo trì cấu trúc undertaking

Makefile là gì?

  • Makefile là 1 file dạng script chứa những thông tin:
  • Cấu trúc undertaking (file, sự phụ thuộc)
  • Những lệnh để tạo file
  • Lệnh make sẽ đọc nội dung Makefile, hiểu kiến trúc của undertaking và thực thi những lệnh

1 số dí dụ cơ bản

Mình sẽ đi vào 1 số dí dụ có makefile cơ bản để mọi người có thể nắm bắt luôn.

Chương trình đơn giản in ra dòng Hi there makefiles được viết thành 3 file

hellomake.c

#embrace <hellomake.h> int predominant() { // name a perform in one other file myPrintHelloMake(); return(0); }

hellofunc.c

#embrace <stdio.h> #embrace <hellomake.h> void myPrintHelloMake(void) { printf(“Hi there makefiles!n”); return; }

Xem Thêm  Nhà loại me88 nhà loại hàng đầu châu lục hiện nay

hellomake.h

/* instance embrace file */ void myPrintHelloMake(void);

Để khởi đầu chúng ta cần có 3 file bỏ chung vào 1 thư phần là hellomake.c tương ứng chương trình chính, hellofunc.c là file hàm in thông tin, và hellomake.h là file header khai báo hàm in.

Thông thường chúng ta có thể compile code và xem kết quả 1 bí quyết đơn giản bằng lệnh sau

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

Lệnh này sẽ thực hành compile 2 file .c. -I. có nghĩa là embrace gcc sẽ thực hành kiếm tìm trong thư phần hiện tại(.) để thêm file hellomake.h.

Trường hợp ko có makefile thì từng compile chúng ta lại cần mở terminal lên và gõ lệnh gcc -o … vào, điều này trở nên quá phiền hà, đặc biệt là lúc chúng ta add thêm nhiều file .c khác vào trong chương trình hoặc lúc chúng ta sửa lại nội dung code trong những file .c

Vậy makefile sẽ khắc phục hạn chế trên trên như thế nào ?

Makefile 1

Trước tiên để dùng được makefile thì cần tạo file có tên là Makefile hoặc makefile trong thư phần chứa code hiện có có nội dung

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

1 cấu trúc make file cơ bản sẽ có dạng cơ bản như sau

Rule: những rule cần thực hành lúc compile

Dependency: là những file cần thiết để tạo ra goal

Motion: là câu lệnh compile để tạo ra Goal từ Dependency. Motion được thụt lùi vào 1 Tab (phím tab trên bàn phím) so có Goal

Xem Thêm  Đa cấp là gì? Những dấu hiệu để nhận biết đa cấp là gì?

Goal: là file đích, nghĩa là file được hình thành sau khoản thời gian quy trình make được thực hành.

Vậy là trong thư phần chúng ta sẽ có 4 file hellofunc.c hellomake.c hellomake.h và Makefile

Chạy chương trình bằng lệnh sau

$ make $ ./hellomake

Makefile 2

CC=gcc CFLAGS=-I. hellomake: hellomake.o hellofunc.o $(CC) -o hellomake hellomake.o hellofunc.o -I.

Chúng ta tiếp tục phát triển thành thêm 1 chút bằng bí quyết thêm CC và CFLAGS vào Makefile trên trên

  • CC: là compiler C được dùng
  • CFLAGS: là danh sách những flag của compiler

Có 1 điểm khác nữa là thêm 2 file object là hellomake.o và hellofunc.o trong dependency record và trong rule để make biết rằng đây là lần trước tiên của quy trình biên dịch.

Có việc dùng makefile như trên thì đã có thể làm cho được những undertaking bé bé rồi. Tuy nhiên vẫn còn thiếu dependency là những file embrace. Giả sử như ta có thay đổi đổi trên file hellomake.h thì make sẽ ko biên dịch lại file .c. Để khắc phục lỗi này thì ta cần cần thông tin cho make rằng hầu hết những file .c đều bị phụ thuộc vào file .h, lúc compile nhớ cần lưu ý nha make em.

Makefile 3

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.

Như mình đã nói trên trên, trên Makefile này sẽ tạo ra 1 macro là DEPS để chỉ ra file .h mà những file .c phụ thuộc vào. Bên cạnh ra sẽ có 1 định nghĩa về rule vận dụng cho hầu hết những file .o, rule này thông tin rằng những file .o phụ thuộc vào những file .c và .h được định nghĩa trong macro là DEPS (dòng 5). Rule sẽ tạo ra file .o, make được dùng C compile được định nghĩa trong CC để compile những file c.(dòng 6)

Xem Thêm  Bảng màu sắc shade scheme và mã màu sắc đẹp cho thiết kế web site 2023 | sentayho.com.vn

Có 1 số lưu ý:

  • -c là tạo ra những object file
  • -o $@ là tạo ra output của quy trình biên dịch trong tập tin bên trái dấu :
  • $< là thành phần đàu tiên trong danh sách của dependency và CFLAGS là macro đã được định nghĩa trên dòng 2

Tiếp tục bước cuối cùng là dùng những macro đặc biệt như $@ và @^ để lấy thông tin bên trái và bên cần của dấu : để làm cho cho quy trình biên dịch được tổng quát hơn, cụ thể là những file embrace sẽ được đưa vào trong macro DEPS, hầu hết những object file được đưa vào macro OBJ như 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)

Ta sẽ thấy 1 số file được sinh ra sau quy trình make như hình dưới

Makefile là gì ? | Học ARM

Trường hợp người trải nghiệm thấy chưa đã thì có thể theo dõi tiếp collection make tại đây

Tạm kết

Coi như chúng ta đã tìm hiểu được make thông qua 1 số dí dụ, chỉ giới hạn trên mức độ đơn giản và tìm hiểu, chuyên dụng cho được cho những undertaking bé, nó sẽ có 1 vấn đề có những undertaking lớn, phức tạp hơn, mình xin để dành cho collection make trên phía trên 😀