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

วันที่ รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

กฎ

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

ชื่อ nonconfigurable; ค่าเริ่มต้นคือ 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

ป้ายกำกับ nonconfigurable; ต้องระบุ

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 จะใช้รายการ แต่ไม่มี ปัจจุบันมีการรองรับมากกว่า 1 ค่า และการระบุระดับบนสุดหลายรายการเป็นข้อผิดพลาด

เมื่อตรวจสอบค่าของการตั้งค่าข้อจำกัดในแพลตฟอร์ม ให้ป้อนค่าที่กำหนดไว้โดยตรงก่อน (ผ่านแอตทริบิวต์ 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

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

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

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

exec_properties

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

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

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

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

String; nonconfigurable; ค่าเริ่มต้นคือ ""

เลิกใช้งานแล้ว โปรดใช้แอตทริบิวต์ 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 โปรดดู หน้า Toolchains สำหรับข้อมูลเพิ่มเติม รายละเอียด

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

Attributes
name

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

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

exec_compatible_with

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

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

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

รายการ constraint_value ที่แพลตฟอร์มเป้าหมายใน เพื่อให้เลือกเครื่องมือเชนนี้สำหรับการสร้างเป้าหมายสำหรับแพลตฟอร์มดังกล่าว
target_settings

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

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

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

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

ป้ายกำกับ nonconfigurable; ต้องระบุ

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

toolchain_type

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

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

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

ตัวอย่าง

แอตทริบิวต์นี้กำหนดประเภท 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

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

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