- ใช้
- ตัวแปรที่กำหนดไว้ล่วงหน้า
- ตัวแปร genrule ที่กำหนดไว้ล่วงหน้า
- ตัวแปรเส้นทางแหล่งที่มา/เอาต์พุตที่กำหนดไว้ล่วงหน้า
- ตัวแปรที่กำหนดเอง
ตัวแปร "Make" เป็นตัวแปรสตริงที่ขยายได้ประเภทพิเศษ ซึ่งใช้ได้ กับแอตทริบิวต์ที่ทำเครื่องหมายเป็น "Subject to 'Make variable' substitution"
ตัวแปรเหล่านี้สามารถใช้ได้ เช่น เพื่อแทรกเส้นทางของ Toolchain ที่เฉพาะเจาะจงลงใน การดำเนินการสร้างที่ผู้ใช้สร้างขึ้น
Bazel มีทั้งตัวแปร ที่กำหนดไว้ล่วงหน้า ซึ่งใช้ได้กับเป้าหมายทั้งหมด และตัวแปร ที่กำหนดเอง ซึ่งกำหนดไว้ในเป้าหมายการขึ้นต่อกัน และใช้ได้กับเป้าหมายที่ขึ้นต่อกันเท่านั้น
เหตุผลที่ใช้คำว่า "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"
หากต้องการเขียน $ เป็นสตริงตัวอักษร (เช่น เพื่อป้องกันการขยายตัวแปร
) ให้เขียน $$
ตัวแปรที่กำหนดไว้ล่วงหน้า
ตัวแปร "Make" ที่กำหนดไว้ล่วงหน้าสามารถอ้างอิงได้โดยแอตทริบิวต์ใดก็ตามที่ทำเครื่องหมายเป็น "Subject to 'Make variable' substitution" ในเป้าหมายใดก็ได้
หากต้องการดูรายการตัวแปรเหล่านี้และค่าของตัวแปรสำหรับชุดตัวเลือกการสร้าง ที่กำหนด ให้เรียกใช้คำสั่ง
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: ระบุเส้นทางที่ไบนารีที่สร้างขึ้นใช้เพื่อ ค้นหาการขึ้นต่อกันในขณะรันไทม์ที่สัมพันธ์กับไดเรกทอรีย่อยของไดเรกทอรี runfiles ที่ตรงกับที่เก็บข้อมูลหลัก หมายเหตุ: ตัวแปรนี้จะทำงานได้ก็ต่อเมื่อเปิดใช้--enable_runfilesซึ่งไม่ได้เปิดใช้โดยค่าเริ่มต้นใน Windows โปรดใช้rlocationpathแทนเพื่อรองรับหลายแพลตฟอร์มตัวแปรนี้คล้ายกับ
execpathแต่จะนำคำนำหน้าการกำหนดค่า ที่อธิบายไว้ข้างต้นออก ในตัวอย่างจากด้านบน หมายความว่าทั้งempty.sourceและappใช้เส้นทางที่สัมพันธ์กับพื้นที่ทำงานล้วนๆ ได้แก่testapp/empty.sourceและtestapp/approotpathของไฟล์ในที่เก็บข้อมูลภายนอกrepoจะขึ้นต้นด้วย../repo/ตามด้วย เส้นทางที่สัมพันธ์กับที่เก็บข้อมูลตัวแปรนี้มีข้อกำหนด "เอาต์พุตเดียวเท่านั้น" เหมือนกับ
execpath -
rlocationpath: เส้นทางที่ไบนารีที่สร้างขึ้นส่งผ่านไปยังฟังก์ชันRlocationของไลบรารี runfiles เพื่อค้นหาการขึ้นต่อกันในขณะรันไทม์ ไม่ว่าจะอยู่ในไดเรกทอรี 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, rlocationpaths และlocation,
ตามลำดับ ตัวแปรเหล่านี้รองรับป้ายกำกับที่สร้างเอาต์พุตหลายรายการ ในกรณีนี้
ระบบจะแสดงเอาต์พุตแต่ละรายการโดยคั่นด้วยช่องว่าง กฎที่ไม่มีเอาต์พุตและป้ายกำกับที่มีรูปแบบไม่ถูกต้อง
จะทำให้เกิดข้อผิดพลาดในการสร้าง
ป้ายกำกับที่อ้างอิงทั้งหมดต้องปรากฏใน srcs ไฟล์เอาต์พุต หรือ deps ของเป้าหมายที่ใช้ หากไม่เป็นเช่นนั้น บิลด์จะล้มเหลว เป้าหมาย C++ ยังอ้างอิงป้ายกำกับใน data ได้ด้วย
ป้ายกำกับไม่จำเป็นต้องอยู่ในรูปแบบ Canonical โดย foo, :foo
และ //somepkg:foo ใช้ได้ทั้งหมด
ตัวแปรที่กำหนดเอง
ตัวแปร "Make" ที่กำหนดเองสามารถอ้างอิงได้โดยแอตทริบิวต์ใดก็ตามที่ทำเครื่องหมายเป็น "Subject to 'Make variable' substitution", แต่เฉพาะในเป้าหมายที่ ขึ้นต่อกันกับเป้าหมายอื่นๆ ที่ กำหนด ตัวแปรเหล่านี้
แนวทางปฏิบัติแนะนำคือตัวแปรทั้งหมดควรเป็นตัวแปรที่กำหนดเอง เว้นแต่จะมีเหตุผลที่ดีจริงๆ ที่จะรวมตัวแปรเหล่านั้นไว้ใน Bazel หลัก วิธีนี้จะช่วยให้ Bazel ไม่ต้องโหลด การขึ้นต่อกันที่มีค่าใช้จ่ายสูงซึ่งเป้าหมายที่ใช้ตัวแปรอาจ ไม่สนใจ
ตัวแปร Toolchain ของ C++
ตัวแปรต่อไปนี้กำหนดไว้ในกฎ Toolchain ของ C++ และใช้ได้กับกฎใดก็ตาม
ที่ตั้งค่า toolchains =
["@bazel_tools//tools/cpp:current_cc_toolchain"]
กฎบางอย่าง เช่น java_binary จะรวม Toolchain ของ C++ ไว้ในการกำหนดกฎโดยนัย กฎเหล่านี้จะรับค่าตัวแปรเหล่านี้
โดยอัตโนมัติ
กฎ C++ ในตัวมีความซับซ้อนมากกว่า "เรียกใช้คอมไพเลอร์กับ กฎ" มาก เพื่อให้รองรับโหมดการคอมไพล์ที่หลากหลาย เช่น *SAN, ThinLTO, มี/ไม่มีโมดูล และไบนารีที่ปรับให้เหมาะสมอย่างระมัดระวัง พร้อมๆ กับการทดสอบที่ทำงานได้อย่างรวดเร็วในหลายแพลตฟอร์ม กฎในตัวจึงพยายามอย่างเต็มที่เพื่อให้แน่ใจว่ามีการตั้งค่าอินพุต เอาต์พุต และแฟล็กบรรทัดคำสั่งที่ถูกต้องในการดำเนินการที่สร้างขึ้นภายในซึ่งอาจมีหลายรายการ
ตัวแปรเหล่านี้เป็นกลไกการทำงานสำรองที่ผู้เชี่ยวชาญด้านภาษาใช้ใน กรณีที่พบได้ยาก หากคุณต้องการใช้ตัวแปรเหล่านี้ โปรด ติดต่อทีมพัฒนา Bazel ก่อน
ABI: เวอร์ชัน ABI ของ C++-
AR: คำสั่ง "ar" จาก crosstool -
C_COMPILER: ตัวระบุคอมไพเลอร์ C/C++ เช่นllvm -
CC: คำสั่งคอมไพเลอร์ C และ C++เราขอแนะนำอย่างยิ่งให้ใช้
CC_FLAGSร่วมกับCCเสมอ หากไม่ทำเช่นนั้น คุณต้องยอมรับความเสี่ยงเอง CC_FLAGS: ชุดแฟล็กขั้นต่ำสำหรับคอมไพเลอร์ C/C++ ที่ genrule ใช้ได้ โดยเฉพาะอย่างยิ่ง ตัวแปรนี้มีแฟล็กสำหรับ เลือกสถาปัตยกรรมที่ถูกต้องหากCCรองรับหลาย สถาปัตยกรรม-
NM: คำสั่ง "nm" จาก crosstool -
OBJCOPY: คำสั่ง objcopy จากชุดเครื่องมือเดียวกันกับคอมไพเลอร์ C/C++ -
STRIP: คำสั่ง strip จากชุดเครื่องมือเดียวกันกับคอมไพเลอร์ C/C++
ตัวแปร Toolchain ของ Java
ตัวแปรต่อไปนี้กำหนดไว้ในกฎ Toolchain ของ Java และใช้ได้กับกฎใดก็ตาม
ที่ตั้งค่า toolchains =
["@bazel_tools//tools/jdk:current_java_runtime"] (หรือ
"@bazel_tools//tools/jdk: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 จะอ่านค่าของตัวแปรได้