ชุดกฎนี้มีไว้เพื่อให้คุณสร้างแพลตฟอร์มฮาร์ดแวร์ที่เฉพาะเจาะจงที่คุณกำลังสร้าง และระบุเครื่องมือที่เฉพาะเจาะจงที่คุณอาจต้องใช้ในการคอมไพล์โค้ดสำหรับแพลตฟอร์มเหล่านั้น ผู้ใช้ควรคุ้นเคยกับแนวคิดที่อธิบายไว้ที่นี่
กฎ
constraint_setting
ดูแหล่งที่มาของกฎconstraint_setting(name, default_constraint_value, deprecation, distribs, features, licenses, tags, testonly, visibility)
กฎนี้ใช้เพื่อแนะนําข้อจํากัดประเภทใหม่ที่แพลตฟอร์มอาจระบุค่าได้
เช่น คุณอาจกำหนด constraint_setting ชื่อ "glibc_version" เพื่อแสดงถึง
ความสามารถของแพลตฟอร์มในการติดตั้งไลบรารี glibc เวอร์ชันต่างๆ
ดูรายละเอียดเพิ่มเติมได้ที่หน้าแพลตฟอร์ม
constraint_setting แต่ละรายการมีชุดconstraint_valueที่เชื่อมโยงกันซึ่งขยายได้
 โดยปกติแล้วการตั้งค่าเหล่านี้จะกำหนดไว้ในแพ็กเกจเดียวกัน แต่บางครั้งแพ็กเกจอื่นอาจมีการตั้งค่าใหม่สำหรับค่าที่มีอยู่ เช่น คุณสามารถขยายการตั้งค่า @platforms//cpu:cpu ที่กำหนดไว้ล่วงหน้าด้วยค่าที่กำหนดเองเพื่อกำหนดแพลตฟอร์มที่กำหนดเป้าหมายสถาปัตยกรรม CPU ที่ไม่ชัดเจน
  
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| default_constraint_value | ชื่อ กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  constraint_valueที่แอตทริบิวต์นี้ชี้ไปในแพ็กเกจเดียวกับconstraint_settingนี้หากการตั้งค่าข้อจำกัดมีค่าเริ่มต้น เมื่อใดก็ตามที่แพลตฟอร์มไม่ได้ระบุค่าข้อจำกัดใดๆ สำหรับการตั้งค่านั้น ก็จะเหมือนกับว่าแพลตฟอร์มได้ระบุค่าเริ่มต้น ไม่เช่นนั้น หากไม่มีค่าเริ่มต้น ระบบจะถือว่าแพลตฟอร์มนั้นไม่ได้ระบุการตั้งค่าข้อจำกัด ในกรณีดังกล่าว แพลตฟอร์มจะไม่จับคู่กับรายการข้อจำกัด (เช่น สำหรับ  | 
constraint_value
ดูแหล่งที่มาของกฎconstraint_value(name, constraint_setting, deprecation, distribs, features, licenses, tags, testonly, visibility)
ตัวอย่าง
คำสั่งต่อไปนี้จะสร้างค่าใหม่ที่เป็นไปได้สำหรับ constraint_value
 ที่กำหนดไว้ล่วงหน้าซึ่งแสดงถึงสถาปัตยกรรม CPU
constraint_value(
    name = "mips",
    constraint_setting = "@platforms//cpu:cpu",
)
mips เป็นทางเลือกแทน
x86_64, arm และอื่นๆ
  อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| constraint_setting | ป้ายกำกับ กำหนดค่าไม่ได้ ต้องระบุ constraint_settingที่constraint_valueนี้เป็น
        ตัวเลือกที่เป็นไปได้ | 
platform
ดูแหล่งที่มาของกฎplatform(name, constraint_values, deprecation, distribs, exec_properties, features, licenses, parents, remote_execution_properties, tags, testonly, visibility)
กฎนี้กำหนดแพลตฟอร์มใหม่ ซึ่งเป็นคอลเล็กชันที่มีชื่อของตัวเลือกข้อจำกัด (เช่น สถาปัตยกรรม CPU หรือเวอร์ชันคอมไพเลอร์) ที่อธิบายสภาพแวดล้อมซึ่ง ส่วนหนึ่งของการสร้างอาจทำงาน ดูรายละเอียดเพิ่มเติมได้ที่หน้าแพลตฟอร์ม
ตัวอย่าง
ซึ่งกำหนดแพลตฟอร์มที่อธิบายสภาพแวดล้อมที่เรียกใช้ Linux บน ARM
platform(
    name = "linux_arm",
    constraint_values = [
        "@platforms//os:linux",
        "@platforms//cpu:arm",
    ],
)
การรับค่าของแพลตฟอร์ม
  แพลตฟอร์มอาจใช้แอตทริบิวต์ parents เพื่อระบุแพลตฟอร์มอื่นที่จะรับค่าข้อจำกัดมา แม้ว่าแอตทริบิวต์ parents จะใช้รายการ แต่ปัจจุบันระบบรองรับค่าเพียงค่าเดียวเท่านั้น และการระบุผู้ปกครองหลายคนถือเป็นข้อผิดพลาด
  เมื่อตรวจสอบค่าของการตั้งค่าข้อจํากัดในแพลตฟอร์ม ระบบจะตรวจสอบค่าที่ตั้งค่าโดยตรงก่อน
  (ผ่านแอตทริบิวต์ constraint_values) จากนั้นจึงตรวจสอบค่าข้อจํากัดใน
  ระดับบน ซึ่งจะดำเนินการต่อไปแบบเรียกซ้ำขึ้นไปตามเชนของแพลตฟอร์มหลัก ด้วยวิธีนี้ ค่าใดก็ตามที่ตั้งค่าโดยตรงในแพลตฟอร์มจะลบล้างค่าที่ตั้งค่าในระดับบน
  แพลตฟอร์มจะรับค่าแอตทริบิวต์ exec_properties จากแพลตฟอร์มหลัก
  ระบบจะรวมรายการพจนานุกรมใน exec_properties ของแพลตฟอร์มหลักและแพลตฟอร์มย่อย
  หากคีย์เดียวกันปรากฏทั้งใน exec_properties ขององค์ประกอบระดับบนและระดับล่าง
  ระบบจะใช้ค่าขององค์ประกอบระดับล่าง หากแพลตฟอร์มย่อยระบุสตริงว่างเป็นค่า ระบบจะไม่ตั้งค่าพร็อพเพอร์ตี้ที่เกี่ยวข้อง
  นอกจากนี้ แพลตฟอร์มยังรับช่วงแอตทริบิวต์ remote_execution_properties (เลิกใช้งานแล้ว)
 จากแพลตฟอร์มหลักได้ด้วย หมายเหตุ: โค้ดใหม่ควรใช้ exec_properties แทน เราจะคงตรรกะที่อธิบายไว้ด้านล่างเพื่อให้เข้ากันได้กับลักษณะการทำงานเดิม แต่จะนำออกในอนาคต
  ตรรกะสำหรับการตั้งค่า remote_execution_platform มีดังนี้เมื่อมีแพลตฟอร์มหลัก
  
- 
      หากไม่ได้ตั้งค่า remote_execution_propertyในแพลตฟอร์มของบุตรหลาน ระบบจะใช้remote_execution_propertiesของผู้ปกครอง
- 
      หากตั้งค่า remote_execution_propertyในแพลตฟอร์มย่อยและมีสตริงตามตัวอักษร {PARENT_REMOTE_EXECUTION_PROPERTIES} ระบบจะแทนที่มาโครดังกล่าวด้วยเนื้อหาของแอตทริบิวต์remote_execution_propertyของแพลตฟอร์มหลัก
- 
      หากตั้งค่า remote_execution_propertyในแพลตฟอร์มย่อยและไม่มี มาโคร ระบบจะใช้remote_execution_propertyของแพลตฟอร์มย่อยโดยไม่มีการเปลี่ยนแปลง
  เนื่องจาก remote_execution_properties เลิกใช้งานแล้วและจะหยุดให้บริการ จึงไม่อนุญาตให้รวม
  remote_execution_properties และ exec_properties ไว้ในเชนการรับค่าเดียวกัน
  ขอแนะนำให้ใช้ exec_properties แทน remote_execution_properties ที่เลิกใช้งานแล้ว
ตัวอย่าง: ค่าข้อจำกัด
platform(
    name = "parent",
    constraint_values = [
        "@platforms//os:linux",
        "@platforms//cpu:arm",
    ],
)
platform(
    name = "child_a",
    parents = [":parent"],
    constraint_values = [
        "@platforms//cpu:x86_64",
    ],
)
platform(
    name = "child_b",
    parents = [":parent"],
)
ในตัวอย่างนี้ แพลตฟอร์มย่อยมีพร็อพเพอร์ตี้ต่อไปนี้
- 
      child_aมีค่าข้อจำกัด@platforms//os:linux(รับค่ามาจาก ระดับบนสุด) และ@platforms//cpu:x86_64(ตั้งค่าในแพลตฟอร์มโดยตรง)
- 
      child_bจะรับค่าข้อจํากัดทั้งหมดจากระดับบน และไม่ได้ตั้งค่าใดๆ ของตัวเอง
ตัวอย่าง: พร็อพเพอร์ตี้การดำเนินการ
platform(
    name = "parent",
    exec_properties = {
      "k1": "v1",
      "k2": "v2",
    },
)
platform(
    name = "child_a",
    parents = [":parent"],
)
platform(
    name = "child_b",
    parents = [":parent"],
    exec_properties = {
      "k1": "child"
    }
)
platform(
    name = "child_c",
    parents = [":parent"],
    exec_properties = {
      "k1": ""
    }
)
platform(
    name = "child_d",
    parents = [":parent"],
    exec_properties = {
      "k3": "v3"
    }
)
ในตัวอย่างนี้ แพลตฟอร์มย่อยมีพร็อพเพอร์ตี้ต่อไปนี้
- 
      child_aจะรับ "exec_properties" ของระดับบนสุดและไม่ได้ตั้งค่าของตัวเอง
- 
      child_bจะรับค่าexec_propertiesขององค์ประกอบระดับบนและลบล้างค่าของk1โดยมีexec_propertiesดังนี้{ "k1": "child", "k2": "v2" }
- 
      child_cจะรับค่าexec_propertiesของระดับบนสุดและยกเลิกการตั้งค่าk1โดยมีexec_propertiesดังนี้{ "k2": "v2" }
- 
      child_dจะรับค่าexec_propertiesของพร็อพเพอร์ตี้หลักและเพิ่มพร็อพเพอร์ตี้ใหม่ โดยมีexec_propertiesดังนี้{ "k1": "v1", "k2": "v2", "k3": "v3" }
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| constraint_values | รายการป้ายกำกับ ที่กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  
 | 
| exec_properties | พจนานุกรม: สตริง -> สตริง กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  exec_propertiesของแพลตฟอร์มหลัก
        หากแพลตฟอร์มย่อยและแพลตฟอร์มหลักกำหนดคีย์เดียวกัน ระบบจะเก็บค่าของแพลตฟอร์มย่อยไว้ ระบบจะนำคีย์ที่เชื่อมโยงกับค่าที่เป็นสตริงว่างออกจากพจนานุกรม
        แอตทริบิวต์นี้มาแทนที่remote_execution_propertiesที่เลิกใช้งานไปแล้ว
        โดยสมบูรณ์ | 
| parents | รายการป้ายกำกับ ที่กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  platformเป้าหมายที่แพลตฟอร์มนี้ควรรับช่วง แม้ว่า
        แอตทริบิวต์จะใช้รายการได้ แต่ไม่ควรมีแพลตฟอร์มมากกว่า 1 แพลตฟอร์ม 
        constraint_settings ที่ไม่ได้ตั้งค่าโดยตรงในแพลตฟอร์มนี้จะอยู่ในแพลตฟอร์มหลัก
        ดูรายละเอียดได้ที่ส่วนการรับค่าแพลตฟอร์ม | 
| remote_execution_properties | สตริง กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  | 
Toolchain
ดูแหล่งที่มาของกฎtoolchain(name, deprecation, distribs, exec_compatible_with, features, licenses, tags, target_compatible_with, target_settings, testonly, toolchain, toolchain_type, visibility)
กฎนี้ประกาศประเภทและข้อจำกัดของเครื่องมือเฉพาะ เพื่อให้เลือกได้ ในระหว่างการแก้ปัญหาเครื่องมือ ดูรายละเอียดเพิ่มเติมได้ที่หน้าชุดเครื่องมือ
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| exec_compatible_with | รายการป้ายกำกับ ที่กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  constraint_valueที่แพลตฟอร์มการดำเนินการต้องปฏิบัติตาม
        เพื่อให้ระบบเลือกเครื่องมือนี้สำหรับการสร้างเป้าหมายในแพลตฟอร์มนั้น | 
| target_compatible_with | รายการป้ายกำกับ ที่กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  constraint_valueที่แพลตฟอร์มเป้าหมายต้องมี
        เพื่อให้เลือกใช้เครื่องมือนี้ในการสร้างเป้าหมายสำหรับแพลตฟอร์มนั้น | 
| target_settings | รายการป้ายกำกับ ค่าเริ่มต้นคือ  config_settingที่การกำหนดค่าเป้าหมายต้องเป็นไปตาม
        เพื่อให้มีการเลือกใช้ชุดเครื่องมือนี้ในระหว่างการแก้ไขชุดเครื่องมือ | 
| toolchain | ชื่อ (ต้องระบุ)เป้าหมายที่แสดงถึงเครื่องมือหรือชุดเครื่องมือจริงที่พร้อมใช้งานเมื่อเลือกเชนเครื่องมือนี้ | 
| toolchain_type | ป้ายกำกับ กำหนดค่าไม่ได้ ต้องระบุป้ายกำกับของ toolchain_typeเป้าหมายที่แสดงถึงบทบาทที่เครื่องมือนี้
        ให้บริการ | 
toolchain_type
ดูแหล่งที่มาของกฎtoolchain_type(name, compatible_with, deprecation, features, restricted_to, tags, target_compatible_with, testonly, visibility)
กฎนี้กำหนดประเภทเครื่องมือใหม่ ซึ่งเป็นเป้าหมายอย่างง่ายที่แสดงถึงคลาสของเครื่องมือที่ มีบทบาทเดียวกันสำหรับแพลตฟอร์มต่างๆ
ดูรายละเอียดเพิ่มเติมได้ที่หน้าชุดเครื่องมือ
ตัวอย่าง
ซึ่งกำหนดประเภทเครื่องมือสำหรับกฎที่กำหนดเอง
toolchain_type(
    name = "bar_toolchain_type",
)
ซึ่งสามารถใช้ในไฟล์ bzl ได้
bar_binary = rule(
    implementation = _bar_binary_impl,
    attrs = {
        "srcs": attr.label_list(allow_files = True),
        ...
        # No `_compiler` attribute anymore.
    },
    toolchains = ["//bar_tools:toolchain_type"]
)
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |