<ก่อนหน้านี้ | Contents | ถัดไป>
การสร้างโปรแกรม
โปรแกรมส่วนใหญ่สร้างด้วยลำดับคำสั่งสองคำสั่งที่เรียบง่าย:
./ตั้งค่าคอนฟิก
./ตั้งค่าคอนฟิก
การขอ กำหนดค่า โปรแกรมเป็นเชลล์สคริปต์ที่มาพร้อมกับทรีต้นทาง หน้าที่ของมันคือการวิเคราะห์ สร้างสิ่งแวดล้อม. ซอร์สโค้ดส่วนใหญ่ได้รับการออกแบบให้เป็น แบบพกพา. นั่นคือมันถูกออกแบบมาเพื่อสร้างบนระบบที่เหมือน Unix มากกว่าหนึ่งประเภท แต่ในการทำเช่นนั้น ซอร์สโค้ดอาจจำเป็นต้องได้รับการปรับปรุงเล็กน้อยระหว่างการสร้างเพื่อรองรับความแตกต่างระหว่างระบบ กำหนดค่า ยังตรวจสอบเพื่อดูว่ามีการติดตั้งเครื่องมือและส่วนประกอบภายนอกที่จำเป็น มาวิ่งกันเถอะ กำหนดค่า. ตั้งแต่ กำหนดค่า ไม่ได้ระบุตำแหน่งที่ปกติของเชลล์คาดว่าโปรแกรมจะตั้งอยู่ เราต้องบอกตำแหน่งของเชลล์ให้ชัดเจนโดยนำหน้าคำสั่งด้วย ./ เพื่อระบุว่าโปรแกรมอยู่ในไดเร็กทอรีการทำงานปัจจุบัน:
[me@linuxbox พจนานุกรม-1.11]$ . / กำหนดค่า
[me@linuxbox พจนานุกรม-1.11]$ . / กำหนดค่า
กำหนดค่าจะส่งข้อความจำนวนมากในขณะที่ทดสอบและกำหนดค่าบิลด์ เมื่อเสร็จแล้วจะมีลักษณะดังนี้:
กำลังตรวจสอบสถานะ libintl.h... ใช่ กำลังตรวจสอบ libintl.h... ใช่
กำลังตรวจสอบไลบรารีที่มี gettext... ไม่ต้องการการกำหนดค่า: การสร้าง ./config.status
config.status: การสร้าง Makefile config.status: การสร้าง diction.1 config.status: การสร้าง diction.texi config.status: การสร้าง diction.spec config.status: การสร้าง style.1 config.status: การสร้างการทดสอบ/rundiction config.status: กำลังสร้าง config.h [me@linuxbox diction-1.11]$
กำลังตรวจสอบสถานะ libintl.h... ใช่ กำลังตรวจสอบ libintl.h... ใช่
กำลังตรวจสอบไลบรารีที่มี gettext... ไม่ต้องการการกำหนดค่า: การสร้าง ./config.status
config.status: การสร้าง Makefile config.status: การสร้าง diction.1 config.status: การสร้าง diction.texi config.status: การสร้าง diction.spec config.status: การสร้าง style.1 config.status: การสร้างการทดสอบ/rundiction config.status: กำลังสร้าง config.h [me@linuxbox diction-1.11]$
สิ่งสำคัญที่นี่คือไม่มีข้อความแสดงข้อผิดพลาด หากมี การกำหนดค่าล้มเหลว และโปรแกรมจะไม่สร้างจนกว่าจะแก้ไขข้อผิดพลาด
เราเห็น กำหนดค่า สร้างไฟล์ใหม่หลายไฟล์ในไดเรกทอรีต้นทางของเรา สิ่งสำคัญที่สุดคือ Makefile. Makefile เป็นไฟล์การกำหนดค่าที่สั่งให้ ทำ โปรแกรมวิธีการสร้างโปรแกรมอย่างแน่นอน ปราศจากมัน, ทำ จะไม่ยอมวิ่ง Makefile เป็นไฟล์ข้อความธรรมดา ดังนั้นเราจึงสามารถดูได้:
[me@linuxbox พจนานุกรม-1.11]$ Makefile น้อย
[me@linuxbox พจนานุกรม-1.11]$ Makefile น้อย
การขอ ทำ โปรแกรมใช้เป็นอินพุต a ทำไฟล์ (ซึ่งปกติจะตั้งชื่อว่า Makefile) ที่อธิบายความสัมพันธ์และการขึ้นต่อกันระหว่างส่วนประกอบต่างๆ ที่ประกอบเป็นโปรแกรมสำเร็จรูป
ส่วนแรกของ makefile กำหนดตัวแปรที่ถูกแทนที่ในส่วนหลังของ makefile ตัวอย่างเช่นเราเห็นบรรทัด:
ซีซี = gcc
ซีซี = gcc
ซึ่งกำหนดให้คอมไพเลอร์ C เป็น gcc. ต่อมาใน makefile เราจะเห็นตัวอย่างหนึ่งที่มีการใช้งาน:
พจน์:
diction.o ประโยค.o misc.o getopt.o getopt1.o
$(CC) -o $@ $(LDFLAGS) diction.o ประโยค.o เบ็ดเตล็ด \ getopt.o getopt1.o $(LIBS)
พจน์:
ทำการแทนที่ที่นี่ และค่า $(ซีซี) ถูกแทนที่ด้วย gcc ในเวลาทำงาน
makefile ส่วนใหญ่ประกอบด้วยบรรทัดซึ่งกำหนด a เป้าในกรณีนี้ไฟล์เรียกทำงาน พจนานุกรมและไฟล์ที่ขึ้นอยู่กับ บรรทัดที่เหลืออธิบายคำสั่งที่จำเป็นในการสร้างเป้าหมายจากส่วนประกอบ เราเห็นในตัวอย่างนี้ว่าไฟล์ปฏิบัติการ พจนานุกรม (หนึ่งในผลิตภัณฑ์ขั้นสุดท้าย) ขึ้นอยู่กับการมีอยู่ของ พจนานุกรม.o, ประโยค.o, อื่นๆ, getopt.oและ getopt1.o. ต่อมาใน makefile เราจะเห็นคำจำกัดความของแต่ละสิ่งเหล่านี้เป็นเป้าหมาย:
พจนานุกรม.o:
getopt.o: getopt1.o: เบ็ดเตล็ด o:
diction.c config.h getopt.h misc.h ประโยค.h
getopt.c getopt.h getopt_int.h getopt1.c getopt.h getopt_int.h misc.c config.h เบ็ดเตล็ด
พจนานุกรม.o:
getopt.o: getopt1.o: เบ็ดเตล็ด o:
ประโยค o:
สไตล์.o:
ประโยค.c config.h mis.h ประโยค.h
style.c config.h getopt.h misc.h ประโยค.h
ประโยค o:
สไตล์.o:
อย่างไรก็ตาม เราไม่เห็นคำสั่งใด ๆ ที่ระบุสำหรับพวกเขา สิ่งนี้ถูกจัดการโดยเป้าหมายทั่วไป ก่อนหน้านี้ในไฟล์ ที่อธิบายคำสั่งที่ใช้ในการคอมไพล์ any .c ไฟล์ลงใน a .o ไฟล์:
.co:
$(CC) -c $(CPPFLAGS) $(CFLAGS) $
.co:
$(CC) -c $(CPPFLAGS) $(CFLAGS) $
ทั้งหมดนี้ดูซับซ้อนมาก ทำไมไม่ลองเขียนขั้นตอนทั้งหมดเพื่อรวบรวมชิ้นส่วนและดำเนินการให้เสร็จสิ้นล่ะ? คำตอบนี้จะชัดเจนในอีกสักครู่ ระหว่างนี้ไปวิ่งกัน ทำ และสร้างโปรแกรมของเรา:
[me@linuxbox พจนานุกรม-1.11]$ ทำ
[me@linuxbox พจนานุกรม-1.11]$ ทำ
การขอ ทำ โปรแกรมจะทำงานโดยใช้เนื้อหาของ Makefile เพื่อเป็นแนวทางในการดำเนินการ มันจะผลิตข้อความจำนวนมาก
เมื่อเสร็จสิ้น เราจะเห็นว่าเป้าหมายทั้งหมดอยู่ในไดเรกทอรีของเราแล้ว:
[me@linuxbox | พจน์-1.11]$ ls | |||
config.เดา | เดโป | en | ติดตั้ง-sh | ประโยค.c |
config.h | พจนานุกรม | en_GB | Makefile | ประโยค.h |
config.h.in | พจน์.1 | th_GB.mo | Makefile.in | ประโยค.o |
config.log | พจนานุกรม.1.ใน | th_GB.po | เบ็ดเตล็ด | สไตล์ |
config.สถานะ | พจนานุกรมค | getopt1.c | เบ็ดเตล็ด | สไตล์.1 |
config.sub | พจนานุกรม.o | getopt1.o | อื่นๆ | สไตล์.1.ใน |
กำหนดค่า | พจนานุกรมหม้อ | getopt.ซี | ข่าว | สไตล์.ค |
config.in | พจนานุกรมข้อมูลจำเพาะ | getopt.h | nl | สไตล์.โอ |
การทำสำเนา | พจน์.spec.in | getopt_int.h | nl.mo | ทดสอบ |
de | พจนานุกรม. texi | getopt.o | nl.po | |
การสาธิต | พจนานุกรม.texi.in | ติดตั้ง | README |
ในบรรดาไฟล์ที่เราเห็น พจนานุกรม และ สไตล์, โปรแกรมที่เรากำหนดไว้เพื่อสร้าง ขอแสดงความยินดีอยู่ในลำดับ! เราเพิ่งรวบรวมโปรแกรมแรกของเราจากซอร์สโค้ด!
แต่ด้วยความอยากรู้ มาวิ่งกันเถอะ ทำ อีกครั้ง:
[me@linuxbox พจนานุกรม-1.11]$ ทำ
ทำให้: ไม่มีอะไรจะทำเพื่อ 'ทั้งหมด'
[me@linuxbox พจนานุกรม-1.11]$ ทำ
ทำให้: ไม่มีอะไรจะทำเพื่อ 'ทั้งหมด'
มันสร้างข้อความแปลก ๆ นี้เท่านั้น เกิดอะไรขึ้น? ทำไมไม่สร้างโปรแกรมอีกครั้ง? อา นี่คือความมหัศจรรย์ของ ทำ. แทนที่จะสร้างทุกอย่างขึ้นมาใหม่ ทำ สร้างแต่สิ่งที่ต้องการสร้างเท่านั้น ด้วยเป้าหมายทั้งหมดที่มีอยู่ ทำ ตั้งใจว่าไม่มีอะไรทำ เราสามารถสาธิตสิ่งนี้ได้โดยการลบหนึ่งในเป้าหมายและเรียกใช้ make อีกครั้งเพื่อดูว่ามันทำอะไรได้บ้าง กำจัดหนึ่งในเป้าหมายระดับกลาง:
[me@linuxbox พจนานุกรม-1.11]$ RM getopt.o
[me@linuxbox พจนานุกรม-1.11]$ ทำ
[me@linuxbox พจนานุกรม-1.11]$ RM getopt.o
[me@linuxbox พจนานุกรม-1.11]$ ทำ
เราเห็นว่า ทำ สร้างใหม่และเชื่อมโยง พจนานุกรม และ สไตล์ โปรแกรมเนื่องจากขึ้นอยู่กับโมดูลที่ขาดหายไป พฤติกรรมนี้ยังชี้ให้เห็นคุณสมบัติที่สำคัญอีกประการของ ทำ: ช่วยให้เป้าหมายเป็นปัจจุบัน ทำ ยืนยันว่าเป้าหมายใหม่กว่าการพึ่งพาอาศัยกัน วิธีนี้สมเหตุสมผลดี เนื่องจากโปรแกรมเมอร์มักจะอัปเดตซอร์สโค้ดเล็กน้อยแล้วจึงใช้ ทำ เพื่อสร้างเวอร์ชันใหม่ของผลิตภัณฑ์สำเร็จรูป ทำ ตรวจสอบให้แน่ใจว่าทุกสิ่งที่จำเป็นต้องสร้างตามรหัสที่อัปเดตนั้นถูกสร้างขึ้น ถ้าเราใช้ แตะ โปรแกรมเพื่อ "อัปเดต" หนึ่งในไฟล์ซอร์สโค้ดเราจะเห็นสิ่งนี้:
[me@linuxbox พจนานุกรม-1.11]$ ls -l พจน์ getopt.c
-rwxr-xr-x 1 ฉัน ฉัน 37164 2009-03-05 06:14 พจนานุกรม
-rw-r--r-- 1 ฉัน ฉัน 33125 2007-03-30 17:45 getopt.c [me@linuxbox diction-1.11]$ แตะ getopt.c
[me@linuxbox พจนานุกรม-1.11]$ ls -l พจน์ getopt.c
-rwxr-xr-x 1 ฉัน ฉัน 37164 2009-03-05 06:14 พจนานุกรม
-rw-r--r-- 1 ฉัน ฉัน 33125 2009-03-05 06:23 getopt.c [me@linuxbox diction-1.11]$ ทำ
[me@linuxbox พจนานุกรม-1.11]$ ls -l พจน์ getopt.c
-rwxr-xr-x 1 ฉัน ฉัน 37164 2009-03-05 06:14 พจนานุกรม
-rw-r--r-- 1 ฉัน ฉัน 33125 2007-03-30 17:45 getopt.c [me@linuxbox diction-1.11]$ แตะ getopt.c
[me@linuxbox พจนานุกรม-1.11]$ ls -l พจน์ getopt.c
-rwxr-xr-x 1 ฉัน ฉัน 37164 2009-03-05 06:14 พจนานุกรม
-rw-r--r-- 1 ฉัน ฉัน 33125 2009-03-05 06:23 getopt.c [me@linuxbox diction-1.11]$ ทำ
หลังจาก ทำ ทำงาน เราเห็นว่าได้คืนค่าเป้าหมายให้ใหม่กว่าการพึ่งพา:
[me@linuxbox พจนานุกรม-1.11]$ ls -l พจน์ getopt.c
-rwxr-xr-x 1 ฉัน ฉัน 37164 2009-03-05 06:24 พจนานุกรม
-rw-r--r-- 1 ฉัน ฉัน 33125 2009-03-05 06:23 getopt.c
[me@linuxbox พจนานุกรม-1.11]$ ls -l พจน์ getopt.c
-rwxr-xr-x 1 ฉัน ฉัน 37164 2009-03-05 06:24 พจนานุกรม
-rw-r--r-- 1 ฉัน ฉัน 33125 2009-03-05 06:23 getopt.c
ความสามารถของ ทำ การสร้างสิ่งที่ต้องการสร้างอย่างชาญฉลาดจะเป็นประโยชน์อย่างยิ่งสำหรับโปรแกรมเมอร์ แม้ว่าการประหยัดเวลาอาจไม่ค่อยชัดเจนสำหรับโครงการเล็กๆ ของเรา แต่ก็
มีความสำคัญมากกับโครงการขนาดใหญ่ โปรดจำไว้ว่า เคอร์เนลของลินุกซ์ (โปรแกรมที่อยู่ภายใต้การดัดแปลงและปรับปรุงอย่างต่อเนื่อง) ประกอบด้วย ล้าน บรรทัดของรหัส