1. Trang chủ
  2. » Luận Văn - Báo Cáo

SỬ DỤNG UBUNTU VÀ MAKEFILE

17 744 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 17
Dung lượng 407,8 KB

Nội dung

SỬ DỤNG UBUNTU VÀ MAKEFILE

Trang 1

Trường Đại Học Bách Khoa Hà Nội Viện Điện Tử Viễn Thông

======o0o======

BÁO CÁO TUẦN 1

SỬ DỤNG UBUNTU VÀ

MAKEFILE

20111719 ĐTTT10-K56

Hà Nội, 7/2014

Trang 2

MỤC LỤC

MỤC LỤC 1

1 Học cách sử dụng ubuntu 2

1.1 Ubuntu là gì? 2

1.2 Tập lệnh cơ bản 2

1.2.1 Lệnh liên quan đến hệ thống 2

1.2.2 Lệnh thao tác tập tin 2

1.2.3 Lệnh làm việc trên terminal 3

1.2.4 Lệnh quản lý hệ thống 3

2 Make file 4

2.1 Định nghĩa 4

2.2 Quy tắc chung 4

2.3 Tổng quan về make 4

2.3.1 Gọi make trên terminal 4

2.3.2 Ví dụ cơ bản 5

2.3.3 Sử dụng biến môi trường 6

2.3.4 Bài toán make những file ở ngoài thư mục root 6

2.4 Những quy luật cụ thể trong makefiile 8

2.4.1 Explicit rules: 8

2.4.2 Wildcards - những kí tự đại diện 8

2.4.3 Phony targets( đích đến giả) 9

2.4.4 Empty targets( đích đến trống) 9

2.4.5 Variables and Automatic Variables(Biến và các biến tự động) 9

2.4.6 VPATH và vpath 10

2.4.7 Quản lý thư viện 11

2.5 Hàm 11

2.5.1 Cú pháp của hàm 12

2.5.2 Những hàm thực hiện thao tác trên văn bản 12

2.5.3 Những hàm thao tác với tên file 13

2.5.4 Những hàm có điều kiện 14

2.5.5 Hàm foreach 14

2.5.6 Hàm file 15

2.5.7 Hàm Call 15

2.5.8 Hàm Value 15

2.5.9 Hàm Origin 15

2.5.10 Hàm flavor 15

Trang 3

1 Học cách sử dụng ubuntu

1.1 Ubuntu là gì?

- Ubuntu (phát âm IPA uːˈbuːntuː) là một hệ điều hành máy tính dựa trên Debian GNU/Linux, một bản phân phối Linux thông dụng Tên của nó bắt nguồn từ "ubuntu" trong tiếng Zulu, có nghĩa là "tình người", mô tả triết lí ubuntu: "Tôi được là chính mình nhờ có những người xung quanh," một khía cạnh tích cực của cộng đồng Mục đính của Ubuntu bao gồm việc cung cấp một hệ điều hành ổn định, cập nhật cho người dùng bình thường, và tập trung vào sự tiện dụng và dễ dàng cài đặt Ubuntu đã được đánh xếp hạng là bản phân phối Linux thông dụng nhất cho máy tính để bàn, chiếm khoảng 30% số bản Linux được cài đặt trên máy tính để bàn năm 2007

- Ubuntu là phần mềm mã nguồn mở tự do, có nghĩa là người dùng được tự do chạy, sao chép, phân phối, nghiên cứu, thay đổi và cải tiến phần mềm theo điều

khoản của giấy phép GNU GPL Ubuntu được tài trợ bởi Canonical Ltd (chủ sở hữu

là một người Nam Phi Mark Shuttleworth) Thay vì bán Ubuntu, Canonical tạo ra doanh thu bằng cách bán hỗ trợ kĩ thuật Bằng vệc để cho Ubuntu tự do và mở mã nguồn, Canonical có thể tận dụng tài năng của những nhà phát triển ở bên ngoài trong các thành phần cấu tạo của Ubuntu mà không cần phải tự mình phát triển

- Canonical ủng hộ và cung cấp hỗ trợ cho bốn bản phân phối dựa trên Ubuntu khác: Kubuntu và Xubuntu, vốn sử dụng KDE và Xfce như là môi trường desktop thay cho hệ thống GNOME mặc định được sử dụng bởi Ubuntu; Edubuntu, một dự

án con và là phần bổ sung cho Ubuntu, được thiết kế cho môi trường học tập và sử dụng ở nhà; and Ubuntu JeOS (pronounced "Juice"), một phiên bản khác của Ubuntu, thiết kế cho các máy ảo

1.2 Tập lệnh cơ bản

1.2.1 Lệnh liên quan đến hệ thống.

 exit: thoát khỏi cửa sổ dòng lệnh

 logout: tương tự exit

 reboot: khởi động lại hệ thống

 halt: tắt máy

 startx: khởi động chế độ xwindows từ cửa sổ terminal

 mount: gắn hệ thống tập tin từ một thiết bị lưu trữ vào cây thư mục chính

 unmount: ngược với lệnh mount

1.2.2 Lệnh thao tác tập tin

 ls: lấy danh sách tất cả các file và thư mục trong thư mục hiện hành

 pwd: xuất đường dẫn của thư mục làm việc

Trang 4

 cd: thay đổi thư mục làm việc đến một thư mục mới.

 mkdir: tạo thư mục mới

 rmdir: xoá thư mục rỗng

 cp: copy một hay nhiều tập tin đến thư mục mới

 mv: đổi tên hay di chuyển tập tin, thư mục

 rm: xóa tập tin

 wc: đếm số dòng, số kí tự trong tập tin

 touch: tạo một tập tin

 cat: xem nội dung tập tin

 vi: khởi động trình soạn thảo văn bản vi

 df: kiểm tra dung lượng đĩa

 du: xem dung lượng đĩa đã dùng cho một số tập tin nhất định

1.2.3 Lệnh làm việc trên terminal

 clear: xoá trắng cửa sổ dòng lệnh

 date: xem ngày, giờ hệ thống

 cal: xem lịch hệ thống

1.2.4 Lệnh quản lý hệ thống

 rpm: kiểm tra gói đã cài đặt hay chưa, hoặc cài đặt một gói, hoặc sử dụng để gỡ

bỏ một gói

 ps: kiểm tra hệ thống tiến trình đang chạy

 kill: dừng tiến trình khi tiến trình bị treo Chỉ có người dùng super-user mới có thể dừng tất cả các tiến trình còn người dùng bình thường chỉ có thể dừng tiến trình mà mình tạo ra

 top: hiển thị sự hoạt động của các tiến trình, đặc biệt là thông tin về tài nguyên hệ thống và việc sử dụng các tài nguyên đó của từng tiến trình

 pstree: hiển thị tất cả các tiến trình dưới dạng cây

 sleep: cho hệ thống ngừng hoạt động trong một khoảng thời gian

 useradd: tạo một người dùng mới

 groupadd: tạo một nhóm người dùng mới

 passwd: thay đổi password cho người dùng

 userdel: xoá người dùng đã tạo

 groupdel: xoá nhóm người dùng đã tạo

 gpasswd: thay đổi password của một nhóm người dùng

 su: cho phép đăng nhập với tư cách người dùng khác

 groups: hiển thị nhóm của user hiện tại

Trang 5

 who: cho biết ai đang đăng nhập hệ thống.

 w: tương tự như lệnh who

 man: xem hướng dẫn về dòng lệnh như cú pháp, các tham số

2 Make file

2.1 Định nghĩa.

- Makefile là 1 file đặc biệt dùng để quản lý các tập tin trong dự án,hiểu đơn giản makefile là 1 kịch bản build tức là khi Linux đọc file đó nó biết nó sẽ phải làm những nhiệm vụ gì, làm như thế nào và tài nguyên nó cần là gì nằm ở đâu

- Một ví dụ về quá trình biên dịch make file

2.2 Quy tắc chung.

- Make có quy tắc và cú pháp như sau:

<target> : <prerequisites>

“TAB”<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 đó, ví dụ `clean' thường để xoá các file nhị phân được tạo ra trong quá trình biên dịch Các target không được bắt đầu bằng dấu '.'

prerequisites: 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.

2.3 Tổng quan về make.

2.3.1 Gọi make trên terminal

make

Chương trình sẽ tự động thực hiện make với file tên là makefile hay Makefile trong thư mục, còn nếu muốn chạy 1file make với tên gọi khác ví dụ make_kien thì

Trang 6

ta gõ

make -f make_kien

2.3.2 Ví dụ cơ bản

Ta xét 1 chương trình: main.cpp,hello.cpp,factorial.cpp,functions.h

//functions.h

void print_hello();

int factorial(int n);

//hello.cpp

void print_hello()[

cout<<"Hello world!";

}

//factorial.cpp

int factorial(int n){

if(n!=1) return (n*factorial(n-1));

else return 1;

}

//main.cpp

#include<iostream>

#include"functions.h"

int main(){

print_hello();

cout<<"\n5!= "<<factorial(5)<<endl;

return 0;

}

Bình thương khi compile, trên terminal ta phải gõ :

g++ -o main main.cpp hello.cpp factorial.cpp

Còn với make, lệnh sẽ đơn giản hơn, ta tạo file makefile với nội dung + Makefile đơn giản:

//makefile

all:

g++ -o main main.cpp hello.cpp factorial.cpp

+ Makefile sử dụng các thành phần phụ thuộc

//makefile using dependencies

all: hello

hello: main.o factorial.o hello.o

g++ main.o factorial.o hello.o -o hello main.o: main.cpp

g++ -c main.cpp

Trang 7

factorial.o: factorial.cpp

g++ -c factorial.cpp

hello.o: hello.cpp

g++ -c hello.cpp

#xoa di cac file rac o trong qua trinh compiler

clean:

rm -rf *o hello

2.3.3 Sử dụng biến môi trường

Ví dụ với bài trên

Khi dặt biến: ví dụ CC=g++, thì cứ chỗ nào g++ ta thay bằng $(CC)

CC=g++

CFLAGS=-c -Wall

all: hello

hello: main.o factorial.o hello.o

$(CC) main.o factorial.o hello.o -o hello

main.o: main.cpp

$(CC) $(CFLAGS) main.cpp

factorial.o: factorial.cpp

$(CC) $(CFLAGS) factorial.cpp

hello.o: hello.cpp

$(CC) $(CFLAGS) hello.cpp

clean:

rm -rf *o hello

Bên tạo biến môi trường, khi mà phát triển chương trình lớn cỡ hàng nghìn dòng dổ lên mà muốn thay đổi 1 số thành phần, target ta chỉ cần thay đổi ở khai báo, đơn giản về

dễ sửa đổi hơn rất nhiều

2.3.4 Bài toán make những file ở ngoài thư mục root

Phân tích ví dụ make cơ bản

USER_DIR =

#biến USER_DIR với nội dung là “ ” dùng để chỉ tên user

LIB_DIR= $(USER_DIR)/libraries

Trang 8

#đường dẫn đến thư viện cần sử dụng

MAIN_FILE_DIR=$(USER_DIR)/mainFile

#địa chỉ chương trình main

#name of main file

MAIN_FILE_NAME= ngokien

#tên chương trình main

INC = -I$(LIB_DIR)

#Sử dụng tùy chọn -I để báo với gcc biết cần tìm trong đường dẫn LIB_DIR những file h include vào.

#compiler

GXX = g++

#biến đại diện cho công cụ compiler g++

FLAG = -Wall -g -W

#Đây là những tùy chọn về tối ưu trong g++ Bật những cờ này lên sẽ giúp đưa ra những cảnh báo về code chương trình giúp viết code tốt hơn.

#source

STUB = $(LIB_DIR)/ipc.cpp $(LIB_DIR)/person.cpp

#chứa tên các file thành viên( phụ thuộc)

#object

OBJECT = ipc.o person.o

#chứa tên các file object thành viên

#The Target

#lệnh

run: ready code

//tác vụ này gồm 2 công việc, ready và code, thực hiện lần lượt ở dưới

$(GXX) $(INC) $(FLAG) $(MAIN_FILE_NAME).o $(OBJECT) -o run

ready:

$(GXX) $(INC) $(FLAG) -c $(STUB)

code:

$(GXX) $(INC) $(FLAG) -c $(MAIN_FILE_DIR)/$(MAIN_FILE_NAME).cpp clean:

rm -rf *.o run

#xóa file rác o khi bạn 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

Trang 9

Một số lệnh với make:

make gọi target đầu tiên

make <tên target> gọi target có tên được ghi ra

make <tên target> -n show toàn bộ kịch bản build của target được gọi

2.4 Những quy luật cụ thể trong makefiile

2.4.1 Explicit rules:

+ Hầu hết những quy tắc mà ta sẽ viết đều phải qui định rõ ràng các thành phần: những cái đích đến (targets) và danh sách những thành phần phụ thuộc (prerequisites) + Một quy tắc có thể có nhiều hơn một đích đến, nghĩa là những đích đến đó đều có chung những thành phần phụ thuộc

+ Nếu như những đích đến đó mà chưa được cập nhật thì sẽ có những lệnh giống nhau để cập nhật cho mỗi đích đến đó

+ Ví dụ:

target1.o target2.o: prerequisite1.h prerequisite2.h prerequisite3.cpp

→ tức là target1.o và target2.o đều phụ thuộc vào 3 tập tin là prerequisite1.h prerequisite2.h và prerequisite3.cpp

→ ta có thể viết lại là:

target1.o : prerequisite1.h prerequisite2.h prerequisite3.cpp

target2.o : prerequisite1.h prerequisite2.h prerequisite3.cpp

+ Mỗi 1 đích đến được quản lý một cách độc lập Mỗi lần thấy một đích đến, make sẽ thêm

đích đến đó và danh sách thành phần phụ thuộc vào đồ thị phụ thuộc của make + Tuy nhiên, chỉ có một bộ danh sách các lệnh được liên kết với bất kỳ đích đến nào.Nếu

chúng ta tạo ra 2 bộ danh sách lệnh cho cùng một thời điểm thì make sẽ cảnh báo và kết quả

có được có thể sẽ sai so với những gì ta mong muốn

* Chú ý: make hỗ trợ cách viết một quy tắc theo kiểu:

target : prerequisites ; command

2.4.2 Wildcards - những kí tự đại diện.

+ Trong makefile luôn tồn tại một danh sách rất dài các file Vì vậy, để giúp cho make file đơn giản hơn thì make hỗ trợ việc sử dụng các ký tự đại diện

+ Các ký tự đại diện như: ~, *, ?, [ ], and [^ ]

→ ~: diễn tả đường dẫn của thư mục home

→ * : ví dụ: → *.* chỉ tất cả những file chứa dấu “.”

→ *.cpp chỉ tất cả những file có phần đuôi là “.cpp” như: node.cpp ,

graph.cpp , egde.cpp …

→ [ ] : diễn tả một lớp đối tượng nào đó

→ [^ ]: diễn tả phủ định của lớp đối tượng trên

+ Cần cẩn thận khi sử dụng các ký tự đại diện vì ta có thể hiểu sai ý nghĩa của chúng

Trang 10

2.4.3 Phony targets( đích đến giả)

+ Đa số các trường hợp thì đích đến (target) trong makefile là tên một tệp tồn tại thực

tế Tuy nhiên, đích đến ở đây có thể chỉ đơn giản là một nhãn dùng để đại diện cho một tập lệnh

+ Ví dụ: đích đến giả clean:

clean:

rm -rf *.o

+ Để thực hiện lệnh trên, chỉ cần gõ make clean.

+ Tuy nhiên,nếu chỉ viết như vậy ta sẽ không thể phân biệt được đây là đích đến giả hay là tên một tập tin

+ Đích đến giả luôn luôn không có danh sách thành phần tệp phụ thuộc, vì vậy nó luôn luôn bị xác định là chưa được thực thi Để tránh hiện tượng này, tiện ích make cung cấp một đích đến đặc biệt là PHONYđể thông báo với make rằng đích đến ở đây không phải là một file thực sự

+ Ví dụ:

.PHONY: clean

clean:

rm -rf *.o

+ Dưới đây là danh sách những đích đến giả tiêu chuẩn, hay được sử dụng trong makefile

là:

→ all: thực hiện tất cả các nhiệm vụ để xây dựng ứng dụng

→ install: cài đặt ứng dụng từ cây nguồn đã được biên dịch

→ clean: xoá các tập tin được tạo ra từ các nguồn

→ distclean: xoá tất cả các file mà nó không được tạo ra từ cây nguồn

→ TAGS: tạo ra các bảng thẻ để sử dụng cho các biên tập viên

→ info: tạo ra các tệp tin info GNU từ các nguồn Texinfo

→ check: chạy bất kỳ một bài kiểm tra nào liên quan tới ứng dụng

2.4.4 Empty targets( đích đến trống)

+ Đích đến trống gần giống với đích đến giả

+ Tuy nhiên, đích đến giả không có danh sách tập tin phụ thuộc Còn đích đến trống thì có tồn tại danh sách tập tin phụ thuộc

+ Đích đến trống nhằm thực hiện một số lệnh nhưng không muốn tạo ra file đầu ra

2.4.5 Variables and Automatic Variables(Biến và các biến tự động)

+ Như đã viết ở trên, ta có thể đặt tên biến rồi gọi biến như sau

$(variable-name)

+ Các biến tự động được cài đặt bởi make sau 1 quy luật dùng để truy cập tới các đích đến và danh sách các tập tin phụ thuộc

+ Việc sử dụng các biến tự động giúp cho makefile gọn hơn, tránh lặp code

Trang 11

+ Một vài biến tự động là:

→ $@ : tên của đích đến hiện tại

→ $% :

→ $< : tên của tệp tin phụ thuộc đầu tiên

→ $? : tên của tất cả các tệp tin phụ thuộc mới hơn so với đích đến, được ngăn cách bởi dấu cách

→ $^ : tên của tất cả các tệp tin phụ thuộc được ngăn cách nhau bởi dấu cách, và trong danh sách này các tên bị trùng lặp đã bị loại bỏ

→ $+ : giống $^ ở chỗ đây cũng là tên của tất cả các tệp tin phụ thuộc được ngăn cách nhau bởi dấu cách, nhưng khác ở chỗ là trong danh sách này chấp nhận việc trùng lặp tên Biến này được dùng trong các trường hợp cụ thể nơi mà các bản sao là có nghĩa

2.4.6 VPATH và vpath

+ Ở đây sẽ đề cập đến việc giải quyết bài toán biên dịch file ở những thư mục khác nhau

+ Ví du: ta có 1 project:

~/src/MyProject

> Makefile

> include

> counter.h

> lexer.h

src

> count_words.c

> counter.c

> lexer.l

+ Nội dung của makefile là:

count_words: count_words.o counter.o lexer.o -lfl

gcc $^ -o $@

count_words.o: count_words.c include/counter.h

gcc -c $<

counter.o: counter.c include/counter.h include/lexer.h

gcc -c $<

lexer.o: lexer.c include/lexer.h

gcc -c $<

lexer.c: lexer.l

flex -t $< > $@

+ Khi chạy make: thì sẽ thông báo lỗi vì make không thể tìm thấy vị trí của file count_words.c vì file này không trong cùng một thư mục với Makefile

+ Ta sửa như sau:

VPATH = src

+ Makefile thành:

count_words: count_words.o counter.o lexer.o -lfl

gcc $^ -o $@

count_words.o: count_words.c include/counter.h

Ngày đăng: 30/03/2015, 12:19

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w