- ใช้
- ตัวแปรที่กำหนดไว้ล่วงหน้า
- ตัวแปร genrule ที่กำหนดไว้ล่วงหน้า
- ตัวแปรเส้นทางแหล่งที่มา/เอาต์พุตที่กำหนดไว้ล่วงหน้า
- ตัวแปรที่กำหนดเอง
ตัวแปร "Make" เป็นตัวแปรสตริงที่ขยายได้ประเภทพิเศษ ซึ่งใช้ได้ กับแอตทริบิวต์ที่ทำเครื่องหมายเป็น "Subject to 'Make variable' substitution"
ตัวแปรเหล่านี้สามารถใช้ได้ เช่น เพื่อแทรกเส้นทางทูลเชนที่เฉพาะเจาะจงลงในการดำเนินการบิลด์ที่ผู้ใช้สร้างขึ้น
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"
หากต้องการเขียน $ เป็นสตริงลิเทอรัล (เช่น เพื่อป้องกันการขยายตัวแปร) ให้เขียน $$.
Predefined variables
Predefined "Make" variables can be referenced by any attribute marked as "Subject to 'Make variable' substitution" on any target.
To see the list of these variables and their values for a given set of build options, run
bazel info --show_make_env [build options]
and look at the top output lines with capital letters.
See an example of predefined variables.
Toolchain option variables
COMPILATION_MODE:fastbuild,dbg, oropt. (more details)
Path variables
-
BINDIR: The base of the generated binary tree for the target architecture.Note that a different tree may be used for programs that run during the build on the host architecture, to support cross-compiling.
If you want to run a tool from within a
genrule, the recommended way to get its path is$(execpath toolname), where toolname must be listed in thegenrule'stoolsattribute. GENDIR: The base of the generated code tree for the target architecture.
Machine architecture variables
-
TARGET_CPU: The target architecture's CPU, e.g.k8.
Predefined genrule variables
The following are specially available to genrule's
cmd attribute and are
generally important for making that attribute work.
See an example of predefined genrule variables.
OUTS: Thegenrule'soutslist. If you have only one output file, you can also use$@.-
SRCS: Thegenrule'ssrcslist (or more precisely: the path names of the files corresponding to labels in thesrcslist). If you have only one source file, you can also use$<. -
<:SRCS, if it is a single file. Else triggers a build error. -
@:OUTS, if it is a single file. Else triggers a build error. -
RULEDIR: The output directory of the target, that is, the directory corresponding to the name of the package containing the target under thegenfilesorbintree. For//my/pkg:my_genrulethis always ends inmy/pkg, even if//my/pkg:my_genrule's outputs are in subdirectories. -
@D: The output directory. If outs has one entry, this expands to the directory containing that file. If it has multiple entries, this expands to the package's root directory in thegenfilestree, even if all output files are in the same subdirectory!Note: Use
RULEDIRover@DbecauseRULEDIRhas simpler semantics and behaves the same way regardless of the number of output files.If the genrule needs to generate temporary intermediate files (perhaps as a result of using some other tool like a compiler), it should attempt to write them to
@D(although/tmpwill also be writable) and remove them before finishing.Especially avoid writing to directories containing inputs. They may be on read-only filesystems. Even if not, doing so would trash the source tree.
Note: If the filenames corresponding to the input labels or the output
filenames contain spaces, ', or other special characters (or your
genrule is part of a Starlark macro which downstream users may invoke on such
files), then $(SRCS) and $(OUTS) are not suitable
for interpolation into a command line, as they do not have the semantics that
"${@}" would in Bash.
One workaround is to convert to a Bash array, with
mapfile SRCS <<< "$$(sed -e 's/ /\\n/g' <<'genrule_srcs_expansion' $(SRC) genrule_srcs_expansion )แล้วใช้"$$\{SRCS[@]}"ในบรรทัดคำสั่งที่ตามมาแทน$(SRCS)ตัวเลือกที่เสถียรกว่าคือการเขียนกฎ Starlark แทนตัวแปรเส้นทางแหล่งที่มา/เอาต์พุตที่กำหนดไว้ล่วงหน้า
ตัวแปรที่กำหนดไว้ล่วงหน้า
execpath,execpaths,rootpath,rootpaths,location, และlocationsใช้พารามิเตอร์ป้ายกำกับ (เช่น$(execpath //foo:bar)) และแทนที่เส้นทางไฟล์ที่ระบุโดยป้ายกำกับนั้นสำหรับไฟล์ต้นฉบับ นี่คือเส้นทางที่สัมพันธ์กับรูทของพื้นที่ทำงาน สำหรับไฟล์ที่เป็นเอาต์พุตของกฎ นี่คือ เส้นทางเอาต์พุต ของไฟล์ (ดูคำอธิบายของ ไฟล์เอาต์พุต ด้านล่าง)
-
execpath: ระบุเส้นทางใต้ execroot ที่ Bazel เรียกใช้การดำเนินการบิลด์ในตัวอย่างข้างต้น Bazel จะเรียกใช้การดำเนินการบิลด์ทั้งหมดในไดเรกทอรีที่ลิงก์ โดย Symlink
bazel-myprojectในรูทของพื้นที่ทำงาน ไฟล์ต้นฉบับ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'stoolsแอตทริบิวต์ ดังนั้นไฟล์เอาต์พุต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 รายการเท่านั้น หากเงื่อนไขนี้เป็น เท็จหรือป้ายกำกับมีรูปแบบไม่ถูกต้อง บิลด์จะล้มเหลวพร้อมข้อผิดพลาด
-
rootpath: ระบุเส้นทางที่ไบนารีที่สร้างขึ้นใช้เพื่อ ค้นหาทรัพยากร Dependency ในรันไทม์ที่สัมพันธ์กับไดเรกทอรีย่อยของไดเรกทอรี Runfiles ที่สอดคล้องกับที่เก็บหลัก หมายเหตุ: ตัวแปรนี้จะทำงานได้ก็ต่อเมื่อเปิดใช้--enable_runfilesซึ่งไม่ได้เปิดใช้ใน Windows โดยค่าเริ่มต้น โปรดใช้rlocationpathแทนเพื่อรองรับหลายแพลตฟอร์มตัวแปรนี้คล้ายกับ
execpathแต่จะนำคำนำหน้าการกำหนดค่า ที่อธิบายไว้ข้างต้นออก ในตัวอย่างจากด้านบน หมายความว่าทั้งempty.sourceและappใช้เส้นทางที่สัมพันธ์กับพื้นที่ทำงานล้วนๆ ได้แก่testapp/empty.sourceและtestapp/approotpathของไฟล์ในที่เก็บภายนอกrepoจะขึ้นต้นด้วย../repo/ตามด้วย เส้นทางที่สัมพันธ์กับที่เก็บตัวแปรนี้มีข้อกำหนด "เอาต์พุต 1 รายการเท่านั้น" เหมือนกับ
execpath -
rlocationpath: เส้นทางที่ไบนารีที่สร้างขึ้นส่งผ่านไปยังฟังก์ชันRlocationของไลบรารี Runfiles เพื่อค้นหาทรัพยากร Dependency ในรันไทม์ ไม่ว่าจะอยู่ในไดเรกทอรี Runfiles (หากมี) หรือใช้ไฟล์ Manifest ของ Runfilesตัวแปรนี้คล้ายกับ
rootpathตรงที่จะไม่มี คำนำหน้าการกำหนดค่า แต่จะแตกต่างกันตรงที่จะขึ้นต้นด้วย ชื่อที่เก็บเสมอ ในตัวอย่างจากด้านบน หมายความว่าempty.sourceและappจะได้เส้นทางต่อไปนี้:myproject/testapp/empty.sourceและmyproject/testapp/appThe
rlocationpathของไฟล์ในที่เก็บภายนอกrepoจะขึ้นต้นด้วยrepo/ตามด้วย เส้นทางที่สัมพันธ์กับที่เก็บการส่งเส้นทางนี้ไปยังไบนารีและการแปลงเส้นทางนี้เป็นเส้นทางระบบไฟล์โดยใช้ ไลบรารี Runfiles เป็นแนวทางที่แนะนำในการค้นหาการขึ้นต่อกันใน รันไทม์ ตัวแปรนี้มีข้อดีกว่า
rootpathตรงที่จะทำงานได้ในทุกแพลตฟอร์มและแม้ว่าจะไม่มีไดเรกทอรี Runfiles ก็ตามตัวแปรนี้มีข้อกำหนด "เอาต์พุต 1 รายการเท่านั้น" เหมือนกับ
execpath -
location: คำพ้องความหมายของexecpathหรือrootpathขึ้นอยู่กับแอตทริบิวต์ที่ขยาย นี่คือ ลักษณะการทำงานเดิมก่อน Starlark และไม่แนะนำให้ใช้เว้นแต่คุณจะทราบอย่างแน่ชัดว่า ตัวแปรนี้ทำอะไรสำหรับกฎหนึ่งๆ ดูรายละเอียดได้ที่ #2475
execpaths, rootpaths, rlocationpaths,
และ locations เป็นรูปแบบพหูพจน์ของ execpath,
rootpath, rlocationpath, และlocation,
ตามลำดับ ตัวแปรเหล่านี้รองรับป้ายกำกับที่สร้างเอาต์พุตหลายรายการ ในกรณีนี้
ระบบจะแสดงเอาต์พุตแต่ละรายการโดยคั่นด้วยช่องว่าง กฎที่ไม่มีเอาต์พุตและป้ายกำกับที่มีรูปแบบไม่ถูกต้อง
จะทำให้เกิดข้อผิดพลาดในการบิลด์
ป้ายกำกับทั้งหมดที่อ้างอิงต้องปรากฏใน srcs,
ไฟล์เอาต์พุต หรือ deps ของเป้าหมายที่ใช้ มิเช่นนั้นบิลด์จะล้มเหลว เป้าหมาย C++ ยังอ้างอิงป้ายกำกับใน data ได้ด้วย
ป้ายกำกับไม่จำเป็นต้องอยู่ในรูปแบบ Canonical โดย foo, :foo
และ //somepkg:foo ใช้ได้ทั้งหมด
ตัวแปรที่กำหนดเอง
ตัวแปร "Make" ที่กำหนดเองสามารถอ้างอิงได้โดยแอตทริบิวต์ใดก็ตามที่ทำเครื่องหมายเป็น "Subject to 'Make variable' substitution", แต่เฉพาะในเป้าหมายที่ ขึ้นต่อกันกับเป้าหมายอื่นๆ ที่ กำหนด ตัวแปรเหล่านี้
แนวทางปฏิบัติแนะนำคือตัวแปรทั้งหมดควรเป็นตัวแปรที่กำหนดเอง เว้นแต่จะมีเหตุผลที่ดีจริงๆ ที่จะรวมตัวแปรเหล่านั้นไว้ใน Bazel หลัก วิธีนี้จะช่วยให้ Bazel ไม่ต้องโหลด การขึ้นต่อกันที่อาจมีค่าใช้จ่ายสูงเพื่อจัดหาตัวแปรที่เป้าหมายที่ใช้ ไม่สนใจ
ตัวแปรทูลเชน C++
ตัวแปรต่อไปนี้กำหนดไว้ในกฎทูลเชน C++ และใช้ได้กับกฎใดก็ตาม
ที่ตั้งค่า toolchains =
["@bazel_tools//tools/cpp:toolchain_type"]
กฎบางอย่าง เช่น java_binary จะรวมทูลเชน 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 จะอ่านค่าของตัวแปรได้ดังนี้