กฎ
- cc_binary
- cc_import
- cc_library
- cc_proto_library
- cc_shared_library
- cc_test
- cc_toolchain
- cc_toolchain_suite
- fdo_prefetch_hints
- fdo_profile
- memprof_profile
- propeller_optimize
cc_binary
ดูแหล่งที่มาของกฎcc_binary(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, dynamic_deps, env, exec_compatible_with, exec_properties, features, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local_defines, malloc, module_interfaces, nocopts, output_licenses, reexport_deps, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)
โดยจะสร้างไบนารีที่สั่งการได้
name
ของเป้าหมายควรเป็นชื่อเดียวกับไฟล์ต้นฉบับที่เป็นจุดแรกเข้าหลักของแอปพลิเคชัน (ลบด้วยส่วนขยาย)
ตัวอย่างเช่น หากจุดแรกเข้าของคุณคือ main.cc
ชื่อของคุณควรเป็น main
เป้าหมายเอาต์พุตโดยนัย
name.stripped
(สร้างเฉพาะในกรณีที่มีการขออย่างชัดเจน): ไบนารีเวอร์ชันที่ถูกตัดออกstrip -g
จะเรียกใช้ในไบนารีเพื่อนำสัญลักษณ์การแก้ไขข้อบกพร่องออก ระบุตัวเลือกแถบเพิ่มเติมในบรรทัดคำสั่งได้โดยใช้--stripopt=-foo
name.dwp
(สร้างเฉพาะในกรณีที่มีคำขออย่างชัดแจ้งเท่านั้น): หากเปิดใช้ Fission: ไฟล์แพ็กเกจข้อมูลการแก้ไขข้อบกพร่องที่เหมาะสำหรับการแก้ไขข้อบกพร่องของไบนารีที่ทำให้ใช้งานได้จากระยะไกล หรือไม่ก็ไฟล์เปล่า
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
deps
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ ซึ่งอาจเป็นเป้าหมาย |
srcs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ ระบบจะคอมไพล์ไฟล์ทั้งหมด ไฟล์ As Signing ล้วน (.s, .asm) ไม่ได้รับการประมวลผลล่วงหน้าและมักสร้างขึ้นโดยใช้ Ascyclr ไฟล์แอสเซมบลีที่ประมวลผลล่วงหน้า (.S) จะได้รับการประมวลผลล่วงหน้าและโดยปกติจะสร้างโดยใช้คอมไพเลอร์ C/C++ ระบบจะไม่คอมไพล์ไฟล์ คุณต้องพูดถึงไฟล์ ไฟล์ หากแอตทริบิวต์
ไฟล์
... และกฎที่สร้างไฟล์เหล่านั้น (เช่น |
data
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ data ได้ที่แอตทริบิวต์ทั่วไปที่กำหนดโดยกฎบิลด์ส่วนใหญ่
หาก หาก โค้ด C++ จะเข้าถึงไฟล์ข้อมูลเหล่านี้ได้ในลักษณะต่อไปนี้
|
additional_linker_inputs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ เช่น ไฟล์ .res ของ Windows ที่คอมไพล์แล้วอาจระบุที่นี่เพื่อฝังในเป้าหมายไบนารี |
copts
|
รายการสตริง ค่าเริ่มต้นคือ
ระบบจะเพิ่มแต่ละสตริงในแอตทริบิวต์นี้ตามลำดับที่ระบุไปยัง
หากแพ็กเกจประกาศฟีเจอร์
|
defines
|
รายการสตริง ค่าเริ่มต้นคือ -D นำหน้าและเพิ่มลงในบรรทัดคำสั่งของคอมไพล์ไปยังเป้าหมายนี้ รวมถึงกฎทุกข้อที่อ้างอิงสตริงนี้ โปรดใช้ความระมัดระวังเป็นอย่างยิ่ง
เนื่องจากอาจส่งผลกระทบในวงกว้าง หากไม่แน่ใจ ให้เพิ่มกําหนดค่าให้กับ local_defines แทน
|
dynamic_deps
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ cc_shared_library ที่เป้าหมายปัจจุบันใช้งานอยู่
การติดตั้งใช้งาน |
hdrs_check
|
สตริง ค่าเริ่มต้นคือ |
includes
|
รายการสตริง ค่าเริ่มต้นคือ -isystem path_to_package/include_entry
ซึ่งควรใช้กับไลบรารีของบุคคลที่สามที่ไม่สอดคล้องกับรูปแบบการเขียน #include ของ Google เท่านั้น
ซึ่งต่างจาก COPTS ตรงที่จะเพิ่มแฟล็กเหล่านี้สำหรับกฎนี้และกฎทุกกฎที่อ้างอิงกฎดังกล่าว (หมายเหตุ: ไม่ใช่กฎเกณฑ์แต่อย่างใด) โปรดใช้ความระมัดระวังเป็นอย่างยิ่งเนื่องจากอาจทำให้เกิดผลกระทบอย่างมาก หากไม่แน่ใจ ให้เพิ่มแฟล็ก "-I" ลงใน COPTS แทน
เส้นทาง |
link_extra_lib
|
ป้ายกำกับ ค่าเริ่มต้นคือ
โดยค่าเริ่มต้น ไบนารีของ C++ จะลิงก์กับ |
linkopts
|
รายการสตริง ค่าเริ่มต้นคือ LINKOPTS ก่อนลิงก์เป้าหมายไบนารี
แต่ละองค์ประกอบในรายการที่ไม่ได้ขึ้นต้นด้วย |
linkshared
|
บูลีน ค่าเริ่มต้นคือ linkshared=True ในกฎ ตัวเลือกนี้จะปิดอยู่โดยค่าเริ่มต้น
การมี Flag นี้แสดงว่ามีการลิงก์ด้วยแฟล็ก
หากระบุทั้ง |
linkstatic
|
บูลีน ค่าเริ่มต้นคือ cc_binary และ cc_test ให้ลิงก์ไบนารีในโหมดคงที่ สำหรับ cc_library.link_static : ดูด้านล่าง
โดยค่าเริ่มต้น ตัวเลือกนี้จะเปิดอยู่สำหรับ
หากเปิดใช้และนี่เป็นไบนารีหรือการทดสอบ ตัวเลือกนี้จะบอกเครื่องมือสร้างให้ลิงก์ใน การลิงก์ไฟล์ปฏิบัติการมี 3 วิธีที่แตกต่างกันดังนี้
หากใช้แอตทริบิวต์
แอตทริบิวต์
ควรมีโค้ดเพียงเล็กน้อยที่สร้างด้วย |
local_defines
|
รายการสตริง ค่าเริ่มต้นคือ -D นำหน้าและเพิ่มลงในบรรทัดคำสั่งของคอมไพล์สำหรับเป้าหมายนี้ แต่ไม่ใช่ลงในการอ้างอิง
|
malloc
|
ป้ายกำกับ ค่าเริ่มต้นคือ
โดยค่าเริ่มต้น ไบนารีของ C++ จะลิงก์กับ |
module_interfaces
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ C++ มาตรฐานไม่มีข้อจำกัดเกี่ยวกับนามสกุลไฟล์ของโมดูลอินเตอร์เฟซ
การใช้งานได้รับการปกป้องโดยแฟล็ก
|
nocopts
|
สตริง ค่าเริ่มต้นคือ COPTS ที่มีอยู่ก่อนหน้าซึ่งตรงกับนิพจน์ทั่วไปนี้ (รวมถึงค่าที่ระบุอย่างชัดแจ้งในแอตทริบิวต์ copts ของกฎ) ออกจาก COPTS เพื่อวัตถุประสงค์ในการรวบรวมกฎนี้
คุณไม่ควรต้องใช้หรือใช้แอตทริบิวต์นี้นอก third_party ค่าจะไม่ได้รับการประมวลผลล่วงหน้าด้วยวิธีการอื่นใดนอกจากการแทนที่ตัวแปร "Make"
|
reexport_deps
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ |
stamp
|
จำนวนเต็ม ค่าเริ่มต้นคือ
ระบบจะไม่สร้างไบนารีที่ประทับตราอีกครั้ง เว้นแต่ทรัพยากร Dependency จะมีการเปลี่ยนแปลง |
win_def_file
|
ป้ายกำกับ ค่าเริ่มต้นคือ แอตทริบิวต์นี้ควรใช้เมื่อ Windows เป็นแพลตฟอร์มเป้าหมายเท่านั้น ซึ่งใช้เพื่อ ส่งออกสัญลักษณ์ระหว่างการลิงก์ไลบรารีที่ใช้ร่วมกันได้ |
cc_import
ดูแหล่งที่มาของกฎcc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, includes, interface_library, linkopts, objects, pic_objects, pic_static_library, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, toolchains, visibility)
กฎ cc_import
อนุญาตให้ผู้ใช้นำเข้าไลบรารี C/C++ ที่คอมไพล์ไว้ล่วงหน้าได้
กรณีการใช้งานทั่วไปมีดังนี้
1. การลิงก์ไลบรารีแบบคงที่
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
static_library = "libmylib.a",
# If alwayslink is turned on,
# libmylib.a will be forcely linked into any binary that depends on it.
# alwayslink = 1,
)
2. การลิงก์ไลบรารีที่ใช้ร่วมกัน (Unix)
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
shared_library = "libmylib.so",
)
3. การลิงก์ไลบรารีที่ใช้ร่วมกันกับไลบรารีอินเทอร์เฟซ
ใน Unix:
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
# libmylib.ifso is an interface library for libmylib.so which will be passed to linker
interface_library = "libmylib.ifso",
# libmylib.so will be available for runtime
shared_library = "libmylib.so",
)
ขั้นตอนสำหรับ Windows
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
# mylib.lib is an import library for mylib.dll which will be passed to linker
interface_library = "mylib.lib",
# mylib.dll will be available for runtime
shared_library = "mylib.dll",
)
4. การลิงก์ไลบรารีที่แชร์กับ system_provided=True
ใน Unix:
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
interface_library = "libmylib.ifso", # Or we can also use libmylib.so as its own interface library
# libmylib.so is provided by system environment, for example it can be found in LD_LIBRARY_PATH.
# This indicates that Bazel is not responsible for making libmylib.so available.
system_provided = 1,
)
ขั้นตอนสำหรับ Windows
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
# mylib.lib is an import library for mylib.dll which will be passed to linker
interface_library = "mylib.lib",
# mylib.dll is provided by system environment, for example it can be found in PATH.
# This indicates that Bazel is not responsible for making mylib.dll available.
system_provided = 1,
)
5. การลิงก์ไปยังไลบรารีแบบคงที่หรือไลบรารีที่ใช้ร่วมกัน
ใน Unix:
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
static_library = "libmylib.a",
shared_library = "libmylib.so",
)
ใน Windows
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
static_library = "libmylib.lib", # A normal static library
interface_library = "mylib.lib", # An import library for mylib.dll
shared_library = "mylib.dll",
)
ส่วนที่เหลือจะเหมือนกันใน Unix และ Windows:
# first will link to libmylib.a (or libmylib.lib)
cc_binary(
name = "first",
srcs = ["first.cc"],
deps = [":mylib"],
linkstatic = 1, # default value
)
# second will link to libmylib.so (or libmylib.lib)
cc_binary(
name = "second",
srcs = ["second.cc"],
deps = [":mylib"],
linkstatic = 0,
)
cc_import
รองรับแอตทริบิวต์ include ตัวอย่างเช่น
cc_import(
name = "curl_lib",
hdrs = glob(["vendor/curl/include/curl/*.h"]),
includes = ["vendor/curl/include"],
shared_library = "vendor/curl/lib/.libs/libcurl.dylib",
)
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
deps
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ deps ได้ที่แอตทริบิวต์ทั่วไปที่กำหนดโดยกฎบิลด์ส่วนใหญ่
|
hdrs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ |
alwayslink
|
บูลีน ค่าเริ่มต้นคือ หากใช้ลิงก์ช่องตลอดเวลากับ VS 2017 ใน Windows ไม่ได้ นั่นอาจเป็นเพราะปัญหาที่ทราบแล้ว โปรดอัปเกรด VS 2017 เป็นเวอร์ชันล่าสุด |
includes
|
รายการสตริง ค่าเริ่มต้นคือ -isystem path_to_package/include_entry
ซึ่งควรใช้กับไลบรารีของบุคคลที่สามที่ไม่สอดคล้องกับรูปแบบการเขียน #include ของ Google เท่านั้น
ซึ่งต่างจาก COPTS ตรงที่จะเพิ่มแฟล็กเหล่านี้สำหรับกฎนี้และกฎทุกกฎที่อ้างอิงกฎดังกล่าว (หมายเหตุ: ไม่ใช่กฎเกณฑ์แต่อย่างใด) โปรดใช้ความระมัดระวังเป็นอย่างยิ่งเนื่องจากอาจทำให้เกิดผลกระทบอย่างมาก หากไม่แน่ใจ ให้เพิ่มแฟล็ก "-I" ลงใน COPTS แทน
เส้นทาง |
interface_library
|
ป้ายกำกับ ค่าเริ่มต้นคือ ประเภทไฟล์ที่อนุญาต: |
linkopts
|
รายการสตริง ค่าเริ่มต้นคือ LINKOPTS ก่อนลิงก์เป้าหมายไบนารี
แต่ละองค์ประกอบในรายการที่ไม่ได้ขึ้นต้นด้วย |
objects
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ |
pic_objects
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ |
pic_static_library
|
ป้ายกำกับ ค่าเริ่มต้นคือ |
shared_library
|
ป้ายกำกับ ค่าเริ่มต้นคือ ประเภทไฟล์ที่อนุญาต: |
static_library
|
ป้ายกำกับ ค่าเริ่มต้นคือ ประเภทไฟล์ที่อนุญาต: |
system_provided
|
บูลีน ค่าเริ่มต้นคือ interface_library และ shared_library ควรเว้นว่างไว้
|
cc_library
ดูแหล่งที่มาของกฎcc_library(name, deps, srcs, data, hdrs, additional_compiler_inputs, additional_linker_inputs, alwayslink, compatible_with, copts, defines, deprecation, distribs, exec_compatible_with, exec_properties, features, hdrs_check, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, module_interfaces, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)
ใช้ cc_library()
สำหรับไลบรารีที่คอมไพล์ C++
ผลลัพธ์จะเป็น .so
, .lo
หรือ .a
ขึ้นอยู่กับความจำเป็น
หากคุณสร้างบางอย่างที่มีการลิงก์แบบคงที่ซึ่งอาศัย cc_library
เอาต์พุตของกฎไลบรารีที่ขึ้นอยู่กับจะขึ้นอยู่กับไฟล์ .a
หากระบุ alwayslink=True
คุณจะได้รับไฟล์ .lo
ชื่อไฟล์เอาต์พุตจริงคือ libfoo.so
สำหรับไลบรารีที่ใช้ร่วมกัน โดย foo คือชื่อของกฎ ไลบรารีประเภทอื่นๆ จะลงท้ายด้วย .lo
และ .a
ตามลำดับ หากคุณต้องการชื่อไลบรารีที่ใช้ร่วมกันที่เจาะจง เช่น เพื่อกำหนดโมดูล Python ให้ใช้ Genrule เพื่อคัดลอกไลบรารีไปยังชื่อที่ต้องการ
การตรวจสอบการรวมส่วนหัว
ไฟล์ส่วนหัวทั้งหมดที่ใช้ในบิลด์ต้องประกาศในกฎ hdrs
หรือ srcs
ของ cc_*
บังคับใช้ข้อกำหนดแล้ว
สำหรับกฎ cc_library
ส่วนหัวใน hdrs
ประกอบด้วยอินเทอร์เฟซสาธารณะของไลบรารีและรวมไว้ได้โดยตรงจากไฟล์ใน hdrs
และ srcs
ของไลบรารีเอง รวมถึงจากไฟล์ใน hdrs
และกฎ srcs
จาก cc_*
รายการที่แสดงรายการไลบรารีใน deps
ส่วนหัวใน srcs
ต้องรวมโดยตรงจากไฟล์ใน hdrs
และ srcs
ของไลบรารีโดยตรงเท่านั้น เมื่อตัดสินใจว่าจะใส่ส่วนหัวใน hdrs
หรือ srcs
คุณควรถามว่าต้องการให้ผู้บริโภคของคลังนี้รวมส่วนหัวดังกล่าวได้โดยตรงหรือไม่ การตัดสินใจนี้คล้ายกับการตัดสินใจระหว่าง public
ถึง private
ระดับการมองเห็นในภาษาโปรแกรม
กฎ cc_binary
และ cc_test
ไม่มีอินเทอร์เฟซที่ส่งออก จึงไม่มีแอตทริบิวต์ hdrs
ด้วย ส่วนหัวทั้งหมดที่เป็นของไบนารีหรือการทดสอบโดยตรงควรระบุไว้ใน srcs
ลองดูตัวอย่างต่อไปนี้เพื่อแสดงกฎเหล่านี้
cc_binary(
name = "foo",
srcs = [
"foo.cc",
"foo.h",
],
deps = [":bar"],
)
cc_library(
name = "bar",
srcs = [
"bar.cc",
"bar-impl.h",
],
hdrs = ["bar.h"],
deps = [":baz"],
)
cc_library(
name = "baz",
srcs = [
"baz.cc",
"baz-impl.h",
],
hdrs = ["baz.h"],
)
การรวมโดยตรงที่อนุญาตในตัวอย่างนี้จะแสดงอยู่ในตารางด้านล่าง
ตัวอย่างเช่น foo.cc
ได้รับอนุญาตให้รวม foo.h
และ bar.h
โดยตรง แต่ไม่สามารถรวม baz.h
รวมไฟล์ | การรวมที่อนุญาต |
---|---|
foo.h | bar.h |
foo.cc | foo.h bar.h |
bar.h | bar-impl.h baz.h |
bar-impl.h | บาซ |
bar.cc | bar.h bar-impl.h baz.h |
baz.h | baz-impl.h |
baz-impl.h | baz.h |
baz.cc | baz.h baz-impl.h |
กฎการตรวจสอบการรวมจะมีผลกับการรวมโดยตรงเท่านั้น ในตัวอย่างด้านบน foo.cc
ได้รับอนุญาตให้ใส่ bar.h
ซึ่งอาจรวมถึง baz.h
ซึ่งส่งผลให้มี baz-impl.h
รวมอยู่ด้วย ในทางเทคนิค การคอมไพล์ไฟล์ .cc
อาจรวมไฟล์ส่วนหัวใดๆ ไว้ใน hdrs
หรือ srcs
ใน cc_library
ใดๆ ในการปิด deps
แบบทางอ้อม ในกรณีนี้ คอมไพเลอร์อาจอ่าน baz.h
และ baz-impl.h
เมื่อคอมไพเลอร์ foo.cc
แต่ foo.cc
ต้องไม่มี #include "baz.h"
คุณต้องเพิ่ม baz
ลงใน deps
ของ foo
จึงจะได้รับอนุญาต
Bazel อาศัยการรองรับ Toolchain เพื่อบังคับใช้กฎการตรวจสอบการรวม
Toolchain ต้องรองรับฟีเจอร์ layering_check
และมีการร้องขออย่างชัดแจ้ง เช่น ผ่านแฟล็กบรรทัดคำสั่ง --features=layering_check
หรือพารามิเตอร์ features
ของฟังก์ชัน package
เครื่องมือเชนจาก Bazel รองรับเฉพาะฟีเจอร์นี้กับ Clang ใน Unix และ macOS เท่านั้น
ตัวอย่าง
เราใช้แฟล็ก alwayslink
เพื่อบังคับให้ Linker ลิงก์ในโค้ดนี้ แม้ว่ารหัสไบนารีหลักจะไม่ได้อ้างอิง URL นั้น
cc_library(
name = "ast_inspector_lib",
srcs = ["ast_inspector_lib.cc"],
hdrs = ["ast_inspector_lib.h"],
visibility = ["//visibility:public"],
deps = ["//third_party/llvm/llvm/tools/clang:frontend"],
# alwayslink as we want to be able to call things in this library at
# debug time, even if they aren't used anywhere in the code.
alwayslink = 1,
)
ตัวอย่างต่อไปนี้มาจาก third_party/python2_4_3/BUILD
โค้ดบางรายการใช้ไลบรารี dl
(เพื่อโหลดไลบรารีแบบไดนามิกอื่น) ดังนั้นกฎนี้จึงระบุตัวเลือกลิงก์ -ldl
เพื่อลิงก์ไลบรารี dl
cc_library(
name = "python2_4_3",
linkopts = [
"-ldl",
"-lutil",
],
deps = ["//third_party/expat"],
)
ตัวอย่างต่อไปนี้มาจาก third_party/kde/BUILD
เราเก็บไฟล์ .so
ที่สร้างไว้ล่วงหน้าใน Depot
ไฟล์ส่วนหัวอยู่ในไดเรกทอรีย่อยชื่อ include
cc_library(
name = "kde",
srcs = [
"lib/libDCOP.so",
"lib/libkdesu.so",
"lib/libkhtml.so",
"lib/libkparts.so",
...more .so files...,
],
includes = ["include"],
deps = ["//third_party/X11"],
)
ตัวอย่างต่อไปนี้มาจาก third_party/gles/BUILD
โค้ดของบุคคลที่สามมักต้องใช้ defines
และ linkopts
cc_library(
name = "gles",
srcs = [
"GLES/egl.h",
"GLES/gl.h",
"ddx.c",
"egl.c",
],
defines = [
"USE_FLOAT",
"__GL_FLOAT",
"__GL_COMMON",
],
linkopts = ["-ldl"], # uses dlopen(), dl library
deps = [
"es",
"//third_party/X11",
],
)
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
deps
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ ซึ่งอาจเป็น ดูความคิดเห็นทั่วไปเกี่ยวกับ ชื่อควรเป็นชื่อของกฎไลบรารี C++
เมื่อสร้างไบนารีที่ลิงก์ไลบรารีของกฎนี้ คุณจะลิงก์ไลบรารีใน แม้ว่าจะมีชื่อ "deps" แต่ไคลเอ็นต์ของไลบรารีนี้บางส่วนอาจไม่อยู่ที่นี่ ทรัพยากร Dependency ของข้อมูลรันไทม์อยู่ใน หากต้องการลิงก์ในไลบรารีของบุคคลที่สามที่คอมไพล์ไว้ล่วงหน้า ให้เพิ่มชื่อในไลบรารีดังกล่าวลงใน หากต้องการอ้างอิงเนื้อหาโดยไม่ลิงก์กับไลบรารีนี้ ให้เพิ่มชื่อใน |
srcs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ ระบบจะคอมไพล์ไฟล์ทั้งหมด ไฟล์ As Signing ล้วน (.s, .asm) ไม่ได้รับการประมวลผลล่วงหน้าและมักสร้างขึ้นโดยใช้ Ascyclr ไฟล์แอสเซมบลีที่ประมวลผลล่วงหน้า (.S) จะได้รับการประมวลผลล่วงหน้าและโดยปกติจะสร้างโดยใช้คอมไพเลอร์ C/C++ ระบบจะไม่คอมไพล์ไฟล์ คุณต้องพูดถึงไฟล์ ไฟล์ หากแอตทริบิวต์
ไฟล์
... และกฎที่สร้างไฟล์เหล่านั้น (เช่น |
data
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ data ได้ที่แอตทริบิวต์ทั่วไปที่กำหนดโดยกฎบิลด์ส่วนใหญ่
หาก หาก โค้ด C++ จะเข้าถึงไฟล์ข้อมูลเหล่านี้ได้ในลักษณะต่อไปนี้
|
hdrs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ นี่เป็นตำแหน่งที่แนะนำอย่างยิ่งสำหรับการประกาศไฟล์ส่วนหัวที่อธิบายอินเทอร์เฟซสำหรับไลบรารี ส่วนหัวเหล่านี้จะพร้อมสำหรับการรวมโดยแหล่งที่มาในกฎนี้หรือกฎที่เกี่ยวข้อง
ส่วนหัวที่ไคลเอ็นต์ของไลบรารีนี้ไม่ได้รวมไว้ควรแสดงอยู่ในแอตทริบิวต์ ประเภทไฟล์ |
additional_compiler_inputs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ |
additional_linker_inputs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ เช่น ไฟล์ .res ของ Windows ที่คอมไพล์แล้วอาจระบุที่นี่เพื่อฝังในเป้าหมายไบนารี |
alwayslink
|
บูลีน ค่าเริ่มต้นคือ srcs แม้ว่าบางไฟล์จะไม่มีสัญลักษณ์ที่ไบนารีอ้างอิงก็ตาม
วิธีนี้มีประโยชน์หากโค้ดไม่ได้ถูกเรียกอย่างชัดเจนด้วยโค้ดในไบนารี เช่น หากโค้ดของคุณลงทะเบียนเพื่อรับ Callback ที่บริการบางอย่างให้
หากใช้ลิงก์ช่องตลอดเวลากับ VS 2017 ใน Windows ไม่ได้ นั่นอาจเป็นเพราะปัญหาที่ทราบแล้ว โปรดอัปเกรด VS 2017 เป็นเวอร์ชันล่าสุด |
copts
|
รายการสตริง ค่าเริ่มต้นคือ
ระบบจะเพิ่มแต่ละสตริงในแอตทริบิวต์นี้ตามลำดับที่ระบุไปยัง
หากแพ็กเกจประกาศฟีเจอร์
|
defines
|
รายการสตริง ค่าเริ่มต้นคือ -D นำหน้าและเพิ่มลงในบรรทัดคำสั่งของคอมไพล์ไปยังเป้าหมายนี้ รวมถึงกฎทุกข้อที่อ้างอิงสตริงนี้ โปรดใช้ความระมัดระวังเป็นอย่างยิ่ง
เนื่องจากอาจส่งผลกระทบในวงกว้าง หากไม่แน่ใจ ให้เพิ่มกําหนดค่าให้กับ local_defines แทน
|
hdrs_check
|
สตริง ค่าเริ่มต้นคือ |
implementation_deps
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ deps ตรงที่จะมีการใช้สำหรับการคอมไพล์ไลบรารีนี้เท่านั้น ไม่ใช่ไลบรารีที่ขึ้นอยู่กับไลบรารีนี้ ไลบรารีที่ระบุด้วย implementation_deps ยังคงลิงก์ในเป้าหมายแบบไบนารีที่ขึ้นอยู่กับไลบรารีนี้
สำหรับตอนนี้ การใช้งานจะถูกจำกัดไว้ที่ cc_libraries และได้รับการป้องกันโดย Flag
|
include_prefix
|
สตริง ค่าเริ่มต้นคือ เมื่อตั้งค่าแล้ว ส่วนหัวในแอตทริบิวต์ ระบบจะนำคำนำหน้าในแอตทริบิวต์ แอตทริบิวต์นี้ใช้ได้ตามกฎหมายภายใต้ |
includes
|
รายการสตริง ค่าเริ่มต้นคือ -isystem path_to_package/include_entry
ซึ่งควรใช้กับไลบรารีของบุคคลที่สามที่ไม่สอดคล้องกับรูปแบบการเขียน #include ของ Google เท่านั้น
ซึ่งต่างจาก COPTS ตรงที่จะเพิ่มแฟล็กเหล่านี้สำหรับกฎนี้และกฎทุกกฎที่อ้างอิงกฎดังกล่าว (หมายเหตุ: ไม่ใช่กฎเกณฑ์แต่อย่างใด) โปรดใช้ความระมัดระวังเป็นอย่างยิ่งเนื่องจากอาจทำให้เกิดผลกระทบอย่างมาก หากไม่แน่ใจ ให้เพิ่มแฟล็ก "-I" ลงใน COPTS แทน
เส้นทาง |
linkopts
|
รายการสตริง ค่าเริ่มต้นคือ cc_binary.linkopts
นอกจากนี้ แอตทริบิวต์ linkopts ยังใช้กับเป้าหมายใดๆ ที่ขึ้นต่อกันโดยตรงหรือโดยอ้อมในไลบรารีนี้ผ่านแอตทริบิวต์ deps (หรือผ่านแอตทริบิวต์อื่นๆ ที่ได้รับการปฏิบัติในลักษณะเดียวกันคือแอตทริบิวต์ malloc
ของ cc_binary ) การขึ้นต่อกันลิงก์จะมีความสำคัญเหนือกว่า linkopts ที่ไม่เป็นอิสระ (นั่นคือ Dependency linkopts จะปรากฏภายหลังในบรรทัดคำสั่ง) Linkopt ที่ระบุไว้ใน --linkopt มีลำดับความสำคัญเหนือ Linkopt ของกฎ
โปรดทราบว่าแอตทริบิวต์ นอกจากนี้ คุณควรทราบว่าตัวเลือก "-Wl,-soname" หรือ "-Xlinker -soname" ไม่ได้รับการสนับสนุนและไม่ควรระบุไว้ในแอตทริบิวต์นี้ ไฟล์ |
linkstamp
|
ป้ายกำกับ ค่าเริ่มต้นคือ base เท่านั้น
|
linkstatic
|
บูลีน ค่าเริ่มต้นคือ cc_binary และ cc_test ให้ลิงก์ไบนารีในโหมดคงที่ สำหรับ cc_library.link_static : ดูด้านล่าง
โดยค่าเริ่มต้น ตัวเลือกนี้จะเปิดอยู่สำหรับ
หากเปิดใช้และนี่เป็นไบนารีหรือการทดสอบ ตัวเลือกนี้จะบอกเครื่องมือสร้างให้ลิงก์ใน การลิงก์ไฟล์ปฏิบัติการมี 3 วิธีที่แตกต่างกันดังนี้
หากใช้แอตทริบิวต์
แอตทริบิวต์
ควรมีโค้ดเพียงเล็กน้อยที่สร้างด้วย |
local_defines
|
รายการสตริง ค่าเริ่มต้นคือ -D นำหน้าและเพิ่มลงในบรรทัดคำสั่งของคอมไพล์สำหรับเป้าหมายนี้ แต่ไม่ใช่ลงในการอ้างอิง
|
module_interfaces
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ C++ มาตรฐานไม่มีข้อจำกัดเกี่ยวกับนามสกุลไฟล์ของโมดูลอินเตอร์เฟซ
การใช้งานได้รับการปกป้องโดยแฟล็ก
|
strip_include_prefix
|
สตริง ค่าเริ่มต้นคือ เมื่อตั้งค่าแล้ว ส่วนหัวในแอตทริบิวต์ หากเป็นเส้นทางแบบสัมพัทธ์ ระบบจะใช้เส้นทางที่สัมพันธ์กับแพ็กเกจ หากเป็นเส้นทางสัมบูรณ์ ก็เข้าใจว่าเป็นเส้นทางที่สัมพันธ์กับที่เก็บ ระบบจะเพิ่มคำนำหน้าในแอตทริบิวต์ แอตทริบิวต์นี้ใช้ได้ตามกฎหมายภายใต้ |
textual_hdrs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ นี่เป็นตำแหน่งสำหรับการประกาศไฟล์ส่วนหัวที่ไม่สามารถคอมไพล์ได้ด้วยตัวเอง กล่าวคือ ไฟล์ต้นฉบับอื่นต้องรวมเป็นข้อความเสมอเพื่อสร้างโค้ดที่ถูกต้อง |
win_def_file
|
ป้ายกำกับ ค่าเริ่มต้นคือ แอตทริบิวต์นี้ควรใช้เมื่อ Windows เป็นแพลตฟอร์มเป้าหมายเท่านั้น ซึ่งใช้เพื่อ ส่งออกสัญลักษณ์ระหว่างการลิงก์ไลบรารีที่ใช้ร่วมกันได้ |
cc_proto_library
ดูแหล่งที่มาของกฎcc_proto_library(name, deps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
cc_proto_library
สร้างโค้ด C++ จาก .proto
ไฟล์
deps
ต้องชี้ไปที่กฎ proto_library
เช่น
cc_library(
name = "lib",
deps = [":foo_cc_proto"],
)
cc_proto_library(
name = "foo_cc_proto",
deps = [":foo_proto"],
)
proto_library(
name = "foo_proto",
)
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
deps
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ proto_library สำหรับสร้างโค้ด C++
|
cc_shared_library
ดูแหล่งที่มาของกฎcc_shared_library(name, deps, additional_linker_inputs, compatible_with, deprecation, distribs, dynamic_deps, exec_compatible_with, exec_properties, experimental_disable_topo_sort_do_not_use_remove_before_7_0, exports_filter, features, restricted_to, roots, shared_lib_name, static_deps, tags, target_compatible_with, testonly, toolchains, user_link_flags, visibility, win_def_file)
และจะสร้างไลบรารีที่ใช้ร่วมกัน
ตัวอย่าง
cc_shared_library( name = "foo_shared", deps = [ ":foo", ], dynamic_deps = [ ":bar_shared", ], additional_linker_inputs = [ ":foo.lds", ], user_link_flags = [ "-Wl,--version-script=$(location :foo.lds)", ], ) cc_library( name = "foo", srcs = ["foo.cc"], hdrs = ["foo.h"], deps = [ ":bar", ":baz", ], ) cc_shared_library( name = "bar_shared", shared_lib_name = "bar.so", deps = [":bar"], ) cc_library( name = "bar", srcs = ["bar.cc"], hdrs = ["bar.h"], ) cc_library( name = "baz", srcs = ["baz.cc"], hdrs = ["baz.h"], )
ในตัวอย่าง foo_shared
ลิงก์ foo
กับ baz
แบบคงที่ ซึ่งรายการหลังเป็นทรัพยากร Dependency แบบทรานซิทีฟ ไม่ได้ลิงก์ bar
เนื่องจาก dynamic_dep
bar_shared
สร้างแบบไดนามิกให้อยู่แล้ว
foo_shared
ใช้ไฟล์ Linker Script *.lds เพื่อควบคุมว่าควรส่งออกสัญลักษณ์ใด ตรรกะของกฎ cc_shared_library
ไม่ได้ควบคุมว่าจะส่งออกสัญลักษณ์ใด แต่จะใช้เฉพาะสิ่งที่คาดว่าจะส่งออกเพื่อให้เกิดข้อผิดพลาดระหว่างช่วงการวิเคราะห์หากไลบรารีที่ใช้ร่วมกัน 2 รายการส่งออกเป้าหมายเดียวกัน
ระบบจะถือว่าการส่งออกทรัพยากร Dependency โดยตรงทั้งหมดของ cc_shared_library
ดังนั้น Bazel จะถือว่าในระหว่างการวิเคราะห์ว่า foo
กำลังส่งออกโดย foo_shared
baz
ไม่ถือว่าส่งออกโดย foo_shared
ทุกเป้าหมายที่ตรงกับ exports_filter
จะถือว่ามีการส่งออกด้วยเช่นกัน
ทุกๆ cc_library
ในตัวอย่างควรปรากฏใน cc_shared_library
ไม่เกิน 1 รายการ หากต้องการลิงก์ baz
กับ bar_shared
ด้วย เราจะต้องเพิ่ม tags = ["LINKABLE_MORE_THAN_ONCE"]
ไปยัง baz
เนื่องจากแอตทริบิวต์ shared_lib_name
ไฟล์ที่ bar_shared
สร้างจะมีชื่อ bar.so
ซึ่งตรงข้ามกับชื่อ libbar.so
ที่เป็นค่าเริ่มต้นใน Linux
ข้อผิดพลาด
Two shared libraries in dependencies export the same symbols.
ซึ่งจะเกิดขึ้นเมื่อคุณสร้างเป้าหมายที่มีทรัพยากร Dependency ของ cc_shared_library
2 รายการซึ่งส่งออกเป้าหมายเดียวกัน หากต้องการแก้ไขปัญหานี้ คุณต้องหยุดการส่งออกไลบรารีในทรัพยากร Dependency ของ cc_shared_library
Two shared libraries in dependencies link the same library statically
ซึ่งจะเกิดขึ้นเมื่อใดก็ตามที่คุณสร้าง cc_shared_library
ใหม่ด้วยทรัพยากร Dependency ของ cc_shared_library
ที่แตกต่างกัน 2 รายการซึ่งลิงก์เป้าหมายเดียวกันในแบบคงที่
คล้ายกับข้อผิดพลาดที่เกิดขึ้นกับการส่งออก
วิธีหนึ่งที่จะแก้ปัญหานี้คือการหยุดลิงก์ไลบรารีเข้ากับทรัพยากร Dependency ของ cc_shared_library
ในขณะเดียวกัน ลิงก์ที่ยังคงลิงก์อยู่จะต้องส่งออกไลบรารีเพื่อให้ตัวที่ไม่ได้ลิงก์ยังคงมองเห็นสัญลักษณ์ได้ อีกวิธีหนึ่งคือการดึงไลบรารีรายการที่ 3 ที่ส่งออกเป้าหมายนั้น
วิธีที่ 3 คือการติดแท็กต้นเหตุของ cc_library
ด้วย LINKABLE_MORE_THAN_ONCE
แต่การแก้ไขนี้ไม่น่าจะเกิดขึ้นบ่อยนักและคุณควรตรวจสอบให้แน่ใจว่า cc_library
จะปลอดภัยมากกว่า 1 ครั้งจริงๆ
'//foo:foo' is already linked statically in '//bar:bar' but not exported`
ซึ่งหมายความว่าคุณจะเข้าถึงไลบรารีที่เป็นแบบทรานซิทีฟของ deps
ได้โดยไม่ต้องผ่านทรัพยากร Dependency ของ cc_shared_library
ตัวใดตัวหนึ่ง แต่ลิงก์กับ cc_shared_library
อื่นใน dynamic_deps
แล้ว และไม่ได้รับการส่งออก
วิธีแก้ไขคือให้ส่งออกข้อมูลจากทรัพยากร Dependency cc_shared_library
หรือดึง cc_shared_library
ที่ 3 ที่ส่งออกออกไป
Do not place libraries which only contain a precompiled dynamic library in deps.
หากคุณมีไลบรารีแบบไดนามิกที่คอมไพล์ไว้ล่วงหน้าแล้ว ก็ไม่จำเป็นที่จะต้องลิงก์ในเชิงสถิติกับเป้าหมาย cc_shared_library
ปัจจุบันที่คุณกำลังสร้างอยู่ ดังนั้นจึงไม่ได้อยู่ใน deps
ของ cc_shared_library
หากไลบรารีแบบไดนามิกที่คอมไพล์ไว้ล่วงหน้านี้เป็นทรัพยากร Dependency ของ cc_libraries
ของคุณ cc_library
จะต้องพึ่งพาไลบรารีดังกล่าวโดยตรง
Trying to export a library already exported by a different shared library
คุณจะเห็นข้อผิดพลาดนี้หากในกฎปัจจุบันคุณกำลังอ้างสิทธิ์ให้ส่งออกเป้าหมายที่กำลังส่งออกโดยทรัพยากร Dependency แบบไดนามิกรายการใดรายการหนึ่งของคุณอยู่แล้ว
หากต้องการแก้ไขปัญหานี้ ให้นำเป้าหมายออกจาก deps
แล้วอิงตามการขึ้นต่อกันแบบไดนามิกหรือตรวจสอบว่า exports_filter
ตรวจไม่พบเป้าหมายนี้
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
deps
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ
ทรัพยากร Dependency ของไลบรารีแบบทรานซิทีฟของ Dep โดยตรงเหล่านี้จะลิงก์กับไลบรารีที่ใช้ร่วมกันนี้ ตราบใดที่คุณยังไม่ได้ลิงก์โดย
ในระหว่างการวิเคราะห์ การใช้งานกฎจะถือว่าเป้าหมายที่ระบุใน
การติดตั้งใช้งานยังจะทริกเกอร์ข้อผิดพลาดเมื่อใดก็ตามที่ไลบรารีเดียวกันลิงก์ไลบรารีเดียวกันแบบคงที่กับ |
additional_linker_inputs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ user_link_flags
|
dynamic_deps
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ cc_shared_library ที่เป้าหมายปัจจุบันใช้งานอยู่
การติดตั้งใช้งาน |
experimental_disable_topo_sort_do_not_use_remove_before_7_0
|
บูลีน ค่าเริ่มต้นคือ |
exports_filter
|
รายการสตริง ค่าเริ่มต้นคือ
ระบบเข้าใจว่า
โปรดทราบว่าจริงๆ แล้ว แอตทริบิวต์นี้ไม่ได้เพิ่มขีดจำกัดทรัพยากร Dependency ไปยังเป้าหมายเหล่านั้น คุณควรสร้างขอบเขตการขึ้นต่อกันโดย ระบบอนุญาตให้ใช้ไวยากรณ์ต่อไปนี้
|
roots
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ |
shared_lib_name
|
สตริง ค่าเริ่มต้นคือ |
static_deps
|
รายการสตริง ค่าเริ่มต้นคือ |
user_link_flags
|
รายการสตริง ค่าเริ่มต้นคือ
|
win_def_file
|
ป้ายกำกับ ค่าเริ่มต้นคือ แอตทริบิวต์นี้ควรใช้เมื่อ Windows เป็นแพลตฟอร์มเป้าหมายเท่านั้น ซึ่งใช้เพื่อ ส่งออกสัญลักษณ์ระหว่างการลิงก์ไลบรารีที่ใช้ร่วมกันได้ |
cc_test
ดูแหล่งที่มาของกฎcc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, dynamic_deps, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local, local_defines, malloc, module_interfaces, nocopts, reexport_deps, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)
กฎ cc_test()
จะรวมการทดสอบ การทดสอบจะเป็น Wrapper แบบไบนารีรอบๆ โค้ดการทดสอบ
โดยค่าเริ่มต้น การทดสอบ C++ จะลิงก์แบบไดนามิก
หากต้องการลิงก์การทดสอบ 1 หน่วยแบบคงที่ ให้ระบุ linkstatic=True
ดังนั้นคงจะดีหากคุณให้ความคิดเห็นว่าเหตุใดการทดสอบจึงต้องมี linkstatic
ซึ่งอาจไม่ชัดเจน
เป้าหมายเอาต์พุตโดยนัย
name.stripped
(สร้างเฉพาะในกรณีที่มีการขออย่างชัดเจน): ไบนารีเวอร์ชันที่ถูกตัดออกstrip -g
จะเรียกใช้ในไบนารีเพื่อนำสัญลักษณ์การแก้ไขข้อบกพร่องออก ระบุตัวเลือกแถบเพิ่มเติมในบรรทัดคำสั่งได้โดยใช้--stripopt=-foo
name.dwp
(สร้างเฉพาะในกรณีที่มีคำขออย่างชัดแจ้งเท่านั้น): หากเปิดใช้ Fission: ไฟล์แพ็กเกจข้อมูลการแก้ไขข้อบกพร่องที่เหมาะสำหรับการแก้ไขข้อบกพร่องของไบนารีที่ทำให้ใช้งานได้จากระยะไกล หรือไม่ก็ไฟล์เปล่า
ดูอาร์กิวเมนต์ cc_binary() เว้นแต่ว่าอาร์กิวเมนต์ stamp
จะตั้งค่าเป็น 0 โดยค่าเริ่มต้นสำหรับการทดสอบ และ cc_test
มี
แอตทริบิวต์พิเศษทั่วไปในกฎการทดสอบทั้งหมด (*_test)
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
deps
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ ซึ่งอาจเป็นเป้าหมาย |
srcs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ ระบบจะคอมไพล์ไฟล์ทั้งหมด ไฟล์ As Signing ล้วน (.s, .asm) ไม่ได้รับการประมวลผลล่วงหน้าและมักสร้างขึ้นโดยใช้ Ascyclr ไฟล์แอสเซมบลีที่ประมวลผลล่วงหน้า (.S) จะได้รับการประมวลผลล่วงหน้าและโดยปกติจะสร้างโดยใช้คอมไพเลอร์ C/C++ ระบบจะไม่คอมไพล์ไฟล์ คุณต้องพูดถึงไฟล์ ไฟล์ หากแอตทริบิวต์
ไฟล์
... และกฎที่สร้างไฟล์เหล่านั้น (เช่น |
data
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ data ได้ที่แอตทริบิวต์ทั่วไปที่กำหนดโดยกฎบิลด์ส่วนใหญ่
หาก หาก โค้ด C++ จะเข้าถึงไฟล์ข้อมูลเหล่านี้ได้ในลักษณะต่อไปนี้
|
additional_linker_inputs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ เช่น ไฟล์ .res ของ Windows ที่คอมไพล์แล้วอาจระบุที่นี่เพื่อฝังในเป้าหมายไบนารี |
copts
|
รายการสตริง ค่าเริ่มต้นคือ
ระบบจะเพิ่มแต่ละสตริงในแอตทริบิวต์นี้ตามลำดับที่ระบุไปยัง
หากแพ็กเกจประกาศฟีเจอร์
|
defines
|
รายการสตริง ค่าเริ่มต้นคือ -D นำหน้าและเพิ่มลงในบรรทัดคำสั่งของคอมไพล์ไปยังเป้าหมายนี้ รวมถึงกฎทุกข้อที่อ้างอิงสตริงนี้ โปรดใช้ความระมัดระวังเป็นอย่างยิ่ง
เนื่องจากอาจส่งผลกระทบในวงกว้าง หากไม่แน่ใจ ให้เพิ่มกําหนดค่าให้กับ local_defines แทน
|
dynamic_deps
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ cc_shared_library ที่เป้าหมายปัจจุบันใช้งานอยู่
การติดตั้งใช้งาน |
hdrs_check
|
สตริง ค่าเริ่มต้นคือ |
includes
|
รายการสตริง ค่าเริ่มต้นคือ -isystem path_to_package/include_entry
ซึ่งควรใช้กับไลบรารีของบุคคลที่สามที่ไม่สอดคล้องกับรูปแบบการเขียน #include ของ Google เท่านั้น
ซึ่งต่างจาก COPTS ตรงที่จะเพิ่มแฟล็กเหล่านี้สำหรับกฎนี้และกฎทุกกฎที่อ้างอิงกฎดังกล่าว (หมายเหตุ: ไม่ใช่กฎเกณฑ์แต่อย่างใด) โปรดใช้ความระมัดระวังเป็นอย่างยิ่งเนื่องจากอาจทำให้เกิดผลกระทบอย่างมาก หากไม่แน่ใจ ให้เพิ่มแฟล็ก "-I" ลงใน COPTS แทน
เส้นทาง |
link_extra_lib
|
ป้ายกำกับ ค่าเริ่มต้นคือ
โดยค่าเริ่มต้น ไบนารีของ C++ จะลิงก์กับ |
linkopts
|
รายการสตริง ค่าเริ่มต้นคือ LINKOPTS ก่อนลิงก์เป้าหมายไบนารี
แต่ละองค์ประกอบในรายการที่ไม่ได้ขึ้นต้นด้วย |
linkshared
|
บูลีน ค่าเริ่มต้นคือ linkshared=True ในกฎ ตัวเลือกนี้จะปิดอยู่โดยค่าเริ่มต้น
การมี Flag นี้แสดงว่ามีการลิงก์ด้วยแฟล็ก
หากระบุทั้ง |
linkstatic
|
บูลีน ค่าเริ่มต้นคือ cc_binary และ cc_test ให้ลิงก์ไบนารีในโหมดคงที่ สำหรับ cc_library.link_static : ดูด้านล่าง
โดยค่าเริ่มต้น ตัวเลือกนี้จะเปิดอยู่สำหรับ
หากเปิดใช้และนี่เป็นไบนารีหรือการทดสอบ ตัวเลือกนี้จะบอกเครื่องมือสร้างให้ลิงก์ใน การลิงก์ไฟล์ปฏิบัติการมี 3 วิธีที่แตกต่างกันดังนี้
หากใช้แอตทริบิวต์
แอตทริบิวต์
ควรมีโค้ดเพียงเล็กน้อยที่สร้างด้วย |
local_defines
|
รายการสตริง ค่าเริ่มต้นคือ -D นำหน้าและเพิ่มลงในบรรทัดคำสั่งของคอมไพล์สำหรับเป้าหมายนี้ แต่ไม่ใช่ลงในการอ้างอิง
|
malloc
|
ป้ายกำกับ ค่าเริ่มต้นคือ
โดยค่าเริ่มต้น ไบนารีของ C++ จะลิงก์กับ |
module_interfaces
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ C++ มาตรฐานไม่มีข้อจำกัดเกี่ยวกับนามสกุลไฟล์ของโมดูลอินเตอร์เฟซ
การใช้งานได้รับการปกป้องโดยแฟล็ก
|
nocopts
|
สตริง ค่าเริ่มต้นคือ COPTS ที่มีอยู่ก่อนหน้าซึ่งตรงกับนิพจน์ทั่วไปนี้ (รวมถึงค่าที่ระบุอย่างชัดแจ้งในแอตทริบิวต์ copts ของกฎ) ออกจาก COPTS เพื่อวัตถุประสงค์ในการรวบรวมกฎนี้
คุณไม่ควรต้องใช้หรือใช้แอตทริบิวต์นี้นอก third_party ค่าจะไม่ได้รับการประมวลผลล่วงหน้าด้วยวิธีการอื่นใดนอกจากการแทนที่ตัวแปร "Make"
|
reexport_deps
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ |
stamp
|
จำนวนเต็ม ค่าเริ่มต้นคือ
ระบบจะไม่สร้างไบนารีที่ประทับตราอีกครั้ง เว้นแต่ทรัพยากร Dependency จะมีการเปลี่ยนแปลง |
win_def_file
|
ป้ายกำกับ ค่าเริ่มต้นคือ แอตทริบิวต์นี้ควรใช้เมื่อ Windows เป็นแพลตฟอร์มเป้าหมายเท่านั้น ซึ่งใช้เพื่อ ส่งออกสัญลักษณ์ระหว่างการลิงก์ไลบรารีที่ใช้ร่วมกันได้ |
cc_toolchain
ดูแหล่งที่มาของกฎcc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler_files, compiler_files_without_includes, coverage_files, deprecation, distribs, dwp_files, dynamic_runtime_lib, exec_compatible_with, exec_properties, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, output_licenses, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, toolchains, visibility)
แสดงเครื่องมือเชน C++
กฎนี้มีหน้าที่รับผิดชอบในเรื่องต่อไปนี้
-
กำลังรวบรวมอาร์ติแฟกต์ทั้งหมดที่จำเป็นสำหรับการเรียกใช้การดำเนินการ C++ ซึ่งทำโดยแอตทริบิวต์ เช่น
all_files
,compiler_files
,linker_files
หรือแอตทริบิวต์อื่นๆ ที่ลงท้ายด้วย_files
) กลุ่มไฟล์ต่อไปนี้มักมีชื่อไฟล์ที่จำเป็นทั้งหมด -
กำลังสร้างบรรทัดคำสั่งที่ถูกต้องสำหรับการดำเนินการ C++ ซึ่งทำโดยใช้ผู้ให้บริการ
CcToolchainConfigInfo
(ตามรายละเอียดด้านล่าง)
ใช้แอตทริบิวต์ toolchain_config
เพื่อกำหนดค่าเครื่องมือเชน C++
และโปรดดู
หน้า
นี้เพื่อดูการกำหนดค่า Toolchain ของ C++ อย่างละเอียดและเอกสารการเลือก Toolchain
ใช้ tags = ["manual"]
เพื่อป้องกันไม่ให้มีการสร้างและกำหนดค่า Toolchain โดยไม่จำเป็นเมื่อเรียกใช้ bazel build //...
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
all_files
|
ป้ายกำกับ ต้องระบุ คอลเล็กชันของอาร์ติแฟกต์ cc_toolchain ทั้งหมด ระบบจะเพิ่มอาร์ติแฟกต์เหล่านี้เป็นอินพุตของการดำเนินการที่เกี่ยวข้องกับrules_cc ทั้งหมด (ยกเว้นการดำเนินการที่ใช้ชุดอาร์ติแฟกต์จากแอตทริบิวต์ด้านล่างที่แม่นยำยิ่งขึ้น) Bazel ถือว่าall_files เป็นชุดพิเศษของแอตทริบิวต์ที่มีอาร์ติแฟกต์อื่นๆ ทั้งหมด (เช่น การคอมไพล์ Linktamp ต้องใช้ทั้งไฟล์คอมไพล์และลิงก์ ดังนั้นจึงต้องใช้ all_files )
นี่คือสิ่งที่ |
ar_files
|
ป้ายกำกับ ค่าเริ่มต้นคือ |
as_files
|
ป้ายกำกับ ค่าเริ่มต้นคือ |
compiler_files
|
ป้ายกำกับ ต้องระบุ คอลเล็กชันอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จำเป็นสำหรับการดำเนินการคอมไพล์ |
compiler_files_without_includes
|
ป้ายกำกับ ค่าเริ่มต้นคือ |
coverage_files
|
ป้ายกำกับ ค่าเริ่มต้นคือ |
dwp_files
|
ป้ายกำกับ ต้องระบุ คอลเล็กชันอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จำเป็นสำหรับการดำเนินการ dwp |
dynamic_runtime_lib
|
ป้ายกำกับ ค่าเริ่มต้นคือ ซึ่งจะใช้เมื่อเปิดใช้ฟีเจอร์ "static_link_cpp_runtimes" และเรากำลังลิงก์การขึ้นต่อกันแบบไดนามิก |
exec_transition_for_inputs
|
บูลีน ค่าเริ่มต้นคือ |
libc_top
|
ป้ายกำกับ ค่าเริ่มต้นคือ |
linker_files
|
ป้ายกำกับ ต้องระบุ คอลเล็กชันของอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จำเป็นสำหรับการลิงก์ |
module_map
|
ป้ายกำกับ ค่าเริ่มต้นคือ |
objcopy_files
|
ป้ายกำกับ ต้องระบุ คอลเล็กชันอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จำเป็นสำหรับการดำเนินการ objcopy |
output_licenses
|
รายการสตริง ค่าเริ่มต้นคือ |
static_runtime_lib
|
ป้ายกำกับ ค่าเริ่มต้นคือ ระบบจะใช้ข้อมูลนี้เมื่อเปิดใช้ฟีเจอร์ "static_link_cpp_runtimes" และเราจะลิงก์การขึ้นต่อกันแบบคงที่ |
strip_files
|
ป้ายกำกับ ต้องระบุ คอลเล็กชันอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จำเป็นสำหรับการดำเนินการนำออก |
supports_header_parsing
|
บูลีน ค่าเริ่มต้นคือ |
supports_param_files
|
บูลีน ค่าเริ่มต้นคือ |
toolchain_config
|
ป้ายกำกับ ต้องระบุ ป้ายกำกับของกฎที่ระบุcc_toolchain_config_info
|
toolchain_identifier
|
สตริง ค่าเริ่มต้นคือ
นี่เป็นวิธีที่แนะนำในการเชื่อมโยง |
cc_toolchain_suite
ดูแหล่งที่มาของกฎcc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
เลิกใช้งานแล้ว: กฎเป็นแบบไม่มีการใช้งานและจะถูกนำออก
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
fdo_prefetch_hints
ดูแหล่งที่มาของกฎfdo_prefetch_hints(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
แสดงโปรไฟล์คำแนะนำที่ดึงข้อมูลล่วงหน้าของ FDO ซึ่งอยู่ในพื้นที่ทำงาน ตัวอย่าง
fdo_prefetch_hints(
name = "hints",
profile = "//path/to/hints:profile.afdo",
)
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
profile
|
ป้ายกำกับ ต้องระบุ ป้ายกำกับของโปรไฟล์คำแนะนำ ไฟล์คำแนะนำมีนามสกุล .afdo ป้ายกำกับชี้ไปที่กฎ fdo_absolute_path_profile ด้วย |
fdo_profile
ดูแหล่งที่มาของกฎfdo_profile(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, memprof_profile, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
แสดงโปรไฟล์ FDO ที่อยู่ในพื้นที่ทำงาน เช่น
fdo_profile(
name = "fdo",
profile = "//path/to/fdo:profile.zip",
)
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
memprof_profile
|
ป้ายกำกับ ค่าเริ่มต้นคือ |
profile
|
ป้ายกำกับ ต้องระบุ ป้ายกำกับของโปรไฟล์ FDO หรือกฎที่สร้างโปรไฟล์ดังกล่าว ไฟล์ FDO อาจมีนามสกุลต่อไปนี้ .profraw สำหรับโปรไฟล์ LLVM ที่ไม่ได้จัดทำดัชนี, .profdata สำหรับโปรไฟล์ LLVM ที่จัดทำดัชนี, .zip ที่มีโปรไฟล์ Profraw LLVM, .afdo สำหรับโปรไฟล์ AutoFDO, .xfdo สำหรับโปรไฟล์ XBinary ป้ายกำกับยังสามารถชี้ไปยังกฎ fdo_absolute_path_profile ได้ด้วย |
proto_profile
|
ป้ายกำกับ ค่าเริ่มต้นคือ |
memprof_profile
ดูแหล่งที่มาของกฎmemprof_profile(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
แสดงโปรไฟล์ MEMPROF ที่อยู่ในพื้นที่ทำงาน เช่น
memprof_profile(
name = "memprof",
profile = "//path/to/memprof:profile.afdo",
)
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
profile
|
ป้ายกำกับ ต้องระบุ ป้ายกำกับของโปรไฟล์ MEMPROF โปรไฟล์ควรมีนามสกุล .profdata (สำหรับโปรไฟล์ memprof ที่มีการจัดทำดัชนี/เป็นสัญลักษณ์) หรือส่วนขยาย .zip สำหรับไฟล์ zip ที่มีไฟล์ memprof.profdata ป้ายกำกับยังสามารถชี้ไปยังกฎ fdo_absolute_path_profile ได้ด้วย |
propeller_optimize
ดูแหล่งที่มาของกฎpropeller_optimize(name, cc_profile, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, ld_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
แสดงโปรไฟล์การเพิ่มประสิทธิภาพ Propeller ในพื้นที่ทำงาน เช่น
propeller_optimize(
name = "layout",
cc_profile = "//path:cc_profile.txt",
ld_profile = "//path:ld_profile.txt"
)
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
cc_profile
|
ป้ายกำกับ ต้องระบุ ป้ายกำกับของโปรไฟล์ที่ส่งไปยังการดำเนินการคอมไพล์ต่างๆ ไฟล์นี้มีนามสกุล .txt |
ld_profile
|
ป้ายกำกับ ต้องระบุ ป้ายกำกับของโปรไฟล์ที่ส่งไปยังการทำงานของลิงก์ ไฟล์นี้มีนามสกุล .txt |