- ใช้
- ตัวแปรที่กำหนดไว้ล่วงหน้า
- ตัวแปร genrule ที่กำหนดไว้ล่วงหน้า
- ตัวแปรเส้นทางแหล่งที่มา/เอาต์พุตที่กำหนดไว้ล่วงหน้า
- ตัวแปรที่กำหนดเอง
ตัวแปร "Make" เป็นตัวแปรสตริงที่ขยายได้ประเภทพิเศษ ซึ่งแอตทริบิวต์ที่ทำเครื่องหมายเป็น "Subject to 'Make variable' substitution" สามารถใช้ได้
ตัวแปรเหล่านี้สามารถใช้ได้ เช่น เพื่อแทรกเส้นทาง Toolchain ที่เฉพาะเจาะจงลงในการดำเนินการสร้างที่ผู้ใช้สร้างขึ้น
Bazel มีทั้งตัวแปร ที่กำหนดไว้ล่วงหน้า ซึ่งใช้ได้กับเป้าหมายทั้งหมด และตัวแปร ที่กำหนดเอง ซึ่งกำหนดไว้ในเป้าหมายทรัพยากร Dependency และใช้ได้กับเป้าหมายที่ขึ้นต่อกันเท่านั้น
เหตุผลที่ใช้คำว่า "Make" เป็นเรื่องทางประวัติศาสตร์ เนื่องจากเดิมทีไวยากรณ์และความหมายของ ตัวแปรเหล่านี้มีไว้เพื่อให้ตรงกับ GNU Make
ใช้
แอตทริบิวต์ที่ทำเครื่องหมายเป็น "Subject to 'Make variable' substitution" สามารถ
อ้างอิงตัวแปร "Make" FOO ได้ดังนี้
my_attr = "prefix $(FOO) suffix"
กล่าวอีกนัยหนึ่งคือ สตริงย่อยใดก็ตามที่ตรงกับ $(FOO) จะขยาย
เป็นค่าของ FOO หากค่าดังกล่าวเป็น "bar" สตริงสุดท้าย
จะเป็นดังนี้
my_attr = "prefix bar suffix"
หาก FOO ไม่ตรงกับตัวแปรที่เป้าหมายที่ใช้รู้จัก Bazel จะล้มเหลวพร้อมข้อผิดพลาด
ตัวแปร "Make" ที่มีชื่อเป็นสัญลักษณ์ที่ไม่ใช่ตัวอักษร เช่น
@ สามารถอ้างอิงได้โดยใช้เครื่องหมายดอลลาร์เพียงอย่างเดียวโดยไม่ต้องใส่วงเล็บ เช่น
my_attr = "prefix $@ suffix"
หากต้องการเขียน $ เป็นสตริงลิเทอรัล (เช่น เพื่อป้องกันการขยายตัวแปร
) ให้เขียน $$
ตัวแปรที่กำหนดไว้ล่วงหน้า
แอตทริบิวต์ใดก็ตามที่ทำเครื่องหมายเป็น "Subject to 'Make variable' substitution" ในเป้าหมายใดก็ได้สามารถอ้างอิงตัวแปร "Make" ที่กำหนดไว้ล่วงหน้าได้
หากต้องการดูรายการตัวแปรเหล่านี้และค่าของตัวแปรสำหรับชุดตัวเลือกการสร้าง ที่กำหนด ให้เรียกใช้
bazel info --show_make_env [build options]
และดูบรรทัดเอาต์พุตด้านบนที่มีตัวอักษรตัวพิมพ์ใหญ่
ดูตัวอย่างตัวแปรที่กำหนดไว้ล่วงหน้า
ตัวแปรตัวเลือก Toolchain
COMPILATION_MODE:fastbuild,dbg, หรือopt(ดูรายละเอียด เพิ่มเติม)
ตัวแปรเส้นทาง
-
BINDIR: ฐานของแผนผังไบนารีที่สร้างขึ้นสำหรับสถาปัตยกรรมเป้าหมายโปรดทราบว่าระบบอาจใช้แผนผังอื่นสำหรับโปรแกรมที่ทำงานระหว่างการสร้างในสถาปัตยกรรมโฮสต์ เพื่อรองรับการคอมไพล์ข้ามระบบ
หากต้องการเรียกใช้เครื่องมือจากภายใน
genruleวิธีที่แนะนำในการรับเส้นทางของเครื่องมือคือ$(execpath toolname)โดย toolname ต้องแสดงอยู่ในแอตทริบิวต์toolsของgenrule GENDIR: ฐานของแผนผังโค้ดที่สร้างขึ้นสำหรับสถาปัตยกรรมเป้าหมาย
ตัวแปรสถาปัตยกรรมเครื่อง
-
TARGET_CPU: CPU ของสถาปัตยกรรมเป้าหมาย เช่นk8
ตัวแปร genrule ที่กำหนดไว้ล่วงหน้า
ตัวแปรต่อไปนี้ใช้ได้กับแอตทริบิวต์ genrule's
cmd เป็นพิเศษ และ
โดยทั่วไปมีความสำคัญต่อการทำให้แอตทริบิวต์ดังกล่าวทำงานได้
ดูตัวอย่างตัวแปร genrule ที่กำหนดไว้ล่วงหน้า
OUTS: รายการoutsของgenruleหากมีไฟล์เอาต์พุตเพียงไฟล์เดียว คุณสามารถใช้$@ได้ด้วย-
SRCS: รายการsrcsของgenrule(หรือชื่อเส้นทางของไฟล์ที่ตรงกับป้ายกำกับในรายการsrcs) หากมีไฟล์ต้นฉบับเพียงไฟล์เดียว คุณสามารถใช้$<ได้ด้วย -
<:SRCSหากเป็นไฟล์เดียว หากไม่เป็นเช่นนั้น จะทริกเกอร์ข้อผิดพลาดในการสร้าง -
@:OUTSหากเป็นไฟล์เดียว หากไม่เป็นเช่นนั้น จะทริกเกอร์ข้อผิดพลาดในการสร้าง -
RULEDIR: ไดเรกทอรีเอาต์พุตของเป้าหมาย ซึ่งก็คือไดเรกทอรีที่ตรงกับชื่อแพ็กเกจที่มีเป้าหมายอยู่ใต้แผนผังgenfilesหรือbinสำหรับ//my/pkg:my_genruleตัวแปรนี้จะลงท้ายด้วยmy/pkg, เสมอ แม้ว่าเอาต์พุตของ//my/pkg:my_genrule's จะอยู่ในไดเรกทอรีย่อยก็ตาม -
@D: ไดเรกทอรีเอาต์พุต หาก outs มีรายการเดียว ตัวแปรนี้จะขยายเป็นไดเรกทอรีที่มีไฟล์ดังกล่าว หากมีหลายรายการ ตัวแปรนี้จะขยายเป็นไดเรกทอรีรากของแพ็กเกจในแผนผังgenfilesแม้ว่าไฟล์เอาต์พุตทั้งหมดจะอยู่ในไดเรกทอรีย่อยเดียวกันก็ตาม!หมายเหตุ: ใช้
RULEDIRแทน@Dเนื่องจากRULEDIRมีความหมายที่ง่ายกว่าและทำงานในลักษณะเดียวกัน ไม่ว่าจะมีไฟล์เอาต์พุตจำนวนเท่าใดก็ตามหาก genrule ต้องสร้างไฟล์ชั่วคราวระดับกลาง (อาจเป็นผลจากการใช้เครื่องมืออื่นๆ เช่น คอมไพเลอร์) เครื่องมือควรพยายามเขียนไฟล์เหล่านั้นลงใน
@D(แม้ว่าจะเขียนลงใน/tmpได้ด้วย) และนำไฟล์ออกก่อนที่จะเสร็จสิ้นโดยเฉพาะอย่างยิ่งควรหลีกเลี่ยงการเขียนลงในไดเรกทอรีที่มีอินพุต เนื่องจากไดเรกทอรีเหล่านั้นอาจอยู่ในระบบไฟล์แบบอ่านอย่างเดียว แม้ว่าจะไม่ได้อยู่ในระบบไฟล์แบบอ่านอย่างเดียว การทำเช่นนั้นก็จะทำให้แผนผังแหล่งที่มาเสียหาย
ตัวแปรเส้นทางแหล่งที่มา/เอาต์พุตที่กำหนดไว้ล่วงหน้า
ตัวแปรที่กำหนดไว้ล่วงหน้า execpath, execpaths,
rootpath, rootpaths, location, และ
locations ใช้พารามิเตอร์ป้ายกำกับ (เช่น $(execpath
//foo:bar)) และแทนที่เส้นทางไฟล์ที่ระบุโดยป้ายกำกับนั้น
สำหรับไฟล์ต้นฉบับ เส้นทางนี้จะเป็นเส้นทางสัมพัทธ์กับรากของพื้นที่ทำงาน สำหรับไฟล์ที่เป็นเอาต์พุตของกฎ เส้นทางนี้จะเป็น เส้นทางเอาต์พุต ของไฟล์ (ดูคำอธิบาย ไฟล์เอาต์พุตด้านล่าง)
ดูตัวอย่างตัวแปรเส้นทางที่กำหนดไว้ล่วงหน้า
-
execpath: ระบุเส้นทางใต้ execroot ที่ Bazel เรียกใช้การดำเนินการสร้างในตัวอย่างด้านบน Bazel จะเรียกใช้การดำเนินการสร้างทั้งหมดในไดเรกทอรีที่ลิงก์ โดย
bazel-myprojectsymlink ในรูทของพื้นที่ทำงาน ไฟล์ต้นฉบับempty.sourceจะลิงก์อยู่ที่เส้นทางbazel-myproject/testapp/empty.sourceดังนั้นเส้นทาง exec (ซึ่ง คือเส้นทางย่อยใต้ราก) คือtestapp/empty.sourceซึ่งเป็นเส้นทางที่การดำเนินการสร้างใช้เพื่อค้นหาไฟล์ระบบจะจัดเตรียมไฟล์เอาต์พุตในลักษณะเดียวกัน แต่จะนำหน้าด้วยเส้นทางย่อย
bazel-out/cpu-compilation_mode/bin(หรือสำหรับเอาต์พุตของ เครื่องมือ:bazel-out/cpu-opt-exec-hash/bin) ในตัวอย่างด้านบน//testapp:appเป็นเครื่องมือเนื่องจากปรากฏในshow_app_output's แอตทริบิวต์toolsดังนั้นระบบจะเขียนไฟล์เอาต์พุตappลงในbazel-myproject/bazel-out/cpu-opt-exec-hash/bin/testapp/appดังนั้นเส้นทาง exec จึงเป็นbazel-out/cpu-opt-exec-hash/bin/testapp/appคำนำหน้าเพิ่มเติมนี้ ช่วยให้สร้างเป้าหมายเดียวกันสำหรับ CPU 2 รายการที่แตกต่างกันใน บิลด์เดียวกันได้โดยไม่ทำให้ผลลัพธ์ทับกันป้ายกำกับที่ส่งไปยังตัวแปรนี้ต้องแสดงถึงไฟล์เดียวเท่านั้น สำหรับ ป้ายกำกับที่แสดงถึงไฟล์ต้นฉบับ เงื่อนไขนี้จะเป็นจริงโดยอัตโนมัติ สำหรับป้ายกำกับ ที่แสดงถึงกฎ กฎต้องสร้างเอาต์พุตเพียงรายการเดียว หากเงื่อนไขนี้ไม่เป็นจริงหรือป้ายกำกับมีรูปแบบไม่ถูกต้อง บิลด์จะล้มเหลวพร้อมข้อผิดพลาด
-
rootpath: ระบุเส้นทางที่ไบนารีที่สร้างขึ้นใช้เพื่อ ค้นหาทรัพยากร Dependency ในขณะรันไทม์โดยสัมพันธ์กับไดเรกทอรีย่อยของไดเรกทอรี runfiles ที่ตรงกับที่เก็บหลัก หมายเหตุ: ตัวแปรนี้จะทำงานได้ก็ต่อเมื่อเปิดใช้--enable_runfilesซึ่งไม่ได้เปิดใช้โดยค่าเริ่มต้นใน Windows โปรดใช้rlocationpathแทนเพื่อรองรับหลายแพลตฟอร์มตัวแปรนี้คล้ายกับ
execpathแต่จะนำคำนำหน้าการกำหนดค่า ที่อธิบายไว้ข้างต้นออก ในตัวอย่างจากด้านบน หมายความว่าทั้งempty.sourceและappใช้เส้นทางสัมพัทธ์กับพื้นที่ทำงานล้วนๆ ได้แก่testapp/empty.sourceและtestapp/approotpathของไฟล์ในที่เก็บภายนอกrepoจะขึ้นต้นด้วย../repo/ตามด้วย เส้นทางสัมพัทธ์กับที่เก็บตัวแปรนี้มีข้อกำหนด "เอาต์พุตเดียวเท่านั้น" เหมือนกับ
execpath -
rlocationpath: เส้นทางที่ไบนารีที่สร้างขึ้นส่งไปยังฟังก์ชันRlocationของไลบรารี runfiles เพื่อค้นหาทรัพยากร Dependency ในขณะรันไทม์ ไม่ว่าจะอยู่ในไดเรกทอรี runfiles (หากมี) หรือใช้ไฟล์ Manifest ของ runfilesตัวแปรนี้คล้ายกับ
rootpathตรงที่ไม่มี คำนำหน้าการกำหนดค่า แต่แตกต่างกันตรงที่จะขึ้นต้นด้วย ชื่อที่เก็บเสมอ ในตัวอย่างจากด้านบน หมายความว่าempty.sourceและappจะมีเส้นทางดังนี้myproject/testapp/empty.sourceและmyproject/testapp/apprlocationpathของไฟล์ในที่เก็บภายนอกrepoจะขึ้นต้นด้วยrepo/ตามด้วย เส้นทางสัมพัทธ์กับที่เก็บการส่งเส้นทางนี้ไปยังไบนารีและการแปลงเส้นทางนี้เป็นเส้นทางระบบไฟล์โดยใช้ ไลบรารี runfiles เป็นแนวทางที่แนะนำในการค้นหาการขึ้นต่อกันในขณะรันไทม์ เมื่อเทียบกับ
rootpathตัวแปรนี้มีข้อดีตรงที่ทำงานได้ในทุกแพลตฟอร์มและแม้ว่าจะไม่มีไดเรกทอรี runfiles ก็ตามตัวแปรนี้มีข้อกำหนด "เอาต์พุตเดียวเท่านั้น" เหมือนกับ
execpath -
location: คำพ้องความหมายของexecpathหรือrootpathขึ้นอยู่กับแอตทริบิวต์ที่ขยาย ตัวแปรนี้เป็น ลักษณะการทำงานก่อน Starlark แบบเดิมและไม่แนะนำให้ใช้ เว้นแต่คุณจะทราบอย่างแน่ชัดว่าตัวแปรนี้ทำอะไรสำหรับกฎที่เฉพาะเจาะจง ดูรายละเอียดได้ที่ #2475
execpaths, rootpaths, rlocationpaths,
และ locations เป็นรูปแบบพหูพจน์ของ execpath,
rootpath, rlocationpath, และlocation,
ตามลำดับ ตัวแปรเหล่านี้รองรับป้ายกำกับที่สร้างเอาต์พุตหลายรายการ ในกรณีนี้
ระบบจะแสดงเอาต์พุตแต่ละรายการโดยคั่นด้วยช่องว่าง กฎที่ไม่มีเอาต์พุตและป้ายกำกับที่มีรูปแบบไม่ถูกต้อง จะทำให้เกิดข้อผิดพลาดในการสร้าง
ป้ายกำกับที่อ้างอิงทั้งหมดต้องปรากฏใน srcs ไฟล์เอาต์พุต หรือ deps ของเป้าหมายที่ใช้ หากไม่เป็นเช่นนั้น บิลด์จะล้มเหลว เป้าหมาย C++ ยังอ้างอิงป้ายกำกับใน data ได้ด้วย
ป้ายกำกับไม่จำเป็นต้องอยู่ในรูปแบบ Canonical โดย foo, :foo
และ //somepkg:foo ใช้ได้ทั้งหมด
ตัวแปรที่กำหนดเอง
แอตทริบิวต์ใดก็ตามที่ทำเครื่องหมายเป็น "Subject to 'Make variable' substitution" สามารถอ้างอิงตัวแปร "Make" ที่กำหนดเองได้ แต่เฉพาะในเป้าหมายที่ ขึ้นต่อกันกับเป้าหมายอื่นๆ ที่ กำหนด ตัวแปรเหล่านี้
แนวทางปฏิบัติแนะนำคือตัวแปรทั้งหมดควรเป็นตัวแปรที่กำหนดเอง เว้นแต่จะมีเหตุผลที่ดีจริงๆ ที่จะรวมตัวแปรเหล่านั้นไว้ใน Bazel หลัก วิธีนี้จะช่วยให้ Bazel ไม่ต้องโหลด การขึ้นต่อกันที่มีค่าใช้จ่ายสูงซึ่งเป้าหมายที่ใช้ตัวแปรอาจ ไม่สนใจ
ตัวแปร Toolchain ของ C++
ตัวแปรต่อไปนี้กำหนดไว้ในกฎ Toolchain ของ C++ และใช้ได้กับกฎใดก็ตาม
ที่ตั้งค่า toolchains =
["@bazel_tools//tools/cpp:current_cc_toolchain"]
กฎบางอย่าง เช่น java_binary จะรวม Toolchain ของ C++ ไว้ในคำจำกัดความของกฎโดยนัย กฎเหล่านั้นจะรับช่วงตัวแปรเหล่านี้
โดยอัตโนมัติ
กฎ C++ ในตัวมีความซับซ้อนมากกว่า "เรียกใช้คอมไพเลอร์กับ กฎ" มาก เพื่อให้รองรับโหมดการคอมไพล์ที่หลากหลาย เช่น *SAN, ThinLTO, with/without modules และไบนารีที่ได้รับการเพิ่มประสิทธิภาพอย่างระมัดระวังไปพร้อมๆ กับ การเรียกใช้การทดสอบอย่างรวดเร็วในหลายแพลตฟอร์ม กฎในตัวจึงพยายามอย่างเต็มที่เพื่อให้แน่ใจว่าได้ตั้งค่า อินพุต เอาต์พุต และแฟล็กบรรทัดคำสั่งที่ถูกต้องในการดำเนินการที่สร้างขึ้นภายในซึ่งอาจมีหลายรายการ
ตัวแปรเหล่านี้เป็นกลไกการทำงานแบบย้อนกลับที่ผู้เชี่ยวชาญด้านภาษาใช้ใน กรณีที่พบได้ยาก หากคุณต้องการใช้ตัวแปรเหล่านี้ โปรด ติดต่อทีมพัฒนา Bazel ก่อน
ABI: เวอร์ชัน ABI ของ C++-
AR: คำสั่ง "ar" จาก crosstool -
C_COMPILER: ตัวระบุคอมไพเลอร์ C/C++ เช่นllvm -
CC: คำสั่งคอมไพเลอร์ C และ C++เราขอแนะนำอย่างยิ่งให้ใช้
CC_FLAGSร่วมกับCCเสมอ หากไม่ทำเช่นนั้น คุณจะต้องรับความเสี่ยงเอง CC_FLAGS: ชุดแฟล็กขั้นต่ำสำหรับคอมไพเลอร์ C/C++ ที่ genrule ใช้ได้ โดยเฉพาะอย่างยิ่ง ตัวแปรนี้มีแฟล็กสำหรับ เลือกสถาปัตยกรรมที่ถูกต้องหากCCรองรับหลาย สถาปัตยกรรม-
DUMPBIN: Microsoft COFF Binary File Dumper (dumpbin.exe) จาก จาก Microsoft Visual Studio -
NM: คำสั่ง "nm" จาก crosstool -
OBJCOPY: คำสั่ง objcopy จากชุดเครื่องมือเดียวกันกับคอมไพเลอร์ C/C++ -
STRIP: คำสั่ง strip จากชุดเครื่องมือเดียวกันกับคอมไพเลอร์ C/C++
ตัวแปร Toolchain ของ Java
ตัวแปรต่อไปนี้กำหนดไว้ในกฎ Toolchain ของ Java และใช้ได้กับกฎใดก็ตาม
ที่ตั้งค่า toolchains =
["@rules_java//toolchains:current_java_runtime"] (หรือ
"@rules_java//toolchains:current_host_java_runtime"
สำหรับ Toolchain โฮสต์ที่เทียบเท่า)
ไม่ควรใช้เครื่องมือส่วนใหญ่ใน JDK โดยตรง กฎ Java ในตัวใช้แนวทางที่ซับซ้อนกว่ามากในการคอมไพล์และสร้างแพ็กเกจ Java ซึ่งเครื่องมือต้นน้ำไม่สามารถแสดงได้ เช่น อินเทอร์เฟซ Jar, อินเทอร์เฟซส่วนหัว Jar และการใช้งานการสร้างแพ็กเกจและการผสาน Jar ที่ได้รับการเพิ่มประสิทธิภาพอย่างสูง
ตัวแปรเหล่านี้เป็นกลไกการทำงานแบบย้อนกลับที่ผู้เชี่ยวชาญด้านภาษาใช้ใน กรณีที่พบได้ยาก หากคุณต้องการใช้ตัวแปรเหล่านี้ โปรด ติดต่อทีมพัฒนา Bazel ก่อน
-
JAVA: คำสั่ง "java" (Java Virtual machine) หลีกเลี่ยงการใช้ตัวแปรนี้และใช้กฎjava_binaryแทนหากเป็นไปได้ ตัวแปรนี้อาจเป็นเส้นทางสัมพัทธ์ หากคุณต้องเปลี่ยน ไดเรกทอรีก่อนที่จะเรียกใช้javaคุณจะต้องบันทึก ไดเรกทอรีการทำงานก่อนที่จะเปลี่ยน JAVABASE: ไดเรกทอรีฐานที่มียูทิลิตี Java ตัวแปรนี้อาจเป็นเส้นทางสัมพัทธ์ และจะมีไดเรกทอรีย่อย "bin" subdirectory.
ตัวแปรที่กำหนดโดย Starlark
ผู้เขียนกฎและ Toolchain สามารถกำหนดตัวแปรที่กำหนดเองได้อย่างสมบูรณ์โดยการแสดงผลผู้ให้บริการ TemplateVariableInfo กฎใดก็ตามที่ขึ้นต่อกันกับตัวแปรเหล่านี้ผ่านแอตทริบิวต์
toolchains จะอ่านค่าของตัวแปรได้ดังนี้