Title Image

Blog Logo

Thực hành với Makefile (1)

🌱 Thực hành với Makefile (1)

    Sau một số bài giới thiệu thì hôm nay mình sẽ cùng các bạn thực hành với Makefile. Để thực hành viết một Makefile cơ bản, bước đầu tiên là cần cài đặt Cygwin mình đã giới thiệu ở bài đầu tiên.


    Và điều không thể thiết trước khi thực hành là các bạn cần nắm được lý thuyết về Makefile:

    👉 Đề bài - Viết Makefile cho Project cơ bản

     Viết Makefile cho project cơ bản sau:



    Folder Project là Helloworld bao gồm: 
  • Folder include chứa các Header Files (sum.h).
  • Folder source chứa các source file (main.c, sum.c).
  • Folder ouput chứa các file object và file thực thi exe sau khi build.
  • Makefile là Makefile cần viết để thực hiện việc build.
    Với file main.c và sum.c đều gọi file sum.h => Mục đích chương trình là tính tổng 2 số.

    👉 Sử dụng GCC cơ bản

    Theo bài viết sử dụng lệnh GCC thì ta có thể dùng một số lệnh sau để build là file exe cho chương trình trên:
  • Mở cửa sổ cmd. Trỏ đến folder Helloword của project bằng lệnh cd.
  • Tạo các file object (main.o, sum.o lưu vào folder output từ các file sources)
    gcc -I./include -c ./source/main.c -o ./output/main.o
    gcc -I./include -c ./source/sum.c -o ./output/sum.o
  • Link các file object với nhau tạo thành file main.exe lưu trong folder output
    gcc ./output/main.o ./output/sum.o -o ./output/main.exe
  • Để chạy file main.exe thì ta nhảy vào trong folder output và gọi main.exe.
    ./output/main.exe
  • Để xóa các file trong output, ta nhảy vào đó gọi rm
    rm ./output/*

    👉 Viết Makefile

    Sau khi đã hiểu các câu lệnh GCC ở trên thì việc ta viết Makefile chỉ là việc tối ưu hóa cho việc gọi lệnh trên. Các tác dụng của Makefile đã được nêu ở những bài trước nên mình không nhắc lại.
    ✌ Thay vì sử dụng những lời gọi như kiểu: ./source/main.c để gọi một file source, hay ./output/main.o để gọi một file object ra sẽ dùng các functions variables để tổng quát hóa, để sau này dù có thêm file soure vào, ta cũng không cần chỉnh lại makefile (Thay vì thêm 1 dòng gcc như ở trên).
    Để làm vậy, ta dùng các biến để đại diện cho các đường dẫn folder như sau:

 

     ✌ Để list ra toàn bộ các file sourt hay file header có trong INC_DIRS và SRC_DIR, ta có thể dùng 2 functions là foreach wildcard như sau:


     ✌ Để lấy đường dẫn của các file source và header:

     ✌ Để thay thế cho 2 câu lệnh gcc tạo file object, ta chỉ cần một Rules chung do cấu trúc 2 lệnh đó giống nhau, sử dụng các Automatic Variable như $<, $@, và wildcard %. Rules gốc giống như câu lệnh gcc sẽ giống comment bên dưới + thêm câu lệnh tương tự với sum.o.


     ✌ Để lấy file object mà không có đường dẫn, phục vụ cho việc tạo file .exe, ta dùng function notdir subst như sau:


     ✌ Sau đó là Rule đại diện cho câu lệnh tạo file main.exe và chạy file này. Chỗ này có thể tách 2 lệnh ra thành build run riêng.


    ✌ Viết thêm một Rule để xóa các file output:

     ✌ Với việc khi gọi lệnh make thì nó sẽ chọn cái target đầu tiên để chạy, nên ta sẽ đặt một target chung lên đầu như sau: 

    
    Để khi gọi make thì nó sẽ tạo các file object, từ đó tạo và run file exe.
    👉 Chạy Makefile
    Sau khi đã có Makefile. Các bạn vào Cygwin, trỏ đến thư mục Helloword bằng lejeng cd ".../Helloword" rồi sau đó có thể sử dụng các lệnh sau:

  • make all : tạo ra các file object.
  • make build : tạo ra file main.exe và chạy nó => chạy là ra kết quả mong muốn liền !!!
  • make clean : xóa các file trong output
    Ok! đó là một bài Makefile đơn giản, các bạn có thể thực hành và download project mình đã viết sẵn tại đây.

    ➤ Bài sau chúng ta sẽ tiếp tục với ví dụ nâng cao hơn liên quan đến Vi điều khiển. 

    Chúc các bạn học tập tốt 😊

Đăng nhận xét

0 Nhận xét