กฎ
- cc_binary
- cc_import
- cc_library
- cc_shared_library
- cc_static_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, conlyopts, copts, cxxopts, defines, deprecation, dynamic_deps, env, exec_compatible_with, exec_group_compatible_with, exec_properties, features, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local_defines, malloc, module_interfaces, nocopts, output_licenses, package_metadata, 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
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ ซึ่งอาจเป็นเป้าหมาย linkopts ได้ด้วย
แต่โปรดพิจารณา
additional_linker_inputs
สำหรับกรณีการใช้งานดังกล่าว
|
srcs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ ระบบจะรวบรวมไฟล์ ไฟล์แอสเซมบลีแบบเพียว (.s, .asm) จะไม่ได้รับการประมวลผลล่วงหน้า และโดยปกติจะสร้างขึ้นโดยใช้แอสเซมเบลอร์ ไฟล์แอสเซมบลีที่ประมวลผลล่วงหน้า (.S) จะได้รับการประมวลผลล่วงหน้าและโดยทั่วไปจะสร้างขึ้น โดยใช้คอมไพเลอร์ C/C++ ระบบจะไม่คอมไพล์ไฟล์ ต้องระบุไฟล์ ไฟล์ หากแอตทริบิวต์
... และกฎใดๆ ที่สร้างไฟล์เหล่านั้น (เช่น |
data
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ data
ที่แอตทริบิวต์ทั่วไปที่กำหนดโดย
กฎการสร้างส่วนใหญ่
หาก หาก โค้ด C++ สามารถเข้าถึงไฟล์ข้อมูลเหล่านี้ได้ดังนี้
|
additional_linker_inputs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ
เช่น คุณระบุไฟล์ .res ของ Windows ที่คอมไพล์แล้วได้ที่นี่เพื่อฝังใน เป้าหมายไบนารี |
conlyopts
|
รายการสตริง ค่าเริ่มต้นคือ |
copts
|
รายการสตริง ค่าเริ่มต้นคือ
ระบบจะเพิ่มสตริงแต่ละรายการในแอตทริบิวต์นี้ตามลำดับที่ระบุไปยัง
หากแพ็กเกจประกาศฟีเจอร์
|
cxxopts
|
รายการสตริง ค่าเริ่มต้นคือ |
defines
|
รายการสตริง ค่าเริ่มต้นคือ -D และเพิ่มลงในบรรทัดคำสั่งคอมไพล์ไปยังเป้าหมายนี้
รวมถึงทุกกฎที่ขึ้นอยู่กับเป้าหมายนี้ โปรดระมัดระวังอย่างยิ่ง เนื่องจากอาจส่งผลกระทบในวงกว้าง โดยระบบจะเพิ่มคำจำกัดความลงในทุกเป้าหมายที่ขึ้นอยู่กับเป้าหมายนี้ หากไม่แน่ใจ ให้เพิ่มค่าที่กำหนดไว้ใน
local_defines แทน
|
dynamic_deps
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ cc_shared_library อื่นๆ ที่เป้าหมายปัจจุบันขึ้นอยู่กับ
การติดตั้งใช้งาน |
hdrs_check
|
สตริง ค่าเริ่มต้นคือ |
includes
|
รายการสตริง ค่าเริ่มต้นคือ -isystem path_to_package/include_entry
ควรใช้เฉพาะกับไลบรารีของบุคคลที่สามที่
ไม่ได้เป็นไปตามรูปแบบการเขียนคำสั่ง #include ของ Google
ซึ่งต่างจาก COPTS โดยระบบจะเพิ่มแฟล็กเหล่านี้สำหรับกฎนี้
และทุกกฎที่ขึ้นอยู่กับกฎนี้ (หมายเหตุ: ไม่ใช่กฎที่ขึ้นอยู่กับกฎนี้) โปรด
ระมัดระวังเป็นอย่างยิ่ง เนื่องจากอาจส่งผลกระทบในวงกว้าง หากไม่แน่ใจ ให้เพิ่ม Flag "-I" ไปยัง COPTS แทน
เส้นทาง |
link_extra_lib
|
ป้ายกำกับ ค่าเริ่มต้นคือ
โดยค่าเริ่มต้น ไบนารี C++ จะลิงก์กับ |
linkopts
|
รายการสตริง ค่าเริ่มต้นคือ LINKOPTS ก่อน
ลิงก์เป้าหมายไบนารี
องค์ประกอบแต่ละรายการในรายการนี้ที่ไม่ได้ขึ้นต้นด้วย |
linkshared
|
บูลีน ค่าเริ่มต้นคือ linkshared=True ในกฎ โดยค่าเริ่มต้น
ตัวเลือกนี้จะปิดอยู่
การมีแฟล็กนี้หมายความว่าการลิงก์เกิดขึ้นพร้อมกับแฟล็ก
หากคุณระบุทั้ง |
linkstatic
|
บูลีน ค่าเริ่มต้นคือ cc_binary และ
cc_test : ลิงก์ไบนารีในโหมดคงที่
สำหรับ cc_library.link_static โปรดดูด้านล่าง
โดยค่าเริ่มต้น ตัวเลือกนี้จะเปิดอยู่สำหรับ
หากเปิดใช้และเป็นไบนารีหรือการทดสอบ ตัวเลือกนี้จะบอกเครื่องมือบิลด์ให้ลิงก์ใน
การลิงก์ไฟล์ที่เรียกใช้งานได้มี 3 วิธี ดังนี้
หากใช้แอตทริบิวต์
แอตทริบิวต์
ไม่ควรมีโค้ดที่สร้างด้วย |
local_defines
|
รายการสตริง ค่าเริ่มต้นคือ -D และเพิ่มลงในบรรทัดคำสั่งคอมไพล์สำหรับเป้าหมายนี้
แต่จะไม่เพิ่มลงในเป้าหมายที่ขึ้นอยู่กับเป้าหมายนี้ ซึ่งแตกต่างจาก defines ตรงที่ระบบจะเพิ่มคำจำกัดความลงใน
บรรทัดคำสั่งคอมไพล์สำหรับเป้าหมายนี้เท่านั้น
|
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, exec_compatible_with, exec_group_compatible_with, exec_properties, features, includes, interface_library, linkopts, objects, package_metadata, pic_objects, pic_static_library, restricted_to, shared_library, static_library, strip_include_prefix, 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 = True,
)
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
shared_library = "libmylib.so",
)
ใน 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",
)
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 = True,
)
บน 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 = True,
)
ใน 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 = True, # default value
)
# second will link to libmylib.so (or libmylib.lib)
cc_binary(
name = "second",
srcs = ["second.cc"],
deps = [":mylib"],
linkstatic = False,
)
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
|
บูลีน ค่าเริ่มต้นคือ หาก alwayslink ใช้กับ VS 2017 ใน Windows ไม่ได้ นั่นเป็นเพราะปัญหาที่ทราบ โปรดอัปเกรด VS 2017 เป็นเวอร์ชันล่าสุด |
includes
|
รายการสตริง ค่าเริ่มต้นคือ -isystem path_to_package/include_entry
ควรใช้เฉพาะกับไลบรารีของบุคคลที่สามที่
ไม่ได้เป็นไปตามรูปแบบการเขียนคำสั่ง #include ของ Google
ซึ่งต่างจาก COPTS โดยระบบจะเพิ่มแฟล็กเหล่านี้สำหรับกฎนี้
และทุกกฎที่ขึ้นอยู่กับกฎนี้ (หมายเหตุ: ไม่ใช่กฎที่ขึ้นอยู่กับกฎนี้) โปรด
ระมัดระวังเป็นอย่างยิ่ง เนื่องจากอาจส่งผลกระทบในวงกว้าง หากไม่แน่ใจ ให้เพิ่ม Flag "-I" ไปยัง COPTS แทน
เส้นทาง |
interface_library
|
ป้ายกำกับ ค่าเริ่มต้นคือ ประเภทไฟล์ที่อนุญาต
|
linkopts
|
รายการสตริง ค่าเริ่มต้นคือ LINKOPTS ก่อน
ลิงก์เป้าหมายไบนารี
องค์ประกอบแต่ละรายการในรายการนี้ที่ไม่ได้ขึ้นต้นด้วย |
objects
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ |
pic_objects
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ |
pic_static_library
|
ป้ายกำกับ ค่าเริ่มต้นคือ |
shared_library
|
ป้ายกำกับ ค่าเริ่มต้นคือ ประเภทไฟล์ที่อนุญาต
|
static_library
|
ป้ายกำกับ ค่าเริ่มต้นคือ ประเภทไฟล์ที่อนุญาต
|
strip_include_prefix
|
สตริง ค่าเริ่มต้นคือ เมื่อตั้งค่าแล้ว ระบบจะเข้าถึงส่วนหัวในแอตทริบิวต์ หากเป็นเส้นทางแบบสัมพัทธ์ ระบบจะถือว่าเป็นเส้นทางแบบสัมพัทธ์ของแพ็กเกจ หากเป็นเส้นทางสัมบูรณ์ ระบบจะถือว่าเป็นเส้นทางสัมพัทธ์ของที่เก็บ ระบบจะเพิ่มคำนำหน้าในแอตทริบิวต์ แอตทริบิวต์นี้ถูกต้องตามกฎหมายภายใต้ |
system_provided
|
บูลีน ค่าเริ่มต้นคือ interface_library และเว้นว่าง shared_library ไว้
|
cc_library
ดูแหล่งที่มาของกฎcc_library(name, deps, srcs, data, hdrs, additional_compiler_inputs, additional_linker_inputs, alwayslink, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, hdrs_check, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, module_interfaces, package_metadata, 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.h baz.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 เพื่อบังคับใช้กฎการตรวจสอบการรวม
เครื่องมือต้องรองรับlayering_check
และต้องมีการขออย่างชัดเจน เช่น ผ่าน
--features=layering_check
แฟล็กบรรทัดคำสั่งหรือพารามิเตอร์ features
ของฟังก์ชัน package
Toolchain
ที่ Bazel จัดเตรียมให้รองรับฟีเจอร์นี้กับ Clang ใน Unix และ macOS เท่านั้น
ตัวอย่าง
เราใช้แฟล็ก alwayslink
เพื่อบังคับให้ Linker ลิงก์ใน
โค้ดนี้แม้ว่าโค้ดไบนารีหลักจะไม่ได้อ้างอิงก็ตาม
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 = True,
)
ตัวอย่างต่อไปนี้มาจาก
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
ที่สร้างไว้ล่วงหน้าไว้ในที่เก็บ
ไฟล์ส่วนหัวจะอยู่ในไดเรกทอรีย่อยชื่อ 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" แต่ไคลเอ็นต์ของไลบรารีนี้บางส่วน
ไม่ได้อยู่ในที่นี้ การขึ้นต่อกันของข้อมูลรันไทม์จะอยู่ใน หากต้องการลิงก์ในไลบรารีของบุคคลที่สามที่คอมไพล์ไว้ล่วงหน้า ให้เพิ่มชื่อไลบรารีลงใน
หากต้องการใช้สิ่งใดโดยไม่ต้องลิงก์กับไลบรารีนี้ ให้เพิ่มชื่อของสิ่งนั้นลงใน |
srcs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ ระบบจะรวบรวมไฟล์ ไฟล์แอสเซมบลีแบบเพียว (.s, .asm) จะไม่ได้รับการประมวลผลล่วงหน้า และโดยปกติจะสร้างขึ้นโดยใช้แอสเซมเบลอร์ ไฟล์แอสเซมบลีที่ประมวลผลล่วงหน้า (.S) จะได้รับการประมวลผลล่วงหน้าและโดยทั่วไปจะสร้างขึ้น โดยใช้คอมไพเลอร์ C/C++ ระบบจะไม่คอมไพล์ไฟล์ ต้องระบุไฟล์ ไฟล์ หากแอตทริบิวต์
... และกฎใดๆ ที่สร้างไฟล์เหล่านั้น (เช่น |
data
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ data
ที่แอตทริบิวต์ทั่วไปที่กำหนดโดย
กฎการสร้างส่วนใหญ่
หาก หาก โค้ด C++ สามารถเข้าถึงไฟล์ข้อมูลเหล่านี้ได้ดังนี้
|
hdrs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ นี่คือตำแหน่งที่แนะนำอย่างยิ่งสำหรับการประกาศไฟล์ส่วนหัวที่
อธิบายอินเทอร์เฟซของไลบรารี ระบบจะทำให้ส่วนหัวเหล่านี้
พร้อมใช้งานเพื่อให้แหล่งที่มาในกฎนี้หรือในกฎที่ขึ้นอยู่กับกฎนี้รวมไว้
ส่วนหัวที่ไม่ได้มีไว้ให้ไคลเอ็นต์ของไลบรารีนี้รวมไว้ควรแสดงอยู่ในแอตทริบิวต์ ประเภทไฟล์ |
additional_compiler_inputs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ |
additional_linker_inputs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ
เช่น คุณระบุไฟล์ .res ของ Windows ที่คอมไพล์แล้วได้ที่นี่เพื่อฝังใน เป้าหมายไบนารี |
alwayslink
|
บูลีน ค่าเริ่มต้นคือ srcs แม้ว่าบางไฟล์จะไม่มีสัญลักษณ์ที่ไบนารีอ้างอิงก็ตาม
ซึ่งจะมีประโยชน์ในกรณีที่โค้ดไม่ได้เรียกอย่างชัดเจนโดยโค้ดใน
ไบนารี เช่น หากโค้ดลงทะเบียนเพื่อรับการเรียกกลับบางอย่าง
ที่ได้รับจากบริการบางอย่าง
หาก alwayslink ใช้กับ VS 2017 ใน Windows ไม่ได้ นั่นเป็นเพราะปัญหาที่ทราบ โปรดอัปเกรด VS 2017 เป็นเวอร์ชันล่าสุด |
conlyopts
|
รายการสตริง ค่าเริ่มต้นคือ |
copts
|
รายการสตริง ค่าเริ่มต้นคือ
ระบบจะเพิ่มสตริงแต่ละรายการในแอตทริบิวต์นี้ตามลำดับที่ระบุไปยัง
หากแพ็กเกจประกาศฟีเจอร์
|
cxxopts
|
รายการสตริง ค่าเริ่มต้นคือ |
defines
|
รายการสตริง ค่าเริ่มต้นคือ -D และเพิ่มลงในบรรทัดคำสั่งคอมไพล์ไปยังเป้าหมายนี้
รวมถึงทุกกฎที่ขึ้นอยู่กับเป้าหมายนี้ โปรดระมัดระวังอย่างยิ่ง เนื่องจากอาจส่งผลกระทบในวงกว้าง โดยระบบจะเพิ่มคำจำกัดความลงในทุกเป้าหมายที่ขึ้นอยู่กับเป้าหมายนี้ หากไม่แน่ใจ ให้เพิ่มค่าที่กำหนดไว้ใน
local_defines แทน
|
hdrs_check
|
สตริง ค่าเริ่มต้นคือ |
implementation_deps
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ deps โดยส่วนหัวและเส้นทางรวมของไลบรารีเหล่านี้ (และ
การขึ้นต่อกันแบบทรานซิทีฟทั้งหมด) จะใช้สำหรับการคอมไพล์ไลบรารีนี้เท่านั้น และไม่ใช่ไลบรารีที่
ขึ้นอยู่กับไลบรารีนี้ ไลบรารีที่ระบุด้วย implementation_deps จะยังคงลิงก์อยู่ใน
เป้าหมายไบนารีที่ขึ้นอยู่กับไลบรารีนี้
|
include_prefix
|
สตริง ค่าเริ่มต้นคือ เมื่อตั้งค่าแล้ว ระบบจะเข้าถึงส่วนหัวในแอตทริบิวต์ ระบบจะนำคำนำหน้าในแอตทริบิวต์ แอตทริบิวต์นี้ถูกต้องตามกฎหมายภายใต้ |
includes
|
รายการสตริง ค่าเริ่มต้นคือ -isystem path_to_package/include_entry
ควรใช้เฉพาะกับไลบรารีของบุคคลที่สามที่
ไม่ได้เป็นไปตามรูปแบบการเขียนคำสั่ง #include ของ Google
ซึ่งต่างจาก COPTS โดยระบบจะเพิ่มแฟล็กเหล่านี้สำหรับกฎนี้
และทุกกฎที่ขึ้นอยู่กับกฎนี้ (หมายเหตุ: ไม่ใช่กฎที่ขึ้นอยู่กับกฎนี้) โปรด
ระมัดระวังเป็นอย่างยิ่ง เนื่องจากอาจส่งผลกระทบในวงกว้าง หากไม่แน่ใจ ให้เพิ่ม Flag "-I" ไปยัง COPTS แทน
เส้นทาง |
linkopts
|
รายการสตริง ค่าเริ่มต้นคือ cc_binary.linkopts
ระบบจะใช้แอตทริบิวต์ linkopts กับเป้าหมายใดๆ ที่ขึ้นอยู่กับไลบรารีนี้โดยตรงหรือโดยอ้อมผ่านแอตทริบิวต์ deps (หรือผ่านแอตทริบิวต์อื่นๆ ที่ได้รับการปฏิบัติในลักษณะเดียวกัน เช่น แอตทริบิวต์ malloc ของ cc_binary ) ลิงก์ตัวเลือกการขึ้นต่อกันจะมีความสำคัญเหนือกว่าลิงก์ตัวเลือกที่ขึ้นต่อกัน (เช่น ลิงก์ตัวเลือกการขึ้นต่อกันจะปรากฏในบรรทัดคำสั่งในภายหลัง) Linkopts ที่ระบุใน
--linkopt
จะมีผลเหนือกว่า Linkopts ของกฎ
โปรดทราบว่าแอตทริบิวต์ นอกจากนี้ โปรดทราบว่าระบบไม่รองรับตัวเลือก "-Wl,-soname" หรือ "-Xlinker -soname" และไม่ควรระบุในแอตทริบิวต์นี้ ไฟล์ |
linkstamp
|
ป้ายกำกับ ค่าเริ่มต้นคือ base แพ็กเกจ
|
linkstatic
|
บูลีน ค่าเริ่มต้นคือ cc_binary และ
cc_test : ลิงก์ไบนารีในโหมดคงที่
สำหรับ cc_library.link_static โปรดดูด้านล่าง
โดยค่าเริ่มต้น ตัวเลือกนี้จะเปิดอยู่สำหรับ
หากเปิดใช้และเป็นไบนารีหรือการทดสอบ ตัวเลือกนี้จะบอกเครื่องมือบิลด์ให้ลิงก์ใน
การลิงก์ไฟล์ที่เรียกใช้งานได้มี 3 วิธี ดังนี้
หากใช้แอตทริบิวต์
แอตทริบิวต์
ไม่ควรมีโค้ดที่สร้างด้วย |
local_defines
|
รายการสตริง ค่าเริ่มต้นคือ -D และเพิ่มลงในบรรทัดคำสั่งคอมไพล์สำหรับเป้าหมายนี้
แต่จะไม่เพิ่มลงในเป้าหมายที่ขึ้นอยู่กับเป้าหมายนี้ ซึ่งแตกต่างจาก defines ตรงที่ระบบจะเพิ่มคำจำกัดความลงใน
บรรทัดคำสั่งคอมไพล์สำหรับเป้าหมายนี้เท่านั้น
|
module_interfaces
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ มาตรฐาน C++ ไม่ได้จำกัดนามสกุลไฟล์อินเทอร์เฟซของโมดูล
การใช้งานได้รับการป้องกันโดยแฟล็ก
|
strip_include_prefix
|
สตริง ค่าเริ่มต้นคือ เมื่อตั้งค่าแล้ว ระบบจะเข้าถึงส่วนหัวในแอตทริบิวต์ หากเป็นเส้นทางแบบสัมพัทธ์ ระบบจะถือว่าเป็นเส้นทางแบบสัมพัทธ์ของแพ็กเกจ หากเป็นเส้นทางสัมบูรณ์ ระบบจะถือว่าเป็นเส้นทางสัมพัทธ์ของที่เก็บ ระบบจะเพิ่มคำนำหน้าในแอตทริบิวต์ แอตทริบิวต์นี้ถูกต้องตามกฎหมายภายใต้ |
textual_hdrs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ นี่คือตำแหน่งสำหรับการประกาศไฟล์ส่วนหัวที่คอมไพล์ด้วยตัวเองไม่ได้ กล่าวคือ ไฟล์เหล่านี้ต้องรวมอยู่ในไฟล์ต้นฉบับอื่นๆ เสมอเพื่อสร้างโค้ดที่ถูกต้อง |
win_def_file
|
ป้ายกำกับ ค่าเริ่มต้นคือ ควรใช้แอตทริบิวต์นี้เมื่อ Windows เป็นแพลตฟอร์มเป้าหมายเท่านั้น ใช้เพื่อ ส่งออกสัญลักษณ์ระหว่างลิงก์ไลบรารีที่แชร์ได้ |
cc_shared_library
ดูแหล่งที่มาของกฎcc_shared_library(name, deps, additional_linker_inputs, compatible_with, deprecation, dynamic_deps, exec_compatible_with, exec_group_compatible_with, exec_properties, exports_filter, features, package_metadata, 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
โดย baz
เป็นการขึ้นต่อกันแบบทรานซิทีฟ ไม่ลิงก์ bar
เนื่องจาก dynamic_dep
bar_shared
มีการระบุแบบไดนามิกอยู่แล้ว
foo_shared
ใช้ไฟล์สคริปต์ของ Linker *.lds เพื่อควบคุมว่าควรส่งออกสัญลักษณ์ใด ตรรกะของกฎ cc_shared_library
ไม่ได้ควบคุมว่าจะส่งออกสัญลักษณ์ใด แต่จะใช้เฉพาะสิ่งที่คาดว่าจะส่งออกเพื่อแสดงข้อผิดพลาดในระยะการวิเคราะห์ หากไลบรารีที่แชร์ 2 รายการส่งออกเป้าหมายเดียวกัน
ระบบจะถือว่าการขึ้นต่อโดยตรงทั้งหมดของ cc_shared_library
มีการส่งออก ดังนั้น Bazel จึงถือว่า foo
ได้รับการส่งออกโดย foo_shared
ในระหว่างการวิเคราะห์ foo_shared
ไม่ได้ส่งออก baz
ระบบจะถือว่าเป้าหมายทุกรายการที่ 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.
เหตุการณ์นี้จะเกิดขึ้นทุกครั้งที่คุณสร้างเป้าหมายที่มีการอ้างอิง 2 รายการที่แตกต่างกัน
cc_shared_library
ซึ่งส่งออกเป้าหมายเดียวกัน หากต้องการแก้ไขปัญหานี้ คุณต้องหยุดการส่งออกไลบรารีในcc_shared_library
การอ้างอิงรายการใดรายการหนึ่ง
Two shared libraries in dependencies link the same library statically
กรณีนี้จะเกิดขึ้นเมื่อใดก็ตามที่คุณสร้าง cc_shared_library
ใหม่ที่มีการอ้างอิง cc_shared_library
2 รายการที่แตกต่างกันซึ่งลิงก์เป้าหมายเดียวกันแบบคงที่
คล้ายกับข้อผิดพลาดในการส่งออก
วิธีแก้ไขปัญหานี้วิธีหนึ่งคือการหยุดลิงก์ไลบรารีไปยังหนึ่งใน
cc_shared_library
Dependency ในขณะเดียวกัน ผู้ที่ยังคงลิงก์อยู่
ต้องส่งออกไลบรารีเพื่อให้ผู้ที่ไม่ได้ลิงก์ยังคงมองเห็น
สัญลักษณ์ อีกวิธีหนึ่งคือการดึงไลบรารีที่สามซึ่งส่งออกเป้าหมาย
วิธีที่ 3 คือการแท็กสาเหตุที่ทำให้เกิดปัญหา cc_library
ด้วย LINKABLE_MORE_THAN_ONCE
แต่การแก้ไขนี้ไม่ควรเกิดขึ้นบ่อยนัก และคุณควรตรวจสอบให้แน่ใจว่า cc_library
ปลอดภัยที่จะลิงก์มากกว่า 1 ครั้ง
'//foo:foo' is already linked statically in '//bar:bar' but not exported`
ซึ่งหมายความว่าไลบรารีใน Transitive Closure ของ deps
สามารถเข้าถึงได้
โดยไม่ต้องผ่านการอ้างอิง cc_shared_library
รายการใดรายการหนึ่ง แต่มีการลิงก์
ไปยัง cc_shared_library
อื่นใน dynamic_deps
อยู่แล้วและไม่ได้
ส่งออก
วิธีแก้คือส่งออกจากcc_shared_library
การขึ้นต่อกันหรือดึงcc_shared_library
บุคคลที่สามที่ส่งออก
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
คุณจะเห็นข้อผิดพลาดนี้หากในกฎปัจจุบัน คุณอ้างว่าต้องการส่งออกเป้าหมายที่การอ้างอิงแบบไดนามิกรายการใดรายการหนึ่งของคุณส่งออกอยู่แล้ว
หากต้องการแก้ไขปัญหานี้ ให้นําเป้าหมายออกจาก deps
และใช้เฉพาะเป้าหมายจากความขึ้นต่อกันแบบไดนามิก หรือตรวจสอบว่า exports_filter
ไม่ได้จับเป้าหมายนี้
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
deps
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ
การขึ้นต่อกันของไลบรารีแบบทรานซิทีฟของ Deps โดยตรงเหล่านี้จะลิงก์ไปยังไลบรารีที่แชร์นี้ ตราบใดที่
ในระหว่างการวิเคราะห์ การติดตั้งใช้งานกฎจะพิจารณาเป้าหมายที่ระบุใน
การใช้งานจะทริกเกอร์ข้อผิดพลาดทุกครั้งที่มีการลิงก์ไลบรารีเดียวกันแบบคงที่
ใน |
additional_linker_inputs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ user_link_flags
|
dynamic_deps
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ cc_shared_library อื่นๆ ที่เป้าหมายปัจจุบันขึ้นอยู่กับ
การติดตั้งใช้งาน |
exports_filter
|
รายการสตริง ค่าเริ่มต้นคือ
ระบบจะถือว่าไลบรารีที่ใช้ร่วมกันส่งออกเป้าหมาย
โปรดทราบว่าแอตทริบิวต์นี้ไม่ได้เพิ่มขอบการอ้างอิงไปยังเป้าหมายเหล่านั้นจริงๆ แต่ ไวยากรณ์ต่อไปนี้ได้รับอนุญาต
|
roots
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ |
shared_lib_name
|
สตริง ค่าเริ่มต้นคือ |
static_deps
|
รายการสตริง ค่าเริ่มต้นคือ |
user_link_flags
|
รายการสตริง ค่าเริ่มต้นคือ
|
win_def_file
|
ป้ายกำกับ ค่าเริ่มต้นคือ ควรใช้แอตทริบิวต์นี้เมื่อ Windows เป็นแพลตฟอร์มเป้าหมายเท่านั้น ใช้เพื่อ ส่งออกสัญลักษณ์ระหว่างลิงก์ไลบรารีที่แชร์ได้ |
cc_static_library
ดูแหล่งที่มาของกฎcc_static_library(name, deps, compatible_with, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, package_metadata, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
ไลบรารีแบบคงที่ที่ได้จะมีไฟล์ออบเจ็กต์ของเป้าหมายที่ระบุไว้ใน
deps
รวมถึงทรัพยากร Dependency แบบทรานซิทีฟ โดยจะให้ความสำคัญกับออบเจ็กต์
PIC
กลุ่มเอาต์พุต
linkdeps
ไฟล์ข้อความที่มีป้ายกำกับของทรัพยากร Dependency แบบทรานซิทีฟของเป้าหมายที่แสดงใน
deps
ซึ่งไม่ได้มีส่วนร่วมในไฟล์ออบเจ็กต์ใดๆ กับไลบรารีแบบคงที่ แต่มี
ไลบรารีแบบคงที่ แบบไดนามิก หรืออินเทอร์เฟซอย่างน้อย 1 รายการ ไลบรารีแบบคงที่ที่ได้
อาจกำหนดให้ไลบรารีเหล่านี้พร้อมใช้งานในเวลาลิงก์
linkopts
ไฟล์ข้อความที่มี linkopts
ที่ผู้ใช้ระบุของ
การอ้างอิงแบบทรานซิทีฟทั้งหมดของเป้าหมายที่ระบุไว้ใน deps
สัญลักษณ์ซ้ำ
โดยค่าเริ่มต้น กฎ cc_static_library
จะตรวจสอบว่าไลบรารีแบบคงที่ที่ได้ไม่มีสัญลักษณ์ที่ซ้ำกัน หากมี ระบบจะสร้างไม่สำเร็จพร้อมข้อความแสดงข้อผิดพลาด
ที่แสดงรายการสัญลักษณ์ที่ซ้ำกันและไฟล์ออบเจ็กต์ที่มีสัญลักษณ์เหล่านั้น
คุณปิดใช้การตรวจสอบนี้ต่อเป้าหมายหรือต่อแพ็กเกจได้โดยตั้งค่า
features = ["-symbol_check"]
หรือปิดใช้ทั่วโลกผ่าน
--features=-symbol_check
การรองรับ Toolchain สำหรับ symbol_check
ชุดเครื่องมือ C++ ที่กำหนดค่าอัตโนมัติซึ่งมาพร้อมกับ Bazel รองรับฟีเจอร์
symbol_check
ในทุกแพลตฟอร์ม Toolchain ที่กำหนดเองสามารถเพิ่มการรองรับ
ได้ 2 วิธีดังนี้
- การใช้การดำเนินการ
ACTION_NAMES.validate_static_library
และ การเปิดใช้ด้วยฟีเจอร์symbol_check
ชุดเครื่องมือที่ตั้งค่าไว้ในการดำเนินการจะ เรียกใช้ด้วยอาร์กิวเมนต์ 2 รายการ ได้แก่ ไลบรารีแบบคงที่ที่จะตรวจสอบสัญลักษณ์ที่ซ้ำกัน และ เส้นทางของไฟล์ที่ต้องสร้างหากการตรวจสอบผ่าน - มี
symbol_check
ฟีเจอร์ที่เพิ่มแฟล็กการเก็บถาวรซึ่งทำให้การดำเนินการสร้างไลบรารีแบบคงที่ล้มเหลวเนื่องจากมีสัญลักษณ์ที่ซ้ำกัน
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
deps
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ Dependency ที่ไม่ได้ระบุไฟล์ออบเจ็กต์จะไม่รวมอยู่ในไลบรารีแบบคงที่ แต่ระบบจะรวบรวมป้ายกำกับของ Dependency เหล่านั้นไว้ในไฟล์ที่จัดทำโดยกลุ่มเอาต์พุต |
cc_test
ดูแหล่งที่มาของกฎcc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, dynamic_deps, env, env_inherit, exec_compatible_with, exec_group_compatible_with, exec_properties, features, flaky, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local, local_defines, malloc, module_interfaces, nocopts, package_metadata, reexport_deps, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)
cc_test()
กฎจะคอมไพล์การทดสอบ ในที่นี้ เทสต์
คือ Wrapper แบบไบนารีที่ครอบโค้ดการทดสอบบางส่วน
โดยค่าเริ่มต้น การทดสอบ C++ จะลิงก์แบบไดนามิก
หากต้องการลิงก์แบบคงที่กับ Unit Test ให้ระบุ
linkstatic=True
คุณควรแสดงความคิดเห็นว่าทำไมการทดสอบจึงต้องมี
linkstatic
เนื่องจากอาจไม่ชัดเจน
เป้าหมายเอาต์พุตโดยนัย
name.stripped
(สร้างขึ้นเฉพาะในกรณีที่มีการขออย่างชัดเจน): ไบนารีเวอร์ชันที่ไม่มีข้อมูลการแก้ไขข้อบกพร่องstrip -g
จะทำงานในไบนารีเพื่อนำสัญลักษณ์การแก้ไขข้อบกพร่องออก คุณระบุตัวเลือกการลบเพิ่มเติมได้ในบรรทัดคำสั่งโดยใช้--stripopt=-foo
name.dwp
(สร้างขึ้นเฉพาะในกรณีที่มีการขออย่างชัดเจน): หากเปิดใช้ Fission จะมีไฟล์แพ็กเกจข้อมูลการแก้ไขข้อบกพร่องที่เหมาะสำหรับการแก้ไขข้อบกพร่องของไบนารีที่ติดตั้งใช้งานจากระยะไกล หรือไฟล์ว่าง
ดูอาร์กิวเมนต์ cc_binary() ยกเว้นว่า
อาร์กิวเมนต์ stamp
จะตั้งค่าเป็น 0 โดยค่าเริ่มต้นสำหรับการทดสอบ และ
cc_test
มี
แอตทริบิวต์เพิ่มเติมที่ใช้ร่วมกันในกฎการทดสอบทั้งหมด (*_test)
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
deps
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ ซึ่งอาจเป็นเป้าหมาย linkopts ได้ด้วย
แต่โปรดพิจารณา
additional_linker_inputs
สำหรับกรณีการใช้งานดังกล่าว
|
srcs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ ระบบจะรวบรวมไฟล์ ไฟล์แอสเซมบลีแบบเพียว (.s, .asm) จะไม่ได้รับการประมวลผลล่วงหน้า และโดยปกติจะสร้างขึ้นโดยใช้แอสเซมเบลอร์ ไฟล์แอสเซมบลีที่ประมวลผลล่วงหน้า (.S) จะได้รับการประมวลผลล่วงหน้าและโดยทั่วไปจะสร้างขึ้น โดยใช้คอมไพเลอร์ C/C++ ระบบจะไม่คอมไพล์ไฟล์ ต้องระบุไฟล์ ไฟล์ หากแอตทริบิวต์
... และกฎใดๆ ที่สร้างไฟล์เหล่านั้น (เช่น |
data
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ data
ที่แอตทริบิวต์ทั่วไปที่กำหนดโดย
กฎการสร้างส่วนใหญ่
หาก หาก โค้ด C++ สามารถเข้าถึงไฟล์ข้อมูลเหล่านี้ได้ดังนี้
|
additional_linker_inputs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ
เช่น คุณระบุไฟล์ .res ของ Windows ที่คอมไพล์แล้วได้ที่นี่เพื่อฝังใน เป้าหมายไบนารี |
conlyopts
|
รายการสตริง ค่าเริ่มต้นคือ |
copts
|
รายการสตริง ค่าเริ่มต้นคือ
ระบบจะเพิ่มสตริงแต่ละรายการในแอตทริบิวต์นี้ตามลำดับที่ระบุไปยัง
หากแพ็กเกจประกาศฟีเจอร์
|
cxxopts
|
รายการสตริง ค่าเริ่มต้นคือ |
defines
|
รายการสตริง ค่าเริ่มต้นคือ -D และเพิ่มลงในบรรทัดคำสั่งคอมไพล์ไปยังเป้าหมายนี้
รวมถึงทุกกฎที่ขึ้นอยู่กับเป้าหมายนี้ โปรดระมัดระวังอย่างยิ่ง เนื่องจากอาจส่งผลกระทบในวงกว้าง โดยระบบจะเพิ่มคำจำกัดความลงในทุกเป้าหมายที่ขึ้นอยู่กับเป้าหมายนี้ หากไม่แน่ใจ ให้เพิ่มค่าที่กำหนดไว้ใน
local_defines แทน
|
dynamic_deps
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ cc_shared_library อื่นๆ ที่เป้าหมายปัจจุบันขึ้นอยู่กับ
การติดตั้งใช้งาน |
hdrs_check
|
สตริง ค่าเริ่มต้นคือ |
includes
|
รายการสตริง ค่าเริ่มต้นคือ -isystem path_to_package/include_entry
ควรใช้เฉพาะกับไลบรารีของบุคคลที่สามที่
ไม่ได้เป็นไปตามรูปแบบการเขียนคำสั่ง #include ของ Google
ซึ่งต่างจาก COPTS โดยระบบจะเพิ่มแฟล็กเหล่านี้สำหรับกฎนี้
และทุกกฎที่ขึ้นอยู่กับกฎนี้ (หมายเหตุ: ไม่ใช่กฎที่ขึ้นอยู่กับกฎนี้) โปรด
ระมัดระวังเป็นอย่างยิ่ง เนื่องจากอาจส่งผลกระทบในวงกว้าง หากไม่แน่ใจ ให้เพิ่ม Flag "-I" ไปยัง COPTS แทน
เส้นทาง |
link_extra_lib
|
ป้ายกำกับ ค่าเริ่มต้นคือ
โดยค่าเริ่มต้น ไบนารี C++ จะลิงก์กับ |
linkopts
|
รายการสตริง ค่าเริ่มต้นคือ LINKOPTS ก่อน
ลิงก์เป้าหมายไบนารี
องค์ประกอบแต่ละรายการในรายการนี้ที่ไม่ได้ขึ้นต้นด้วย |
linkshared
|
บูลีน ค่าเริ่มต้นคือ linkshared=True ในกฎ โดยค่าเริ่มต้น
ตัวเลือกนี้จะปิดอยู่
การมีแฟล็กนี้หมายความว่าการลิงก์เกิดขึ้นพร้อมกับแฟล็ก
หากคุณระบุทั้ง |
linkstatic
|
บูลีน ค่าเริ่มต้นคือ cc_binary และ
cc_test : ลิงก์ไบนารีในโหมดคงที่
สำหรับ cc_library.link_static โปรดดูด้านล่าง
โดยค่าเริ่มต้น ตัวเลือกนี้จะเปิดอยู่สำหรับ
หากเปิดใช้และเป็นไบนารีหรือการทดสอบ ตัวเลือกนี้จะบอกเครื่องมือบิลด์ให้ลิงก์ใน
การลิงก์ไฟล์ที่เรียกใช้งานได้มี 3 วิธี ดังนี้
หากใช้แอตทริบิวต์
แอตทริบิวต์
ไม่ควรมีโค้ดที่สร้างด้วย |
local_defines
|
รายการสตริง ค่าเริ่มต้นคือ -D และเพิ่มลงในบรรทัดคำสั่งคอมไพล์สำหรับเป้าหมายนี้
แต่จะไม่เพิ่มลงในเป้าหมายที่ขึ้นอยู่กับเป้าหมายนี้ ซึ่งแตกต่างจาก defines ตรงที่ระบบจะเพิ่มคำจำกัดความลงใน
บรรทัดคำสั่งคอมไพล์สำหรับเป้าหมายนี้เท่านั้น
|
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, dwp_files, dynamic_runtime_lib, exec_compatible_with, exec_group_compatible_with, exec_properties, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, output_licenses, package_metadata, 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
โดยส่วนใหญ่แล้วจะเป็นรูปแบบ globbing ของกลุ่มไฟล์ที่รวมไฟล์ที่จำเป็นทั้งหมด -
สร้างบรรทัดคำสั่งที่ถูกต้องสำหรับการดำเนินการ C++ โดยทำได้โดยใช้
CcToolchainConfigInfo
ผู้ให้บริการ (ดูรายละเอียดด้านล่าง)
ใช้แอตทริบิวต์ toolchain_config
เพื่อกำหนดค่าเครื่องมือ C++
ดูเอกสารประกอบเกี่ยวกับการกำหนดค่าเครื่องมือ C++ และการเลือกเครื่องมืออย่างละเอียดได้ที่
หน้า
นี้
ใช้ tags = ["manual"]
เพื่อป้องกันไม่ให้สร้างและกำหนดค่า Toolchain
โดยไม่จำเป็นเมื่อเรียกใช้ bazel build //...
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
all_files
|
ป้ายกำกับ (ต้องระบุ) คอลเล็กชันของอาร์ติแฟกต์ cc_toolchain ทั้งหมด ระบบจะเพิ่มอาร์ติแฟกต์เหล่านี้เป็นอินพุตในการดำเนินการทั้งหมดที่เกี่ยวข้องกับ rules_cc (ยกเว้นการดำเนินการที่ใช้ชุดอาร์ติแฟกต์ที่แม่นยำกว่าจากแอตทริบิวต์ด้านล่าง) Bazel ถือว่าall_files เป็นซูเปอร์เซ็ต
ของแอตทริบิวต์อื่นๆ ทั้งหมดที่ให้สิ่งประดิษฐ์ (เช่น การคอมไพล์ linkstamp ต้องใช้ทั้งไฟล์คอมไพล์
และไฟล์ลิงก์ จึงใช้ 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 ทั้งหมดที่จำเป็นสำหรับการดำเนินการ strip |
supports_header_parsing
|
บูลีน ค่าเริ่มต้นคือ |
supports_param_files
|
บูลีน ค่าเริ่มต้นคือ |
toolchain_config
|
ป้ายกำกับ (ต้องระบุ) ป้ายกำกับของกฎที่ระบุcc_toolchain_config_info
|
toolchain_identifier
|
สตริง ค่าเริ่มต้นคือ
จนกว่าปัญหา #5380 จะได้รับการแก้ไข
วิธีที่แนะนำในการเชื่อมโยง |
cc_toolchain_suite
ดูแหล่งที่มาของกฎcc_toolchain_suite(name, compatible_with, deprecation, features, licenses, package_metadata, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
เลิกใช้งานแล้ว: กฎนี้ไม่มีผลและจะถูกนำออก
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
fdo_prefetch_hints
ดูแหล่งที่มาของกฎfdo_prefetch_hints(name, compatible_with, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, package_metadata, 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, exec_compatible_with, exec_group_compatible_with, exec_properties, features, memprof_profile, package_metadata, 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 ที่มีโปรไฟล์ LLVM profraw, .afdo สำหรับโปรไฟล์ AutoFDO, .xfdo สำหรับ โปรไฟล์ XBinary ป้ายกำกับยังชี้ไปยังกฎ fdo_absolute_path_profile ได้ด้วย |
proto_profile
|
ป้ายกำกับ ค่าเริ่มต้นคือ |
memprof_profile
ดูแหล่งที่มาของกฎmemprof_profile(name, compatible_with, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, package_metadata, 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, exec_compatible_with, exec_group_compatible_with, exec_properties, features, ld_profile, package_metadata, 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 |