Grup eksekusi memungkinkan beberapa platform eksekusi dalam satu target. Setiap grup eksekusi memiliki dependensi toolchain sendiri dan melakukan penyelesaian toolchain sendiri.
Status saat ini
Grup eksekusi untuk tindakan yang dideklarasikan secara native tertentu, seperti CppLink
, dapat digunakan di dalam exec_properties
untuk menetapkan persyaratan eksekusi per tindakan dan per target. Untuk mengetahui detail selengkapnya, lihat bagian
Grup eksekusi default.
Latar belakang
Grup eksekusi memungkinkan penulis aturan menentukan serangkaian tindakan, yang masing-masing memiliki platform eksekusi yang berpotensi berbeda. Beberapa platform eksekusi dapat memungkinkan tindakan dieksekusi secara berbeda, misalnya mengompilasi aplikasi iOS di pekerja jarak jauh (Linux), lalu menautkan/menandatangani kode di pekerja Mac lokal.
Kemampuan untuk menentukan grup tindakan juga membantu mengurangi penggunaan mnemonik tindakan sebagai pengganti untuk menentukan tindakan. Mnemonic tidak dijamin unik dan hanya dapat mereferensikan satu tindakan. Hal ini sangat membantu dalam mengalokasikan resource tambahan untuk tindakan intensif pemrosesan dan memori tertentu seperti penautan dalam build C++ tanpa mengalokasikan secara berlebihan untuk tugas yang kurang menuntut.
Menentukan grup eksekusi
Selama definisi aturan, penulis aturan dapat
mendeklarasikan
serangkaian grup eksekusi. Di setiap grup eksekusi, penulis aturan dapat menentukan
semua yang diperlukan untuk memilih platform eksekusi untuk grup eksekusi tersebut,
yaitu batasan apa pun melalui exec_compatible_with
dan jenis toolchain melalui
toolchain
.
# foo.bzl
my_rule = rule(
_impl,
exec_groups = {
"link": exec_group(
exec_compatible_with = ["@platforms//os:linux"],
toolchains = ["//foo:toolchain_type"],
),
"test": exec_group(
toolchains = ["//foo_tools:toolchain_type"],
),
},
attrs = {
"_compiler": attr.label(cfg = config.exec("link"))
},
)
Dalam cuplikan kode di atas, Anda dapat melihat bahwa dependensi alat juga dapat menentukan transisi untuk grup exec menggunakan parameter atribut
cfg
dan modul
config
. Modul ini mengekspos fungsi exec
yang mengambil satu parameter string yang merupakan nama grup exec yang dependensinya harus dibangun.
Seperti pada aturan native, grup eksekusi test
ada secara default pada aturan pengujian Starlark.
Mengakses grup eksekusi
Dalam penerapan aturan, Anda dapat menyatakan bahwa tindakan harus dijalankan di platform eksekusi grup eksekusi. Anda dapat melakukannya dengan menggunakan parameter exec_group
dari metode pembuatan tindakan, khususnya ctx.actions.run
dan
ctx.actions.run_shell
.
# foo.bzl
def _impl(ctx):
ctx.actions.run(
inputs = [ctx.attr._some_tool, ctx.srcs[0]]
exec_group = "compile",
# ...
)
Penulis aturan juga dapat mengakses toolchain yang telah diselesaikan dari grup eksekusi, mirip dengan cara Anda dapat mengakses toolchain yang telah diselesaikan dari target:
# foo.bzl
def _impl(ctx):
foo_info = ctx.exec_groups["link"].toolchains["//foo:toolchain_type"].fooinfo
ctx.actions.run(
inputs = [foo_info, ctx.srcs[0]]
exec_group = "link",
# ...
)
Grup eksekusi default
Grup eksekusi berikut telah ditentukan sebelumnya:
test
: Tindakan runner pengujian (untuk mengetahui detail selengkapnya, lihat bagian platform eksekusi Test Encyclopedia).cpp_link
: Tindakan penautan C++.
Menggunakan grup eksekusi untuk menetapkan properti eksekusi
Grup eksekusi diintegrasikan dengan atribut
exec_properties
yang ada di setiap aturan dan memungkinkan penulis target menentukan
string dict properti yang kemudian diteruskan ke mesin eksekusi. Misalnya, jika Anda ingin menetapkan beberapa properti, misalnya memori, untuk target dan memberikan alokasi memori yang lebih tinggi untuk tindakan tertentu, Anda akan menulis entri exec_properties
dengan kunci yang ditingkatkan execution-group, seperti:
# BUILD
my_rule(
name = 'my_target',
exec_properties = {
'mem': '12g',
'link.mem': '16g'
}
…
)
Semua tindakan dengan exec_group = "link"
akan melihat kamus properti exec sebagai {"mem": "16g"}
. Seperti yang Anda lihat di sini, setelan tingkat grup eksekusi menggantikan setelan tingkat target.
Menggunakan grup eksekusi untuk menetapkan batasan platform
Grup eksekusi juga terintegrasi dengan atribut
exec_compatible_with
dan
exec_group_compatible_with
yang ada di setiap aturan dan memungkinkan penulis target menentukan
batasan tambahan yang harus dipenuhi oleh platform eksekusi
yang dipilih untuk tindakan target.
Misalnya, jika aturan my_test
menentukan grup eksekusi link
selain grup eksekusi default dan test
, maka penggunaan atribut ini akan menjalankan tindakan di grup eksekusi default pada platform dengan jumlah CPU yang tinggi, tindakan pengujian di Linux, dan tindakan penautan di platform eksekusi default:
# BUILD
constraint_setting(name = "cpu")
constraint_value(name = "high_cpu", constraint_setting = ":cpu")
platform(
name = "high_cpu_platform",
constraint_values = [":high_cpu"],
exec_properties = {
"cpu": "256",
},
)
my_test(
name = "my_test",
exec_compatible_with = ["//constraints:high_cpu"],
exec_group_compatible_with = {
"test": ["@platforms//os:linux"],
},
...
)
Grup eksekusi untuk aturan native
Grup eksekusi berikut tersedia untuk tindakan yang ditentukan oleh aturan bawaan:
test
: Tindakan peluncur pengujian.cpp_link
: Tindakan penautan C++.
Grup eksekusi dan properti eksekusi platform
exec_properties
dapat ditentukan untuk grup eksekusi arbitrer pada target platform (tidak seperti exec_properties
yang ditetapkan langsung pada target, yang menolak properti untuk grup eksekusi yang tidak diketahui). Target kemudian mewarisi exec_properties
platform eksekusi yang memengaruhi grup eksekusi default dan grup eksekusi relevan lainnya.
Misalnya, menjalankan pengujian di platform exec memerlukan beberapa resource agar tersedia, tetapi tidak diperlukan untuk mengompilasi dan menautkan; hal ini dapat dimodelkan sebagai berikut:
constraint_setting(name = "resource")
constraint_value(name = "has_resource", constraint_setting = ":resource")
platform(
name = "platform_with_resource",
constraint_values = [":has_resource"],
exec_properties = {
"test.resource": "...",
},
)
cc_test(
name = "my_test",
srcs = ["my_test.cc"],
exec_compatible_with = [":has_resource"],
)
exec_properties
yang ditentukan langsung pada target lebih diutamakan daripada yang
diwarisi dari platform eksekusi.