- การใช้งาน
- ตัวแปรที่กำหนดไว้ล่วงหน้า
- ตัวแปร Genrule ที่กำหนดไว้ล่วงหน้า
- ตัวแปรเส้นทางแหล่งที่มา/เอาต์พุตที่กำหนดไว้ล่วงหน้า
- ตัวแปรที่กำหนดเอง
"ทำ" ตัวแปร คือคลาสพิเศษของตัวแปรสตริงที่ขยายได้ ไปยังแอตทริบิวต์ที่ทำเครื่องหมายว่า "ขึ้นอยู่กับ "สร้างตัวแปร" การแทนค่า"
ตัวอย่างเหล่านี้สามารถใช้เพื่อแทรกเส้นทาง Toolchain ที่เฉพาะเจาะจงลงใน การดำเนินการบิลด์ที่ผู้ใช้สร้างขึ้น
Bazel จัดเตรียมตัวแปรที่กำหนดไว้ล่วงหน้าทั้ง 2 ตัวแปรซึ่งใช้ได้กับทุกตัวแปร เป้าหมาย และตัวแปรที่กำหนดเอง ซึ่งระบุไว้ในเป้าหมายทรัพยากร Dependency และใช้ได้กับเป้าหมายที่อ้างอิงอยู่เท่านั้น
สาเหตุที่ทำให้เกิดคำว่า "ผู้ผลิต" คือประวัติศาสตร์ นั่นคือไวยากรณ์และอรรถศาสตร์ของ แต่เดิมตัวแปรเหล่านี้มีจุดประสงค์เพื่อให้ตรงกับ GNU ยี่ห้อ
ใช้
แอตทริบิวต์ที่ทําเครื่องหมายเป็น "ขึ้นอยู่กับ "สร้างตัวแปร" การแทนค่า" สามารถ
ให้อ้างอิงถึง "ผู้ผลิต" ตัวแปร FOO
ดังนี้
my_attr = "prefix $(FOO) suffix"
กล่าวคือ ขยายสตริงย่อยทั้งหมดที่ตรงกับ $(FOO)
เป็นค่าของ FOO
หากค่านั้นเป็น "bar"
ค่าสุดท้าย
สตริงจะกลายเป็น:
my_attr = "prefix bar suffix"
หาก FOO
ไม่ตรงกับตัวแปรที่ทราบของตัวแปรที่ใช้
Bazel ดำเนินการไม่สำเร็จเนื่องจากข้อผิดพลาด
"ทำ" ตัวแปรที่ชื่อไม่ใช่สัญลักษณ์ตัวอักษร เช่น
@
สามารถอ้างอิงได้โดยใช้เฉพาะเครื่องหมายดอลลาร์ โดยไม่มี
วงเล็บ เช่น
my_attr = "prefix $@ suffix"
เพื่อเขียน $
เป็นสัญพจน์ของสตริง (เช่น เพื่อป้องกันตัวแปร
การขยาย) ให้เขียน $$
ตัวแปรที่กำหนดไว้ล่วงหน้า
"ผู้ผลิต" ที่กำหนดไว้ล่วงหน้า ตัวแปรสามารถอ้างอิงได้โดยแอตทริบิวต์ที่ทำเครื่องหมายเป็น "ขึ้นอยู่กับ 'สร้างตัวแปร' แทน" ในเป้าหมายใดก็ได้
หากต้องการดูรายการตัวแปรเหล่านี้และค่าสำหรับชุดบิลด์ที่กำหนด ตัวเลือก, เรียกใช้
bazel info --show_make_env [build options]
และดูที่บรรทัดเอาต์พุตด้านบนด้วยอักษรตัวพิมพ์ใหญ่
ดูตัวอย่างตัวแปรที่กําหนดไว้ล่วงหน้า
ตัวแปรตัวเลือก Toolchain
COMPILATION_MODE
:fastbuild
,dbg
หรือopt
(เพิ่มเติม รายละเอียด)
ตัวแปรเส้นทาง
-
BINDIR
: ฐานของแผนผังไบนารีที่สร้างขึ้นสำหรับเป้าหมาย สถาปัตยกรรมโปรดทราบว่าอาจมีการใช้แผนผังอื่นสำหรับโปรแกรมที่ทำงานระหว่าง ต่อยอดสถาปัตยกรรมโฮสต์เพื่อรองรับการคอมไพล์แบบข้ามแพลตฟอร์ม
หากต้องการเรียกใช้เครื่องมือจากภายใน
genrule
พารามิเตอร์ เส้นทางที่แนะนำคือ$(execpath toolname)
โดยที่ ชื่อเครื่องมือ จะต้องอยู่ในรายการของgenrule
tools
GENDIR
: ฐานของแผนผังโค้ดที่สร้างขึ้นสำหรับสถาปัตยกรรมเป้าหมาย
ตัวแปรของสถาปัตยกรรมเครื่อง
-
TARGET_CPU
: CPU ของสถาปัตยกรรมเป้าหมาย เช่นk8
ตัวแปร Genrule ที่กำหนดไว้ล่วงหน้า
รายการต่อไปนี้มีให้บริการแก่ธุรกิจ genrule
cmd
และต่อไปนี้
มักสำคัญในการช่วยให้แอตทริบิวต์นั้นใช้งานได้
ดูตัวอย่างตัวแปร Genrule ที่กำหนดไว้ล่วงหน้า
OUTS
: รายการouts
ของgenrule
หากคุณมี ไฟล์เอาต์พุตเดียวเท่านั้น คุณยังสามารถใช้$@
ได้ด้วย-
SRCS
: รายการsrcs
ของgenrule
(หรือมากกว่านั้น นั่นคือชื่อเส้นทางของไฟล์ที่เกี่ยวข้องกับป้ายกำกับในsrcs
) หากมีไฟล์ต้นฉบับเพียงไฟล์เดียว คุณยังใช้$<
ได้ด้วย -
<
:SRCS
หากเป็นไฟล์เดียว ทริกเกอร์อื่นๆ ข้อผิดพลาดของรุ่น -
@
:OUTS
หากเป็นไฟล์เดียว ไม่เช่นนั้นจะทริกเกอร์ ข้อผิดพลาดของรุ่น -
RULEDIR
: ไดเรกทอรีเอาต์พุตของเป้าหมาย ซึ่งก็คือ ไดเรกทอรีที่ตรงกับชื่อแพ็กเกจที่มีการกำหนดเป้าหมาย ใต้แผนผังgenfiles
หรือbin
สำหรับ//my/pkg:my_genrule
มักจะลงท้ายด้วยmy/pkg
, แม้ว่าเอาต์พุตของ//my/pkg:my_genrule
จะอยู่ในไดเรกทอรีย่อยก็ตาม -
@D
: ไดเรกทอรีเอาต์พุต ถ้า outs มี 1 รายการ จะเป็นการขยายเป็นไดเรกทอรีที่มีไฟล์นั้น หากมีหลายส่วน การดำเนินการนี้จะขยายเป็นไดเรกทอรีรากของแพ็กเกจใน แผนผังgenfiles
แม้ว่าไฟล์เอาต์พุตทั้งหมดจะอยู่ในเหมือนกัน ไดเรกทอรีย่อย!หมายเหตุ: ใช้
RULEDIR
มากกว่า@D
เนื่องจากRULEDIR
มีความหมายที่ง่ายกว่าและมีการทำงานในลักษณะเดียวกัน โดยไม่คํานึงถึงจำนวนไฟล์เอาต์พุตหาก Genrule ต้องการสร้างไฟล์กลางชั่วคราว (อาจเป็น ซึ่งเป็นผลมาจากการใช้เครื่องมืออื่น เช่น คอมไพเลอร์) ให้เขียนถึง
@D
(แต่/tmp
จะ เขียนได้) แล้วนำออกไปก่อนที่จะจบลงโดยเฉพาะอย่างยิ่ง ให้หลีกเลี่ยงการเขียนไปยังไดเรกทอรีที่มีอินพุต อาจเปิดอยู่ ระบบไฟล์แบบอ่านอย่างเดียว มิฉะนั้น การทำเช่นนั้นจะเป็นการทิ้งโครงสร้างต้นทาง
ตัวแปรเส้นทางแหล่งที่มา/เอาต์พุตที่กำหนดไว้ล่วงหน้า
ตัวแปรที่กำหนดล่วงหน้า execpath
, execpaths
,
rootpath
, rootpaths
, location
และ
locations
นำพารามิเตอร์ของป้ายกำกับ (เช่น $(execpath
//foo:bar)
) มาใช้แทนเส้นทางไฟล์ที่ป้ายกำกับนั้นแสดง
สำหรับไฟล์ต้นทาง นี่คือเส้นทางที่สัมพันธ์กับรูทของพื้นที่ทำงาน สำหรับไฟล์ที่เป็นเอาต์พุตของกฎ จะเป็นเส้นทางเอาต์พุตของไฟล์ (ดูคำอธิบายของไฟล์เอาต์พุตด้านล่าง)
ดูตัวอย่างตัวแปรเส้นทางที่กําหนดไว้ล่วงหน้า
-
execpath
: แสดงเส้นทางที่อยู่ใต้ ผู้บริหาร ที่ Bazel เรียกใช้การดำเนินการบิลด์ในตัวอย่างด้านบน Bazel เรียกใช้การดำเนินการบิลด์ทั้งหมดในไดเรกทอรีที่ลิงก์ ตามลิงก์สัญลักษณ์
bazel-myproject
ในรูทของพื้นที่ทำงาน ไฟล์ต้นฉบับempty.source
ลิงก์อยู่ที่เส้นทางbazel-myproject/testapp/empty.source
ดังนั้นเส้นทางผู้บริหาร (ซึ่ง คือเส้นทางย่อยด้านล่างราก) คือtestapp/empty.source
ช่วงเวลานี้ คือการทำงานของบิลด์เส้นทางที่ใช้ค้นหาไฟล์ได้ไฟล์เอาต์พุตจะได้รับการจัดเป็นขั้นตอนคล้ายคลึงกัน แต่จะมีเส้นทางย่อยนำหน้าด้วย
bazel-out/cpu-compilation_mode/bin
(หรือสำหรับเอาต์พุตของ เครื่องมือ:bazel-out/cpu-opt-exec-hash/bin
) ในตัวอย่างข้างต้น//testapp:app
เป็นเครื่องมือเนื่องจากปรากฏใน แอตทริบิวต์tools
ของshow_app_output
ระบบจึงเขียนไฟล์เอาต์พุตapp
ไปยังbazel-myproject/bazel-out/cpu-opt-exec-hash/bin/testapp/app
เส้นทาง exec คือbazel-out/cpu-opt-exec-hash/bin/testapp/app
คำนำหน้าเพิ่มเติมนี้ ช่วยให้สร้างเป้าหมายเดียวกันสำหรับ CPU ที่แตกต่างกัน 2 ตัว สิ่งสร้างเดียวกันโดยที่ผลลัพธ์ไม่บดบังกันป้ายกำกับที่ส่งไปยังตัวแปรนี้ต้องแสดงถึงไฟล์เพียง 1 ไฟล์เท่านั้น สำหรับ ป้ายกำกับที่แสดงไฟล์ต้นฉบับ ซึ่งจะเป็นจริงโดยอัตโนมัติ สำหรับป้ายกำกับ แทนกฎ กฎนั้นจะต้องสร้างเอาต์พุตเพียง 1 รายการ หากนี่คือ false หรือป้ายกำกับผิดรูปแบบ การสร้างล้มเหลวโดยมีข้อผิดพลาด
-
rootpath
: แสดงเส้นทางที่ไบนารีที่สร้างขึ้นใช้เพื่อ ค้นหาทรัพยากร Dependency ในรันไทม์ซึ่งสัมพันธ์กับไดเรกทอรีย่อยของไฟล์รันไฟล์ ที่สอดคล้องกับที่เก็บหลัก หมายเหตุ: การดำเนินการนี้จะใช้ได้เมื่อ--enable_runfiles
เปิดอยู่ ซึ่งไม่ใช่กรณีปกติ Windows โดยค่าเริ่มต้น ใช้rlocationpath
แทนสำหรับ ข้ามแพลตฟอร์มได้ค่านี้คล้ายกับ
execpath
แต่ตัดการกำหนดค่าออก ตามที่อธิบายข้างต้น ในตัวอย่างจากด้านบนนี้empty.source
และapp
ใช้พื้นที่ทำงานที่สัมพันธ์กับพื้นที่ทำงานทั้งหมด เส้นทาง:testapp/empty.source
และtestapp/app
rootpath
ของไฟล์ในที่เก็บภายนอกrepo
จะขึ้นต้นด้วย../repo/
ตามด้วย เส้นทางที่เกี่ยวข้องกับที่เก็บมีข้อมูล "เอาต์พุตเดียวเท่านั้น" เหมือนกัน ข้อกำหนดในฐานะ
execpath
-
rlocationpath
: เส้นทางที่ไบนารีที่สร้างขึ้นสามารถส่งผ่านไปยังฟังก์ชันRlocation
ของไลบรารีรันไฟล์ เพื่อค้นหาทรัพยากร Dependency ที่ ในไดเรกทอรี Runfiles (หากมี) หรือใช้ ไฟล์ Manifest ของ Runfilesซึ่งคล้ายกับ
rootpath
ตรงที่ไม่มี คำนำหน้าการกำหนดค่า แต่แตกต่างกันตรงที่มักจะขึ้นต้นด้วย ของที่เก็บ ในตัวอย่างจากด้านบน ค่านี้หมายความว่าempty.source
และapp
ส่งผลดังต่อไปนี้ เส้นทาง:myproject/testapp/empty.source
และmyproject/testapp/app
rlocationpath
ของไฟล์ในที่เก็บภายนอกrepo
จะขึ้นต้นด้วยrepo/
ตามด้วย เส้นทางที่เกี่ยวข้องกับที่เก็บส่งเส้นทางนี้ไปยังไบนารีและแก้ไขเป็นเส้นทางระบบไฟล์โดยใช้ ไลบรารีรันไฟล์เป็นวิธีที่แนะนำในการค้นหาทรัพยากร Dependency รันไทม์ เมื่อเทียบกับ
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
ไม่มีปัญหา
ตัวแปรที่กำหนดเอง
"ผู้ผลิต" ที่กำหนดเอง ตัวแปรสามารถอ้างอิงได้โดยแอตทริบิวต์ที่ทำเครื่องหมายเป็น "ขึ้นอยู่กับ 'สร้างตัวแปร' แทน" แต่มีผลเฉพาะกับเป้าหมายที่ ขึ้นอยู่กับเป้าหมายอื่นๆ ที่กำหนดตัวแปรเหล่านี้
ตามแนวทางปฏิบัติแนะนำ ตัวแปรทั้งหมดควรกำหนดเอง เว้นแต่ตัวแปรที่ดี ที่ควรจะอบขนมเหล่านั้นให้เป็น Bazel หลัก ช่วยให้ Bazel ไม่ต้องโหลด ทรัพยากร Dependency ที่มีราคาแพงเพื่อรองรับตัวแปรที่ใช้ทาเร็ตอาจ ก็ไม่สนใจ
ตัวแปร Toolchain ของ C++
สิ่งต่อไปนี้กำหนดไว้ในกฎเครื่องมือเชน C++ และใช้ได้กับกฎทุกข้อ
ที่กำหนดtoolchains =
["@bazel_tools//tools/cpp:current_cc_toolchain"]
กฎบางอย่าง เช่น java_binary
โดยปริยาย
รวมเครื่องมือเชน C++ ไว้ในคำจำกัดความของกฎ รับค่าตัวแปรเหล่านี้
โดยอัตโนมัติ
กฎ C++ ในตัวจะซับซ้อนกว่า "เรียกใช้คอมไพเลอร์ มัน" เพื่อให้รองรับโหมดการคอมไพล์ได้หลากหลายเหมือน *SAN, ThinLTO มี/ไม่มีโมดูล และไบนารีที่เพิ่มประสิทธิภาพอย่างระมัดระวัง ดำเนินการทดสอบได้อย่างรวดเร็วในหลายแพลตฟอร์ม กฎในตัวจะให้ผลลัพธ์ที่ดี ความยาวเพื่อให้แน่ใจว่าได้ตั้งค่าอินพุต เอาต์พุต และแฟล็กบรรทัดคำสั่งที่ถูกต้อง ในการดำเนินการหลายรายการที่อาจเกิดขึ้นภายในแต่ละรายการ
ตัวแปรเหล่านี้เป็นกลไกสำรองที่ผู้เชี่ยวชาญด้านภาษาใช้ กรณีที่พบได้ไม่บ่อยนัก หากต้องการใช้งาน โปรดติดต่อนักพัฒนาแอป Bazel ก่อน
ABI
: เวอร์ชัน C++ ABI-
AR
: สัญลักษณ์ "ar" จาก Crosstool -
C_COMPILER
: ตัวระบุคอมไพเลอร์ C/C++ เช่นllvm
-
CC
: คำสั่งของคอมไพเลอร์ C และ C++เราขอแนะนำอย่างยิ่งให้ใช้
CC_FLAGS
เสมอใน รวมกับCC
หากไม่สำเร็จ คุณต้องยอมรับความเสี่ยงเอง CC_FLAGS
: ชุด Flag ขั้นต่ำสำหรับ C/C++ ที่ genrules ใช้งานได้ กล่าวอย่างเจาะจงคือ เลือกสถาปัตยกรรมที่ถูกต้องหากCC
รองรับหลายเวอร์ชัน สถาปัตยกรรม-
NM
: สัญลักษณ์ "Nm" จาก Crosstool -
OBJCOPY
: คำสั่ง objcopy จากชุดโปรแกรมเดียวกับ C/C++ คอมไพเลอร์ -
STRIP
: คำสั่ง Strip จากชุดโปรแกรมเดียวกันกับ C/C++ คอมไพเลอร์
ตัวแปร Toolchain ของ Java
โค้ดต่อไปนี้กำหนดไว้ในกฎของเครื่องมือ Javas และใช้ได้กับกฎทั้งหมด
ที่กำหนด toolchains =
["@bazel_tools//tools/jdk:current_java_runtime"]
(หรือ
วันที่ "@bazel_tools//tools/jdk:current_host_java_runtime"
สำหรับเครื่องมือเชนของโฮสต์ที่เทียบเท่า)
ไม่ควรใช้เครื่องมือส่วนใหญ่ใน JDK โดยตรง Java ในตัว จะใช้วิธีการที่ซับซ้อนมากขึ้นในการคอมไพล์และการทำแพ็กเกจ Java กว่าที่เครื่องมืออัปสตรีมแสดงได้ เช่น Jars อินเทอร์เฟซ, อินเทอร์เฟซส่วนหัว Jars, บรรจุภัณฑ์ Jar ที่ได้รับการเพิ่มประสิทธิภาพสูง และการใช้งานผสานรวม
ตัวแปรเหล่านี้เป็นกลไกสำรองที่ผู้เชี่ยวชาญด้านภาษาใช้ กรณีที่พบได้ไม่บ่อยนัก หากต้องการใช้งาน โปรดติดต่อนักพัฒนาแอป Bazel ก่อน
-
JAVA
: "java" ( Java Virtual) อัตโนมัติ) หลีกเลี่ยงการดำเนินการนี้และใช้กฎjava_binary
แทนหากเป็นไปได้ อาจเป็นเส้นทางที่เกี่ยวข้อง หากคุณจำเป็นต้องเปลี่ยน ไดเรกทอรีก่อนที่จะเรียกใช้java
คุณต้องบันทึก ไดเรกทอรีที่ใช้งานอยู่ก่อนที่จะเปลี่ยนแปลง JAVABASE
: ไดเรกทอรีฐานที่มี ยูทิลิตีของ Java อาจเป็นเส้นทางที่เกี่ยวข้อง เครื่องมือนี้จะมี "ถังขยะ" ไดเรกทอรีย่อย
ตัวแปรที่กำหนดโดย Starlark
ผู้เขียนกฎและเครื่องมือเชนจะกำหนดได้
ตัวแปรที่กำหนดเองทั้งหมดโดยส่งคืน
TemplateVariableInfo
กฎใดๆ ที่ขึ้นอยู่กับนโยบายเหล่านี้ผ่าน
จากนั้นแอตทริบิวต์ toolchains
จะอ่านค่าต่อไปนี้ได้