Этот набор правил позволяет моделировать конкретные аппаратные платформы, для которых вы разрабатываете, и указывать конкретные инструменты, необходимые для компиляции кода для этих платформ. Пользователь должен быть знаком с понятиями, объяснёнными здесь.
Правила
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 может быть расширен пользовательским значением, чтобы определить платформу, нацеленную на малораспространённую архитектуру процессора.
Аргументы
| Атрибуты | |
|---|---|
name | Имя; обязательно Уникальное имя для этой цели. |
default_constraint_value | Имя; неперенастраиваемый; по умолчанию constraint_value на который он ссылается, должен быть определён в том же пакете, что и это constraint_setting. Если у параметра ограничения есть значение по умолчанию, то, когда платформа не включает никакого значения ограничения для этого параметра, это равносильно тому, как если бы платформа указала значение по умолчанию. В противном случае, если значения по умолчанию нет, параметр ограничения считается неуказанным данной платформой. В этом случае платформа не будет соответствовать ни одному списку ограничений (например, для |
constraint_value
constraint_value(name, constraint_setting, deprecation, distribs, features, licenses, tags, testonly, visibility)Это правило вводит новое значение для данного типа ограничения. Для получения более подробной информации см. страницу Платформы.
Пример
Следующее создаёт новое возможное значение для предопределённого constraint_value, представляющего архитектуру процессора.
constraint_value(
name = "mips",
constraint_setting = "@platforms//cpu:cpu",
)
Платформы затем могут объявлять, что у них есть архитектура mips в качестве альтернативы x86_64, arm, и так далее. Аргументы
| Атрибуты | |
|---|---|
name | Имя; обязательно Уникальное имя для этой цели. |
constraint_setting | Метка; неперенастраиваемый; обязательно constraint_setting, для которого это constraint_value является возможным выбором. |
платформа
platform(name, constraint_values, deprecation, distribs, exec_properties, features, licenses, parents, remote_execution_properties, tags, testonly, visibility)
Это правило определяет новую платформу — именованный набор вариантов ограничений (таких как архитектура процессора или версия компилятора), описывающих среду, в которой может выполняться часть сборки. Для получения более подробной информации см. страницу Платформы.
Пример
Это определяет платформу, которая описывает любую среду, выполняющую 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" }.