570 likes | 719 Views
make Utility. A Unix utility to create and maintain program. Present by …. Noppamas Pukkhem. Overview. Compiling multi-part programs Overview of the make Utility The Description file and its Components Operation of the make Utility Running make. Compiling Multi-part programs.
E N D
make Utility A Unix utility to create and maintain program Present by …. Noppamas Pukkhem make
Overview • Compiling multi-part programs • Overview of the make Utility • The Description file and its Components • Operation of the make Utility • Running make make
Compiling multi-part programs • การ compile โปรแกรมที่ประกอบด้วย source file มากกว่าหนึ่งตัว โดยพื้นฐานมี 2 ขั้นตอน คือ : • compile แต่ละ module ให้อยู่ในรูปของ object file • link ตัว object file เหล่านั้นให้อยู่ในรูปของ executable program make
Compiling multi-part programs ตัวอย่าง ขั้นตอนที่ 1: ขั้นตอนที่ 2 : Compile โปรแกรมแต่ละตัวเพื่อให้ได้ object file mod1.o mod2.o mod3.o cc -c mod1.c cc -c mod2.c cc -c mod3.c Link ตัว object file เข้าด้วยกัน cc -o final mod1.o mod2.o mod3.o make
Compiling multi-part programs • จากตัวอย่าง จะเห็นว่า 1. แต่ละขั้นตอนยังประกอบด้วยขั้นตอนย่อย เช่น ขั้นตอนที่ 1 ถ้าใช้ source file จำนวน 3 file ต้องทำการ compile 3 ครั้งจึงจะได้ object file ของทุกตัว 2. เมื่อมีการเปลี่ยนแปลง source ตัวใดตัวหนึ่ง ต้องทำการ recompile ตัว source file ใหม่ แล้วก็ต้องทำการ link file ใหม่ เพื่อให้ได้ตัว executable file ที่ up-to-date make
Compiling multi-part programs • สิ่งที่อาจผู้ใช้ต้องการคือ: • ทำอย่างไรให้สามารถ compile โปรแกรมที่มีหลาย source file ได้ด้วยคำสั่งเพียงคำสั่งเดียว • เมื่อมีการเปลี่ยนแปลง source file แล้ว คำสั่งนั้นจะช่วย update โปรแกรมให้โดยอัตโนมัติ โดยผู้ใช้ไม่ต้องทำการ compile และ link ตัว object file ใหม่ ซึ่งความต้องการข้างต้นนี้ คุณทำได้ เมื่อใช้ “make utility” make
Overview of the make Utility • make utility เป็น software engineering tool เพื่อ จัดการและบำรุงรักษาโปรแกรมให้เป็นปัจจุบัน • ช่วยในการ compile โปรแกรมที่ประกอบด้วยหลาย source file โดยใช้เพียงคำสั่ง “make” ทำให้ขั้นตอนต่าง ๆ ลดลง • มีการสร้าง description file ที่เรียกว่า “makefile” เพื่อบรรจุ dependency rules, macro และ suffix rule และ command ต่างๆสำหรับ update file เมื่อใช้คำสั่ง make จะทำการ rebuild โปรแกรมโดยอัตโนมัติเมื่อมีการ modify ตัว source file ที่ใช้โดยจะ recompile เฉพาะตัวที่มีการเปลี่ยนแปลงเท่านั้น จึงเป็นเหตุผลที่ทำให้โปรแกรม up-to-date make
Overview of the make Utility • “make” can be used with any programming language (including C/C++) whose compiler can be run with a unix shell command. make
The description file and its Components • Description file เป็นข้อมูลเกี่ยวกับการทำงานของ make ในการสร้าง target ด้วยการระบุตัว dependent หรือ dependency file ซึ่งเป็นการอ้างถึงความสัมพันธ์ของ file ต่าง ๆ ใน procedure • Make จะรู้จัก description file โดย default โดย file ชื่อ ‘makefile’หรือ ‘Makefile’ make
The description file and its Components รูปแบบการใช้คำสั่ง % make [ -f make_name] [other options] [targets] make
The description file and its Components Components of description file : • Comments • Dependency rules • Target • Phony target • Dependencies • Commands • Macro • Suffix rules make
The description file and its Components • Comments เราสามารถใส่ comment เข้าไปใน description file ได้โดยใช้ เครื่องหมาย pound sign (#) และตามด้วยข้อความที่ต้องการให้ถูก ignored โดย make ถ้ามีหลายบรรทัดต้องใส่เครื่องหมายนี้ทุกบรรทัด Example # This is comment line in description file # This is comment line 2 make
The description file and its Components • Dependency rules เป็น file ที่เก็บส่วนของ code ต่าง ๆ และกฎต่าง ๆเพื่อบอกการทำงานให้กับ make ในการสร้างเป้าหมายของโปรแกรม ประกอบด้วย 3 ส่วน คือ 1. Targets 2. Dependents 3. Commands make
The description file and its Components • รูปแบบของการใช้ dependency rule target1[ target2 …] : [dependency1 …][; commands] [<tab> command] ตัวอย่าง mod1.o : mod1.c cc -c mod1.c dependency target tab command make
The description file and its Components • รูปแบบอื่น ๆ target_1 : dependency_1…. dependency_n \ dependency_n+1 …;\ command_1 ; command_2 ; command_3;…;\ … …; command_m make
The description file and its Components Targets “ โดยปกติทั่วไป target จะเป็นชื่อ file ซึ่ง make สร้างขึ้น เช่น object file หรือ executable program” final : mod1.o mod2.o mod3.o cc -o final mod1.o mod2.o mod3.o make
The description file and its Components Phony target “ เราสามารถกำหนดให้ target นั้นมีชื่อเป็นขั้นตอนการทำงานที่ต้องการก็ได้ ซึ่งจะเรียก target ประเภทนี้ว่า phony target ” Clean : rm *.o make
The description file and its Components Dependents “ เป็นตัวที่ใช้ระบุความขึ้นอยู่แก่กันของ target กับ file ที่ใช้ในการสร้าง เช่น โปรแกรม .c file ใช้เป็น source file ของการสร้าง .o file ซึ่งนำมาใช้สร้าง executable file” make
final mod1.o mod2.o mod3.o mod1.c mod2.c mod3.c The description file and its Components Simple dependencies for make make
The description file and its Components commands “ แต่ละ command ในกฎจะถูกแปลโดย shell เพื่อถูกสั่งให้ทำงาน โดย default แล้ว make จะใช้ /bin/sh shell ตัว default นี้ละได้โดยการใช้โดยการใช้ macro SHELL= /bin/sh ใน description file” make
The description file and its Components macro macroเป็นชื่อที่ใช้แทนตัวแปรหรือกลุ่มของข้อมูลต่าง ๆ ที่ ทำให้เกิดความสะดวกในกรณีที่ต้องการให้ตัวแปรเหล่านี้ปรากฎอยู่ในหลาย ๆ ที่ของ description file หรือ ต้องการ update กลุ่มข้อมูลนี้บ่อย ๆ make
The description file and its Components • Macro used to define setting : * platform-specific commands * list of required files for target * list of command options * so on • make reads all the macro definitions before executing any commands • it is often convenient to put all the macro definitions at the head of the makefile, but this is necessary make
The description file and its Components • Macro format and Usage macro_name = value โดย macro_name คือ ชื่อที่ต้องการเรียกแทนค่า value ที่ถูก define ไว้ ซึ่ง make จะทำการแทนค่าของ value ใน macro_name ที่มันหาเจอใน description file โดยสามารถระบุ macro ได้ตามขั้นตอนดังนี้ : 1. เริ่มต้นบรรทัดใหม่ด้วยชื่อของ macro 2. ตามหลังชื่อด้วย equal sign (=) 3. พิมพ์ string ของตัวอักษรของ value ที่ต้องการแทนด้วย macro_name ทางด้านขวามือของเครื่องหมาย = make
The description file and its Components • Example # macro ABC has a value of “ls -la” ABC = ls -la # macro LIBES has a null value LIBES = # macro DIRECT includes the definition of macro ROOT # the expanded value of DIRECT is “/usr/home/fred” ROOT = /usr/home DIRECT = $(ROOT)/fred DIRECT macro ใน command line เป็นการใช้ definition อื่นเป็นส่วน ของ definition ของ ROOT make
The description file and its Components • การใช้ macro ใน description file • ในการอ้างถึงค่าที่อยู่ใน macro ทำได้โดยการใช้เครื่องหมาย $ ก่อนชื่อของ macro • ถ้าชื่อของ macro ยาวกว่า 1 ตัวอักษรจะต้องใช้วงเล็บ () หรือปีกกา {} ครอบชื่อ macro นั้นด้วย เช่น : $(XY) $(CFLAGS) $(Z) $Z make
The description file and its Components • การใช้ macro substitution 1. การแทนที่คำใน macro เช่น แทน string1 ของ macro ด้วย string 2 [$(MACRO : string1 = string2)] • ตัวอย่าง #Define macro MAC1 MAC1 = xxx yyy zzz … #Evaluate MAC1 project: @ echo $(MAC1 : yyy = abc) xxxabczzz make
The description file and its Components 2. เป็นการแทนที่ในแต่ละ word ในค่าที่ระบุไว้แล้ว โดยมีการระบุ location parameter เพื่อบอกส่วนของคำที่ต้องการให้แทนที่ [$(MACRO/location/string)] location : Circumflex (^) Asterisk (*) Dollar sign ($) make
The description file and its Components • Circumflex (^) - string value added as a prefix to each defined word : # Define macro MAC1 MAC1 = abc def ghi …. # Evaluate MAC1 project: @ echo $(MAC1/^/xyz) xyzabc xyzdef xyzghi make
The description file and its Components • Asterisk (*) - string value replaces all of each defined word : # Define macro MAC1 MAC1 = abc def ghi …. # Evaluate MAC1 project: @ echo $(MAC1/*/xyz) xyzxyzxyz make
The description file and its Components • Asterisk (*) - use ampersand (&) in the string value , it represents the defined word that is being substituted for, and cause that word to be interpolated in the result: # Define macro MAC1 MAC1 = abc def ghi …. # Evaluate MAC1 project: @ echo $(MAC1/*/x&z) xabczxdefzxghiz make
The description file and its Components • Dollar sign ($) - string value is appended to each defined word : # Define macro MAC1 MAC1 = abc def ghi …. # Evaluate MAC1 project: @ echo $(MAC1/$/xyz) abcxyz defxyz ghixyz make
The description file and its Components 3. เป็นรูปแบบการเลือกค่าที่เป็นไปได้ในการแทนค่าของคำที่ระบุไว้: # Define macro MAC1 MAC1 = abc def ghi …. # Evaluate MAC1 MAC2 , MAC2 is not defined. project: @ echo $(MAC1?uvw : xyz) @ echo $(MAC2?123 : 456) [$(MACRO?string1: string2)] uvw 456 Used Used make
The description file and its Components Internal Macros make utility มี built-in macro definition สำหรับใช้ใน description file โดยตัว macro จะช่วยระบุตัวแปรที่ใช้ใน description fileโดย make utility จะแทน macro ดังต่อไปนี้ MacroValuex $@The name of the current target file $$@The target names on the dependency line $? The names of the dependency files that have changed more recently than the target $< The name of the out-of-date file that caused a target file to be created $*The name of the current dependency file without the suffix make
The description file and its Components ตัวอย่าง Internal target file name macro : /u/tom/test : test.o cc test.o -o $@ /u/tom/test : test.o cc test.o -o /u/tom/test make
The description file and its Components • ตัวอย่าง Internal label name macro : การใช้ $$@ เป็นการแทนที่ด้วยค่าที่อยู่ทางซ้ายมือ เช่น cat : $$@.c แปลเป็น cat : cat.c make
The description file and its Components #Define macro CMDS as a series of command names CMD = cat dd echo date cc cmp comm ar ld chown #Each command depends on a .c file $(CMD) : $$@.c #Create the new command set by compiling the out of date file #( $?) to the current target file name ($@) cc -O $? -o $@ make
The description file and its Components • Suffix rules make has a set of default rules called suffix or implicit rule. These are generalized rules that make can use to build a program , example : rule tell make that .o object files are made from .c source file .c.o : cc -g -c $< Name of the file that is out of date with the target make
The description file and its Components .o .c .f .s .y .l .y .l Summary of Default Transformation Path make
The description file and its Components Example of description file OBJS = file1.o file2.o file3.0 prog1 : $(OBJS) cc -o prog1 $(OBJS) file1.o : file1.c mydefs.h cc -c file1.c file2.o : file2.c mydefs.h cc -c file2.c file3.o : file3.c cc -c file3.c clean : rm $(OBJS) make
Operation of the make Utility Maintain program : • make utility ทำงานโดยการเปรียบเทียบ creation date ของโปรแกรมที่ถูกสร้าง ซึ่งเรียกว่า target หรือ target file ด้วย date ของ file ถูก modify เรียกว่า dependency filesหรือdependents โดย make จะพิจารณาว่า target นั้น เป็นตัว out-of-date ในกรณีนี้ make จะ rebuild ตัว target โดยการ compile ส่วนที่จำเป็นแล้ว link ใหม่ โดย command ที่เขียนไว้ใน description file make
Operation of the make Utility Target 13.10:12/2/1999 Dependency 13.20:12/2/1999 Older than Recompile, up to date stop make
Operation of the make Utility Target 13.30:12/2/1999 Dependency 13.20:12/2/1999 New than stop make
Operation of the make Utility • The make utility uses the following sources of information: - A description file that you create - File names - Time stamps of the file from the file system - A set of rules the tell make how to build files • For make to work properly on a distributed system, the date and time on all systems in the network must be synchronized make
Operation of the make Utility • ‘make’ creates a target file using the following step-by-step procedure : 1. Finds the name of target file in the description file 2. Finds a line that describes the dependents of the target, called a dependency line 3. Ensure that all the target’s dependency files exist and are up to date 4. Determines if the target is current with respect to its dependents make
Operation of the make Utility 5. Create the target by one of the following methods if the target or one of the dependents is out of date - Executes commands from the description file - Uses internal rules to create the file - Uses default rules from the description file make
Operation of the make Utility • If all file on the dependency line are up to date when make is run, make indicate that the target is up to date and then stops. • If any dependents are newer than their targets , make recreates only those target that are out of date • If a given target has no dependents, it is always out of date, and make rebuilds it every time you run make. make