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

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

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

กฎ

การตั้งค่าที่จํากัด

ดูแหล่งที่มาของกฎ
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 ที่ไม่ชัดเจน

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

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

Name; required

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

default_constraint_value

Name; optional; nonconfigurable

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

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

ค่าที่จํากัด

ดูแหล่งที่มาของกฎ
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 และอื่นๆ ได้

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

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

Name; required

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

constraint_setting

Label; required; 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_properities" ของระดับบนสุดและไม่ได้ตั้งค่าเอง
  • 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" }

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

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

Name; required

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

constraint_values

List of labels; optional; nonconfigurable

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

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

exec_properties

Dictionary: String -> String; optional

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

List of labels; optional; nonconfigurable

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

String; optional

เลิกใช้งานแล้ว โปรดใช้แอตทริบิวต์ exec_properities แทน สตริงที่ใช้กําหนดค่าแพลตฟอร์มการดําเนินการระยะไกล บิลด์จริงจะไม่พยายามตีความว่าเป็นเอนทิตีที่ทึบแสงซึ่งสามารถใช้โดย SpawnRunner ที่เฉพาะเจาะจง ซึ่งอาจรวมถึงข้อมูลจากแอตทริบิวต์ "remote_execution_properies" ของแพลตฟอร์มระดับบนสุด โดยใช้มาโคร "{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)

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

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

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

Name; required

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

exec_compatible_with

List of labels; optional; nonconfigurable

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

List of labels; optional; nonconfigurable

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

List of labels; optional

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

Name; required

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

Label; required; nonconfigurable

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

ประเภทเครื่องมือเชน

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

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

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

ตัวอย่าง

ข้อมูลนี้จะเป็นตัวกําหนดประเภทของเครื่องมือเชนสําหรับกฎที่กําหนดเอง

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"]
)

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

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

Name; required

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