กฎแพลตฟอร์มและเชนเครื่องมือ

ชุดกฎนี้มีไว้เพื่อให้คุณสร้างแบบจำลองแพลตฟอร์มฮาร์ดแวร์ที่เฉพาะเจาะจงซึ่งคุณกำลังสร้างขึ้น และระบุเครื่องมือที่เฉพาะเจาะจงที่คุณอาจต้องใช้ในการคอมไพล์โค้ดสำหรับแพลตฟอร์มเหล่านั้น ผู้ใช้ควรคุ้นเคยกับแนวคิดที่อธิบายไว้ที่นี่

กฎ

constraint_setting

ดูแหล่งที่มาของกฎ
constraint_setting(name, default_constraint_value, deprecation, distribs, features, licenses, tags, testonly, visibility)

กฎนี้ใช้เพื่อแนะนำประเภทข้อจำกัดใหม่ที่แพลตฟอร์มอาจระบุค่าได้ เช่น คุณอาจกำหนด constraint_setting ที่ชื่อ "glibc_version" เพื่อแสดงความสามารถของแพลตฟอร์มในการติดตั้ง glibc library เวอร์ชันต่างๆ ดูรายละเอียดเพิ่มเติมได้ที่หน้า แพลตฟอร์ม

constraint_setting แต่ละรายการมีชุด constraint_value ที่เชื่อมโยงกันซึ่งขยายได้ โดยปกติแล้วจะมีการกำหนดค่าเหล่านี้ไว้ในแพ็กเกจเดียวกัน แต่บางครั้งแพ็กเกจอื่นจะแนะนำค่าใหม่สำหรับการตั้งค่าที่มีอยู่ เช่น การตั้งค่าที่กำหนดไว้ล่วงหน้า @platforms//cpu:cpu สามารถขยายได้ด้วยค่าที่กำหนดเองเพื่อกำหนดแพลตฟอร์มที่กำหนดเป้าหมายเป็นสถาปัตยกรรม CPU ที่ไม่ชัดเจน

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

Attributes
name

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

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

default_constraint_value

ชื่อ (กำหนดค่าไม่ได้) ค่าเริ่มต้นคือ None

ป้ายกำกับของค่าเริ่มต้นสำหรับการตั้งค่านี้ ซึ่งจะใช้หากไม่มีการระบุค่า หากมีแอตทริบิวต์นี้ constraint_value ที่แอตทริบิวต์นี้ชี้ไปจะต้องกำหนดไว้ในแพ็กเกจเดียวกับ constraint_setting นี้

หากการตั้งค่าการจำกัดมีค่าเริ่มต้น เมื่อใดก็ตามที่แพลตฟอร์มไม่มีค่าการจำกัดสำหรับการตั้งค่านั้น ระบบจะถือว่าแพลตฟอร์มได้ระบุค่าเริ่มต้น มิฉะนั้น หากไม่มีค่าเริ่มต้น ระบบจะถือว่าแพลตฟอร์มนั้นไม่ได้ระบุการตั้งค่าข้อจำกัด ในกรณีดังกล่าว แพลตฟอร์มจะไม่ตรงกับรายการข้อจำกัดใดๆ (เช่น สำหรับ config_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 จะเป็นดังนี้เมื่อมี แพลตฟอร์มหลัก

  1. หากไม่ได้ตั้งค่า remote_execution_property ในแพลตฟอร์มย่อย ระบบจะใช้ remote_execution_properties ของแพลตฟอร์มหลัก
  2. หากตั้งค่า remote_execution_property ในแพลตฟอร์มย่อยและมีสตริงตัวอักษร {PARENT_REMOTE_EXECUTION_PROPERTIES} ระบบจะแทนที่มาโครนั้นด้วยเนื้อหาของแอตทริบิวต์ remote_execution_property ของแพลตฟอร์มหลัก
  3. หากตั้งค่า 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

รายการป้ายกำกับ (กำหนดค่าไม่ได้) ค่าเริ่มต้นคือ []

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

constraint_value แต่ละรายการในรายการนี้ต้องมีไว้สำหรับ ที่แตกต่างกันconstraint_setting เช่น คุณไม่สามารถกำหนดแพลตฟอร์มที่กำหนดให้สถาปัตยกรรม CPU เป็นทั้ง @platforms//cpu:x86_64 และ @platforms//cpu:arm

exec_properties

พจนานุกรม: สตริง -> สตริง; กำหนดค่าไม่ได้; ค่าเริ่มต้นคือ {}

แผนที่ของสตริงที่ส่งผลต่อวิธีดำเนินการระยะไกล Bazel ไม่ได้พยายาม ตีความข้อมูลนี้ แต่จะถือว่าเป็นข้อมูลทึบแสงที่ส่งต่อผ่านฟิลด์แพลตฟอร์มของ โปรโตคอลการดำเนินการระยะไกล ซึ่งรวมถึงข้อมูลใดๆ จากแอตทริบิวต์ exec_properties ของแพลตฟอร์มหลัก หากแพลตฟอร์มย่อยและแพลตฟอร์มหลักกำหนดคีย์เดียวกัน ระบบจะเก็บค่าของแพลตฟอร์มย่อยไว้ ระบบจะนำคีย์ที่เชื่อมโยงกับค่าที่เป็นสตริงว่างออกจากพจนานุกรม แอตทริบิวต์นี้จะแทนที่ remote_execution_propertiesที่เลิกใช้งานแล้วอย่างสมบูรณ์
parents

รายการป้ายกำกับ (กำหนดค่าไม่ได้) ค่าเริ่มต้นคือ []

ป้ายกำกับของเป้าหมาย platform ที่แพลตฟอร์มนี้ควรรับค่า แม้ว่า แอตทริบิวต์จะใช้รายการ แต่ควรมีแพลตฟอร์มเพียงรายการเดียว ระบบจะค้นหา constraint_setting ที่ไม่ได้ตั้งค่าในแพลตฟอร์มนี้โดยตรงในแพลตฟอร์มหลัก ดูรายละเอียดได้ที่ส่วนการรับค่าแพลตฟอร์ม
remote_execution_properties

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

เลิกใช้งานแล้ว โปรดใช้แอตทริบิวต์ exec_properties แทน สตริงที่ใช้กำหนดค่าแพลตฟอร์มการดำเนินการระยะไกล การสร้างจริงไม่ได้พยายามที่จะ ตีความข้อมูลนี้ แต่จะถือว่าเป็นข้อมูลทึบแสงที่ SpawnRunner ที่เฉพาะเจาะจงใช้ได้ ซึ่งอาจรวมถึงข้อมูลจากแอตทริบิวต์ "remote_execution_properties" ของแพลตฟอร์มหลัก โดยใช้มาโคร "{PARENT_REMOTE_EXECUTION_PROPERTIES}" ดูรายละเอียดได้ที่ส่วน การรับค่าแพลตฟอร์ม

toolchain

ดูแหล่งที่มาของกฎ
toolchain(name, deprecation, distribs, exec_compatible_with, features, licenses, tags, target_compatible_with, target_settings, testonly, toolchain, toolchain_type, visibility)

กฎนี้จะประกาศประเภทและข้อจำกัดของ Toolchain ที่เฉพาะเจาะจงเพื่อให้เลือกได้ในระหว่างการแก้ปัญหา Toolchain ดูรายละเอียดเพิ่มเติมได้ที่หน้า Toolchain

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

Attributes
name

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

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

exec_compatible_with

รายการป้ายกำกับ (กำหนดค่าไม่ได้) ค่าเริ่มต้นคือ []

รายการ constraint_value ที่แพลตฟอร์มการดำเนินการต้องมีเพื่อให้ระบบเลือก Toolchain นี้สำหรับเป้าหมายที่สร้างขึ้นในแพลตฟอร์มนั้น
target_compatible_with

รายการป้ายกำกับ (กำหนดค่าไม่ได้) ค่าเริ่มต้นคือ []

รายการ constraint_value ที่แพลตฟอร์มเป้าหมายต้องมีเพื่อให้ระบบเลือก Toolchain นี้สำหรับเป้าหมายที่สร้างขึ้นสำหรับแพลตฟอร์มนั้น
target_settings

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

รายการ config_setting ที่การกำหนดค่าเป้าหมายต้องมี เพื่อให้ระบบเลือก Toolchain นี้ในระหว่างการแก้ปัญหา Toolchain
toolchain

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

เป้าหมายที่แสดงถึงเครื่องมือหรือชุดเครื่องมือจริงที่จะพร้อมใช้งานเมื่อมีการเลือก Toolchain นี้
toolchain_type

ป้ายกำกับ (กำหนดค่าไม่ได้) (ต้องระบุ)

ป้ายกำกับของเป้าหมาย toolchain_type ที่แสดงถึงบทบาทที่ Toolchain นี้ทำ

toolchain_type

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

กฎนี้จะกำหนด Toolchain ประเภทใหม่ ซึ่งเป็นเป้าหมายอย่างง่ายที่แสดงถึงคลาสของเครื่องมือที่ มีบทบาทเดียวกันสำหรับแพลตฟอร์มต่างๆ

ดูรายละเอียดเพิ่มเติมได้ที่หน้า Toolchain

ตัวอย่าง

ตัวอย่างนี้จะกำหนดประเภท Toolchain สำหรับกฎที่กำหนดเอง

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

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

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