กฎ C / C++

รายงานปัญหา ดูซอร์สโค้ด รุ่น Nightly · 8.0 7.4 7.3 · 7.2 · 7.1 · 7.0 · 6.5

กฎ

cc_binary

ดูแหล่งที่มาของกฎ
cc_binary(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, exec_compatible_with, exec_properties, features, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local_defines, malloc, nocopts, output_licenses, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)

เป้าหมายเอาต์พุตโดยนัย

  • name.stripped (จะสร้างขึ้นก็ต่อเมื่อมีการขออย่างชัดแจ้งเท่านั้น): ไฟล์ไบนารีเวอร์ชันที่ลบข้อมูล strip -g ทำงานบนไบนารีเพื่อนำสัญลักษณ์การแก้ไขข้อบกพร่องออก คุณสามารถระบุตัวเลือกแถบเพิ่มเติมในบรรทัดคำสั่งได้โดยใช้ --stripopt=-foo ระบบจะสร้างเอาต์พุตนี้ต่อเมื่อมีการขออย่างชัดเจนเท่านั้น
  • name.dwp (จะสร้างขึ้นก็ต่อเมื่อมีการขออย่างชัดเจนเท่านั้น): หากFission เปิดใช้งานอยู่: ไฟล์แพ็กเกจข้อมูลการแก้ไขข้อบกพร่องที่เหมาะสำหรับการแก้ไขข้อบกพร่องของไบนารีที่ติดตั้งจากระยะไกล ไม่เช่นนั้น: ไฟล์ว่างเปล่า

อาร์กิวเมนต์

Attributes
name

ชื่อ ต้องระบุ

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

deps

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

รายการไลบรารีอื่นๆ ที่จะลิงก์กับเป้าหมายไบนารี

ซึ่งอาจเป็นเป้าหมาย cc_library หรือ objc_libraryก็ได้

srcs

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

รายการไฟล์ C และ C++ ที่ประมวลผลเพื่อสร้างเป้าหมาย ไฟล์เหล่านี้คือไฟล์ซอร์สโค้ดและไฟล์ส่วนหัว C/C++ ที่ไม่ได้สร้าง (ซอร์สโค้ดปกติ) หรือที่สร้าง

ระบบจะคอมไพล์ไฟล์ .cc, .c และ .cpp ทั้งหมด ไฟล์เหล่านี้อาจเป็นไฟล์ที่สร้างขึ้น หากไฟล์ที่มีชื่ออยู่ใน outs ของกฎอื่น กฎนี้จะขึ้นอยู่กับกฎอื่นนั้นโดยอัตโนมัติ

ระบบจะไม่คอมไพล์ไฟล์ .h แต่แหล่งที่มาจะรวมไฟล์ดังกล่าวได้ภายใต้กฎนี้ ทั้งไฟล์ .cc และ .h สามารถใส่ส่วนหัวที่ระบุไว้ใน srcs เหล่านี้หรือใน hdrs ของกฎที่ระบุไว้ในอาร์กิวเมนต์ deps ได้โดยตรง

คุณต้องพูดถึงไฟล์ #included ทั้งหมดในแอตทริบิวต์ srcs ของกฎนี้ หรือในแอตทริบิวต์ hdrs ของ cc_library() ที่อ้างอิง รูปแบบที่แนะนำคือให้ส่วนหัวที่เชื่อมโยงกับคลังแสดงอยู่ในแอตทริบิวต์ hdrs ของคลังนั้น ส่วนหัวที่เหลือซึ่งเชื่อมโยงกับแหล่งที่มาของกฎนี้จะแสดงอยู่ใน srcs ดูคำอธิบายโดยละเอียดได้ที่"การตรวจสอบการรวมส่วนหัว"

หากชื่อของกฎอยู่ใน srcs กฎนี้จะขึ้นอยู่กับกฎนั้นโดยอัตโนมัติ หาก outs ของกฎที่มีชื่อเป็นไฟล์ซอร์สโค้ด C หรือ C++ ระบบจะคอมไพล์ไฟล์เหล่านั้นเป็นกฎนี้ หากเป็นไฟล์ไลบรารี ระบบจะลิงก์ไฟล์เหล่านั้น

ประเภทไฟล์ srcs ที่อนุญาต

  • ไฟล์ซอร์สโค้ด C และ C++: .c, .cc, .cpp, .cxx, .c++, .C
  • ไฟล์ส่วนหัว C และ C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Assembler ที่มี C preprocessor: .S
  • เก็บ: .a, .pic.a
  • คลัง "ลิงก์เสมอ": .lo, .pic.lo
  • ไลบรารีที่ใช้ร่วมกันซึ่งมีเวอร์ชันหรือไม่มีเวอร์ชัน: .so, .so.version
  • ไฟล์ออบเจ็กต์: .o, .pic.o

...และกฎที่สร้างไฟล์เหล่านั้น ส่วนขยายต่างๆ จะแสดงถึงภาษาโปรแกรมที่แตกต่างกันตามแบบแผนของ gcc

additional_linker_inputs

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

ส่งไฟล์เหล่านี้ไปยังคําสั่ง linker ของ C++

เช่น คุณสามารถระบุไฟล์ .res ของ Windows ที่คอมไพล์แล้วที่นี่เพื่อฝังลงในเป้าหมายไบนารี

copts

รายการสตริง ค่าเริ่มต้นคือ []

เพิ่มตัวเลือกเหล่านี้ลงในคำสั่งคอมไพล์ C++ ขึ้นอยู่กับการแทนที่ "Make variable" และการแยกสตริงคำสั่ง Bourne Shell

ระบบจะเพิ่มสตริงแต่ละรายการในแอตทริบิวต์นี้ตามลําดับที่ระบุลงใน COPTS ก่อนคอมไพล์เป้าหมายไบนารี Flag จะมีผลกับการคอมไพล์เป้าหมายนี้เท่านั้น ไม่ใช่กับสิ่งที่ต้องพึ่งพา ดังนั้นโปรดระมัดระวังเกี่ยวกับไฟล์ส่วนหัวที่รวมไว้ที่อื่น เส้นทางทั้งหมดควรสัมพันธ์กับพื้นที่ทํางาน ไม่ใช่กับแพ็กเกจปัจจุบัน

หากแพ็กเกจประกาศฟีเจอร์ no_copts_tokenization จะมีการแยกออกเป็นโทเค็นของ Bourne shell เฉพาะกับสตริงที่ประกอบด้วยตัวแปร "Make" รายการเดียวเท่านั้น

defines

รายการสตริง ค่าเริ่มต้นคือ []

รายการคําจํากัดความที่จะเพิ่มลงในบรรทัดการคอมไพล์ ขึ้นอยู่กับการแทนที่ตัวแปร"Make" และการแยกสตริงคำสั่ง Bourne Shell สตริงแต่ละรายการ ซึ่งต้องประกอบด้วยโทเค็น Bourne Shell รายการเดียว จะมี -D อยู่ข้างหน้าและเพิ่มลงในบรรทัดคำสั่งคอมไพล์ไปยังเป้าหมายนี้ รวมถึงกฎทั้งหมดที่ขึ้นอยู่กับเป้าหมายนี้ โปรดใช้ความระมัดระวังอย่างยิ่ง เนื่องจากการดำเนินการนี้อาจมีผลกระทบที่กว้างไกล หากไม่แน่ใจ ให้เพิ่มค่าที่กําหนดใน local_defines แทน
includes

รายการสตริง ค่าเริ่มต้นคือ []

รายการไดเรกทอรีรวมที่จะเพิ่มลงในบรรทัดคอมไพล์

ขึ้นอยู่กับการแทนที่ "Make variable" สตริงแต่ละรายการจะมี -isystem อยู่ด้านหน้าและเพิ่มลงใน COPTS ซึ่งแตกต่างจาก COPTS เนื่องจากระบบจะเพิ่ม Flag เหล่านี้สำหรับกฎนี้และกฎทุกข้อที่ขึ้นอยู่กับกฎนี้ (หมายเหตุ: ไม่ใช่กฎที่ใช้กับแอตทริบิวต์) โปรดใช้ความระมัดระวังอย่างยิ่ง เนื่องจากการดำเนินการนี้อาจมีผลที่ตามมาอย่างกว้างขวาง หากไม่แน่ใจ ให้เพิ่ม Flag "-I" ลงใน COPTS แทน

คุณต้องเพิ่มส่วนหัวลงใน srcs หรือ hdrs มิฉะนั้นกฎที่เกี่ยวข้องจะใช้ไม่ได้เมื่อการคอมไพล์อยู่ในแซนด์บ็อกซ์ (ค่าเริ่มต้น)

ป้ายกํากับ ค่าเริ่มต้นคือ "@bazel_tools//tools/cpp:link_extra_lib"

ควบคุมการลิงก์ไลบรารีเพิ่มเติม

โดยค่าเริ่มต้น ระบบจะลิงก์ไบนารี C++ กับ //tools/cpp:link_extra_lib ซึ่งโดยค่าเริ่มต้นจะขึ้นอยู่กับ Flag ป้ายกำกับ //tools/cpp:link_extra_libs หากไม่ได้ตั้งค่า Flag ห้องสมุดนี้จะว่างเปล่าโดยค่าเริ่มต้น การตั้งค่า Flag ป้ายกำกับจะอนุญาตให้ลิงก์ไลบรารี 3rd party ที่ไม่บังคับ เช่น การลบล้างสำหรับสัญลักษณ์ที่ลบล้างได้ อินเตอร์เซปเตอร์สำหรับฟังก์ชันในคลังที่ใช้ร่วมกัน หรือไลบรารีรันไทม์พิเศษ (สำหรับรายการที่แทนที่ malloc โปรดใช้ malloc หรือ --custom_malloc) การตั้งค่าแอตทริบิวต์นี้เป็น None จะปิดใช้ลักษณะการทำงานนี้

linkopts

รายการสตริง ค่าเริ่มต้นคือ []

เพิ่ม Flag เหล่านี้ลงในคําสั่ง linker ของ C++ ขึ้นอยู่กับการแทนที่ตัวแปร"Make", การจัดทําโทเค็นของ Bourne Shell และ การขยายป้ายกำกับ ระบบจะเพิ่มสตริงแต่ละรายการในแอตทริบิวต์นี้ลงใน LINKOPTS ก่อนลิงก์เป้าหมายไบนารี

ระบบจะถือว่าองค์ประกอบแต่ละรายการในรายการนี้ที่ไม่ได้ขึ้นต้นด้วย $ หรือ - เป็นป้ายกำกับของเป้าหมายใน deps ระบบจะเพิ่มรายการไฟล์ที่สร้างขึ้นโดยเป้าหมายนั้นต่อท้ายตัวเลือก linker ระบบจะรายงานข้อผิดพลาดหากป้ายกำกับไม่ถูกต้องหรือไม่มีการประกาศใน deps

linkshared

บูลีน ไม่สามารถกําหนดค่าได้ ค่าเริ่มต้นคือ False

สร้างคลังที่ใช้ร่วมกัน หากต้องการเปิดใช้แอตทริบิวต์นี้ ให้ใส่ linkshared=True ในกฎ ตัวเลือกนี้จะปิดอยู่โดยค่าเริ่มต้น

การมี Flag นี้หมายความว่ามีการลิงก์ Flag -shared กับ gcc และไลบรารีที่แชร์ซึ่งได้จะเหมาะสำหรับการโหลดลงในโปรแกรม Java เป็นต้น อย่างไรก็ตาม จะไม่มีการสร้างลิงก์ไปยังไฟล์ไบนารีที่ขึ้นอยู่กับไลบรารีดังกล่าวเพื่อวัตถุประสงค์ในการสร้าง เนื่องจากระบบจะถือว่าโปรแกรมอื่นๆ จะโหลดไลบรารีที่ใช้ร่วมกันซึ่งสร้างด้วยกฎ cc_binary ด้วยตนเองเท่านั้น ดังนั้นจึงไม่ควรถือว่ากฎนี้ใช้แทนกฎ cc_library เราขอแนะนำให้หลีกเลี่ยงแนวทางนี้โดยสิ้นเชิงและเพียงแค่ให้java_libraryขึ้นอยู่กับกฎcc_libraryแทน เพื่อความสามารถในการปรับขนาด

หากคุณระบุทั้ง linkopts=['-static'] และ linkshared=True คุณจะได้รับหน่วยเดียวที่ทำงานได้ครบถ้วน หากคุณระบุทั้ง linkstatic=True และ linkshared=True คุณจะได้รับหน่วยเดียวที่ทำงานได้ด้วยตัวเองส่วนใหญ่

linkstatic

บูลีน ค่าเริ่มต้นคือ True

สำหรับ cc_binary และ cc_test ให้ลิงก์ไบนารีในโหมดแบบคงที่ สำหรับ cc_library.linkstatic: โปรดดูด้านล่าง

โดยค่าเริ่มต้น ตัวเลือกนี้จะเปิดอยู่สําหรับ cc_binary และปิดอยู่สําหรับรายการอื่นๆ

หากเปิดใช้และนี่คือไบนารีหรือการทดสอบ ตัวเลือกนี้จะบอกเครื่องมือสร้างให้ลิงก์ .a แทน .so สำหรับไลบรารีผู้ใช้ทุกครั้งที่เป็นไปได้ ไลบรารีระบบบางรายการอาจยังคงลิงก์แบบไดนามิกอยู่เช่นเดียวกับไลบรารีที่ไม่มีไลบรารีแบบคงที่ ดังนั้นไฟล์ปฏิบัติการที่ได้จะยังคงมีการลิงก์แบบไดนามิก จึงเป็นแบบคงที่ส่วนใหญ่เท่านั้น

การลิงก์ไฟล์ปฏิบัติการทำได้ 3 วิธีดังนี้

  • STATIC ที่มีฟีเจอร์ fully_static_link ซึ่งทุกอย่างจะลิงก์แบบคงที่ เช่น "gcc -static foo.o libbar.a libbaz.a -lm"
    เปิดใช้โหมดนี้โดยระบุ fully_static_link ในแอตทริบิวต์ features
  • STATIC ซึ่งจะลิงก์ไลบรารีผู้ใช้ทั้งหมดแบบคงที่ (หากมีเวอร์ชันแบบคงที่) แต่ลิงก์ไลบรารีระบบ (ยกเว้นไลบรารีรันไทม์ C/C++) แบบไดนามิก เช่น "gcc foo.o libfoo.a libbaz.a -lm"
    โหมดนี้จะเปิดใช้โดยระบุ linkstatic=True
  • ไดนามิก ซึ่งจะลิงก์ไลบรารีทั้งหมดแบบไดนามิก (หากมีเวอร์ชันแบบไดนามิก) เช่น "gcc foo.o libfoo.so libbaz.so -lm"
    โดยเปิดใช้โหมดนี้ได้โดยระบุ linkstatic=False

แอตทริบิวต์ linkstatic มีความหมายแตกต่างกันหากใช้ในกฎ cc_library() สำหรับไลบรารี C++ linkstatic=True บ่งบอกว่าอนุญาตให้มีเฉพาะการลิงก์แบบคงที่เท่านั้น ดังนั้นระบบจะไม่สร้าง .so linkstatic=False จะไม่ป้องกันไม่ให้สร้างไลบรารีแบบคงที่ แอตทริบิวต์นี้มีไว้เพื่อควบคุมการสร้างไลบรารีแบบไดนามิก

หากเป็น linkstatic=False เครื่องมือสร้างจะสร้างสัญลักษณ์ลิงก์ไปยังไลบรารีที่ใช้ร่วมกันซึ่งต้องอาศัยในพื้นที่ *.runfiles

local_defines

รายการสตริง ค่าเริ่มต้นคือ []

รายการคําจํากัดความที่จะเพิ่มลงในบรรทัดการคอมไพล์ ขึ้นอยู่กับการแทนที่ตัวแปร"Make" และการแยกสตริงคำสั่ง Bourne Shell สตริงแต่ละรายการ ซึ่งต้องประกอบด้วยโทเค็น Bourne Shell รายการเดียว จะมี -D นำหน้าและเพิ่มลงในบรรทัดคำสั่งคอมไพล์สำหรับเป้าหมายนี้ แต่จะไม่เพิ่มลงในรายการที่เกี่ยวข้อง
malloc

ป้ายกํากับ ค่าเริ่มต้นคือ "@bazel_tools//tools/cpp:malloc"

ลบล้างการพึ่งพาเริ่มต้นใน malloc

โดยค่าเริ่มต้น ระบบจะลิงก์ไบนารี C++ กับ //tools/cpp:malloc ซึ่งเป็นไลบรารีว่างเปล่าเพื่อให้ไบนารีใช้ libc malloc ป้ายกำกับนี้ต้องอ้างอิงถึง cc_library หากการคอมไพล์มีไว้สำหรับกฎที่ไม่ใช่ C++ ตัวเลือกนี้จะไม่มีผล ระบบจะละเว้นค่าของแอตทริบิวต์นี้หากระบุ linkshared=True

nocopts

สตริง ค่าเริ่มต้นคือ ""

นำตัวเลือกที่ตรงกันออกจากคำสั่งการคอมไพล์ C++ ขึ้นอยู่กับการแทนที่ตัวแปร"Make" ระบบจะตีความค่าของแอตทริบิวต์นี้เป็นนิพจน์ทั่วไป ระบบจะนำ COPTS ที่มีอยู่ซึ่งตรงกับนิพจน์ทั่วไปนี้ (รวมถึงค่าที่ระบุไว้อย่างชัดเจนในแอตทริบิวต์ copts ของกฎ) ออกจาก COPTS เพื่อวัตถุประสงค์ในการคอมไพล์กฎนี้ คุณแทบจะไม่ต้องใช้แอตทริบิวต์นี้
stamp

จํานวนเต็ม ค่าเริ่มต้นคือ -1

ว่าจะเข้ารหัสข้อมูลบิลด์ลงในไบนารีหรือไม่ ค่าที่เป็นไปได้มีดังนี้
  • stamp = 1: ประทับข้อมูลบิลด์ลงในไบนารีเสมอ แม้ในบิลด์ --nostamp ก็ตาม คุณควรหลีกเลี่ยงการตั้งค่านี้ เนื่องจากอาจทำให้แคชระยะไกลสําหรับไบนารีและการดำเนินการดาวน์สตรีมใดๆ ที่ขึ้นอยู่กับแคชนั้นใช้งานไม่ได้
  • stamp = 0: แทนที่ข้อมูลบิลด์ด้วยค่าคงที่เสมอ ซึ่งจะแคชผลลัพธ์การสร้างที่ดี
  • stamp = -1: การฝังข้อมูลบิลด์จะควบคุมโดย Flag --[no]stamp

ระบบจะไม่สร้างไฟล์ไบนารีที่มีตราประทับอีกครั้ง เว้นแต่จะมีการเปลี่ยนแปลงทรัพยากร Dependency

win_def_file

ป้ายกํากับ ค่าเริ่มต้นคือ None

ไฟล์ DEF ของ Windows ที่ส่งไปยัง linker

คุณควรใช้แอตทริบิวต์นี้เมื่อ Windows เป็นแพลตฟอร์มเป้าหมายเท่านั้น ซึ่งสามารถใช้เพื่อ ส่งออกสัญลักษณ์ระหว่างการลิงก์ไลบรารีที่ใช้ร่วมกัน

cc_import

ดูแหล่งที่มาของกฎ
cc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, distribs, features, interface_library, licenses, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, 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. การลิงก์ไลบรารีที่ใช้ร่วมกันกับไลบรารีอินเทอร์เฟซ (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 (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",
)

# first will link to libmylib.a
cc_binary(
  name = "first",
  srcs = ["first.cc"],
  deps = [":mylib"],
  linkstatic = 1, # default value
)

# second will link to libmylib.so
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)
ใน 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",
)

# first will link to libmylib.lib
cc_binary(
  name = "first",
  srcs = ["first.cc"],
  deps = [":mylib"],
  linkstatic = 1, # default value
)

# second will link to mylib.dll through mylib.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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

รายการไฟล์ส่วนหัวที่เผยแพร่โดยไลบรารีที่คอมไพล์ล่วงหน้านี้เพื่อให้แหล่งที่มารวมไว้ในกฎที่เกี่ยวข้องได้โดยตรง

บูลีน ค่าเริ่มต้นคือ False

หากเป็น 1 ไฟล์ไบนารีที่ขึ้นอยู่กับ (โดยตรงหรือโดยอ้อม) ไลบรารี C++ ที่คอมไพล์ล่วงหน้านี้จะลิงก์ไฟล์ออบเจ็กต์ทั้งหมดที่เก็บถาวรไว้ในไลบรารีแบบคงที่ แม้ว่าบางไฟล์จะไม่มีสัญลักษณ์ที่ไบนารีอ้างอิงก็ตาม ซึ่งมีประโยชน์ในกรณีที่โค้ดในไบนารีไม่ได้เรียกใช้โค้ดของคุณอย่างชัดเจน เช่น ในกรณีที่โค้ดลงทะเบียนเพื่อรับการเรียกกลับบางอย่างจากบริการบางอย่าง

หาก alwayslink ไม่ทำงานกับ VS 2017 ใน Windows ปัญหานี้เกิดจากปัญหาที่ทราบ โปรดอัปเกรด VS 2017 เป็นเวอร์ชันล่าสุด

interface_library

ป้ายกํากับ ค่าเริ่มต้นคือ None

ไลบรารีอินเทอร์เฟซเดียวสำหรับลิงก์ไลบรารีที่ใช้ร่วมกัน

ประเภทไฟล์ที่อนุญาต ได้แก่ .ifso .tbd .lib .so หรือ .dylib

shared_library

ป้ายกํากับ ค่าเริ่มต้นคือ None

ไลบรารีที่ใช้ร่วมกันแบบคอมไพล์ล่วงหน้ารายการเดียว Bazel จะตรวจสอบว่าไฟล์ดังกล่าวพร้อมใช้งานสำหรับไบนารีที่ต้องใช้ไฟล์นั้นในระหว่างรันไทม์

ประเภทไฟล์ที่อนุญาต ได้แก่ .so .dll หรือ .dylib

static_library

ป้ายกํากับ ค่าเริ่มต้นคือ None

ไลบรารีแบบคงที่ที่คอมไพล์ไว้ล่วงหน้ารายการเดียว

ประเภทไฟล์ที่อนุญาต ได้แก่ .a .pic.a หรือ .lib

system_provided

บูลีน ค่าเริ่มต้นคือ False

หากเป็น 1 แสดงว่าระบบจัดหาไลบรารีที่ใช้ร่วมกันที่จำเป็นในรันไทม์ ในกรณีนี้ คุณควรระบุ 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, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, nocopts, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)

การตรวจสอบการรวมส่วนหัว

ไฟล์ส่วนหัวทั้งหมดที่ใช้ในการสร้างต้องประกาศใน 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.hbar.h
foo.ccfoo.h bar.h
bar.hbar-impl.h baz.h
bar-impl.hbar.h baz.h
bar.ccbar.h bar-impl.h baz.h
baz.hbaz-impl.h
baz-impl.hbaz.h
baz.ccbaz.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 อาศัยการรองรับเครื่องมือทางเทคนิคเพื่อบังคับใช้กฎการตรวจสอบการรวม เครื่องมือควรรองรับฟีเจอร์ layering_check และมีการขออย่างชัดแจ้ง เช่น ผ่าน Flag บรรทัดคำสั่ง --features=layering_check หรือพารามิเตอร์ features ของฟังก์ชัน package เครื่องมือทางเทคนิคที่ Bazel มีให้รองรับฟีเจอร์นี้กับ clang ใน Unix และ macOS เท่านั้น

อาร์กิวเมนต์

Attributes
name

ชื่อ ต้องระบุ

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

deps

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

รายการไลบรารีอื่นๆ ที่จะลิงก์กับเป้าหมายไบนารี

ซึ่งอาจเป็นเป้าหมาย cc_library หรือ objc_libraryก็ได้

srcs

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

รายการไฟล์ C และ C++ ที่ประมวลผลเพื่อสร้างเป้าหมาย ไฟล์เหล่านี้คือไฟล์ซอร์สโค้ดและไฟล์ส่วนหัว C/C++ ที่ไม่ได้สร้าง (ซอร์สโค้ดปกติ) หรือที่สร้าง

ระบบจะคอมไพล์ไฟล์ .cc, .c และ .cpp ทั้งหมด ไฟล์เหล่านี้อาจเป็นไฟล์ที่สร้างขึ้น หากไฟล์ที่มีชื่ออยู่ใน outs ของกฎอื่น กฎนี้จะขึ้นอยู่กับกฎอื่นนั้นโดยอัตโนมัติ

ระบบจะไม่คอมไพล์ไฟล์ .h แต่แหล่งที่มาจะรวมไฟล์ดังกล่าวได้ภายใต้กฎนี้ ทั้งไฟล์ .cc และ .h สามารถใส่ส่วนหัวที่ระบุไว้ใน srcs เหล่านี้หรือใน hdrs ของกฎที่ระบุไว้ในอาร์กิวเมนต์ deps ได้โดยตรง

คุณต้องพูดถึงไฟล์ #included ทั้งหมดในแอตทริบิวต์ srcs ของกฎนี้ หรือในแอตทริบิวต์ hdrs ของ cc_library() ที่อ้างอิง รูปแบบที่แนะนำคือให้ส่วนหัวที่เชื่อมโยงกับคลังแสดงอยู่ในแอตทริบิวต์ hdrs ของคลังนั้น ส่วนหัวที่เหลือซึ่งเชื่อมโยงกับแหล่งที่มาของกฎนี้จะแสดงอยู่ใน srcs ดูคำอธิบายโดยละเอียดได้ที่"การตรวจสอบการรวมส่วนหัว"

หากชื่อของกฎอยู่ใน srcs กฎนี้จะขึ้นอยู่กับกฎนั้นโดยอัตโนมัติ หาก outs ของกฎที่มีชื่อเป็นไฟล์ซอร์สโค้ด C หรือ C++ ระบบจะคอมไพล์ไฟล์เหล่านั้นเป็นกฎนี้ หากเป็นไฟล์ไลบรารี ระบบจะลิงก์ไฟล์เหล่านั้น

ประเภทไฟล์ srcs ที่อนุญาต

  • ไฟล์ซอร์สโค้ด C และ C++: .c, .cc, .cpp, .cxx, .c++, .C
  • ไฟล์ส่วนหัว C และ C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Assembler ที่มี C preprocessor: .S
  • เก็บ: .a, .pic.a
  • คลัง "ลิงก์เสมอ": .lo, .pic.lo
  • ไลบรารีที่ใช้ร่วมกันซึ่งมีเวอร์ชันหรือไม่มีเวอร์ชัน: .so, .so.version
  • ไฟล์ออบเจ็กต์: .o, .pic.o

...และกฎที่สร้างไฟล์เหล่านั้น ส่วนขยายต่างๆ จะแสดงถึงภาษาโปรแกรมที่แตกต่างกันตามแบบแผนของ gcc

hdrs

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

รายการไฟล์ส่วนหัวที่เผยแพร่โดยไลบรารีนี้เพื่อให้แหล่งที่มารวมไว้ในกฎแบบพึ่งพาได้โดยตรง

ตำแหน่งนี้เป็นตำแหน่งที่แนะนำอย่างยิ่งสำหรับการประกาศไฟล์ส่วนหัวที่อธิบายอินเทอร์เฟซสำหรับไลบรารี ระบบจะทําให้ส่วนหัวเหล่านี้พร้อมใช้งานสําหรับรวมโดยแหล่งที่มาในกฎนี้หรือในกฎที่เกี่ยวข้อง ส่วนหัวที่ไม่ได้ตั้งใจให้รวมโดยไคลเอ็นต์ของไลบรารีนี้ควรแสดงในแอตทริบิวต์ srcs แทน แม้ว่าส่วนหัวที่เผยแพร่จะรวมไว้ก็ตาม ดูคำอธิบายโดยละเอียดได้ที่"การตรวจสอบการรวมส่วนหัว"

additional_compiler_inputs

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

ไฟล์อื่นๆ ที่คุณอาจต้องการส่งไปยังบรรทัดคำสั่งคอมไพเลอร์ เช่น รายการที่ละเว้นของโปรแกรมตรวจสอบ จากนั้นไฟล์ที่ระบุที่นี่จะใช้ได้ใน copts โดยใช้ฟังก์ชัน $(location)
additional_linker_inputs

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

ส่งไฟล์เหล่านี้ไปยังคําสั่ง linker ของ C++

เช่น คุณสามารถระบุไฟล์ .res ของ Windows ที่คอมไพล์แล้วที่นี่เพื่อฝังลงในเป้าหมายไบนารี

บูลีน ค่าเริ่มต้นคือ False

หากเป็น 1 ไฟล์ไบนารีที่ขึ้นกับ (โดยตรงหรือโดยอ้อม) ไลบรารี C++ นี้จะลิงก์ไฟล์ออบเจ็กต์ทั้งหมดของไฟล์ที่แสดงใน srcs แม้ว่าบางไฟล์จะไม่มีสัญลักษณ์ที่ไฟล์ไบนารีอ้างอิงก็ตาม ซึ่งมีประโยชน์ในกรณีที่โค้ดในไบนารีไม่ได้เรียกใช้โค้ดของคุณอย่างชัดเจน เช่น ในกรณีที่โค้ดลงทะเบียนเพื่อรับการเรียกกลับบางอย่างจากบริการบางอย่าง

หาก alwayslink ไม่ทำงานกับ VS 2017 ใน Windows ปัญหานี้เกิดจากปัญหาที่ทราบ โปรดอัปเกรด VS 2017 เป็นเวอร์ชันล่าสุด

copts

รายการสตริง ค่าเริ่มต้นคือ []

เพิ่มตัวเลือกเหล่านี้ลงในคำสั่งคอมไพล์ C++ ขึ้นอยู่กับการแทนที่ "Make variable" และการแยกสตริงคำสั่ง Bourne Shell

ระบบจะเพิ่มสตริงแต่ละรายการในแอตทริบิวต์นี้ตามลําดับที่ระบุลงใน COPTS ก่อนคอมไพล์เป้าหมายไบนารี Flag จะมีผลกับการคอมไพล์เป้าหมายนี้เท่านั้น ไม่ใช่กับสิ่งที่ต้องพึ่งพา ดังนั้นโปรดระมัดระวังเกี่ยวกับไฟล์ส่วนหัวที่รวมไว้ที่อื่น เส้นทางทั้งหมดควรสัมพันธ์กับพื้นที่ทํางาน ไม่ใช่กับแพ็กเกจปัจจุบัน

หากแพ็กเกจประกาศฟีเจอร์ no_copts_tokenization จะมีการแยกออกเป็นโทเค็นของ Bourne shell เฉพาะกับสตริงที่ประกอบด้วยตัวแปร "Make" รายการเดียวเท่านั้น

defines

รายการสตริง ค่าเริ่มต้นคือ []

รายการคําจํากัดความที่จะเพิ่มลงในบรรทัดการคอมไพล์ ขึ้นอยู่กับการแทนที่ตัวแปร"Make" และการแยกสตริงคำสั่ง Bourne Shell สตริงแต่ละรายการ ซึ่งต้องประกอบด้วยโทเค็น Bourne Shell รายการเดียว จะมี -D อยู่ข้างหน้าและเพิ่มลงในบรรทัดคำสั่งคอมไพล์ไปยังเป้าหมายนี้ รวมถึงกฎทั้งหมดที่ขึ้นอยู่กับเป้าหมายนี้ โปรดใช้ความระมัดระวังอย่างยิ่ง เนื่องจากการดำเนินการนี้อาจมีผลกระทบที่กว้างไกล หากไม่แน่ใจ ให้เพิ่มค่าที่กําหนดใน local_defines แทน
implementation_deps

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

รายการไลบรารีอื่นๆ ที่ไลบรารีเป้าหมายใช้อยู่ ซึ่งแตกต่างจาก deps ตรงที่ส่วนหัวและเส้นทางรวมของไลบรารีเหล่านี้ (และ Dependency แบบทรานซิทีฟทั้งหมด) จะใช้สำหรับการคอมไพล์ไลบรารีนี้เท่านั้น ไม่ใช่ไลบรารีที่ขึ้นอยู่กับไลบรารีนี้ ไลบรารีที่ระบุด้วย implementation_deps จะยังคงลิงก์อยู่ในเป้าหมายไบนารีที่ขึ้นอยู่กับไลบรารีนี้

ขณะนี้การใช้งานจะจํากัดอยู่ที่ cc_libraries และได้รับการปกป้องโดย Flag --experimental_cc_implementation_deps

include_prefix

สตริง ค่าเริ่มต้นคือ ""

คำนำหน้าที่จะเพิ่มลงในเส้นทางของส่วนหัวของกฎนี้

เมื่อตั้งค่าแล้ว ระบบจะเข้าถึงส่วนหัวในแอตทริบิวต์ hdrs ของกฎนี้ได้ โดย at คือค่าของแอตทริบิวต์นี้ที่ขึ้นต้นเส้นทางแบบสัมพัทธ์กับที่เก็บ

ระบบจะนำคำนำหน้าในแอตทริบิวต์ strip_include_prefix ออกก่อนเพิ่มคำนำหน้านี้

includes

รายการสตริง ค่าเริ่มต้นคือ []

รายการไดเรกทอรีรวมที่จะเพิ่มลงในบรรทัดคอมไพล์

ขึ้นอยู่กับการแทนที่ "Make variable" สตริงแต่ละรายการจะมี -isystem อยู่ด้านหน้าและเพิ่มลงใน COPTS ซึ่งแตกต่างจาก COPTS เนื่องจากระบบจะเพิ่ม Flag เหล่านี้สำหรับกฎนี้และกฎทุกข้อที่ขึ้นอยู่กับกฎนี้ (หมายเหตุ: ไม่ใช่กฎที่ใช้กับแอตทริบิวต์) โปรดใช้ความระมัดระวังอย่างยิ่ง เนื่องจากการดำเนินการนี้อาจมีผลที่ตามมาอย่างกว้างขวาง หากไม่แน่ใจ ให้เพิ่ม Flag "-I" ลงใน COPTS แทน

คุณต้องเพิ่มส่วนหัวลงใน srcs หรือ hdrs มิฉะนั้นกฎที่เกี่ยวข้องจะใช้ไม่ได้เมื่อการคอมไพล์อยู่ในแซนด์บ็อกซ์ (ค่าเริ่มต้น)

linkopts

รายการสตริง ค่าเริ่มต้นคือ []

เพิ่ม Flag เหล่านี้ลงในคําสั่ง linker ของ C++ ขึ้นอยู่กับการแทนที่ตัวแปร"Make", การจัดทําโทเค็นของ Bourne Shell และ การขยายป้ายกำกับ ระบบจะเพิ่มสตริงแต่ละรายการในแอตทริบิวต์นี้ลงใน LINKOPTS ก่อนลิงก์เป้าหมายไบนารี

ระบบจะถือว่าองค์ประกอบแต่ละรายการในรายการนี้ที่ไม่ได้ขึ้นต้นด้วย $ หรือ - เป็นป้ายกำกับของเป้าหมายใน deps ระบบจะเพิ่มรายการไฟล์ที่สร้างขึ้นโดยเป้าหมายนั้นต่อท้ายตัวเลือก linker ระบบจะรายงานข้อผิดพลาดหากป้ายกำกับไม่ถูกต้องหรือไม่มีการประกาศใน deps

linkstamp

ป้ายกํากับ ค่าเริ่มต้นคือ None

คอมไพล์และลิงก์ไฟล์ซอร์ส C++ ที่ระบุเป็นไบนารีสุดท้ายพร้อมกัน ต้องใช้กลโกงนี้เพื่อใส่ข้อมูลการประทับเวลาลงในไบนารี หากเราคอมไพล์ไฟล์ต้นฉบับเป็นไฟล์ออบเจ็กต์ตามปกติ การประทับเวลาจะไม่ถูกต้อง การคอมไพล์ลิงก์แสตมป์อาจไม่รวมชุด Flag คอมไพเลอร์ใดๆ โดยเฉพาะ จึงไม่ควรขึ้นอยู่กับส่วนหัว ตัวเลือกคอมไพเลอร์ หรือตัวแปรการสร้างอื่นๆ โดยเฉพาะ ตัวเลือกนี้ควรใช้ในแพ็กเกจ base เท่านั้น
linkstatic

บูลีน ค่าเริ่มต้นคือ False

สำหรับ cc_binary และ cc_test ให้ลิงก์ไบนารีในโหมดแบบคงที่ สำหรับ cc_library.linkstatic: โปรดดูด้านล่าง

โดยค่าเริ่มต้น ตัวเลือกนี้จะเปิดอยู่สําหรับ cc_binary และปิดอยู่สําหรับรายการอื่นๆ

หากเปิดใช้และนี่คือไบนารีหรือการทดสอบ ตัวเลือกนี้จะบอกเครื่องมือสร้างให้ลิงก์ .a แทน .so สำหรับไลบรารีผู้ใช้ทุกครั้งที่เป็นไปได้ ไลบรารีระบบบางรายการอาจยังคงลิงก์แบบไดนามิกอยู่เช่นเดียวกับไลบรารีที่ไม่มีไลบรารีแบบคงที่ ดังนั้นไฟล์ปฏิบัติการที่ได้จะยังคงมีการลิงก์แบบไดนามิก จึงเป็นแบบคงที่ส่วนใหญ่เท่านั้น

การลิงก์ไฟล์ปฏิบัติการทำได้ 3 วิธีดังนี้

  • STATIC ที่มีฟีเจอร์ fully_static_link ซึ่งทุกอย่างจะลิงก์แบบคงที่ เช่น "gcc -static foo.o libbar.a libbaz.a -lm"
    เปิดใช้โหมดนี้โดยระบุ fully_static_link ในแอตทริบิวต์ features
  • STATIC ซึ่งจะลิงก์ไลบรารีผู้ใช้ทั้งหมดแบบคงที่ (หากมีเวอร์ชันแบบคงที่) แต่ลิงก์ไลบรารีระบบ (ยกเว้นไลบรารีรันไทม์ C/C++) แบบไดนามิก เช่น "gcc foo.o libfoo.a libbaz.a -lm"
    โหมดนี้จะเปิดใช้โดยระบุ linkstatic=True
  • ไดนามิก ซึ่งจะลิงก์ไลบรารีทั้งหมดแบบไดนามิก (หากมีเวอร์ชันแบบไดนามิก) เช่น "gcc foo.o libfoo.so libbaz.so -lm"
    โดยเปิดใช้โหมดนี้ได้โดยระบุ linkstatic=False

แอตทริบิวต์ linkstatic มีความหมายแตกต่างกันหากใช้ในกฎ cc_library() สำหรับไลบรารี C++ linkstatic=True บ่งบอกว่าอนุญาตให้มีเฉพาะการลิงก์แบบคงที่เท่านั้น ดังนั้นระบบจะไม่สร้าง .so linkstatic=False จะไม่ป้องกันไม่ให้สร้างไลบรารีแบบคงที่ แอตทริบิวต์นี้มีไว้เพื่อควบคุมการสร้างไลบรารีแบบไดนามิก

หากเป็น linkstatic=False เครื่องมือสร้างจะสร้างสัญลักษณ์ลิงก์ไปยังไลบรารีที่ใช้ร่วมกันซึ่งต้องอาศัยในพื้นที่ *.runfiles

local_defines

รายการสตริง ค่าเริ่มต้นคือ []

รายการคําจํากัดความที่จะเพิ่มลงในบรรทัดการคอมไพล์ ขึ้นอยู่กับการแทนที่ตัวแปร"Make" และการแยกสตริงคำสั่ง Bourne Shell สตริงแต่ละรายการ ซึ่งต้องประกอบด้วยโทเค็น Bourne Shell รายการเดียว จะมี -D นำหน้าและเพิ่มลงในบรรทัดคำสั่งคอมไพล์สำหรับเป้าหมายนี้ แต่จะไม่เพิ่มลงในรายการที่เกี่ยวข้อง
nocopts

สตริง ค่าเริ่มต้นคือ ""

นำตัวเลือกที่ตรงกันออกจากคำสั่งการคอมไพล์ C++ ขึ้นอยู่กับการแทนที่ตัวแปร"Make" ระบบจะตีความค่าของแอตทริบิวต์นี้เป็นนิพจน์ทั่วไป ระบบจะนำ COPTS ที่มีอยู่ซึ่งตรงกับนิพจน์ทั่วไปนี้ (รวมถึงค่าที่ระบุไว้อย่างชัดเจนในแอตทริบิวต์ copts ของกฎ) ออกจาก COPTS เพื่อวัตถุประสงค์ในการคอมไพล์กฎนี้ คุณแทบจะไม่ต้องใช้แอตทริบิวต์นี้
strip_include_prefix

สตริง ค่าเริ่มต้นคือ ""

คำนำหน้าที่จะตัดออกจากเส้นทางของส่วนหัวของกฎนี้

เมื่อตั้งค่าแล้ว คุณจะเข้าถึงส่วนหัวในแอตทริบิวต์ hdrs ของกฎนี้ได้ที่เส้นทางโดยตัดคำนำหน้านี้ออก

หากเป็นเส้นทางแบบสัมพัทธ์ ระบบจะถือว่าเส้นทางนั้นสัมพันธ์กับแพ็กเกจ หากเป็นเส้นทางสัมบูรณ์ ระบบจะเข้าใจว่าเป็นเส้นทางสัมพัทธ์กับที่เก็บ

ระบบจะเพิ่มคำนำหน้าในแอตทริบิวต์ include_prefix หลังจากที่นำคำนำหน้านี้ออก

textual_hdrs

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

รายการไฟล์ส่วนหัวที่เผยแพร่โดยไลบรารีนี้เพื่อให้แหล่งที่มารวมไว้ในข้อความในกฎที่เกี่ยวข้อง

นี่เป็นตำแหน่งสำหรับการประกาศไฟล์ส่วนหัวที่คอมไพล์ด้วยตนเองไม่ได้ กล่าวคือ ไฟล์อื่นๆ ต้องรวมไฟล์ส่วนหัวเหล่านี้ไว้ในข้อความเสมอเพื่อสร้างโค้ดที่ถูกต้อง

win_def_file

ป้ายกํากับ ค่าเริ่มต้นคือ None

ไฟล์ DEF ของ Windows ที่ส่งไปยัง linker

คุณควรใช้แอตทริบิวต์นี้เมื่อ Windows เป็นแพลตฟอร์มเป้าหมายเท่านั้น ซึ่งสามารถใช้เพื่อ ส่งออกสัญลักษณ์ระหว่างการลิงก์ไลบรารีที่ใช้ร่วมกัน

cc_proto_library

ดูแหล่งที่มาของกฎ
cc_proto_library(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, restricted_to, tags, target_compatible_with, testonly, 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, dynamic_deps, exports_filter, shared_lib_name, tags, user_link_flags, 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 ลิงก์กับ foo แบบทรานซิทีฟ แต่ไม่ลิงก์ 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.

เหตุการณ์นี้จะเกิดขึ้นทุกครั้งที่คุณสร้างเป้าหมายที่มีcc_shared_libraryข้อกําหนด 2 ข้อที่แตกต่างกันซึ่งส่งออกเป้าหมายเดียวกัน หากต้องการแก้ไขปัญหานี้ คุณจะต้องหยุดการส่งออกไลบรารีในcc_shared_library Dependency รายการใดรายการหนึ่ง

ปัญหานี้จะเกิดขึ้นทุกครั้งที่คุณสร้าง cc_shared_library ใหม่ที่มี cc_shared_library ที่ต้องพึ่งพา 2 รายการที่แตกต่างกันซึ่งลิงก์เป้าหมายเดียวกันแบบคงที่ คล้ายกับข้อผิดพลาดในการส่งออก

วิธีหนึ่งในการแก้ไขปัญหานี้คือหยุดลิงก์ไลบรารีกับ Dependency ของ cc_shared_library ในขณะเดียวกัน บัญชีที่ยังคงลิงก์อยู่จะต้องส่งออกไลบรารีเพื่อให้บัญชีที่ไม่ได้ลิงก์ยังคงมองเห็นสัญลักษณ์ได้ อีกวิธีหนึ่งคือดึงไลบรารีที่ 3 ที่ส่งออกเป้าหมาย วิธีที่สามคือการติดแท็ก cc_library ที่เป็นปัญหาด้วย LINKABLE_MORE_THAN_ONCE แต่วิธีนี้ควรใช้น้อยครั้งและคุณควรตรวจสอบให้แน่ใจว่า cc_library นั้นปลอดภัยที่จะลิงก์มากกว่า 1 ครั้ง

'//foo:foo' is already linked statically in '//bar:bar' but not exported`

ซึ่งหมายความว่าเข้าถึงไลบรารีใน Closure แบบโอนได้ของ deps ได้โดยไม่ต้องผ่าน Dependency ของ cc_shared_library รายการใดรายการหนึ่ง แต่มีการลิงก์กับ cc_shared_library อื่นใน dynamic_deps อยู่แล้วและไม่ได้ส่งออก

วิธีแก้ปัญหาคือส่งออกจากcc_shared_library Dependency หรือดึง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 และใช้จากไดนามิก Dependency เท่านั้น หรือตรวจสอบว่า exports_filter ไม่ได้จับเป้าหมายนี้

อาร์กิวเมนต์

Attributes
name

ชื่อ ต้องระบุ

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

deps

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

ไลบรารีระดับบนสุดที่จะลิงก์แบบคงที่กับไลบรารีที่ใช้ร่วมกันโดยไม่มีเงื่อนไขหลังจากได้รับการเก็บถาวร

ระบบจะลิงก์ไลบรารีที่ขึ้นต่อกันแบบทรานซิทีฟของไลบรารีที่ขึ้นต่อกันโดยตรงเหล่านี้ไปยังคลังที่ใช้ร่วมกันนี้ ตราบใดที่ยังไม่ได้ลิงก์โดย cc_shared_library ใน dynamic_deps

ในระหว่างการวิเคราะห์ การใช้งานกฎจะถือว่าเป้าหมายที่แสดงใน deps ได้รับการส่งออกโดยไลบรารีที่แชร์เพื่อให้ข้อผิดพลาดเมื่อ deps หลายรายการส่งออกเป้าหมายเดียวกันcc_shared_libraries การใช้กฎไม่ได้มีหน้าที่แจ้งให้ linker ทราบว่าออบเจ็กต์ที่แชร์ควรส่งออกสัญลักษณ์ใด ผู้ใช้ควรจัดการเรื่องนี้ผ่านสคริปต์ linker หรือการประกาศระดับการเข้าถึงในซอร์สโค้ด

การใช้งานจะทริกเกอร์ข้อผิดพลาดทุกครั้งที่ลิงก์ไลบรารีเดียวกันแบบคงที่ไปยัง cc_shared_library มากกว่า 1 รายการ ปัญหานี้สามารถหลีกเลี่ยงได้โดยการเพิ่ม "LINKABLE_MORE_THAN_ONCE" ลงใน cc_library.tags หรือระบุ `cc_library` เป็นการนําส่งของไลบรารีที่ใช้ร่วมกันรายการใดรายการหนึ่งเพื่อให้ทําให้รายการหนึ่งเป็น dynamic_dep ของอีกรายการหนึ่งได้

additional_linker_inputs

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

ไฟล์เพิ่มเติมที่คุณอาจต้องการส่งไปยัง linker เช่น สคริปต์ linker คุณต้องส่ง Flag ของ linker แยกต่างหากเพื่อให้ linker รับรู้ถึงไฟล์นี้ ซึ่งทำได้ผ่านแอตทริบิวต์ user_link_flags
dynamic_deps

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

รายการเหล่านี้คือ cc_shared_library อื่นๆ ที่เป้าหมายปัจจุบันพึ่งพา

การติดตั้งใช้งาน cc_shared_library จะใช้รายการ dynamic_deps (แบบสื่อกลาง กล่าวคือ dynamic_deps ของ dynamic_deps เป้าหมายปัจจุบัน) เพื่อตัดสินใจว่า cc_libraries ใดใน deps แบบสื่อกลางไม่ควรลิงก์เนื่องจากมี cc_shared_library อื่นระบุไว้แล้ว

exports_filter

รายการสตริง ค่าเริ่มต้นคือ []

แอตทริบิวต์นี้มีรายการเป้าหมายที่อ้างว่าส่งออกโดยคลังที่ใช้ร่วมกันปัจจุบัน

ระบบเข้าใจว่าไลบรารีที่ใช้ร่วมกันส่งออกเป้าหมาย deps อยู่แล้ว คุณควรใช้แอตทริบิวต์นี้เพื่อแสดงรายการเป้าหมายที่ส่งออกโดยไลบรารีที่ใช้ร่วมกันแต่มีความเกี่ยวข้องแบบเปลี่ยนผ่านของ deps

โปรดทราบว่าแอตทริบิวต์นี้ไม่ได้เพิ่มขอบความเกี่ยวข้องไปยังเป้าหมายเหล่านั้น deps ควรสร้างขอบความเกี่ยวข้องแทน รายการในแอตทริบิวต์นี้เป็นเพียงสตริง โปรดทราบว่าการวางเป้าหมายในแอตทริบิวต์นี้ถือเป็นการอ้างสิทธิ์ว่าไลบรารีที่แชร์จะส่งออกสัญลักษณ์จากเป้าหมายนั้น ตรรกะ cc_shared_library ไม่ได้จัดการกับการบอก linker ว่าควรส่งออกสัญลักษณ์ใด

ไวยากรณ์ที่อนุญาตมีดังนี้

//foo:__package__ เพื่อพิจารณาเป้าหมายใน foo/BUILD

//foo:__subpackages__ เพื่อพิจารณาเป้าหมายใน foo/BUILD หรือแพ็กเกจอื่นๆ ใต้ foo/ เช่น foo/bar/BUILD

shared_lib_name

สตริง ค่าเริ่มต้นคือ ""

โดยค่าเริ่มต้น cc_shared_library จะใช้ชื่อสำหรับไฟล์เอาต์พุตของไลบรารีที่แชร์โดยอิงตามชื่อของเป้าหมายและแพลตฟอร์ม ซึ่งรวมถึงนามสกุลและบางครั้งก็มีคำนำหน้า บางครั้งคุณอาจไม่ต้องการชื่อเริ่มต้น เช่น เมื่อโหลดไลบรารีที่แชร์ C++ สำหรับ Python ผู้ใช้มักไม่ต้องการคำนำหน้า lib* เริ่มต้น ในกรณีนี้ คุณสามารถใช้แอตทริบิวต์นี้เพื่อเลือกชื่อที่กำหนดเอง

รายการสตริง ค่าเริ่มต้นคือ []

แฟล็กเพิ่มเติมที่คุณต้องการส่งไปยังโปรแกรมลิงก์ ตัวอย่างเช่น หากต้องการให้ Linker รับรู้สคริปต์ Linker ที่ส่งผ่าน additional_linker_inputs คุณสามารถใช้สิ่งต่อไปนี้
         cc_shared_library(
            name = "foo_shared",
            additional_linker_inputs = select({
              "//src/conditions:linux": [
                ":foo.lds",
                ":additional_script.txt",
              ],
              "//conditions:default": []}),
            user_link_flags = select({
              "//src/conditions:linux": [
                "-Wl,-rpath,kittens",
                "-Wl,--version-script=$(location :foo.lds)",
                "-Wl,--script=$(location :additional_script.txt)",
              ],
              "//conditions:default": []}),
              ...
         )
        
win_def_file

ป้ายกํากับ ค่าเริ่มต้นคือ None

ไฟล์ DEF ของ Windows ที่ส่งไปยัง linker

คุณควรใช้แอตทริบิวต์นี้เมื่อ Windows เป็นแพลตฟอร์มเป้าหมายเท่านั้น ซึ่งสามารถใช้เพื่อ ส่งออกสัญลักษณ์ระหว่างการลิงก์ไลบรารีที่ใช้ร่วมกัน

fdo_prefetch_hints

ดูแหล่งที่มาของกฎ
fdo_prefetch_hints(name, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)

แสดงโปรไฟล์คำแนะนำการเรียกข้อมูลล่วงหน้าของ FDO ที่อยู่ในเวิร์กスペースหรือที่เส้นทางสัมบูรณ์ที่ระบุ ตัวอย่าง

fdo_prefetch_hints(
    name = "hints",
    profile = "//path/to/hints:profile.afdo",
)

fdo_profile(
  name = "hints_abs",
  absolute_path_profile = "/absolute/path/profile.afdo",
)

อาร์กิวเมนต์

Attributes
name

ชื่อ ต้องระบุ

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

profile

ป้ายกํากับ ค่าเริ่มต้นคือ None

ป้ายกำกับของโปรไฟล์คำแนะนำ ไฟล์คำแนะนำจะมีนามสกุล .afdo และยังชี้ไปยังกฎ fdo_absolute_path_profile ได้ด้วย

fdo_profile

ดูแหล่งที่มาของกฎ
fdo_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, visibility)

แสดงโปรไฟล์ FDO ที่อยู่ในเวิร์กスペースหรือที่เส้นทางสัมบูรณ์ที่ระบุ ตัวอย่าง

fdo_profile(
    name = "fdo",
    profile = "//path/to/fdo:profile.zip",
)

fdo_profile(
  name = "fdo_abs",
  absolute_path_profile = "/absolute/path/profile.zip",
)

อาร์กิวเมนต์

Attributes
name

ชื่อ ต้องระบุ

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

absolute_path_profile

สตริง ค่าเริ่มต้นคือ ""

เส้นทางสัมบูรณ์ไปยังโปรไฟล์ FDO ไฟล์ FDO อาจมีนามสกุลอย่างใดอย่างหนึ่งต่อไปนี้ .profraw สำหรับโปรไฟล์ LLVM ที่ไม่ได้จัดทําดัชนี .profdata สําหรับโปรไฟล์ LLVM ที่จัดทําดัชนี .zip ที่มีโปรไฟล์ LLVM profraw หรือ .afdo สําหรับโปรไฟล์ AutoFDO
profile

ป้ายกํากับ ค่าเริ่มต้นคือ None

ป้ายกํากับของโปรไฟล์ FDO หรือกฎที่สร้างโปรไฟล์ ไฟล์ FDO อาจมีนามสกุลอย่างใดอย่างหนึ่งต่อไปนี้ .profraw สำหรับโปรไฟล์ LLVM ที่ไม่ได้จัดทําดัชนี .profdata สําหรับโปรไฟล์ LLVM ที่จัดทําดัชนี .zip ที่มีโปรไฟล์ LLVM profraw .afdo สําหรับโปรไฟล์ AutoFDO .xfdo สําหรับโปรไฟล์ XBinary นอกจากนี้ ป้ายกำกับยังชี้ไปยังกฎ fdo_absolute_path_profile ได้ด้วย
proto_profile

ป้ายกํากับ ค่าเริ่มต้นคือ None

ป้ายกำกับของโปรไฟล์ protobuf

memprof_profile

ดูแหล่งที่มาของกฎ
memprof_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)

แสดงโปรไฟล์ MEMPROF ที่อยู่ในพื้นที่ทํางานหรือที่เส้นทางสัมบูรณ์ที่ระบุ ตัวอย่าง

memprof_profile(
    name = "memprof",
    profile = "//path/to/memprof:profile.afdo",
)

memprof_profile(
  name = "memprof_abs",
  absolute_path_profile = "/absolute/path/profile.afdo",
)

อาร์กิวเมนต์

Attributes
name

ชื่อ ต้องระบุ

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

absolute_path_profile

สตริง ค่าเริ่มต้นคือ ""

เส้นทางสัมบูรณ์ไปยังโปรไฟล์ MEMPROF ไฟล์ต้องมีนามสกุลเป็น .profdata หรือ .zip เท่านั้น (โดยไฟล์ ZIP ต้องมีไฟล์ memprof.profdata)
profile

ป้ายกํากับ ค่าเริ่มต้นคือ None

ป้ายกำกับของโปรไฟล์ MEMPROF โปรไฟล์ควรมีนามสกุล .profdata (สําหรับโปรไฟล์ memprof ที่จัดทำดัชนี/สัญลักษณ์) หรือนามสกุล .zip สําหรับไฟล์ ZIP ที่มีไฟล์ memprof.profdata นอกจากนี้ ป้ายกำกับยังชี้ไปยังกฎ fdo_absolute_path_profile ได้ด้วย

propeller_optimize

ดูแหล่งที่มาของกฎ
propeller_optimize(name, compatible_with, deprecation, distribs, features, ld_profile, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

แสดงโปรไฟล์การเพิ่มประสิทธิภาพ Propeller ในเวิร์กสเปซ ตัวอย่าง

propeller_optimize(
    name = "layout",
    cc_profile = "//path:cc_profile.txt",
    ld_profile = "//path:ld_profile.txt"
)

propeller_optimize(
    name = "layout_absolute",
    absolute_cc_profile = "/absolute/cc_profile.txt",
    absolute_ld_profile = "/absolute/ld_profile.txt"
)

อาร์กิวเมนต์

Attributes
name

ชื่อ ต้องระบุ

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

ld_profile

ป้ายกํากับ ค่าเริ่มต้นคือ None

ป้ายกํากับของโปรไฟล์ที่ส่งไปยังการดําเนินการลิงก์ ไฟล์นี้มีนามสกุล .txt

cc_test

ดูแหล่งที่มาของกฎ
cc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, includes, licenses, link_extra_lib, linkopts, linkstatic, local, local_defines, malloc, nocopts, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)

อาร์กิวเมนต์

Attributes
name

ชื่อ ต้องระบุ

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

deps

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

รายการไลบรารีอื่นๆ ที่จะลิงก์กับเป้าหมายไบนารี

ซึ่งอาจเป็นเป้าหมาย cc_library หรือ objc_libraryก็ได้

srcs

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

รายการไฟล์ C และ C++ ที่ประมวลผลเพื่อสร้างเป้าหมาย ไฟล์เหล่านี้คือไฟล์ซอร์สโค้ดและไฟล์ส่วนหัว C/C++ ที่ไม่ได้สร้าง (ซอร์สโค้ดปกติ) หรือที่สร้าง

ระบบจะคอมไพล์ไฟล์ .cc, .c และ .cpp ทั้งหมด ไฟล์เหล่านี้อาจเป็นไฟล์ที่สร้างขึ้น หากไฟล์ที่มีชื่ออยู่ใน outs ของกฎอื่น กฎนี้จะขึ้นอยู่กับกฎอื่นนั้นโดยอัตโนมัติ

ระบบจะไม่คอมไพล์ไฟล์ .h แต่แหล่งที่มาจะรวมไฟล์ดังกล่าวได้ภายใต้กฎนี้ ทั้งไฟล์ .cc และ .h สามารถใส่ส่วนหัวที่ระบุไว้ใน srcs เหล่านี้หรือใน hdrs ของกฎที่ระบุไว้ในอาร์กิวเมนต์ deps ได้โดยตรง

คุณต้องพูดถึงไฟล์ #included ทั้งหมดในแอตทริบิวต์ srcs ของกฎนี้ หรือในแอตทริบิวต์ hdrs ของ cc_library() ที่อ้างอิง รูปแบบที่แนะนำคือให้ส่วนหัวที่เชื่อมโยงกับคลังแสดงอยู่ในแอตทริบิวต์ hdrs ของคลังนั้น ส่วนหัวที่เหลือซึ่งเชื่อมโยงกับแหล่งที่มาของกฎนี้จะแสดงอยู่ใน srcs ดูคำอธิบายโดยละเอียดได้ที่"การตรวจสอบการรวมส่วนหัว"

หากชื่อของกฎอยู่ใน srcs กฎนี้จะขึ้นอยู่กับกฎนั้นโดยอัตโนมัติ หาก outs ของกฎที่มีชื่อเป็นไฟล์ซอร์สโค้ด C หรือ C++ ระบบจะคอมไพล์ไฟล์เหล่านั้นเป็นกฎนี้ หากเป็นไฟล์ไลบรารี ระบบจะลิงก์ไฟล์เหล่านั้น

ประเภทไฟล์ srcs ที่อนุญาต

  • ไฟล์ซอร์สโค้ด C และ C++: .c, .cc, .cpp, .cxx, .c++, .C
  • ไฟล์ส่วนหัว C และ C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Assembler ที่มี C preprocessor: .S
  • เก็บ: .a, .pic.a
  • คลัง "ลิงก์เสมอ": .lo, .pic.lo
  • ไลบรารีที่ใช้ร่วมกันซึ่งมีเวอร์ชันหรือไม่มีเวอร์ชัน: .so, .so.version
  • ไฟล์ออบเจ็กต์: .o, .pic.o

...และกฎที่สร้างไฟล์เหล่านั้น ส่วนขยายต่างๆ จะแสดงถึงภาษาโปรแกรมที่แตกต่างกันตามแบบแผนของ gcc

additional_linker_inputs

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

ส่งไฟล์เหล่านี้ไปยังคําสั่ง linker ของ C++

เช่น คุณสามารถระบุไฟล์ .res ของ Windows ที่คอมไพล์แล้วที่นี่เพื่อฝังลงในเป้าหมายไบนารี

copts

รายการสตริง ค่าเริ่มต้นคือ []

เพิ่มตัวเลือกเหล่านี้ลงในคำสั่งคอมไพล์ C++ ขึ้นอยู่กับการแทนที่ "Make variable" และการแยกสตริงคำสั่ง Bourne Shell

ระบบจะเพิ่มสตริงแต่ละรายการในแอตทริบิวต์นี้ตามลําดับที่ระบุลงใน COPTS ก่อนคอมไพล์เป้าหมายไบนารี Flag จะมีผลกับการคอมไพล์เป้าหมายนี้เท่านั้น ไม่ใช่กับสิ่งที่ต้องพึ่งพา ดังนั้นโปรดระมัดระวังเกี่ยวกับไฟล์ส่วนหัวที่รวมไว้ที่อื่น เส้นทางทั้งหมดควรสัมพันธ์กับพื้นที่ทํางาน ไม่ใช่กับแพ็กเกจปัจจุบัน

หากแพ็กเกจประกาศฟีเจอร์ no_copts_tokenization จะมีการแยกออกเป็นโทเค็นของ Bourne shell เฉพาะกับสตริงที่ประกอบด้วยตัวแปร "Make" รายการเดียวเท่านั้น

defines

รายการสตริง ค่าเริ่มต้นคือ []

รายการคําจํากัดความที่จะเพิ่มลงในบรรทัดการคอมไพล์ ขึ้นอยู่กับการแทนที่ตัวแปร"Make" และการแยกสตริงคำสั่ง Bourne Shell สตริงแต่ละรายการ ซึ่งต้องประกอบด้วยโทเค็น Bourne Shell รายการเดียว จะมี -D อยู่ข้างหน้าและเพิ่มลงในบรรทัดคำสั่งคอมไพล์ไปยังเป้าหมายนี้ รวมถึงกฎทั้งหมดที่ขึ้นอยู่กับเป้าหมายนี้ โปรดใช้ความระมัดระวังอย่างยิ่ง เนื่องจากการดำเนินการนี้อาจมีผลกระทบที่กว้างไกล หากไม่แน่ใจ ให้เพิ่มค่าที่กําหนดใน local_defines แทน
includes

รายการสตริง ค่าเริ่มต้นคือ []

รายการไดเรกทอรีรวมที่จะเพิ่มลงในบรรทัดคอมไพล์

ขึ้นอยู่กับการแทนที่ "Make variable" สตริงแต่ละรายการจะมี -isystem อยู่ด้านหน้าและเพิ่มลงใน COPTS ซึ่งแตกต่างจาก COPTS เนื่องจากระบบจะเพิ่ม Flag เหล่านี้สำหรับกฎนี้และกฎทุกข้อที่ขึ้นอยู่กับกฎนี้ (หมายเหตุ: ไม่ใช่กฎที่ใช้กับแอตทริบิวต์) โปรดใช้ความระมัดระวังอย่างยิ่ง เนื่องจากการดำเนินการนี้อาจมีผลที่ตามมาอย่างกว้างขวาง หากไม่แน่ใจ ให้เพิ่ม Flag "-I" ลงใน COPTS แทน

คุณต้องเพิ่มส่วนหัวลงใน srcs หรือ hdrs มิฉะนั้นกฎที่เกี่ยวข้องจะใช้ไม่ได้เมื่อการคอมไพล์อยู่ในแซนด์บ็อกซ์ (ค่าเริ่มต้น)

ป้ายกํากับ ค่าเริ่มต้นคือ "@bazel_tools//tools/cpp:link_extra_lib"

ควบคุมการลิงก์ไลบรารีเพิ่มเติม

โดยค่าเริ่มต้น ระบบจะลิงก์ไบนารี C++ กับ //tools/cpp:link_extra_lib ซึ่งโดยค่าเริ่มต้นจะขึ้นอยู่กับ Flag ป้ายกำกับ //tools/cpp:link_extra_libs หากไม่ได้ตั้งค่า Flag ห้องสมุดนี้จะว่างเปล่าโดยค่าเริ่มต้น การตั้งค่า Flag ป้ายกำกับจะอนุญาตให้ลิงก์ไลบรารี 3rd party ที่ไม่บังคับ เช่น การลบล้างสำหรับสัญลักษณ์ที่ลบล้างได้ อินเตอร์เซปเตอร์สำหรับฟังก์ชันในคลังที่ใช้ร่วมกัน หรือไลบรารีรันไทม์พิเศษ (สำหรับรายการที่แทนที่ malloc โปรดใช้ malloc หรือ --custom_malloc) การตั้งค่าแอตทริบิวต์นี้เป็น None จะปิดใช้ลักษณะการทำงานนี้

linkopts

รายการสตริง ค่าเริ่มต้นคือ []

เพิ่ม Flag เหล่านี้ลงในคําสั่ง linker ของ C++ ขึ้นอยู่กับการแทนที่ตัวแปร"Make", การจัดทําโทเค็นของ Bourne Shell และ การขยายป้ายกำกับ ระบบจะเพิ่มสตริงแต่ละรายการในแอตทริบิวต์นี้ลงใน LINKOPTS ก่อนลิงก์เป้าหมายไบนารี

ระบบจะถือว่าองค์ประกอบแต่ละรายการในรายการนี้ที่ไม่ได้ขึ้นต้นด้วย $ หรือ - เป็นป้ายกำกับของเป้าหมายใน deps ระบบจะเพิ่มรายการไฟล์ที่สร้างขึ้นโดยเป้าหมายนั้นต่อท้ายตัวเลือก linker ระบบจะรายงานข้อผิดพลาดหากป้ายกำกับไม่ถูกต้องหรือไม่มีการประกาศใน deps

linkstatic

บูลีน ค่าเริ่มต้นคือ False

สำหรับ cc_binary และ cc_test ให้ลิงก์ไบนารีในโหมดแบบคงที่ สำหรับ cc_library.linkstatic: โปรดดูด้านล่าง

โดยค่าเริ่มต้น ตัวเลือกนี้จะเปิดอยู่สําหรับ cc_binary และปิดอยู่สําหรับรายการอื่นๆ

หากเปิดใช้และนี่คือไบนารีหรือการทดสอบ ตัวเลือกนี้จะบอกเครื่องมือสร้างให้ลิงก์ .a แทน .so สำหรับไลบรารีผู้ใช้ทุกครั้งที่เป็นไปได้ ไลบรารีระบบบางรายการอาจยังคงลิงก์แบบไดนามิกอยู่เช่นเดียวกับไลบรารีที่ไม่มีไลบรารีแบบคงที่ ดังนั้นไฟล์ปฏิบัติการที่ได้จะยังคงมีการลิงก์แบบไดนามิก จึงเป็นแบบคงที่ส่วนใหญ่เท่านั้น

การลิงก์ไฟล์ปฏิบัติการทำได้ 3 วิธีดังนี้

  • STATIC ที่มีฟีเจอร์ fully_static_link ซึ่งทุกอย่างจะลิงก์แบบคงที่ เช่น "gcc -static foo.o libbar.a libbaz.a -lm"
    เปิดใช้โหมดนี้โดยระบุ fully_static_link ในแอตทริบิวต์ features
  • STATIC ซึ่งจะลิงก์ไลบรารีผู้ใช้ทั้งหมดแบบคงที่ (หากมีเวอร์ชันแบบคงที่) แต่ลิงก์ไลบรารีระบบ (ยกเว้นไลบรารีรันไทม์ C/C++) แบบไดนามิก เช่น "gcc foo.o libfoo.a libbaz.a -lm"
    โหมดนี้จะเปิดใช้โดยระบุ linkstatic=True
  • ไดนามิก ซึ่งจะลิงก์ไลบรารีทั้งหมดแบบไดนามิก (หากมีเวอร์ชันแบบไดนามิก) เช่น "gcc foo.o libfoo.so libbaz.so -lm"
    โดยเปิดใช้โหมดนี้ได้โดยระบุ linkstatic=False

แอตทริบิวต์ linkstatic มีความหมายแตกต่างกันหากใช้ในกฎ cc_library() สำหรับไลบรารี C++ linkstatic=True บ่งบอกว่าอนุญาตให้มีเฉพาะการลิงก์แบบคงที่เท่านั้น ดังนั้นระบบจะไม่สร้าง .so linkstatic=False จะไม่ป้องกันไม่ให้สร้างไลบรารีแบบคงที่ แอตทริบิวต์นี้มีไว้เพื่อควบคุมการสร้างไลบรารีแบบไดนามิก

หากเป็น linkstatic=False เครื่องมือสร้างจะสร้างสัญลักษณ์ลิงก์ไปยังไลบรารีที่ใช้ร่วมกันซึ่งต้องอาศัยในพื้นที่ *.runfiles

local_defines

รายการสตริง ค่าเริ่มต้นคือ []

รายการคําจํากัดความที่จะเพิ่มลงในบรรทัดการคอมไพล์ ขึ้นอยู่กับการแทนที่ตัวแปร"Make" และการแยกสตริงคำสั่ง Bourne Shell สตริงแต่ละรายการ ซึ่งต้องประกอบด้วยโทเค็น Bourne Shell รายการเดียว จะมี -D นำหน้าและเพิ่มลงในบรรทัดคำสั่งคอมไพล์สำหรับเป้าหมายนี้ แต่จะไม่เพิ่มลงในรายการที่เกี่ยวข้อง
malloc

ป้ายกํากับ ค่าเริ่มต้นคือ "@bazel_tools//tools/cpp:malloc"

ลบล้างการพึ่งพาเริ่มต้นใน malloc

โดยค่าเริ่มต้น ระบบจะลิงก์ไบนารี C++ กับ //tools/cpp:malloc ซึ่งเป็นไลบรารีว่างเปล่าเพื่อให้ไบนารีใช้ libc malloc ป้ายกำกับนี้ต้องอ้างอิงถึง cc_library หากการคอมไพล์มีไว้สำหรับกฎที่ไม่ใช่ C++ ตัวเลือกนี้จะไม่มีผล ระบบจะละเว้นค่าของแอตทริบิวต์นี้หากระบุ linkshared=True

nocopts

สตริง ค่าเริ่มต้นคือ ""

นำตัวเลือกที่ตรงกันออกจากคำสั่งการคอมไพล์ C++ ขึ้นอยู่กับการแทนที่ตัวแปร"Make" ระบบจะตีความค่าของแอตทริบิวต์นี้เป็นนิพจน์ทั่วไป ระบบจะนำ COPTS ที่มีอยู่ซึ่งตรงกับนิพจน์ทั่วไปนี้ (รวมถึงค่าที่ระบุไว้อย่างชัดเจนในแอตทริบิวต์ copts ของกฎ) ออกจาก COPTS เพื่อวัตถุประสงค์ในการคอมไพล์กฎนี้ คุณแทบจะไม่ต้องใช้แอตทริบิวต์นี้
stamp

จํานวนเต็ม ค่าเริ่มต้นคือ 0

ว่าจะเข้ารหัสข้อมูลบิลด์ลงในไบนารีหรือไม่ ค่าที่เป็นไปได้มีดังนี้
  • stamp = 1: ประทับข้อมูลบิลด์ลงในไบนารีเสมอ แม้ในบิลด์ --nostamp ก็ตาม คุณควรหลีกเลี่ยงการตั้งค่านี้ เนื่องจากอาจทำให้แคชระยะไกลสําหรับไบนารีและการดำเนินการดาวน์สตรีมใดๆ ที่ขึ้นอยู่กับแคชนั้นใช้งานไม่ได้
  • stamp = 0: แทนที่ข้อมูลบิลด์ด้วยค่าคงที่เสมอ ซึ่งจะแคชผลลัพธ์การสร้างที่ดี
  • stamp = -1: การฝังข้อมูลบิลด์จะควบคุมโดย Flag --[no]stamp

ระบบจะไม่สร้างไฟล์ไบนารีที่มีตราประทับอีกครั้ง เว้นแต่จะมีการเปลี่ยนแปลงทรัพยากร Dependency

win_def_file

ป้ายกํากับ ค่าเริ่มต้นคือ None

ไฟล์ DEF ของ Windows ที่ส่งไปยัง linker

คุณควรใช้แอตทริบิวต์นี้เมื่อ 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_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, visibility)

แสดงถึงเครื่องมือทางเทคนิค C++

กฎนี้มีหน้าที่ดังนี้

  • รวบรวมอาร์ติแฟกต์ทั้งหมดที่จําเป็นสําหรับการดําเนินการ C++ ซึ่งทำได้โดยใช้แอตทริบิวต์ เช่น all_files, compiler_files, linker_files หรือแอตทริบิวต์อื่นๆ ที่ลงท้ายด้วย _files) ซึ่งโดยปกติแล้วจะเป็นกลุ่มไฟล์ที่รวมไฟล์ที่จำเป็นทั้งหมด
  • การสร้างบรรทัดคำสั่งที่ถูกต้องสําหรับการดำเนินการ C++ ซึ่งทำได้โดยใช้ผู้ให้บริการ CcToolchainConfigInfo (ดูรายละเอียดด้านล่าง)

ใช้แอตทริบิวต์ toolchain_config เพื่อกำหนดค่าชุดเครื่องมือ C++ ดูเอกสารประกอบเกี่ยวกับการกำหนดค่าและการเลือกเครื่องมือชุด C++ ที่ละเอียดได้ที่นี่ หน้านี้

ใช้ tags = ["manual"] เพื่อป้องกันไม่ให้ระบบสร้างและกำหนดค่าเครื่องมือทางเทคนิคโดยไม่จำเป็นเมื่อเรียกใช้ bazel build //...

อาร์กิวเมนต์

Attributes
name

ชื่อ ต้องระบุ

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

all_files

ป้ายกำกับ (ต้องระบุ)

การเก็บรวบรวมอาร์ติแฟกต์ cc_toolchain ทั้งหมด ระบบจะเพิ่มรายการต่างๆ เหล่านี้เป็นอินพุตสําหรับการดําเนินการทั้งหมดที่เกี่ยวข้องกับ rules_cc (ยกเว้นการดําเนินการที่ใช้ชุดรายการที่แม่นยํากว่าจากแอตทริบิวต์ด้านล่าง) Bazel จะถือว่า all_files เป็นเซตที่ใหญ่กว่าของแอตทริบิวต์อื่นๆ ทั้งหมดที่ให้อาร์ติแฟกต์ (เช่น การคอมไพล์ลิงก์สแตมป์ต้องใช้ทั้งการคอมไพล์และลิงก์ไฟล์ จึงต้องใช้ all_files)

cc_toolchain.files มีข้อมูลนี้อยู่ และกฎ Starlark ทั้งหมดที่ใช้ชุดเครื่องมือ C++ จะใช้ข้อมูลนี้

ar_files

ป้ายกํากับ ค่าเริ่มต้นคือ None

การเก็บรวบรวมอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จําเป็นสําหรับการดําเนินการของการเก็บถาวร

as_files

ป้ายกํากับ ค่าเริ่มต้นคือ None

การเก็บรวบรวมอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จําเป็นสําหรับการดําเนินการประกอบ

compiler_files

ป้ายกำกับ (ต้องระบุ)

การเก็บรวบรวมอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จำเป็นสำหรับการดำเนินการคอมไพล์
compiler_files_without_includes

ป้ายกํากับ ค่าเริ่มต้นคือ None

การเก็บรวบรวมอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จําเป็นสําหรับการดําเนินการคอมไพล์ในกรณีที่รองรับการค้นพบอินพุต (ปัจจุบันรองรับเฉพาะ Google)
coverage_files

ป้ายกํากับ ค่าเริ่มต้นคือ None

การเก็บรวบรวมอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จําเป็นสําหรับการดําเนินการเกี่ยวกับความครอบคลุม หากไม่ได้ระบุ ระบบจะใช้ all_files
dwp_files

ป้ายกำกับ (ต้องระบุ)

การเก็บรวบรวมอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จําเป็นสําหรับการดำเนินการ dwp
dynamic_runtime_lib

ป้ายกํากับ ค่าเริ่มต้นคือ None

อาร์ติแฟกต์ไลบรารีแบบไดนามิกสำหรับไลบรารีรันไทม์ C++ (เช่น libstdc++.so)

ตัวเลือกนี้จะใช้งานได้เมื่อเปิดใช้ฟีเจอร์ "static_link_cpp_runtimes" และเรากำลังลิงก์ข้อกําหนดอย่างไดนามิก

exec_transition_for_inputs

บูลีน ค่าเริ่มต้นคือ True

ตั้งค่าเป็น "จริง" เพื่อสร้างอินพุตไฟล์ทั้งหมดไปยัง cc_toolchain สำหรับแพลตฟอร์ม exec แทนที่จะไม่มีการเปลี่ยน (เช่น แพลตฟอร์มเป้าหมายโดยค่าเริ่มต้น)
libc_top

ป้ายกํากับ ค่าเริ่มต้นคือ None

คอลเล็กชันอาร์ติแฟกต์สำหรับ libc ที่ส่งเป็นอินพุตไปยังการดำเนินการคอมไพล์/การลิงก์
linker_files

ป้ายกำกับ (ต้องระบุ)

การเก็บรวบรวมอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จําเป็นสําหรับการลิงก์การดําเนินการ
module_map

ป้ายกํากับ ค่าเริ่มต้นคือ None

อาร์ติแฟกต์แผนที่โมดูลที่จะใช้สำหรับบิลด์แบบโมดูล
objcopy_files

ป้ายกำกับ (ต้องระบุ)

การเก็บรวบรวมอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จําเป็นสําหรับการดําเนินการ objcopy
static_runtime_lib

ป้ายกํากับ ค่าเริ่มต้นคือ None

อาร์ติแฟกต์ไลบรารีแบบคงที่สำหรับไลบรารีรันไทม์ C++ (เช่น libstdc++.a)

ตัวเลือกนี้จะใช้ได้เมื่อเปิดใช้ฟีเจอร์ "static_link_cpp_runtimes" และเราลิงก์ข้อกําหนดแบบคงที่

strip_files

ป้ายกำกับ (ต้องระบุ)

การเก็บรวบรวมอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จําเป็นสําหรับการดำเนินการ Strip
supports_header_parsing

บูลีน ค่าเริ่มต้นคือ False

ตั้งค่าเป็น "จริง" เมื่อ cc_toolchain รองรับการดำเนินการแยกวิเคราะห์ส่วนหัว
supports_param_files

บูลีน ค่าเริ่มต้นคือ True

ตั้งค่าเป็น "จริง" เมื่อ cc_toolchain รองรับการใช้ไฟล์ param สำหรับการลิงก์การดำเนินการ
toolchain_config

ป้ายกำกับ (ต้องระบุ)

ป้ายกำกับของกฎที่ให้ cc_toolchain_config_info
toolchain_identifier

สตริง ไม่สามารถกําหนดค่าได้ ค่าเริ่มต้นคือ ""

ตัวระบุที่ใช้จับคู่ cc_toolchain นี้กับ crosstool_config.toolchain ที่เกี่ยวข้อง

ในระหว่างที่รอแก้ไขปัญหา #5380 เราขอแนะนําให้ใช้วิธีนี้ในการเชื่อมโยง cc_toolchain กับ CROSSTOOL.toolchain ระบบจะแทนที่ด้วยแอตทริบิวต์ toolchain_config (#5380)

cc_toolchain_suite

ดูแหล่งที่มาของกฎ
cc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

แสดงถึงคอลเล็กชันเครื่องมือทางเทคนิค C++

กฎนี้มีหน้าที่ดังนี้

  • รวบรวมเครื่องมือทางเทคนิค C++ ที่เกี่ยวข้องทั้งหมด
  • การเลือก Toolchain 1 รายการตามตัวเลือก --cpu และ --compiler ที่ส่งไปยัง Bazel

ดูเอกสารประกอบเกี่ยวกับการกำหนดค่าและการเลือกเครื่องมือชุด C++ ที่ละเอียดได้ที่นี่ หน้านี้

อาร์กิวเมนต์

Attributes
name

ชื่อ ต้องระบุ

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

toolchains

พจนานุกรมที่แมปสตริงกับป้ายกํากับ ไม่สามารถกําหนดค่าได้ ต้องระบุ

การแมปสตริง "<cpu>" หรือ "<cpu>|<compiler>" กับป้ายกำกับ cc_toolchain ระบบจะใช้ "<cpu>" เมื่อส่งเฉพาะ --cpu ไปยัง Bazel และจะใช้ "<cpu>|<compiler>" เมื่อส่งทั้ง --cpu และ --compiler ไปยัง Bazel ตัวอย่าง

          cc_toolchain_suite(
            name = "toolchain",
            toolchains = {
              "piii|gcc": ":my_cc_toolchain_for_piii_using_gcc",
              "piii": ":my_cc_toolchain_for_piii_using_default_compiler",
            },
          )