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

รายงานปัญหา ดูแหล่งที่มา รุ่น Nightly · 7.4 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

ป้ายกํากับ ไม่สามารถกําหนดค่าได้ ต้องระบุ

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

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

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

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

exec_properties

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

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

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

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

สตริง 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 ดูรายละเอียดเพิ่มเติมได้ในหน้าชุดเครื่องมือ

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

Attributes
name

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

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

exec_compatible_with

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

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

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

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

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

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

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

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

ป้ายกํากับ ไม่สามารถกําหนดค่าได้ ต้องระบุ

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

toolchain_type

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

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

ดูรายละเอียดเพิ่มเติมได้ที่หน้า 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

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

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