กฎ
- cc_binary
- cc_import
- cc_library
- cc_proto_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, 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) ไม่ได้ถูกประมวลผลล่วงหน้าและมักจะสร้างขึ้นโดยใช้ โปรแกรมประกอบ ไฟล์แอสเซมบลีที่ประมวลผลล่วงหน้า (.S) ได้รับการประมวลผลล่วงหน้าและมักสร้างขึ้น โดยใช้คอมไพเลอร์ C/C++ ไฟล์ ไฟล์ ไฟล์ หากแอตทริบิวต์
ไฟล์
... และกฎที่สร้างไฟล์เหล่านั้น (เช่น |
data
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ data
ที่แอตทริบิวต์ทั่วไปที่กำหนดโดย
กฎการสร้างส่วนใหญ่
หาก หาก โค้ด C++ จะเข้าถึงไฟล์ข้อมูลเหล่านี้ได้ในลักษณะต่อไปนี้
|
additional_linker_inputs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ ตัวอย่างเช่น ไฟล์ .res ของ Windows ที่คอมไพล์แล้วสามารถใส่ที่นี่เพื่อฝังใน เป้าหมายไบนารี |
copts
|
รายการสตริง ค่าเริ่มต้นคือ
ระบบจะเพิ่มแต่ละสตริงในแอตทริบิวต์นี้ตามลำดับที่ระบุให้กับ
หากแพ็กเกจแจ้งฟีเจอร์
|
defines
|
รายการสตริง ค่าเริ่มต้นคือ -D ไว้ข้างหน้า และเพิ่มลงในบรรทัดคำสั่งคอมไพล์ไปยังเป้าหมายนี้
รวมทั้งกฎทุกกฎที่ขึ้นอยู่กับกฎนั้น โปรดระมัดระวังให้มาก เนื่องจาก
ที่ส่งผลกระทบในวงกว้าง หากไม่แน่ใจ ให้เพิ่มกําหนดค่าให้กับ
local_defines แทน
|
dynamic_deps
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ cc_shared_library ที่เป้าหมายปัจจุบันใช้งานอยู่
การใช้งาน |
hdrs_check
|
String; ค่าเริ่มต้นคือ |
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
|
String; ค่าเริ่มต้นคือ COPTS ที่มีอยู่ก่อนหน้าซึ่งตรงกับนิพจน์ทั่วไปนี้
(รวมถึงค่าที่ระบุอย่างชัดแจ้งในแอตทริบิวต์ copts ของกฎ)
จะถูกลบออกจาก COPTS เพื่อวัตถุประสงค์ในการรวบรวมกฎนี้
ไม่ควรต้องใช้หรือใช้แอตทริบิวต์นี้
ภายนอก third_party ค่าไม่ได้ประมวลผลล่วงหน้า
ในลักษณะอื่นใดนอกเหนือจาก "ผู้ผลิต" การแทนที่ตัวแปร
|
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
|
บูลีน ค่าเริ่มต้นคือ หาก 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
โดยขึ้นอยู่กับสิ่งที่ต้องการ
หากคุณสร้างบางอย่างโดยใช้การลิงก์แบบคงที่ซึ่งขึ้นอยู่กับ
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
Toolchain
Bazel รองรับเฉพาะฟีเจอร์นี้กับคําแปลใน 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 = 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) ไม่ได้ถูกประมวลผลล่วงหน้าและมักจะสร้างขึ้นโดยใช้ โปรแกรมประกอบ ไฟล์แอสเซมบลีที่ประมวลผลล่วงหน้า (.S) ได้รับการประมวลผลล่วงหน้าและมักสร้างขึ้น โดยใช้คอมไพเลอร์ C/C++ ไฟล์ ไฟล์ ไฟล์ หากแอตทริบิวต์
ไฟล์
... และกฎที่สร้างไฟล์เหล่านั้น (เช่น |
data
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ data
ที่แอตทริบิวต์ทั่วไปที่กำหนดโดย
กฎการสร้างส่วนใหญ่
หาก หาก โค้ด C++ จะเข้าถึงไฟล์ข้อมูลเหล่านี้ได้ในลักษณะต่อไปนี้
|
hdrs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ นี่คือตำแหน่งที่แนะนำอย่างยิ่งสำหรับการประกาศไฟล์ส่วนหัวที่
อธิบายอินเทอร์เฟซสำหรับไลบรารี ระบบจะสร้างส่วนหัวเหล่านี้
พร้อมสำหรับการรวมโดยแหล่งที่มาในกฎนี้หรือในกฎที่ไม่เป็นอิสระ
ส่วนหัวที่ไคลเอ็นต์ของไลบรารีนี้ไม่ควรรวมควรเป็น
แสดงในแอตทริบิวต์ ไฟล์ |
additional_compiler_inputs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ |
additional_linker_inputs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ ตัวอย่างเช่น ไฟล์ .res ของ Windows ที่คอมไพล์แล้วสามารถใส่ที่นี่เพื่อฝังใน เป้าหมายไบนารี |
alwayslink
|
บูลีน ค่าเริ่มต้นคือ srcs แม้ว่าบางแอตทริบิวต์จะไม่มีสัญลักษณ์ที่ไบนารีอ้างอิงอยู่
วิธีนี้มีประโยชน์หากโค้ดของคุณไม่ได้ถูกเรียกอย่างชัดแจ้งด้วยโค้ดใน
ไบนารี เช่น หากโค้ดของคุณลงทะเบียนเพื่อให้รับการเรียกกลับ
ที่ให้บริการโดยบางบริการ
หาก Alwayslink ใช้ไม่ได้กับ VS 2017 ใน Windows นั่นเป็นเพราะ ปัญหาที่ทราบแล้ว โปรดอัปเกรด VS 2017 เป็นเวอร์ชันล่าสุด |
copts
|
รายการสตริง ค่าเริ่มต้นคือ
ระบบจะเพิ่มแต่ละสตริงในแอตทริบิวต์นี้ตามลำดับที่ระบุให้กับ
หากแพ็กเกจแจ้งฟีเจอร์
|
defines
|
รายการสตริง ค่าเริ่มต้นคือ -D ไว้ข้างหน้า และเพิ่มลงในบรรทัดคำสั่งคอมไพล์ไปยังเป้าหมายนี้
รวมทั้งกฎทุกกฎที่ขึ้นอยู่กับกฎนั้น โปรดระมัดระวังให้มาก เนื่องจาก
ที่ส่งผลกระทบในวงกว้าง หากไม่แน่ใจ ให้เพิ่มกําหนดค่าให้กับ
local_defines แทน
|
hdrs_check
|
String; ค่าเริ่มต้นคือ |
implementation_deps
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ deps ส่วนหัว และระบุเส้นทางของไลบรารีเหล่านี้ (รวมถึงเส้นทางทั้งหมดของไลบรารี
deps สับเปลี่ยน) จะใช้สำหรับการรวบรวมไลบรารีนี้เท่านั้น ไม่รวมถึงไลบรารีที่
ต้องพึ่งพาสิ่งนั้น ไลบรารีที่ระบุด้วย implementation_deps ยังคงลิงก์อยู่ใน
เป้าหมายไบนารีที่ขึ้นอยู่กับไลบรารีนี้
สำหรับตอนนี้ การใช้งานจะถูกจำกัดไว้ที่ cc_libraries และได้รับการปกป้องโดย Flag
|
include_prefix
|
String; ค่าเริ่มต้นคือ เมื่อตั้งค่าแล้ว ส่วนหัวในแอตทริบิวต์ ระบบนำคำนำหน้าในแอตทริบิวต์ แอตทริบิวต์นี้ใช้ได้ตามกฎหมายภายใต้ |
includes
|
รายการสตริง ค่าเริ่มต้นคือ -isystem path_to_package/include_entry
ควรใช้การตั้งค่านี้สำหรับไลบรารีของบุคคลที่สามที่
ไม่เป็นไปตามรูปแบบการเขียน #include ของ Google
กฎนี้ต่างจาก COPTS ตรงที่เพิ่มแฟล็กเหล่านี้
และทุกกฎที่เกี่ยวข้อง (หมายเหตุ: ไม่ใช่กฎเกณฑ์แต่อย่างใด) เป็น
ระมัดระวังให้มาก เนื่องจากอาจส่งผลกระทบเป็นวงกว้าง หากไม่แน่ใจ ให้เพิ่ม
"-I" แจ้งว่าเป็น COPTS แทน
เส้นทาง |
linkopts
|
รายการสตริง ค่าเริ่มต้นคือ cc_binary.linkopts
แอตทริบิวต์ linkopts ยังมีผลกับเป้าหมายที่
ขึ้นอยู่กับไลบรารีนี้โดยตรงหรือโดยอ้อมผ่านทาง deps
(หรือผ่านแอตทริบิวต์อื่นๆ ที่ได้รับการปฏิบัติในลักษณะเดียวกัน:
malloc
ของ cc_binary ) การขึ้นต่อกัน
linkopts จะมีความสำคัญเหนือกว่า linkopts ที่อ้างอิง (นั่นคือ linkopt ของทรัพยากร Dependency อีกด้วย
ปรากฏภายหลังในบรรทัดคำสั่ง) Linkopts ที่ระบุใน
--linkopt
จะมีความสำคัญเหนือ linkopts ของกฎ
โปรดทราบว่าแอตทริบิวต์ นอกจากนี้ คุณควรทราบว่า "-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
|
String; ค่าเริ่มต้นคือ เมื่อตั้งค่าแล้ว ส่วนหัวในแอตทริบิวต์ หากเป็นเส้นทางแบบสัมพัทธ์ ระบบจะใช้เส้นทางที่สัมพันธ์กับแพ็กเกจ หากเป็นวิธีการแบบสัมบูรณ์ ระบบเข้าใจว่าเป็นเส้นทางที่สัมพันธ์กับที่เก็บ ระบบจะเพิ่มคำนำหน้าในแอตทริบิวต์ แอตทริบิวต์นี้ใช้ได้ตามกฎหมายภายใต้ |
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
ซึ่งเป็นการขึ้นต่อกันแบบสับเปลี่ยน ไม่ได้ผล
ลิงก์ bar
เนื่องจากให้บริการแบบไดนามิกโดย
dynamic_dep
bar_shared
foo_shared
ใช้ไฟล์ Linker *.lds เพื่อควบคุมไฟล์
ควรส่งออกสัญลักษณ์ ตรรกะของกฎ cc_shared_library
จะทำงาน
ไม่ได้ควบคุมว่าจะส่งออกสัญลักษณ์ใด แต่จะใช้เฉพาะสัญลักษณ์ที่ถือว่าเป็น
ส่งออกเพื่อให้ข้อผิดพลาดในขั้นตอนการวิเคราะห์หากไลบรารีที่ใช้ร่วมกัน 2 รายการส่งออก
เป้าหมายเดียวกัน
การขึ้นต่อกันโดยตรงทั้งหมดของ cc_shared_library
จะถือว่า
ส่งออกแล้ว ดังนั้น Bazel จึงถือว่าในระหว่างการวิเคราะห์ว่า foo
ส่งออกโดย foo_shared
ไม่ถือว่าเป็นการส่งออก baz
โดย foo_shared
ทุกเป้าหมายตรงกับ exports_filter
ให้ถือว่ามีการส่งออกด้วยเช่นกัน
ทุกๆ cc_library
ในตัวอย่างควรปรากฏมากที่สุดใน 1
cc_shared_library
หากเราต้องการลิงก์ 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
ที่ส่งออกเป้าหมายเดียวกัน วิธีแก้ไขปัญหา
คุณต้องหยุดการส่งออกไลบรารีใน
ทรัพยากร Dependency cc_shared_library
Two shared libraries in dependencies link the same library statically
กรณีนี้จะเกิดขึ้นทุกครั้งที่คุณสร้าง cc_shared_library
ใหม่ที่มี
ทรัพยากร Dependency ของ cc_shared_library
ที่แตกต่างกันซึ่งลิงก์เป้าหมายเดียวกันแบบคงที่
คล้ายกับข้อผิดพลาดที่เกิดขึ้นกับการส่งออก
วิธีหนึ่งที่จะแก้ปัญหานี้คือการหยุดลิงก์ไลบรารีกับหนึ่งใน
ทรัพยากร 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
ที่สามที่ส่งออก
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
และอาศัยเป้าหมายจากไดนามิก
ทรัพยากร Dependency หรือตรวจสอบว่า 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 ไปยังเป้าหมายเหล่านั้น
Dependency Edge ควรสร้างโดย ระบบอนุญาตให้ใช้ไวยากรณ์ต่อไปนี้
|
roots
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ |
shared_lib_name
|
String; ค่าเริ่มต้นคือ |
static_deps
|
รายการสตริง ค่าเริ่มต้นคือ |
user_link_flags
|
รายการสตริง ค่าเริ่มต้นคือ
|
win_def_file
|
ป้ายกำกับ ค่าเริ่มต้นคือ แอตทริบิวต์นี้ควรใช้เมื่อ Windows เป็นแพลตฟอร์มเป้าหมายเท่านั้น สามารถใช้เพื่อ สัญลักษณ์ส่งออกในระหว่างการลิงก์ไลบรารีที่ใช้ร่วมกัน |
cc_static_library
ดูแหล่งที่มาของกฎcc_static_library(name, deps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)สร้างไลบรารีแบบคงที่จากรายการเป้าหมายและทรัพยากร Dependency แบบทรานซิทีฟ
ไลบรารีแบบคงที่ที่ได้จะมีไฟล์ออบเจ็กต์ของเป้าหมายที่แสดงอยู่ใน
deps
รวมถึงทรัพยากร Dependency แบบสับเปลี่ยน โดยจะกำหนดให้
PIC
ออบเจ็กต์
กลุ่มเอาต์พุต
linkdeps
ไฟล์ข้อความที่มีป้ายกำกับของทรัพยากร Dependency แบบสับเปลี่ยนของเป้าหมายที่ระบุไว้ใน
deps
ที่ไม่ได้ส่งไฟล์ออบเจ็กต์ใดๆ ไปยังไลบรารีแบบคงที่ แต่ได้ส่ง
ให้ไลบรารีแบบคงที่ แบบไดนามิก หรืออินเทอร์เฟซอย่างน้อยหนึ่งรายการ ไลบรารีแบบคงที่ผลลัพธ์
อาจกำหนดให้ไลบรารีเหล่านี้พร้อมใช้งาน ณ เวลาที่ลิงก์
linkopts
ไฟล์ข้อความที่มี linkopts
ของทรานซิทีฟทั้งหมดที่ผู้ใช้ระบุ
ทรัพยากร Dependency ของเป้าหมายที่แสดงใน deps
สัญลักษณ์ซ้ำกัน
โดยค่าเริ่มต้น กฎ cc_static_library
จะตรวจสอบว่าผลลัพธ์แบบคงที่
ไลบรารีไม่มีสัญลักษณ์ที่ซ้ำกัน หากไม่ใช่ บิลด์จะล้มเหลวโดยมีข้อผิดพลาด
ที่แสดงสัญลักษณ์ที่ซ้ำกันและไฟล์ออบเจ็กต์ที่มีสัญลักษณ์ดังกล่าวอยู่
สามารถปิดใช้การตรวจสอบนี้ต่อเป้าหมายหรือต่อแพ็กเกจได้โดยการตั้งค่า
features = ["-symbol_check"]
หรือทั่วโลกผ่าน
--features=-symbol_check
การรองรับเครื่องมือเชนสำหรับ symbol_check
เครื่องมือเชน C++ ที่กำหนดค่าอัตโนมัติซึ่งจัดส่งโดย Bazel รองรับ
symbol_check
ในทุกแพลตฟอร์ม Toolchain ที่กําหนดเองจะเพิ่มการรองรับ
ด้วยวิธีใดวิธีหนึ่งจาก 2 วิธีต่อไปนี้
- กําลังนําการดําเนินการ
ACTION_NAMES.validate_static_library
และ เปิดใช้ด้วยฟีเจอร์symbol_check
เครื่องมือที่ตั้งค่าในการทำงานคือ โดยใช้อาร์กิวเมนต์ 2 แบบ คือไลบรารีแบบคงที่เพื่อตรวจหาสัญลักษณ์ที่ซ้ำกันและ เส้นทางของไฟล์ที่ต้องสร้างหากผ่านการตรวจสอบ - การมี
symbol_check
แฟล็กเครื่องมือเก็บถาวรจะเพิ่มค่าที่เก็บถาวร ดำเนินการสร้างไลบรารีแบบคงที่เพื่อไม่ให้แสดงสัญลักษณ์ที่ซ้ำกัน
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
deps
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ การขึ้นต่อกันที่ไม่มีไฟล์ออบเจ็กต์ใดๆ จะไม่รวมอยู่ในแบบคงที่
แต่ป้ายกำกับของผู้เผยแพร่โฆษณาจะรวบรวมไว้ในไฟล์ที่
กลุ่มเอาต์พุต |
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) ไม่ได้ถูกประมวลผลล่วงหน้าและมักจะสร้างขึ้นโดยใช้ โปรแกรมประกอบ ไฟล์แอสเซมบลีที่ประมวลผลล่วงหน้า (.S) ได้รับการประมวลผลล่วงหน้าและมักสร้างขึ้น โดยใช้คอมไพเลอร์ C/C++ ไฟล์ ไฟล์ ไฟล์ หากแอตทริบิวต์
ไฟล์
... และกฎที่สร้างไฟล์เหล่านั้น (เช่น |
data
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ data
ที่แอตทริบิวต์ทั่วไปที่กำหนดโดย
กฎการสร้างส่วนใหญ่
หาก หาก โค้ด C++ จะเข้าถึงไฟล์ข้อมูลเหล่านี้ได้ในลักษณะต่อไปนี้
|
additional_linker_inputs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ ตัวอย่างเช่น ไฟล์ .res ของ Windows ที่คอมไพล์แล้วสามารถใส่ที่นี่เพื่อฝังใน เป้าหมายไบนารี |
copts
|
รายการสตริง ค่าเริ่มต้นคือ
ระบบจะเพิ่มแต่ละสตริงในแอตทริบิวต์นี้ตามลำดับที่ระบุให้กับ
หากแพ็กเกจแจ้งฟีเจอร์
|
defines
|
รายการสตริง ค่าเริ่มต้นคือ -D ไว้ข้างหน้า และเพิ่มลงในบรรทัดคำสั่งคอมไพล์ไปยังเป้าหมายนี้
รวมทั้งกฎทุกกฎที่ขึ้นอยู่กับกฎนั้น โปรดระมัดระวังให้มาก เนื่องจาก
ที่ส่งผลกระทบในวงกว้าง หากไม่แน่ใจ ให้เพิ่มกําหนดค่าให้กับ
local_defines แทน
|
dynamic_deps
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ cc_shared_library ที่เป้าหมายปัจจุบันใช้งานอยู่
การใช้งาน |
hdrs_check
|
String; ค่าเริ่มต้นคือ |
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
|
String; ค่าเริ่มต้นคือ COPTS ที่มีอยู่ก่อนหน้าซึ่งตรงกับนิพจน์ทั่วไปนี้
(รวมถึงค่าที่ระบุอย่างชัดแจ้งในแอตทริบิวต์ copts ของกฎ)
จะถูกลบออกจาก COPTS เพื่อวัตถุประสงค์ในการรวบรวมกฎนี้
ไม่ควรต้องใช้หรือใช้แอตทริบิวต์นี้
ภายนอก third_party ค่าไม่ได้ประมวลผลล่วงหน้า
ในลักษณะอื่นใดนอกเหนือจาก "ผู้ผลิต" การแทนที่ตัวแปร
|
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"]
เพื่อป้องกันไม่ให้มีการสร้างและกำหนดค่าเชนเครื่องมือ
โดยไม่จำเป็นเมื่อเรียกใช้ 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" เปิดใช้งานฟีเจอร์แล้ว และเรากำลังเชื่อมโยง ทรัพยากร Dependency แบบไดนามิก |
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
|
String; ค่าเริ่มต้นคือ
จนกว่าปัญหา #5380 จะได้รับการแก้ไข
วิธีนี้เป็นวิธีที่แนะนำในการเชื่อมโยง |
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 |