Этот набор правил предназначен для того, чтобы позволить вам моделировать конкретные аппаратные платформы, для которых вы разрабатываете, и указывать конкретные инструменты, которые могут потребоваться для компиляции кода для этих платформ. Пользователь должен быть знаком с концепциями, объясненными здесь.
Правила
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
platform(name, constraint_values, deprecation, distribs, exec_properties, features, flags, licenses, parents, remote_execution_properties, required_settings, tags, testonly, visibility)
Это правило определяет новую платформу — именованный набор вариантов ограничений (например, архитектура процессора или версия компилятора), описывающий среду, в которой может работать часть сборки. Для получения более подробной информации см. страницу Платформы.
Пример
Это определяет платформу, описывающую любую среду, на которой работает Linux на ARM.
platform(
name = "linux_arm",
constraint_values = [
"@platforms//os:linux",
"@platforms//cpu:arm",
],
)
Флаги платформы
Платформы могут использовать атрибут flags для указания списка флагов, которые будут добавлены к конфигурации всякий раз, когда платформа используется в качестве целевой платформы (то есть, как значение флага --platforms).
Флаги, установленные с платформы, имеют наивысший приоритет и перезаписывают любое предыдущее значение для этого флага, заданное из командной строки, файла конфигурации или перехода.
Пример
platform(
name = "foo",
flags = [
"--dynamic_mode=fully",
"--//bool_flag",
"--no//package:other_bool_flag",
],
)
Это определяет платформу под названием foo. Когда это целевая платформа (либо потому, что пользователь указал --platforms//:foo, либо потому, что переход установил флаг //command_line_option:platforms в значение ["//:foo"], или потому, что //:foo был использован в качестве платформы выполнения), тогда указанные флаги будут установлены в конфигурации.
Платформы и повторяющиеся флаги
Некоторые флаги накапливают значения при повторении, такие как --features, --copt, любой флаг Starlark, созданный как config.string(repeatable = True). Эти флаги несовместимы с установкой флагов с платформы: вместо этого все предыдущие значения будут удалены и перезаписаны значениями с платформы.
Например, приведённая ниже платформа, вызов build --platforms=//:repeat_demo
--features feature_a --features feature_b приведет к тому, что значение флага --feature станет ["feature_c", "feature_d"], удалив особенности, заданные в командной строке.
platform(
name = "repeat_demo",
flags = [
"--features=feature_c",
"--features=feature_d",
],
)
По этой причине не рекомендуется использовать повторяющиеся флаги в атрибуте flags.
Наследование платформ
Платформы могут использовать атрибут 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" }.