นี่คือคำสั่ง mkplan9 ที่สามารถเรียกใช้ในผู้ให้บริการโฮสติ้งฟรีของ OnWorks โดยใช้หนึ่งในเวิร์กสเตชันออนไลน์ฟรีของเรา เช่น Ubuntu Online, Fedora Online, โปรแกรมจำลองออนไลน์ของ Windows หรือโปรแกรมจำลองออนไลน์ของ MAC OS
โครงการ:
ชื่อ
mk - รักษา (สร้าง) ไฟล์ที่เกี่ยวข้อง
เรื่องย่อ
mk [ -f mkfile - ตัวเลือก ... ] [ เป้า ... ]
DESCRIPTION
Mk ใช้กฎการพึ่งพาที่ระบุใน mkfile เพื่อควบคุมการอัพเดท (โดยปกติโดย
การรวบรวม) ของ เป้าหมาย (โดยปกติคือไฟล์) จากไฟล์ต้นทางที่อิงตาม NS
mkfile (ค่าเริ่มต้นประกอบด้วย a กฎ สำหรับแต่ละเป้าหมายที่ระบุไฟล์และอื่น ๆ
เป้าหมายที่มันขึ้นอยู่กับและ sh(1) สคริปต์ a สูตร, เพื่ออัปเดตเป้าหมาย NS
สคริปต์จะทำงานถ้าเป้าหมายไม่มีอยู่หรือถ้ามันเก่ากว่าไฟล์ใด ๆ นั้น
ขึ้นอยู่กับ. เอ็มเคไฟล์ อาจมี กฎเมตา ที่กำหนดการดำเนินการสำหรับการปรับปรุงโดยปริยาย
เป้าหมาย ถ้าไม่ เป้า มีการระบุเป้าหมายของกฎข้อแรก (ไม่ใช่ meta-rule) ใน
mkfile ได้รับการอัปเดต
ตัวแปรสภาพแวดล้อม $เอ็นพรอค กำหนดจำนวนเป้าหมายที่สามารถอัปเดตได้พร้อมกัน
ระบบปฏิบัติการบางระบบ เช่น Plan 9, set $เอ็นพรอค โดยอัตโนมัติตามจำนวนซีพียูที่เปิดอยู่
เครื่องปัจจุบัน.
ตัวเลือกคือ:
-a สมมติว่าเป้าหมายทั้งหมดล้าสมัย ดังนั้นทุกอย่างจะได้รับการปรับปรุง
-d[ไข่] สร้างเอาต์พุตการดีบัก (p สำหรับการแยกวิเคราะห์ g สำหรับการสร้างกราฟ e สำหรับ
การดำเนินการ)
-e อธิบายว่าเหตุใดแต่ละเป้าหมายจึงถูกสร้างขึ้น
-i บังคับให้สร้างเป้าหมายระดับกลางที่ขาดหายไป
-k ทำงานให้มากที่สุดเมื่อเผชิญกับข้อผิดพลาด
-n พิมพ์ แต่ไม่ต้องดำเนินการ คำสั่งที่จำเป็นในการอัปเดตเป้าหมาย
-s สร้างอาร์กิวเมนต์บรรทัดคำสั่งตามลำดับแทนที่จะขนานกัน
-t แตะ (อัปเดตวันที่แก้ไขของ) เป้าหมายไฟล์โดยไม่ต้องดำเนินการตามสูตรใดๆ
-wtarget1,เป้าหมาย2,...
แกล้งทำเป็นปรับเปลี่ยนเวลาสำหรับแต่ละ เป้า คือเวลาปัจจุบัน มีประโยชน์ร่วมกัน
สีสดสวย -n เพื่อเรียนรู้ว่าการอัปเดตใดที่จะถูกทริกเกอร์โดยการแก้ไข เป้าหมาย.
การขอ mkfile
A mkfile ประกอบด้วย ที่ได้รับมอบหมาย (อธิบายภายใต้ `สิ่งแวดล้อม') และ กฎระเบียบ. กฎ
มี เป้าหมาย และ หาง. เป้าหมายคือสตริงตามตัวอักษรและโดยปกติคือชื่อไฟล์
หางมีศูนย์หรือมากกว่า ข้อกำหนดเบื้องต้น และตัวเลือก สูตรซึ่งเป็น เปลือกหอย
สคริปต์ สูตรแต่ละบรรทัดต้องขึ้นต้นด้วยช่องว่าง กฎใช้แบบฟอร์ม
เป้าหมาย: prereq1 prereq2
สูตร ด้วย prereq1,prereq2 ไปยัง สร้าง เป้า
เมื่อดำเนินการตามสูตรแล้ว อักขระตัวแรกในทุกบรรทัดจะถูกตัดออก
หลังโคลอนบนเส้นเป้าหมาย กฎอาจระบุ แอตทริบิวต์, อธิบายไว้ด้านล่าง.
A กฎเมตา มีเป้าหมายของรูปแบบ A%B ที่ไหน A และ B เป็นสตริง (อาจว่างเปล่า) NS
meta-rule ทำหน้าที่เป็นกฎสำหรับเป้าหมายที่เป็นไปได้ซึ่งมีชื่อตรงกัน A%B สีสดสวย % แทนที่
โดยสตริงตามใจชอบ เรียกว่า แง่ง. ในการตีความกฎเมตา ต้นกำเนิดคือ
แทนการเกิดขึ้นทั้งหมดของ % ในชื่อข้อกำหนดเบื้องต้น ในสูตรของเมตา-
กฎ, ตัวแปรสภาพแวดล้อม $ลำต้น มีสตริงที่จับคู่โดย %. ตัวอย่างเช่น
meta-rule เพื่อคอมไพล์โปรแกรม C โดยใช้ 9c(1) อาจเป็น:
%: %.ค
9c -c $stem.ค
9l -o $ต้นกำเนิด $stem.o
กฎเมตาอาจมีเครื่องหมายและ & มากกว่าเครื่องหมายร้อยละ %. % ตรงกับค่าสูงสุด
สตริงความยาวของอักขระใด ๆ NS & จับคู่สตริงที่มีความยาวสูงสุดของอักขระใดๆ
ยกเว้นคาบหรือสแลช
ข้อความของ mkfile ถูกประมวลผลดังนี้ บรรทัดที่ขึ้นต้นด้วย < ตามด้วยไฟล์
ชื่อจะถูกแทนที่ด้วยเนื้อหาของไฟล์ที่มีชื่อ บรรทัดที่ขึ้นต้นด้วย <| ตามมาด้วย
ชื่อไฟล์จะถูกแทนที่ด้วยผลลัพธ์ของการดำเนินการของไฟล์ที่มีชื่อ เส้นเปล่า
และความคิดเห็นที่เรียกใช้จาก unquoted # อักขระที่ขึ้นบรรทัดใหม่ต่อไปนี้จะถูกลบออก
ลำดับอักขระแบ็กสแลช-ขึ้นบรรทัดใหม่จะถูกลบออก ดังนั้นบรรทัดยาวใน mkfile อาจจะ
พับ รายการที่ไม่ใช่สูตรถูกประมวลผลโดยการแทนที่ for `{คำสั่ง} ผลลัพธ์ของ
คำสั่ง เมื่อดำเนินการโดย sh. การอ้างอิงถึงตัวแปรจะถูกแทนที่ด้วยค่าของตัวแปร
อักขระพิเศษอาจยกมาโดยใช้เครื่องหมายคำพูดเดียว '' เช่นเดียวกับใน sh(1)
การมอบหมายและกฎเกณฑ์จะแยกความแตกต่างจากการเกิดขึ้นครั้งแรกของ : (กฎ) หรือ =
(งานที่มอบหมาย).
กฎภายหลังอาจแก้ไขหรือแทนที่กฎที่มีอยู่ภายใต้เงื่อนไขต่อไปนี้:
- หากเป้าหมายของกฎตรงกันทุกประการและกฎหนึ่งข้อมีเพียงข้อกำหนดเบื้องต้นเท่านั้น
และไม่มีสูตร ประโยคจะถูกเพิ่มไปยังข้อกำหนดเบื้องต้นของกฎอื่น
หากเป้าหมายใดเป้าหมายหนึ่งหรือทั้งสองเป็นเสมือน สูตรจะถูกดำเนินการเสมอ
- หากเป้าหมายของกฎตรงกันทุกประการและข้อกำหนดเบื้องต้นไม่ตรงกันและ
กฎทั้งสองมีสูตร mk รายงานข้อผิดพลาด ``สูตรคลุมเครือ''
- หากเป้าหมายและข้อกำหนดเบื้องต้นของกฎทั้งสองตรงกันทุกประการ กฎข้อที่สอง
แทนที่ครั้งแรก
สภาพสิ่งแวดล้อม
กฎอาจใช้ประโยชน์จากตัวแปรสภาพแวดล้อมของเชลล์ การอ้างอิงทางกฎหมายของแบบฟอร์ม $OBJ or
${ชื่อ} ถูกขยายเป็นใน sh(1). การอ้างอิงของแบบฟอร์ม ${ชื่อ:A%B=ซีดี}ที่นี่มี A, B, C,
D เป็นสตริง (อาจว่างเปล่า) มีค่าที่เกิดขึ้นจากการขยาย $ชื่อ และแทนที่ C
สำหรับ A และ D สำหรับ B ในแต่ละคำใน $ชื่อ ที่เข้ากับลวดลาย A%B.
ตัวแปรสามารถกำหนดได้โดยการมอบหมายแบบฟอร์ม
วาร์=[attr=]ความคุ้มค่า
ช่องว่างใน ความคุ้มค่า แบ่งมันเป็นคำ ตัวแปรดังกล่าวจะถูกส่งออกไปยังสิ่งแวดล้อม
ของสูตรตามที่ดำเนินการ เว้นแต่ U, คุณสมบัติทางกฎหมายเท่านั้น Attribution-NonCommercial-ShareAlike,มีอยู่. NS
ค่าเริ่มต้นของตัวแปรนำมาจาก (ในลำดับความสำคัญที่เพิ่มขึ้น) ค่าเริ่มต้น
ค่าด้านล่าง mk's สิ่งแวดล้อม mkfilesและการกำหนดบรรทัดคำสั่งใดๆ เป็น an
อาร์กิวเมนต์ถึง mk. อาร์กิวเมนต์การกำหนดตัวแปรจะแทนที่อาร์กิวเมนต์แรก (แต่ไม่ใช่ใดๆ
ต่อไป) การกำหนดให้กับตัวแปรนั้น
ตัวแปร เอ็มเคแฟลกส์ มีอาร์กิวเมนต์ตัวเลือกทั้งหมด (อาร์กิวเมนต์ที่ขึ้นต้นด้วย or
ที่มีและ มาร์กส์ มีเป้าหมายทั้งหมดในการโทรไปที่ mk.
ตัวแปร เอ็มเคเชลล์ มีบรรทัดคำสั่งเชลล์ mk ใช้ในการเรียกใช้สูตร ถ้าครั้งแรก
คำของคำสั่งลงท้ายด้วย rc or rcsh, mk ใช้ rc(1) กฎการเสนอราคา; มิฉะนั้นจะใช้
sh(1)ของ. NS เอ็มเคเชลล์ ตัวแปรจะถูกพิจารณาเมื่ออ่าน mkfile ไม่ใช่เมื่อเป็น
ดำเนินการเพื่อให้สามารถใช้เชลล์ที่แตกต่างกันภายใน mkfile เดียว:
MKSHELL=$PLAN9/bin/rc
ใช้-rc:V:
สำหรับ (i ใน abc) echo $i
MKSHELL=ช
ใช้-sh:V:
สำหรับฉันใน abc; ทำ echo $i; เสร็จแล้ว
Mkfiles รวมผ่าน < or <| (qv) ดูสำเนาส่วนตัวของ เอ็มเคเชลล์ซึ่งเสมอ
เริ่มตั้งเป็น sh .
ข้อมูลไดนามิกอาจรวมอยู่ใน mkfile โดยใช้บรรทัดของ form
<|คำสั่ง args
สิ่งนี้รันคำสั่ง คำสั่ง ด้วยข้อโต้แย้งที่กำหนด args และท่อเอาท์พุตมาตรฐาน
ไปยัง mk ที่จะรวมเป็นส่วนหนึ่งของ mkfile ตัวอย่างเช่น เมล็ด Inferno ใช้สิ่งนี้
เทคนิคในการรันคำสั่งเชลล์ด้วยสคริปต์ awk และไฟล์คอนฟิกูเรชันเป็นอาร์กิวเมนต์
เพื่อให้ awk สคริปต์เพื่อประมวลผลไฟล์และส่งออกชุดของตัวแปรและ
ค่า
การกระทำ
ในระหว่างการดำเนินการ mk กำหนดว่าเป้าหมายใดต้องได้รับการปรับปรุง และลำดับใดในการสร้าง
ชื่อ ระบุไว้ในบรรทัดคำสั่ง จากนั้นรันสูตรที่เกี่ยวข้อง
เป้าหมายจะได้รับการพิจารณาเป็นปัจจุบันหากไม่มีข้อกำหนดเบื้องต้นหรือข้อกำหนดเบื้องต้นทั้งหมด
เป็นข้อมูลล่าสุดและใหม่กว่าข้อกำหนดเบื้องต้นทั้งหมด เมื่อสูตรสำหรับเป้าหมาย
ดำเนินการแล้ว ถือว่าเป้าหมายเป็นปัจจุบัน
การประทับวันที่ที่ใช้ในการพิจารณาว่าเป้าหมายเป็นข้อมูลล่าสุดหรือไม่ถูกคำนวณแตกต่างกันสำหรับ
เป้าหมายประเภทต่างๆ ถ้าเป้าหมายคือ เสมือน (เป้าหมายของกฎกับ V
คุณลักษณะ) การประทับวันที่เริ่มต้นเป็นศูนย์ เมื่อเป้าหมายถูกอัพเดตวันที่ประทับคือ
ตั้งค่าเป็นประทับวันที่ล่าสุดของข้อกำหนดเบื้องต้น มิฉะนั้น ถ้าเป้าหมายไม่
มีอยู่ในรูปแบบไฟล์ การประทับวันที่ถูกตั้งค่าเป็นวันที่ล่าสุดของข้อกำหนดเบื้องต้น
หรือศูนย์หากไม่มีข้อกำหนดเบื้องต้น มิฉะนั้น เป้าหมายจะเป็นชื่อของไฟล์และ
การประทับวันที่ของเป้าหมายคือวันที่แก้ไขของไฟล์นั้นเสมอ คำนวณวันที่ประทับ
เมื่อเป้าหมายเป็นสิ่งจำเป็นในการดำเนินการตามกฎ มันไม่ใช่ค่าคงที่
เป้าหมายที่ไม่มีอยู่ซึ่งมีข้อกำหนดเบื้องต้นและเป็นข้อกำหนดเบื้องต้นเองจะได้รับการปฏิบัติ
เป็นพิเศษ เป้าหมายดังกล่าว t จะได้รับตราประทับวันที่ของข้อกำหนดเบื้องต้นล่าสุดและ if
ทำให้เป้าหมายทั้งหมดที่มี t เป็นข้อกำหนดเบื้องต้นเพื่อให้ทันสมัย t is
ถือว่าทันสมัย มิฉะนั้น, t จะทำในลักษณะปกติ NS -i ธงแทนที่
การรักษาพิเศษนี้
ไฟล์อาจทำตามลำดับใดๆ ที่เป็นไปตามข้อจำกัดก่อนหน้านี้
สูตรจะดำเนินการโดยการจัดหาสูตรเป็นอินพุตมาตรฐานให้กับคำสั่ง bin / sh /.
(สังเกตว่าไม่เหมือน ทำ, mk ป้อนสูตรทั้งหมดไปที่เชลล์แทนที่จะรันแต่ละสูตร
บรรทัดของสูตรแยกต่างหาก) สภาพแวดล้อมถูกเสริมด้วยตัวแปรต่อไปนี้:
$เป้าหมายทั้งหมด เป้าหมายทั้งหมดของกฎนี้
$newprereq ข้อกำหนดเบื้องต้นที่ทำให้กฎนี้ดำเนินการ
$สมาชิกใหม่ ข้อกำหนดเบื้องต้นที่เป็นสมาชิกของมวลรวมที่ทำให้กฎนี้ต้อง
ดำเนินการ เมื่อข้อกำหนดเบื้องต้นของกฎเป็นสมาชิกของผลรวม
$newprereq มีชื่อรวมและสมาชิกที่ล้าสมัยในขณะที่
$สมาชิกใหม่ มีเฉพาะชื่อสมาชิกเท่านั้น
$nproc ช่องกระบวนการสำหรับสูตรนี้ มันตอบสนอง0≤$nproc<$เอ็นพรอค.
$pid รหัสกระบวนการสำหรับ mk กำลังดำเนินการตามสูตร
$ข้อกำหนดเบื้องต้น ข้อกำหนดเบื้องต้นทั้งหมดสำหรับกฎนี้
$ลำต้น ถ้านี่คือกฎเมตา $ลำต้น คือสายอักขระที่เข้าคู่กัน % or &. มิฉะนั้น,
มันว่างเปล่า สำหรับกฎเมตานิพจน์ทั่วไป (ดูด้านล่าง) ตัวแปร
ถูกกำหนดเป็นนิพจน์ย่อยที่เกี่ยวข้อง
$เป้าหมาย เป้าหมายสำหรับกฎนี้ที่ต้องทำใหม่
ตัวแปรเหล่านี้จะใช้ได้เฉพาะในระหว่างการดำเนินการตามสูตร ไม่ใช่ในขณะที่กำลังประเมิน
mkfile.
เว้นแต่กฎจะมี Q แอตทริบิวต์สูตรพิมพ์ก่อนดำเนินการด้วย
ตัวแปรสภาพแวดล้อมที่รู้จักขยายออก คำสั่งส่งคืนสถานะข้อผิดพลาดสาเหตุ mk ไปยัง
ยุติ
สูตรและ backquoted rc คำสั่งในสถานที่เช่นการมอบหมายดำเนินการในสำเนาของ mk's
สิ่งแวดล้อม; การเปลี่ยนแปลงที่ทำกับตัวแปรสภาพแวดล้อมไม่สามารถมองเห็นได้จาก mk.
การแทนที่ตัวแปรในกฎจะกระทำเมื่ออ่านกฎ การแทนที่ตัวแปรใน
สูตรจะทำเมื่อสูตรถูกดำเนินการ ตัวอย่างเช่น:
bar=ac
ฟู: $bar
$CC -o foo $บาร์
bar=bc
จะรวบรวม ก่อนคริสต์ศักราช เข้าไป fooถ้า ac ใหม่กว่า foo.
มวลรวม
ชื่อของแบบฟอร์ม a(b) อ้างถึงสมาชิก b ของมวลรวม a. ปัจจุบันเท่านั้น
มวลรวมที่รองรับคือ 9ar (ดู 9c(1)) เอกสารสำคัญ
คุณสมบัติ
เครื่องหมายทวิภาคที่แยกเป้าหมายออกจากข้อกำหนดเบื้องต้นอาจตามด้วย
แอตทริบิวต์ และลำไส้ใหญ่อื่น คุณลักษณะคือ:
D หากสูตรออกด้วยสถานะที่ไม่ใช่ค่าว่าง เป้าหมายจะถูกลบ
E ดำเนินการต่อไปหากสูตรเกิดข้อผิดพลาด
N หากไม่มีสูตร เป้าหมายจะมีการอัปเดตเวลา
n กฎเป็นกฎเมตาที่ไม่สามารถเป็นเป้าหมายของกฎเสมือนได้ เฉพาะไฟล์
ตรงกับรูปแบบในเป้าหมาย
P ตัวละครหลัง P จนกว่าจะสิ้นสุด : นำมาเป็นชื่อโปรแกรม มัน
จะถูกเรียกเป็น sh -c โปรแกรม 'arg1' 'arg2' และควรคืนค่าสถานะออกเป็นศูนย์ if
และเฉพาะในกรณีที่ arg1 เป็นข้อมูลล่าสุดเกี่ยวกับ arg2 แสตมป์วันที่ยังคงอยู่
ขยายพันธุ์ได้ตามปกติ
Q ไม่มีการพิมพ์สูตรก่อนดำเนินการ
R กฎนี้เป็นกฎเมตาที่ใช้นิพจน์ทั่วไป ในกฎนั้น % ไม่มีอะไรพิเศษ
ความหมาย. เป้าหมายถูกตีความว่าเป็นนิพจน์ทั่วไปตามที่กำหนดไว้ใน
regexp(7). ข้อกำหนดเบื้องต้นอาจมีการอ้างอิงถึงนิพจน์ย่อยในรูปแบบ \n,
เช่นเดียวกับคำสั่งแทนของ ความกระหายน้ำ(1)
U เป้าหมายจะถือว่าได้รับการอัปเดตแม้ว่าสูตรจะไม่ทำอย่างนั้นก็ตาม
V เป้าหมายของกฎนี้ถูกทำเครื่องหมายเป็นเสมือน ต่างจากไฟล์ของ
ชื่อเดียวกัน
ตัวอย่าง
mkfile ง่าย ๆ ในการรวบรวมโปรแกรม:
</$objtype/mkfile
โปรแกรม: a.$O b.$O c.$O
$LD $LDFLAGS -o $เป้าหมาย $prereq
%.$O: %.ค
$CC $CFLAGS $stem.ค
แทนที่การตั้งค่าแฟล็กใน mkfile:
% mk เป้าหมาย 'CFLAGS=-S -w'
ดูแลห้องสมุด:
libc.a(%.$O):N: %.$O
libc.a: libc.a(abs.$O) libc.a(การเข้าถึง.$O) libc.a(alarm.$O) ...
ar r libc.a $สมาชิกใหม่
ตัวแปรนิพจน์สตริงเพื่อรับชื่อจากรายการหลัก:
NAMES=alloc arc bquote builtins ขยายการจับคู่หลัก mk var word
OBJ=${ชื่อ:%=%.$O}
กฎเมตาของนิพจน์ทั่วไป:
([^/]*)/(.*)\.$O:R: \1/\2.c
ซีดี $stem1; $CC $CFLAGS $stem2.c
วิธีรับมือที่ถูกต้อง ย๊าก(1) ไวยากรณ์ ไฟล์ เล็กซ์.ซี รวมถึงไฟล์ x.tab.h
มากกว่า y.tab.h เพื่อสะท้อนการเปลี่ยนแปลงในเนื้อหา ไม่ใช่แค่เวลาปรับเปลี่ยน
ไฟแนนซ์$O: x.tab.h
x.tab.h: y.tab.h
cmp -s x.tab.h y.tab.h || cp y.tab.h x.tab.h
y.tab.c y.tab.h: gram.y
$YACC -d gram.y
ตัวอย่างข้างต้นสามารถใช้ the P คุณลักษณะสำหรับ x.tab.h กฎ:
x.tab.h:Pcmp -s: y.tab.h
cp y.tab.h x.tab.h
แหล่งที่มา
/src/cmd/mk
ใช้ mkplan9 ออนไลน์โดยใช้บริการ onworks.net
