กฎทั่วไป

รายงานปัญหา ดูแหล่งที่มา

กฎ

ชื่อแทน

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

กฎ alias สร้างชื่ออีกกฎหนึ่งที่อ้างอิงถึงได้

ชื่อแทนเหมาะสําหรับเป้าหมาย "ปกติ" เท่านั้น โดยเฉพาะอย่างยิ่ง package_group และ test_suite จะเป็นชื่อแทนไม่ได้

ซึ่งกฎจะมีชื่อแทนเป็นของตัวเอง ในกรณีอื่นๆ กฎทั้งหมดจะทํางานเหมือนกฎที่อ้างอิง (เช่น ไม่ได้ทดสอบเฉพาะชื่อแทน แต่จะใช้กฎการทดสอบเท่านั้นที่จะใช้การอ้างอิงแทน) โดยมีข้อยกเว้นเล็กๆ น้อยๆ ต่อไปนี้

  • ระบบจะไม่ดําเนินการทดสอบ หากมีการพูดถึงชื่อแทนในบรรทัดคําสั่ง หากต้องการกําหนดชื่อแทนที่ใช้การทดสอบที่อ้างอิง ให้ใช้กฎ test_suite ที่มีเป้าหมายเดียวในแอตทริบิวต์ tests
  • ระบบจะกําหนดชื่อแทนไปยังกฎ environment เมื่อกําหนดกลุ่มสภาพแวดล้อม และไม่รองรับในตัวเลือกบรรทัดคําสั่ง --target_environment ด้วย

ตัวอย่าง

filegroup(
    name = "data",
    srcs = ["data.txt"],
)

alias(
    name = "other",
    actual = ":data",
)

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

แอตทริบิวต์
name

Name; required

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

actual

Label; required

เป้าหมายที่ชื่อแทนนี้หมายถึง ไม่จําเป็นต้องเป็นกฎ แต่เป็นไฟล์อินพุตได้

การตั้งค่ากําหนด

ดูแหล่งที่มาของกฎ
config_setting(name, constraint_values, define_values, deprecation, distribs, features, flag_values, licenses, tags, testonly, values, visibility)

จับคู่สถานะการกําหนดค่าที่คาดไว้ (แสดงเป็นแฟล็กบิวด์หรือข้อจํากัดของแพลตฟอร์ม) เพื่อวัตถุประสงค์ในการเรียกแอตทริบิวต์ที่กําหนดค่าได้ ดูเลือกวิธีใช้งานกฎนี้และ แอตทริบิวต์ที่กําหนดค่าได้สําหรับภาพรวมของฟีเจอร์ทั่วไป

ตัวอย่าง

รายการต่อไปนี้ตรงกับบิลด์ที่กําหนด --compilation_mode=opt หรือ -c opt (อย่างชัดเจนที่บรรทัดคําสั่งหรือโดยปริยายจากไฟล์ .bazelcc)

  config_setting(
      name = "simple",
      values = {"compilation_mode": "opt"}
  )
  

รายการต่อไปนี้ตรงกับบิลด์ที่กําหนดเป้าหมาย ARM และใช้ FOO=bar ที่กําหนดเอง (เช่น bazel build --cpu=arm --define FOO=bar ...)

  config_setting(
      name = "two_conditions",
      values = {
          "cpu": "arm",
          "define": "FOO=bar"
      }
  )
  

รายการต่อไปนี้ตรงกับบิลด์ที่มีการตั้งค่าแฟล็กที่ผู้ใช้กําหนด --//custom_flags:foo=1 (ทั้งตามอย่างชัดแจ้งในบรรทัดคําสั่งหรือโดยนัยจากไฟล์ .bazelcc)

  config_setting(
      name = "my_custom_flag_is_set",
      flag_values = { "//custom_flags:foo": "1" },
  )
  

รายการต่อไปนี้ตรงกับบิลด์ที่กําหนดเป้าหมายเป็นแพลตฟอร์มที่มีสถาปัตยกรรม x86_64 และ glibc เวอร์ชัน 2.25 โดยสมมติว่ามี constraint_value ที่มีป้ายกํากับ //example:glibc_2_25 โปรดทราบว่าแพลตฟอร์มจะยังคงตรงกันหากกําหนดค่าขีดจํากัดเพิ่มเติมนอกเหนือจาก 2 รายการนี้

  config_setting(
      name = "64bit_glibc_2_25",
      constraint_values = [
          "@platforms//cpu:x86_64",
          "//example:glibc_2_25",
      ]
  )
  
ในกรณีดังกล่าว การกําหนดค่าอาจเปลี่ยนแปลงภายในบิลด์ได้ เช่น หากจําเป็นต้องสร้างเป้าหมายสําหรับแพลตฟอร์มอื่นที่ไม่ใช่ความลึก ซึ่งหมายความว่าหน้าเว็บ config_setting อาจไม่ตรงกับแฟล็กบรรทัดคําสั่งระดับบนสุด แต่ก็อาจยังคงตรงกับเป้าหมายบิลด์บางรายการอยู่

หมายเหตุ

  • ดูเลือกสิ่งที่จะเกิดขึ้นเมื่อมี config_setting หลายรายการที่ตรงกับสถานะการกําหนดค่าปัจจุบัน
  • สําหรับแฟล็กที่รองรับแบบฟอร์มแบบสั้น (เช่น --compilation_mode เทียบกับ -c) คําจํากัดความของ values ต้องใช้แบบฟอร์มแบบเต็ม ซึ่งจะจับคู่การเรียกใช้โดยอัตโนมัติโดยใช้แบบฟอร์มใดรูปแบบหนึ่ง
  • หากแฟล็กมีค่าหลายค่า (เช่น --copt=-Da --copt=-Db หรือ ธง Starlark) values = { "flag": "a" } จะตรงกันหากมี "a" อยู่ในทุกที่ในรายการจริง

    values = { "myflag": "a,b" } ทํางานในลักษณะเดียวกัน: ตรงกับ --myflag=a --myflag=b, --myflag=a --myflag=b --myflag=c, --myflag=a,b และ --myflag=c,b,a ความหมายที่ตรงกันของแฟล็กต่างๆ จะแตกต่างกันไป ตัวอย่างเช่น --copt ไม่รองรับค่าหลายค่า ในอินสแตนซ์เดียวกัน: --copt=a,b จะให้ ["a,b"] ขณะที่ --copt=a --copt=b สร้าง ["a", "b"] (เพื่อให้ values = { "copt": "a,b" } ตรงกับค่าเก่า แต่ไม่ใช่อันหลัง) แต่ --ios_multi_cpus (สําหรับกฎ Apple) ให้: -ios_multi_cpus=a,b และ ios_multi_cpus=a --ios_multi_cpus=b จะให้ ["a", "b"] ตรวจสอบคําจํากัดความของธง และทดสอบเงื่อนไขอย่างละเอียดเพื่อยืนยันความคาดหวังที่แน่นอน

  • หากต้องการกําหนดเงื่อนไขที่ไม่ได้สร้างโดยแฟล็กบิลด์ในตัว ให้ใช้ แฟล็กที่กําหนดโดย Starlark คุณยังใช้ --define ได้ด้วย แต่ตัวเลือกนี้มีการรองรับที่ไม่รัดกุม เราจึงไม่แนะนํา ดูการสนทนาเพิ่มเติมที่นี่
  • หลีกเลี่ยงการแสดงคําจํากัดความ config_setting ที่เหมือนกันในแพ็กเกจอื่น แต่ให้อ้างอิง config_setting ทั่วไปที่กําหนดไว้ในแพ็กเกจ Canonical แทน
  • ใช้ values, define_values และ constraint_values ผสมกันในรูปแบบใดก็ได้ใน config_setting เดียวกัน แต่ต้องตั้งค่าอย่างน้อย 1 รายการสําหรับ config_setting ที่ต้องการ

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

แอตทริบิวต์
name

Name; required

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

constraint_values

List of labels; optional; nonconfigurable

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

ในกรณีที่ config_setting 2 รายการตรงกันใน select เดียวกัน ระบบจะไม่พิจารณาแอตทริบิวต์นี้เพื่อตัดสินว่า config_setting รายการหนึ่งเป็นความเชี่ยวชาญของอีกรายการหรือไม่ กล่าวคือ config_setting 1 รายการไม่สามารถจับคู่แพลตฟอร์มได้สูงกว่าแพลตฟอร์มอื่น

define_values

Dictionary: String -> String; optional; nonconfigurable

เหมือนกับ values แต่สําหรับแฟล็ก --define โดยเฉพาะ

--define พิเศษเนื่องจากไวยากรณ์ (--define KEY=VAL) หมายความว่า KEY=VAL เป็นค่าจากมุมมองการแจ้งว่าไม่เหมาะสมของ Bazel

ซึ่งหมายความว่า

            config_setting(
                name = "a_and_b",
                values = {
                    "define": "a=1",
                    "define": "b=2",
                })
          

ไม่ทํางานเนื่องจากคีย์เดียวกัน (define) ปรากฏขึ้น 2 ครั้งในพจนานุกรม แอตทริบิวต์นี้ช่วยแก้ปัญหาได้

            config_setting(
                name = "a_and_b",
                define_values = {
                    "a": "1",
                    "b": "2",
                })
          

ตรงกับ bazel build //foo --define a=1 --define b=2 อย่างถูกต้อง

--define ยังคงปรากฏใน values ได้ด้วยไวยากรณ์แฟล็กปกติ และผสมกับแอตทริบิวต์นี้ได้อย่างอิสระตราบใดที่คีย์พจนานุกรมยังคงแตกต่างกัน

flag_values

Dictionary: label -> String; optional; nonconfigurable

เหมือนกับ values แต่สําหรับ แฟล็กบิลด์ที่ผู้ใช้กําหนด

แอตทริบิวต์นี้เป็นแอตทริบิวต์ที่แตกต่างกัน เนื่องจากแฟล็กที่กําหนดโดยผู้ใช้จะเรียกว่าป้ายกํากับ ส่วนแฟล็กในตัวจะอ้างอิงเป็นสตริงที่กําหนดเอง

values

Dictionary: String -> String; optional; nonconfigurable

ชุดของค่าที่ตรงกับกฎนี้ (แสดงเป็นแฟล็กบิวด์)

กฎนี้จะรับค่าการกําหนดค่าของเป้าหมายที่กําหนดค่าไว้ซึ่งอ้างอิงคําสั่งนี้ในคําสั่ง select ระบบจะถือว่า "จับคู่" การเรียกใช้ Bazel หากการกําหนดค่าทุกรายการในพจนานุกรมตรงกับค่าที่คาดไว้ของรายการ ตัวอย่างเช่น values = {"compilation_mode": "opt"} จะตรงกับการเรียกใช้ bazel build --compilation_mode=opt ... และ bazel build -c opt ... ในกฎที่กําหนดค่าเป้าหมาย

เพื่อความปลอดภัย ค่าการกําหนดค่าจะแสดงเป็นแฟล็กบิวด์ (ไม่มี "--" ก่อนหน้า) แต่โปรดทราบว่าทั้ง 2 ค่าไม่ตรงกัน เนื่องจากเป้าหมายสร้างขึ้นในการกําหนดค่าได้หลายรายการภายในบิลด์เดียวกัน เช่น "cpu" ของการกําหนดค่าexe ที่ตรงกับค่าของ --host_cpu ไม่ใช่ --cpu ดังนั้น อินสแตนซ์ของ config_setting เดียวกันอาจจับคู่การเรียกใช้เดียวกันแตกต่างกันโดยขึ้นอยู่กับการกําหนดค่าของกฎที่ใช้

หากไม่ได้ตั้งค่าแฟล็กที่บรรทัดคําสั่งอย่างชัดเจน ระบบจะใช้ค่าเริ่มต้น หากคีย์ปรากฏในพจนานุกรมหลายครั้ง ระบบจะใช้เฉพาะอินสแตนซ์สุดท้ายเท่านั้น หากคีย์อ้างอิงแฟล็กที่ตั้งค่าได้หลายครั้งในบรรทัดคําสั่ง (เช่น bazel build --copt=foo --copt=bar --copt=baz ...) รายการที่ตรงกันจะเกิดขึ้นหากรายการใดก็ตามของการตั้งค่าเหล่านั้นตรงกัน

กลุ่มไฟล์

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

ใช้ filegroup เพื่อตั้งชื่อที่สะดวกให้กับกลุ่มเป้าหมาย จากนั้น คุณจะอ้างอิงกฎเหล่านี้จากกฎอื่นๆ ได้

ขอแนะนําให้ใช้ filegroup แทนการอ้างอิงไดเรกทอรีโดยตรง กรณีหลังไม่มีเสียงเนื่องจากระบบการสร้างไม่มีความรู้มากนักเกี่ยวกับไฟล์ทั้งหมด ในไดเรกทอรี จึงไม่สามารถสร้างใหม่ได้เมื่อมีการเปลี่ยนแปลงไฟล์เหล่านี้ เมื่อรวมกับ glob filegroup จะมั่นใจได้ว่าไฟล์ทั้งหมดเป็นที่ชัดเจนสําหรับระบบการสร้าง

ตัวอย่าง

หากต้องการสร้าง filegroup ที่มีไฟล์แหล่งที่มา 2 ไฟล์ ให้ทําดังนี้

filegroup(
    name = "mygroup",
    srcs = [
        "a_file.txt",
        "some/subdirectory/another_file.txt",
    ],
)

หรือใช้ glob เพื่อแสดงตัวอย่างไดเรกทอรีข้อมูลทดสอบ

filegroup(
    name = "exported_testdata",
    srcs = glob([
        "testdata/*.dat",
        "testdata/logs/**/*.log",
    ]),
)

หากต้องการใช้คําจํากัดความเหล่านี้ ให้อ้างอิง filegroup ด้วยป้ายกํากับจากกฎใดก็ได้

cc_library(
    name = "my_library",
    srcs = ["foo.cc"],
    data = [
        "//my_package:exported_testdata",
        "//my_package:mygroup",
    ],
)

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

แอตทริบิวต์
name

Name; required

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

srcs

List of labels; optional

รายการเป้าหมายที่เป็นสมาชิกของกลุ่มไฟล์

โดยทั่วไปแล้ว จะใช้ผลลัพธ์ของนิพจน์ glob กับค่าของแอตทริบิวต์ srcs

data

List of labels; optional

รายการไฟล์ที่กฎนี้ต้องใช้ขณะรันไทม์

ระบบจะเพิ่มเป้าหมายที่มีชื่อในแอตทริบิวต์ data ไปยังกฎ runfiles ของกฎ filegroup นี้ เมื่ออ้างอิง filegroup ในแอตทริบิวต์ data ของกฎอื่น ระบบจะเพิ่ม runfiles ใน runfiles ของกฎที่เกี่ยวข้อง ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีที่อิงตามและใช้ไฟล์ข้อมูลได้ในส่วนทรัพยากร Dependency ของข้อมูลและเอกสารประกอบทั่วไปของ data

output_group

String; optional

กลุ่มเอาต์พุตที่จะรวบรวมอาร์ติแฟกต์จากแหล่งที่มา หากระบุแอตทริบิวต์นี้ ระบบจะส่งออกอาร์ติแฟกต์จากกลุ่มเอาต์พุตที่เกี่ยวข้องของทรัพยากร Dependency แทนกลุ่มเอาต์พุตเริ่มต้น

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

Gengen

ดูแหล่งที่มาของกฎ
genquery(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, expression, features, licenses, opts, restricted_to, scope, strict, tags, target_compatible_with, testonly, visibility)

genquery() จะเรียกใช้การค้นหาที่ระบุอยู่ในภาษาในการค้นหา Blaze และดัมพ์ผลการค้นหาลงในไฟล์

เพื่อให้การค้นหามีความสอดคล้องกัน คําค้นหาจะได้รับอนุญาตให้ปิดทําการปิดชั่วคราวตามเป้าหมายที่ระบุไว้ในแอตทริบิวต์ scope เท่านั้น การค้นหาที่ละเมิดกฎนี้จะล้มเหลวระหว่างการดําเนินการหากไม่ได้ระบุ strict หรือเป็นจริง (หาก strict เป็น "เท็จ" ระบบจะข้ามเป้าหมายที่อยู่นอกขอบเขตพร้อมด้วยคําเตือน) วิธีที่ง่ายที่สุดในการตรวจสอบว่าเหตุการณ์นี้ไม่ได้เกิดขึ้นคือการพูดถึงป้ายกํากับเดียวกันในขอบเขตเหมือนในนิพจน์การค้นหา

ความแตกต่างเพียงอย่างเดียวระหว่างคําค้นหาที่อนุญาตที่นี่และในบรรทัดคําสั่งคือ คําค้นหาที่มีข้อกําหนดเป้าหมายไวลด์การ์ด (เช่น //pkg:* หรือ //pkg:all) จะไม่ได้รับอนุญาตที่นี่ สําหรับ 2 ขั้นตอนนี้คือ 1 เพราะ genquery ต้องใช้ขอบเขตเพื่อป้องกันเป้าหมายภายนอกการปิดแบบปิดของคําค้นหาที่ส่งผลต่อเอาต์พุต และรายการที่ 2 เนื่องจาก BUILD ไฟล์ไม่รองรับทรัพยากร Dependency แบบไวลด์การ์ด (เช่น deps=["//a/..."] ไม่ได้รับอนุญาต)

เอาต์พุตของ Gengen จะสั่งซื้อโดยใช้ --order_output=full เพื่อบังคับใช้เอาต์พุตแบบกําหนดความเชื่อมโยง

ชื่อของไฟล์เอาต์พุตคือชื่อของกฎ

ตัวอย่าง

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

genquery(
    name = "kiwi-deps",
    expression = "deps(//kiwi:kiwi_lib)",
    scope = ["//kiwi:kiwi_lib"],
)

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

แอตทริบิวต์
name

Name; required

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

expression

String; required

คําค้นหาที่จะดําเนินการ ป้ายกํากับที่นี่จะได้รับการแก้ไขเมื่อเทียบกับไดเรกทอรีรากของพื้นที่ทํางาน ซึ่งแตกต่างจากบรรทัดคําสั่งและที่อื่นๆ ในไฟล์ BUILD เช่น ป้ายกํากับ :b ในแอตทริบิวต์นี้ในไฟล์ a/BUILD จะอ้างถึงเป้าหมาย //:b
opts

List of strings; optional

ตัวเลือกที่ส่งไปยังเครื่องมือค้นหา ซึ่งจะสอดคล้องกับตัวเลือกบรรทัดคําสั่งที่ส่งไปยัง bazel query ได้ ไม่อนุญาตให้ใช้ตัวเลือกการค้นหาบางรายการที่นี่: --keep_going, --query_file, --universe_scope, --order_results และ --order_output ตัวเลือกที่ไม่ได้ระบุไว้ที่นี่จะมีค่าเริ่มต้นเหมือนกับบรรทัดคําสั่งใน bazel query
scope

List of labels; required

ขอบเขตของการค้นหา คําค้นหาไม่ได้รับอนุญาตให้แตะเป้าหมายนอกการปิดชั่วคราวของเป้าหมายเหล่านี้
strict

Boolean; optional; default is True

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

พันธุกรรม

ดูแหล่งที่มาของกฎ
genrule(name, srcs, outs, cmd, cmd_bash, cmd_bat, cmd_ps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, exec_tools, executable, features, licenses, local, message, output_licenses, output_to_bindir, restricted_to, tags, target_compatible_with, testonly, toolchains, tools, visibility)

genrule จะสร้างไฟล์อย่างน้อย 1 ไฟล์โดยใช้คําสั่ง Bash ที่กําหนดโดยผู้ใช้

กฎทั่วไปเป็นกฎบิลด์ทั่วไปที่คุณสามารถใช้ได้หากไม่มีกฎเฉพาะสําหรับงาน เช่น คุณอาจเรียกใช้ Bash One-liner แต่หากต้องการรวบรวมไฟล์ C++ โปรดปฏิบัติตามกฎ cc_* ที่มีอยู่ เนื่องจากมีการดําเนินการยกน้ําหนักทั้งหมดสําหรับคุณแล้ว

โปรดทราบว่า Gengen จําเป็นต้องมี Shell เพื่อตีความอาร์กิวเมนต์คําสั่ง นอกจากนี้ยังอ้างอิงโปรแกรมที่กําหนดเองได้ใน PATH อีกด้วย แต่วิธีนี้ทําให้คําสั่งไม่ใช่แบบตามความหมายและอาจทําซ้ําไม่ได้ หากคุณต้องการเรียกใช้เครื่องมือเดียว ให้ลองใช้ run_binary แทน

อย่าใช้กฎการทดสอบ มีการทดสอบสั่งจ่ายและผลการทดสอบเป็นพิเศษ ซึ่งรวมถึงนโยบายการแคชและตัวแปรสภาพแวดล้อม โดยปกติต้องทดสอบหลังจากที่บิลด์เสร็จสมบูรณ์และในสถาปัตยกรรมเป้าหมาย ส่วนกฎทั่วไปจะทํางานระหว่างบิลด์และสถาปัตยกรรม exec (ทั้ง 2 แบบอาจแตกต่างกัน) หากต้องการใช้กฎการทดสอบเพื่อวัตถุประสงค์ทั่วไป ให้ใช้ sh_test

ข้อควรพิจารณาเกี่ยวกับการรวบรวมหลายวิดีโอ

ดูข้อมูลเพิ่มเติมเกี่ยวกับการรวบรวมการรวบรวมได้ในคู่มือผู้ใช้

แม้ว่า Gengen จะทํางานในระหว่างบิลด์ แต่มักจะใช้เอาต์พุตหลังบิลด์เพื่อติดตั้งใช้งานหรือทดสอบ ดูตัวอย่างการคอมไพล์โค้ด C สําหรับไมโครคอนโทรลเลอร์: คอมไพเลอร์ยอมรับไฟล์แหล่งที่มาของ C และสร้างโค้ดที่ทํางานบนไมโครคอนโทรลเลอร์ โค้ดที่สร้างขึ้นมาอย่างชัดเจนจะใช้งานกับ CPU ที่ใช้ในการสร้างไม่ได้ แต่คอมไพเลอร์ C (หากคอมไพล์มาจากต้นทาง) เองก็จะต้องทํา

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

สําหรับ Gengen, ระบบบิลด์จะตรวจสอบว่าทรัพยากร Dependency สร้างขึ้นอย่างถูกต้อง srcs สร้างขึ้น (หากจําเป็น) สําหรับการกําหนดค่า target, tools สร้างขึ้นสําหรับการกําหนดค่า exec และจะถือว่าเอาต์พุตเป็นของการกําหนดค่า target และยังมี ตัวแปร "สร้าง" ที่คําสั่ง Gengen สามารถส่งผ่านไปยังเครื่องมือที่เกี่ยวข้องได้ด้วย

โดยตั้งใจว่ากฎที่ระบุไม่มีแอตทริบิวต์ deps กล่าวคือ กฎในตัวอื่นๆ จะใช้ข้อมูลเมตาที่ขึ้นอยู่กับภาษาซึ่งส่งระหว่างกฎเพื่อกําหนดวิธีจัดการกฎที่ต้องพึ่งพาโดยอัตโนมัติ แต่ระบบอัตโนมัติระดับนี้ไม่สามารถบังคับใช้กับกฎทั่วไปได้ กฎทั่วไปจะทํางานที่ระดับไฟล์และการเรียกใช้ไฟล์เท่านั้น

กรณีพิเศษ

การรวบรวมคลิปสําหรับการดําเนินการ: ในบางกรณี ระบบการสร้างต้องเรียกใช้ Gengen ซึ่งทําให้เรียกใช้เอาต์พุตระหว่างบิลด์ได้ด้วย เช่น ระหว่างที่ Gengen สร้างคอมไพเลอร์ที่กําหนดเอง ซึ่งใช้กันต่อไปใน Gengen อื่น ข้อมูลโค้ดแรกจะต้องสร้างเอาต์พุตของการกําหนดค่า exec เพราะเป็นที่คอมไพเลอร์จะทํางานใน genrule อื่น ในกรณีนี้ ระบบบิวด์จะทําสิ่งที่ถูกต้องโดยอัตโนมัติ กล่าวคือจะสร้าง srcs และ outs ของกฎแรกสําหรับการกําหนดค่า exec แทนที่จะเป็นการกําหนดค่าเป้าหมาย ดูข้อมูลเพิ่มเติมที่คู่มือผู้ใช้

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

สภาพแวดล้อม Genrule

คําสั่ง Genrule จะดําเนินการโดย Shell ของ Bash ที่กําหนดค่าแล้วไม่สําเร็จเมื่อคําสั่งหรือไปป์ไลน์ล้มเหลว โดยใช้ set -e -o pipefail

เครื่องมือบิลด์จะเรียกใช้คําสั่ง Bash ในสภาพแวดล้อมการประมวลผลแบบสุขาภิบาลที่กําหนดเฉพาะตัวแปรหลัก เช่น PATH, PWD, TMPDIR และอีก 2-3 ตัว ระบบจะไม่ส่งตัวแปรส่วนใหญ่ที่กําหนดไว้ในสภาพแวดล้อม Shell ของผู้ใช้ไปยังคําสั่งของกฎเพื่อให้แน่ใจว่าบิลด์ทําซ้ําได้ แต่ Bazel (แต่ไม่ใช่ Blaze) จะส่งผ่านค่าของตัวแปรสภาพแวดล้อม PATH ของผู้ใช้ การเปลี่ยนแปลงใดๆ กับค่าของ PATH จะทําให้ Bazel เรียกใช้คําสั่งอีกครั้งในบิลด์ถัดไป

คําสั่งพันธุกรรมไม่ควรเข้าถึงเครือข่าย ยกเว้นการเชื่อมต่อกระบวนการที่เป็นตัวย่อยของคําสั่งเอง แม้ว่าปัจจุบันจะยังไม่ได้บังคับใช้

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

คําแนะนําทั่วไป

  • ตรวจสอบว่าเครื่องมือที่ดําเนินการโดยพันธุกรรมมีคําจํากัดความที่ชัดเจนและชัดเจน ไม่ควรเขียนการประทับเวลาไปยังเอาต์พุต และควรใช้การจัดลําดับแบบคงที่สําหรับชุดและแผนที่ ตลอดจนเขียนเฉพาะเส้นทางของไฟล์ที่เกี่ยวข้องไปยังเอาต์พุตเท่านั้น ไม่มีเส้นทางสมบูรณ์ การไม่ปฏิบัติตามกฎนี้จะทําให้เกิดลักษณะการทํางานที่ไม่คาดคิดโดยไม่คาดคิด (Bazel ไม่ได้สร้าง Gengen ที่คุณคิดว่าจะทําใหม่) และลดประสิทธิภาพของแคช
  • ใช้ $(location) อย่างครอบคลุมสําหรับเอาต์พุต เครื่องมือ และแหล่งที่มา เนื่องจากการแยกไฟล์เอาต์พุตสําหรับการกําหนดค่าที่แตกต่างกัน กฎ จึงไม่สามารถอาศัยเส้นทางฮาร์ดโค้ดและ/หรือเส้นทางสัมบูรณ์ได้
  • เขียนมาโคร Starlark ทั่วไปในกรณีที่มีการใช้พันธุเดียวกันหรือคล้ายกันมากในหลายที่ หากพันธุกรรมมีความซับซ้อน ให้พิจารณาใช้พันธุกรรมในสคริปต์หรือเป็นกฎ Starlark ซึ่งจะช่วยปรับปรุงความสามารถในการอ่านและการทดสอบ
  • โปรดตรวจสอบว่ารหัสการออกมีการระบุสําเร็จหรือล้มเหลวของ Gengen
  • อย่าเขียนข้อความให้ข้อมูลถึง stdout หรือ derder แม้ว่าจะเป็นประโยชน์สําหรับการแก้ไขข้อบกพร่อง แต่ก็อาจทําให้เกิดเสียงรบกวนได้โดยง่าย ในทางกลับกัน กฎที่ล้มเหลวจะปล่อยข้อความแสดงข้อผิดพลาดที่ดี
  • $$ evaluates to a $, a literal dollar-sign, so in order to invoke a shell command containing dollar-signs such as ls $(dirname $x), one must escape it thus: ls $$(dirname $$x)
  • หลีกเลี่ยงการสร้างลิงก์ลิงก์และไดเรกทอรี Bazel จะไม่คัดลอกโครงสร้างไดเรกทอรี/symlink ที่สร้างโดย genrules และการตรวจสอบทรัพยากร Dependency ของไดเรกทอรีคือไม่มีเสียง
  • เมื่ออ้างอิง Gengen ในกฎอื่นๆ คุณจะใช้ป้ายกํากับของ Gengen หรือป้ายกํากับของไฟล์เอาต์พุตแต่ละไฟล์ บางครั้งวิธีหนึ่งก็อ่านง่ายกว่ากัน แต่บางครั้งวิธีอ้างอิงอื่นๆ เช่น การอ้างอิงเอาต์พุตตามชื่อใน srcs ของกฎการบริโภคเพื่อหลีกเลี่ยงการรับเอาต์พุตอื่นๆ ของพันธุกรรมโดยไม่ตั้งใจ

ตัวอย่าง

ตัวอย่างนี้สร้าง foo.h ไม่มีแหล่งที่มาเนื่องจากคําสั่งดังกล่าวไม่ได้ใช้อินพุตใดๆ "ไบนารี" ที่เรียกใช้โดยคําสั่งคือสคริปต์ Perl ในแพ็กเกจเดียวกับ Gengen

genrule(
    name = "foo",
    srcs = [],
    outs = ["foo.h"],
    cmd = "./$(location create_foo.pl) > \"$@\"",
    tools = ["create_foo.pl"],
)

ตัวอย่างต่อไปนี้แสดงวิธีใช้ filegroup และเอาต์พุตของ genrule อื่น โปรดทราบว่าการใช้ $(SRCS) แทนคําสั่ง $(location) ที่ชัดเจนที่ใช้งานได้ด้วย ตัวอย่างนี้ใช้ตัวอย่างใหม่เพื่อการสาธิต

genrule(
    name = "concat_all_files",
    srcs = [
        "//some:files",  # a filegroup with multiple files in it ==> $(locations)
        "//other:gen",   # a genrule with a single output ==> $(location)
    ],
    outs = ["concatenated.txt"],
    cmd = "cat $(locations //some:files) $(location //other:gen) > $@",
)

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

แอตทริบิวต์
name

Name; required

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


คุณอาจอ้างอิงกฎนี้ตามชื่อในส่วน srcs หรือ deps ของกฎ BUILD อื่นๆ หากกฎสร้างไฟล์ต้นฉบับ คุณควรใช้แอตทริบิวต์ srcs
srcs

List of labels; optional

รายการอินพุตสําหรับกฎนี้ เช่น ไฟล์แหล่งที่มาที่จะประมวลผล

แอตทริบิวต์นี้ไม่เหมาะที่จะแสดงเครื่องมือที่ cmd เรียกใช้ แต่ใช้แอตทริบิวต์ tools แทน

ระบบการสร้างบิลด์นี้จะช่วยสร้างข้อกําหนดเบื้องต้นเหล่านี้ก่อนเรียกใช้คําสั่ง genrule สร้างขึ้นโดยใช้การกําหนดค่าเดียวกับคําขอบิวด์เดิม ชื่อไฟล์ข้อกําหนดเบื้องต้นเหล่านี้พร้อมใช้งานกับคําสั่งเป็นรายการพื้นที่ทํางานที่คั่นด้วยคอมมาใน $(SRCS) หรือจะกําหนดเส้นทางของเป้าหมาย srcs แต่ละรายการ //x:y โดยใช้ $(location //x:y) หรือใช้ $< ก็ได้ โดยมีเพียงรายการเดียวใน srcs

outs

List of filenames; required; nonconfigurable

รายการไฟล์ที่กฎนี้สร้างขึ้น

ไฟล์เอาต์พุตต้องไม่ข้ามขอบเขตของแพ็กเกจ ระบบจะตีความชื่อไฟล์เอาต์พุตว่าเกี่ยวข้องกับแพ็กเกจ

หากตั้งค่าแฟล็ก executable ไว้ outs ต้องมีป้ายกํากับ 1 รายการเท่านั้น

คุณควรใช้คําสั่ง Gerule ในการสร้างไฟล์เอาต์พุตแต่ละไฟล์ในตําแหน่งที่กําหนดไว้ล่วงหน้า สถานที่อยู่ใน cmd โดยใช้ตัวแปร "ผลิต" เฉพาะกฎ ($@, $(OUTS), $(@D) หรือ $(RULEDIR)) หรือใช้การแทนที่ $(location)

cmd

String; optional

คําสั่งที่จะเรียกใช้ ขึ้นอยู่กับการแทนที่ $(location) และ ตัวแปร"ผลิต"
  1. ระบบจะใช้การแทนที่ $(location) ครั้งแรก โดยแทนที่ $(location label) และ $(locations label) ทั้งหมด (รวมถึงโครงสร้างที่คล้ายกันโดยใช้ตัวแปร execpath, execpaths, rootpath และ rootpaths ที่เกี่ยวข้อง)
  2. ถัดไป ตัวแปร"ผลิต" จะขยาย โปรดทราบว่าตัวแปร $(JAVA), $(JAVAC) และ $(JAVABASE) ที่กําหนดไว้ล่วงหน้าจะขยายออกภายใต้การกําหนดค่า exec เพื่อให้การเรียกใช้ Java ซึ่งเป็นส่วนหนึ่งของขั้นตอนบิลด์โหลดไลบรารีที่ใช้ร่วมกันและทรัพยากร Dependency อื่นๆ ได้อย่างถูกต้อง
  3. สุดท้าย ระบบจะเรียกใช้คําสั่งที่ได้มาโดยใช้ Shell ของ Bash หากรหัสการออกไม่ใช่ 0 จะถือว่าคําสั่งล้มเหลว
นี่คือโฆษณาสํารองของ cmd_bash, cmd_ps และ cmd_bat หากไม่มีรายการที่เกี่ยวข้อง

หากความยาวบรรทัดคําสั่งเกินขีดจํากัดของแพลตฟอร์ม (64, 000 ใน Linux/macOS, 8K ใน Windows) Gengen จะเขียนคําสั่งไปยังสคริปต์และเรียกใช้สคริปต์นั้นเพื่อให้แก้ปัญหา ข้อกําหนดนี้มีผลกับแอตทริบิวต์ cmd ทั้งหมด (cmd, cmd_bash, cmd_ps, cmd_bat)

cmd_bash

String; optional

คําสั่ง Bash ที่จะเรียกใช้

แอตทริบิวต์นี้มีลําดับความสําคัญสูงกว่า cmd คําสั่งจะขยายและทํางานในลักษณะเดียวกันกับแอตทริบิวต์ cmd

cmd_bat

String; optional

คําสั่งแบบกลุ่มเพื่อเรียกใช้ใน Windows

แอตทริบิวต์นี้มีลําดับความสําคัญสูงกว่า cmd และ cmd_bash คําสั่งนี้จะทํางานในลักษณะเดียวกับแอตทริบิวต์ cmd โดยมีความแตกต่างดังนี้

  • แอตทริบิวต์นี้ใช้ได้กับ Windows เท่านั้น
  • คําสั่งนี้ทํางานด้วย cmd.exe /c พร้อมด้วยอาร์กิวเมนต์เริ่มต้นต่อไปนี้
    • /S - ขีดฆ่าคําแรกและเครื่องหมายคําพูดสุดท้ายและดําเนินการอื่นๆ ตามที่เป็นอยู่
    • /E:ON - เปิดใช้ชุดคําสั่งแบบขยาย
    • /V:ON - เปิดใช้การขยายตัวแปรที่ล่าช้า
    • /D - ละเว้นรายการรีจิสทรี AutoRun
  • หลังจากการแทนที่ $(location) และ ตัวแปร"ผู้ผลิต" ระบบจะขยายเส้นทางไปยังเส้นทางรูปแบบ Windows (ด้วยแบ็กสแลช)
cmd_ps

String; optional

คําสั่ง Powershell ที่จะเรียกใช้ใน Windows

แอตทริบิวต์นี้มีลําดับความสําคัญสูงกว่า cmd, cmd_bash และ cmd_bat คําสั่งจะทํางานในลักษณะเดียวกับแอตทริบิวต์ cmd โดยมีความแตกต่างดังนี้

  • แอตทริบิวต์นี้ใช้ได้กับ Windows เท่านั้น
  • คําสั่งนี้ทํางานกับ powershell.exe /c

เราจะเรียกใช้คําสั่งต่อไปนี้เพื่อตั้งค่าสภาพแวดล้อมก่อนเรียกใช้คําสั่ง Powershell ในกฎ เพื่อให้ Powershell ใช้งานง่ายและมีแนวโน้มที่จะเกิดข้อผิดพลาดน้อยลง

  • Set-ExecutionPolicy -Scope CurrentUser RemoteSigned - อนุญาตการเรียกใช้สคริปต์ที่ไม่มีการรับรอง
  • $errorActionPreference='Stop' - ในกรณีที่มีคําสั่งหลายรายการแยกกันด้วย ; การดําเนินการจะออกทันทีหาก Powershell Cmd Let ล้มเหลว แต่ไม่ใช้ได้กับคําสั่งภายนอก
  • $PSDefaultParameterValues['*:Encoding'] = 'utf8' - เปลี่ยนการเข้ารหัสเริ่มต้นจาก utf-16 เป็น utf-8
exec_tools

List of labels; optional

เลิกใช้งานแล้ว โปรดใช้ tools แทน

ก่อนหน้านี้ในเวลาที่ exec_tools และ tools มีลักษณะการทํางานต่างกัน แต่ขณะนี้เทียบเท่ากันและทีม Blaze จะย้ายการใช้งาน exec_tools ทั้งหมดไปยัง tools

executable

Boolean; optional; nonconfigurable; default is False

ประกาศเอาต์พุตเป็นไฟล์ปฏิบัติการ

การตั้งค่าแฟล็กนี้เป็น "จริง" หมายความว่าเอาต์พุตเป็นไฟล์ปฏิบัติการและเรียกใช้ได้โดยใช้คําสั่ง run ในกรณีนี้ Gengen จะต้องสร้างเอาต์พุตเพียง 1 รายการเท่านั้น หากตั้งค่าแอตทริบิวต์นี้ไว้ run จะพยายามเรียกใช้ไฟล์โดยไม่คํานึงถึงเนื้อหา

ระบบไม่รองรับการประกาศทรัพยากร Dependency ของข้อมูลสําหรับไฟล์ปฏิบัติการที่สร้างขึ้น

local

Boolean; optional; default is False

หากตั้งค่าเป็น "จริง" ตัวเลือกนี้จะบังคับให้ genrule นี้ทํางานโดยใช้กลยุทธ์ "ท้องถิ่น" ซึ่งหมายความว่าจะไม่มีการดําเนินการระยะไกล ไม่มีแซนด์บ็อกซ์ ไม่มีผู้ปฏิบัติงานถาวร

ซึ่งเทียบเท่ากับการระบุ "local" เป็นแท็ก (tags=["local"])

message

String; optional

ข้อความความคืบหน้า

ข้อความความคืบหน้าที่จะพิมพ์ในขณะที่ดําเนินการขั้นตอนการสร้างนี้ โดยค่าเริ่มต้น ข้อความคือ "การสร้างเอาต์พุต" (หรือบางอย่างที่มีความหมายเท่าๆ กัน) แต่คุณอาจระบุหรือไม่ก็ได้ ใช้แอตทริบิวต์นี้แทน echo หรือคําสั่งพิมพ์อื่นๆ ในคําสั่ง cmd เพราะจะช่วยให้เครื่องมือสร้างควบคุมได้ว่าจะพิมพ์ความคืบหน้าดังกล่าวหรือไม่

output_licenses

Licence type; optional

ดู common attributes
output_to_bindir

Boolean; optional; nonconfigurable; default is False

หากตั้งค่าเป็น "จริง" ตัวเลือกนี้จะทําให้เขียนไฟล์เอาต์พุตลงในไดเรกทอรี bin แทนไดเรกทอรี genfiles

tools

List of labels; optional

รายการทรัพยากร Dependency ของ tool สําหรับกฎนี้ ดูข้อมูลเพิ่มเติมในคําจํากัดความของทรัพยากร Dependency

ระบบการสร้างบิลด์จะตรวจสอบว่ามีข้อกําหนดเบื้องต้นเหล่านี้ก่อนเรียกใช้คําสั่ง genrule สร้างขึ้นโดยใช้การกําหนดค่า exec เนื่องจากเครื่องมือเหล่านี้ทํางานเป็นส่วนหนึ่งของบิลด์ เส้นทางของเป้าหมาย tools แต่ละ //x:y จะได้รับโดยใช้ $(location //x:y)

*_binary หรือเครื่องมือที่จะดําเนินการโดย cmd ต้องปรากฏในรายการนี้ ไม่ใช่ใน srcs เพื่อให้มั่นใจว่าสร้างในการกําหนดค่าที่ถูกต้อง

กลุ่มทดสอบ

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

test_suite กําหนดชุดการทดสอบที่ถือว่า "มีประโยชน์" ต่อมนุษย์ การดําเนินการนี้จะช่วยให้โปรเจ็กต์กําหนดชุดการทดสอบต่างๆ ได้ เช่น "การทดสอบที่คุณต้องดําเนินการก่อนการตรวจสอบ" "การทดสอบความเครียดของโปรเจ็กต์" หรือ "การทดสอบขนาดเล็กทั้งหมด" คําสั่ง blaze test เคารพองค์กรประเภทนี้: สําหรับการเรียกใช้ blaze test //some/test:suite ให้ Blaze ระบุเป้าหมายการทดสอบทั้งหมดโดยรวมอยู่ในเป้าหมาย //some/test:suite ก่อน (เราเรียกว่า "การทดสอบ test_suite") จากนั้น Blaze จะสร้างและทดสอบเป้าหมายเหล่านั้น

ตัวอย่าง

ชุดทดสอบเพื่อทําการทดสอบขนาดเล็กทั้งหมดในแพ็กเกจปัจจุบัน

test_suite(
    name = "small_tests",
    tags = ["small"],
)

ชุดทดสอบที่ใช้ชุดการทดสอบที่ระบุ

test_suite(
    name = "smoke_tests",
    tests = [
        "system_unittest",
        "public_api_unittest",
    ],
)

ชุดทดสอบสําหรับดําเนินการทดสอบทั้งหมดในแพ็กเกจปัจจุบันซึ่งไม่น่าเชื่อถือ

test_suite(
    name = "non_flaky_test",
    tags = ["-flaky"],
)

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

แอตทริบิวต์
name

Name; required

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

tags

List of strings; optional; nonconfigurable

รายการแท็กข้อความ เช่น "เล็ก" หรือ "ฐานข้อมูล" หรือ "-ไม่น่าเชื่อถือ" แท็กอาจเป็นสตริงที่ถูกต้องก็ได้

แท็กที่เริ่มต้นด้วยอักขระ "-" จะถือว่าเป็นแท็กเชิงลบ ระบบจะไม่พิจารณาอักขระ "-" ที่อยู่ก่อนหน้า แท็กอื่นๆ ทั้งหมดจะถือว่าเป็นแท็กเชิงบวก

(ไม่บังคับ) เพื่อให้แท็กเชิงบวกมีความชัดเจนยิ่งขึ้น แท็กอาจขึ้นต้นด้วยอักขระ "+" จะไม่ได้รับการประเมินเป็นส่วนหนึ่งของข้อความของแท็ก เพียงแต่ช่วยให้ความแตกต่างในเชิงบวกและเชิงลบนั้นอ่านง่ายขึ้น

มีเพียงชุดทดสอบที่ตรงกับแท็กเชิงบวกทั้งหมดและแท็กเชิงลบทั้งหมดเท่านั้นที่จะรวมอยู่ในชุดทดสอบ ทั้งนี้ไม่ได้หมายความว่าการตรวจสอบข้อผิดพลาดเกี่ยวกับทรัพยากร Dependency ในการทดสอบที่กรองออกจะข้ามทรัพยากร Dependency ในการทดสอบที่ข้ามไปไปจะยังคงถูกต้องตามกฎหมาย (เช่น ไม่ได้ถูกบล็อกโดยข้อจํากัดระดับการเข้าถึง)

manual คีย์เวิร์ดแท็กจะได้รับการจัดการที่แตกต่างจากคําว่า "test_suite" ซึ่งเป็นคําสั่ง blaze test ในการเรียกใช้ที่เกี่ยวข้องกับไวลด์การ์ด รูปแบบเป้าหมาย ระบบจะกรองเป้าหมาย test_suite ที่ติดแท็ก "ด้วยตนเอง" ออก (จึงไม่มีการขยาย) ลักษณะการทํางานนี้จะสอดคล้องกับวิธีที่ blaze build และ blaze test จัดการรูปแบบเป้าหมายไวลด์การ์ดโดยทั่วไป โปรดทราบว่าสิ่งนี้แตกต่างจากลักษณะการทํางานของ blaze query 'tests(E)' อย่างชัดเจน เนื่องจากฟังก์ชันการค้นหา tests จะขยายชุดการค้นหาเสมอ ไม่ว่าแท็ก manual จะเป็นอย่างไรก็ตาม

โปรดทราบว่า size ของการทดสอบจะถือว่าเป็นแท็กสําหรับการกรอง

หากต้องการใช้ test_suite ที่มีการทดสอบด้วยแท็กพิเศษพร้อมกัน (เช่น การทดสอบขนาดเล็กและขนาดกลางทั้งหมด) คุณจะต้องสร้างกฎ test_suite 3 ข้อ กฎหนึ่งสําหรับการทดสอบขนาดเล็กทั้งหมด กฎหนึ่งสําหรับการทดสอบก่อนหน้าทั้งหมด และกฎหนึ่งที่มีกฎก่อนหน้า 2 ข้อ

tests

List of labels; optional; nonconfigurable

รายการชุดทดสอบและเป้าหมายการทดสอบของภาษาใดก็ได้

*_test จะถือว่ายอมรับที่นี่ โดยไม่คํานึงถึงภาษา แต่ระบบไม่ยอมรับเป้าหมาย *_binary แม้ว่าการทดสอบจะจะเกิดขึ้นก็ตาม การกรองตาม tags ที่ระบุจะมีไว้สําหรับการทดสอบที่แสดงในแอตทริบิวต์นี้โดยตรงเท่านั้น หากแอตทริบิวต์นี้มี test_suite การทดสอบภายในนี้จะไม่ถูกกรองออกโดย test_suite นี้ (ซึ่งจะถือว่าถูกกรองออกแล้ว)

หากไม่ระบุแอตทริบิวต์ tests หรือว่างเปล่า กฎจะรวมกฎการทดสอบทั้งหมดไว้ในไฟล์ BUILD ปัจจุบันที่ไม่ได้ติดแท็กเป็น manual กฎเหล่านี้ยังคงใช้ตัวกรอง tag