Vì sao ta phải dùng Makefile?

Một phần của tài liệu Báo Cáo LẬP TRÌNH HỆ THỐNG Đề Tài Hệ điều hành Linux (Trang 50)

III. Trình bày sự khác nhau trong cấu trúc điều khiển giữa 2 loại shell này

1. Vì sao ta phải dùng Makefile?

- Có rất nhiều dòng code - Các thành phần phức tạp. - Nhiều hơn 1 người lập trình

 Các vấn đề:

- Các file dài khó để quản lí (cho cả người lập trình và máy).

- Mọi thay đổi đề đòi hỏi sự biên dịch dài. Nhiều người lập trình không thể chỉnh sửa các file đòng thời.

 Giải pháp: chia project(dự án/công trình) thành các file.

 Mục tiêu:

- Phân chia tốt các thành phần

- Tối thiểu sự biên dịch khi có gì đó thay đổi.

- Dễ dàng bảo trì cấu trúc project, sự phụ thuộc và sự sáng tạo.

. Đ Makefile

- ,

- :

CC=gcc # the C compiler is gcc

CFLAGS=-g -Wall -I/usr/include/libxml2 LIBS=-lxml2

tut_prog: main.o aux.o

$(CC) $(LIBS) main.o aux.o -o tut_prog main.o: main.c $(CC) -c $(CFLAGS) main.c aux.o: aux.c $(CC) -c $(CFLAGS) aux.c . N) , CFLAGS, LIBS

. : +CC „gcc‟ CXX ++‟ CPP $(cc) –e‟ RM –f‟ CFLAGS LDFLAGS

2.

target: prerequisites…. command

... ...

- target thường là tên của file được tạo ra bởi chương trình, hoặc cũng có thể là các chỉ định để thực thi một hoặc một loạt tác vụ nào đó. Các target không được bắt đầu bằng dấu '.'

- prerequisite là file hoặc các file đầu vào hoặc phụ thuộc để tạo ra target. target thường phụ thuộc vào các file này, khi các file này thay đổi (do chỉnh sửa mã nguồn->thời gian lưu cửa file bị thay đổi) thì target sẽ được biên dịch lại. - command là lệnh hoặc tập lệnh mà trình make sẽ thực thi. Một rule (quy tắc)

có thể có nhiều lệnh (command), mỗi lệnh thường được viết trên một dòng. Chú ý: trước mỗi dòng lệnh bạn cần phải có dấu tab. Dấu '\' ở cuối dòng để quy định dòng dưới tiếp theo thực chất cũng là dòng trên, vì dòng trên dài quá, nên chúng ta có thể ngắt xuống dưới bằng dấu này.

Các biến:

Các biến được dùng để rút gọn, khai báo có dạng sau:

var=text1text2..textn

Khi sử dụng để tham chiếu ta dùng theo dạng $(var) .

. - - . : all check clean distclean dist (tar.gz) install ) uninstall

Tạo ra Makefile: Nội dung của Makefile của project như sau: Code: USER_DIR=.. LIB_DIR=$(USER_DIR)/libraries MAIN_FILE_DIR=$(USER_DIR)/mainFile INC=-I$(LIB_DIR) #compiler CC=gcc FLAG= -Wall-g-W #source STUB=$(LIB_DIR)/ipc.c $(LIB_DIR)/person.c #nameofmainfile MAIN_FILE_NAME=sample1 #object

OBJECT= ipc.o person.o #The Target

run: ready code

$(CC)$(INC)$(FLAG)$(MAIN_FILE_NAME).o$(OBJECT)-o run ready:

$(CC)$(INC)$(FLAG) -c $(STUB) code:

$(CC) $(INC) $(FLAG) -c $(MAIN_FILE_DIR)/$(MAIN_FILE_NAME).c clean

rm -rf *.o run

Những từ viết in hoa đó là các biến môi trường (such as: USER_DIR, GXX, FLAG, MAIN_FILE_NAME,....) sau dấu = của các biến môi trường là nội dung được gán cho các biến

Vídụ:

USER_DIR=.. <-- biến USER_DIR với nội dung là ".."

Một số lời khuyên khi tạo Makefile: - Bạn nên tạo ra biến môi trường:

Ở ví dụ trên nếu không dùng biến môi trường mà viết thẳng trong các target dòng lệnh luôn, tức là Makefile của trở thành:

Code:

run: ready code

gcc -I../libraries -Wall -g -W sample1.o ipc.o person.o -o run ready:

gcc -I../libraries -Wall -g -W -c ../libraries/ipc.c ../libraries/person.c code:

gcc -I../libraries -Wall -g -W -c ../mainFile/sample1.c clean:

rm -rf *.o run

thì Makefile vẫn hoạt động bình thường tuy nhiên make file này chỉ có thể dịch cho mỗi file sample1.c hoặc nếu muốn thay thành sample2.c thì phải thay cả ở run,code.

- Nên tạo ra Target có chức năng tương tự target clean:

Khi làm việc với project lớn thì việc tạo clean khá quan trọng vì khi gọi nó sẽ xóa đi những gì được gọi là rác trong quá trình build như là những file object hoặc file executable cũ chẳng hạn.

3. Ví dụ Demo sử dụng Makefile

Viết chương trình cho phép nhập vào một số nguyên, yêu cầu xuất ra màn hình số vừa nhập là chẵn hay lẻ ?

Các bước thực hiện:

Tạo file main.c // chương trình chính Code: #include <stdio.h> #include "header.h" void main(void) { int num;

scanf("%d",&num); if(odd_even(num))

printf("%d la so chan \n",num); else

printf("%d la so le \n",num); printf("\n");

}

1. Tạo file function.c // hàm phân biệt chẵn lẻ Code: int odd_even(int x) { if(x % 2 == 0) return 1; else return 0; }

2. Tạo file header.h // khai báo nguyên hàm nguyên mẫu Code:

int odd_even(int x);

Tạo file Makefile // nội dung make - Code không sử dụng biến:

main: main.o function.o

gcc main.o function.o -o main main.o: main.c

gcc -c main.c

function.o: function.c header.h gcc -c function.c

clearn: rm *.o

- Code có sử dụng biến: USER_DIR=.. WORK_DIR=$(USER_DIR)/Desktop/makefile CC=gcc OBJECT=main.o function.o MAIN_FILE=main MAIN_FILE: $(OBJECT) $(CC) $(OBJECT) -o $(MAIN_FILE) $(WORK_DIR)/main.o: $(WORK_DIR)/main.c CC -c $(WORK_DIR)/main.c $(WORK_DIR)/function.o: $(WORK_DIR)/function.c CC -c $(WORK_DIR)/function.c clearn: rm *.o

3. Từ Terminal với đường dẫn trong thư mục các file vừa tạo, gõ lệnh : a. make // thực thi Makefile

b. ./main // chạy chương trình

Một phần của tài liệu Báo Cáo LẬP TRÌNH HỆ THỐNG Đề Tài Hệ điều hành Linux (Trang 50)

Tải bản đầy đủ (PDF)

(57 trang)