“ ทั้งหมด” หมายถึงอะไรใน makefile?


105

ฉันอ่านบทแนะนำเกี่ยวกับ Makefiles แต่สำหรับฉันแล้วยังไม่ชัดเจนว่าเป้าหมาย "ทั้งหมด" หมายถึงอะไรและทำหน้าที่อะไร

ความคิดใด ๆ ?

คำตอบ:


117

บิลด์ดังที่ Makefile เข้าใจประกอบด้วยเป้าหมายจำนวนมาก ตัวอย่างเช่นในการสร้างโครงการคุณอาจต้องใช้

  1. สร้าง file1.o จาก file1.c
  2. สร้าง file2.o จาก file2.c
  3. สร้าง file3.o จาก file3.c
  4. สร้างไฟล์ปฏิบัติการ 1 จาก file1.o และ file3.o
  5. สร้างไฟล์ปฏิบัติการ 2 จาก file2.o

หากคุณใช้เวิร์กโฟลว์นี้กับ makefile คุณสามารถสร้างแต่ละเป้าหมายแยกกันได้ ตัวอย่างเช่นถ้าคุณเขียน

make file1.o

มันจะสร้างไฟล์นั้นถ้าจำเป็นเท่านั้น

ชื่อของallไม่ได้รับการแก้ไข เป็นเพียงชื่อธรรมดา allหมายถึงเป้าหมายที่ถ้าคุณเรียกมันให้จะสร้างทุกสิ่งที่จำเป็นเพื่อให้สมบูรณ์สร้าง โดยปกติจะเป็นเป้าหมายจำลองซึ่งไม่ได้สร้างไฟล์ใด ๆ แต่ขึ้นอยู่กับไฟล์อื่น ๆ เท่านั้น ตัวอย่างข้างต้นการสร้างสิ่งที่จำเป็นทั้งหมดคือการสร้างไฟล์ปฏิบัติการไฟล์อื่น ๆ ที่ถูกดึงเข้ามาเป็นการอ้างอิง ดังนั้นใน makefile จะมีลักษณะดังนี้:

all: executable1 executable2

allโดยปกติเป้าหมายจะเป็นเป้าหมายแรกใน makefile เนื่องจากหากคุณเพียงแค่เขียนmakeในบรรทัดคำสั่งโดยไม่ระบุเป้าหมายเป้าหมายจะสร้างเป้าหมายแรก allและคุณคาดหวังให้เป็น

allมักจะเป็น.PHONYเป้าหมายด้วย เรียนรู้เพิ่มเติมที่นี่


31

คู่มือสำหรับ GNU Make ให้คำนิยามที่ชัดเจนสำหรับallในของรายการเป้าหมายมาตรฐาน

หากผู้เขียน Makefile ปฏิบัติตามหลักการนั้นเป้าหมายallควร:

  1. คอมไพล์โปรแกรมทั้งหมด แต่ไม่สร้างเอกสารประกอบ
  2. เป็นเป้าหมายเริ่มต้น ในการทำงานก็makeควรทำเช่นเดียวกับmake all.

allโดยทั่วไปเพื่อให้บรรลุ 1 จะถูกกำหนดให้เป็น.PHONYเป้าหมายที่ขึ้นอยู่กับปฏิบัติการที่สร้างโปรแกรมทั้งหมด:

.PHONY : all
all : executable

เพื่อให้บรรลุ 2 allควรเป็นเป้าหมายแรกที่กำหนดในไฟล์ make หรือกำหนดให้เป็นเป้าหมายเริ่มต้น:

.DEFAULT_GOAL := all

3

ไม่แน่ใจว่าย่อมาจากอะไรพิเศษ เป็นเพียงแบบแผนที่คุณระบุกฎ 'ทั้งหมด' และโดยทั่วไปจะใช้เพื่อแสดงรายการเป้าหมายย่อยทั้งหมดที่จำเป็นในการสร้างโครงการทั้งหมดดังนั้นจึงเรียกว่า 'ทั้งหมด' สิ่งเดียวที่พิเศษเกี่ยวกับเรื่องนี้ก็คือบ่อยครั้งที่ผู้คนมักจะใส่เป้าหมายนี้เป็นเป้าหมายแรกใน makefile ซึ่งหมายความว่าเพียงแค่พิมพ์ "make" เพียงอย่างเดียวก็จะเหมือนกับ "make all"


2

เป้าหมาย "ทั้งหมด" เป็นตัวอย่างของเป้าหมายจำลอง - ไม่มีสิ่งใดในดิสก์ที่เรียกว่า "ทั้งหมด" ซึ่งหมายความว่าเมื่อคุณทำการ "สร้างทั้งหมด" ให้คิดเสมอว่าจำเป็นต้องสร้างมันและรันคำสั่งทั้งหมดสำหรับเป้าหมายนั้น โดยทั่วไปคำสั่งเหล่านั้นจะเป็นคำสั่งที่สร้าง end-products ทั้งหมดที่ makefile รู้ แต่มันสามารถทำอะไรก็ได้

ตัวอย่างอื่น ๆ ของเป้าหมายจำลองคือ "สะอาด" และ "ติดตั้ง" และทำงานในลักษณะเดียวกัน

หากคุณยังไม่ได้อ่านคุณควรอ่านGNU Make Manualซึ่งเป็นบทช่วยสอนที่ยอดเยี่ยมเช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.