- Kullanım
- Önceden tanımlanmış değişkenler
- Önceden tanımlanmış genrule değişkenleri
- Önceden tanımlanmış kaynak/çıkış yolu değişkenleri
- Özelleştirilebilen değişkenler
"Marka" değişkenleri, "Marka değişkeni değiştirme işlemine tabidir" olarak işaretlenen özellikler için kullanılabilen özel bir genişletilebilir dize değişkeni sınıfıdır.
Örneğin, kullanıcı tarafından oluşturulan derleme işlemlerine belirli araç zinciri yollarını yerleştirmek için kullanılabilir.
Bazel, tüm hedeflerde kullanılabilen önceden tanımlanmış değişkenlerin yanı sıra bağımlılık hedeflerinde tanımlanan ve yalnızca bunlara bağlı hedeflerde kullanılabilen özel değişkenler de sağlar.
"Make" teriminin nedeni geçmişe dayanmaktadır: Bu değişkenlerin söz dizimi ve semantiği başlangıçta GNU Make ile eşleşecek şekilde tasarlanmıştır.
Kullan
"Değişken oluşturma" yerine geçirme işlemine tabi olarak işaretlenen özellikler, FOO
"Marka" değişkenine aşağıdaki gibi referans verebilir:
my_attr = "prefix $(FOO) suffix"
Diğer bir deyişle, $(FOO)
ile eşleşen tüm alt dizeler FOO
değerine genişletilir. Bu değer "bar"
ise nihai dize şu şekilde olur:
my_attr = "prefix bar suffix"
FOO
, tüketen hedef tarafından bilinen bir değişkene karşılık gelmiyorsa Bazel hata vererek başarısız olur.
Adları @
gibi harf olmayan sembollerden oluşan "Make" değişkenlerine de yalnızca dolar işareti kullanılarak (parantez olmadan) referans verilebilir. Örneğin:
my_attr = "prefix $@ suffix"
$
değerini dize değişmezi olarak yazmak için (ör. değişken genişletmeyi önlemek için) $$
.
Predefined variables
Predefined "Make" variables can be referenced by any attribute marked as "Subject to 'Make variable' substitution" on any target.
To see the list of these variables and their values for a given set of build options, run
bazel info --show_make_env [build options]
and look at the top output lines with capital letters.
See an example of predefined variables.
Toolchain option variables
COMPILATION_MODE
:fastbuild
,dbg
, oropt
. (more details)
Path variables
-
BINDIR
: The base of the generated binary tree for the target architecture.Note that a different tree may be used for programs that run during the build on the host architecture, to support cross-compiling.
If you want to run a tool from within a
genrule
, the recommended way to get its path is$(execpath toolname)
, where toolname must be listed in thegenrule
'stools
attribute. GENDIR
: The base of the generated code tree for the target architecture.
Machine architecture variables
-
TARGET_CPU
: The target architecture's CPU, e.g.k8
.
Predefined genrule variables
The following are specially available to genrule
's
cmd
attribute and are
generally important for making that attribute work.
See an example of predefined genrule variables.
OUTS
: Thegenrule
'souts
list. If you have only one output file, you can also use$@
.-
SRCS
: Thegenrule
'ssrcs
list (or more precisely: the path names of the files corresponding to labels in thesrcs
list). If you have only one source file, you can also use$<
. -
<
:SRCS
, if it is a single file. Else triggers a build error. -
@
:OUTS
, if it is a single file. Else triggers a build error. -
RULEDIR
: The output directory of the target, that is, the directory corresponding to the name of the package containing the target under thegenfiles
orbin
tree. For//my/pkg:my_genrule
this always ends inmy/pkg
, even if//my/pkg:my_genrule
's outputs are in subdirectories. -
@D
: The output directory. If outs has one entry, this expands to the directory containing that file. If it has multiple entries, this expands to the package's root directory in thegenfiles
tree, even if all output files are in the same subdirectory!Note: Use
RULEDIR
over@D
becauseRULEDIR
has simpler semantics and behaves the same way regardless of the number of output files.If the genrule needs to generate temporary intermediate files (perhaps as a result of using some other tool like a compiler), it should attempt to write them to
@D
(although/tmp
will also be writable) and remove them before finishing.Especially avoid writing to directories containing inputs. They may be on read-only filesystems. Even if not, doing so would trash the source tree.
Note: If the filenames corresponding to the input labels or the output
filenames contain spaces, '
, or other special characters (or your
genrule is part of a Starlark macro which downstream users may invoke on such
files), then $(SRCS)
and $(OUTS)
are not suitable
for interpolation into a command line, as they do not have the semantics that
"${@}"
would in Bash.
One workaround is to convert to a Bash array, with
mapfile SRCS <<< "$$(sed -e 's/ /\\n/g' <<'genrule_srcs_expansion' $(SRC) genrule_srcs_expansion )
yazın ve sonraki komut satırlarında$(SRCS)
yerine"$$\{SRCS[@]}"
kullanın. Daha sağlam bir seçenek ise bunun yerine bir Starlark kuralı yazmaktır.Önceden tanımlanmış kaynak/çıkış yolu değişkenleri
Önceden tanımlanmış
execpath
,execpaths
,rootpath
,rootpaths
,location
velocations
değişkenleri, etiket parametrelerini (ör.$(execpath //foo:bar)
) alır ve bu etiketle belirtilen dosya yollarının yerine geçer.Kaynak dosyalar için bu, çalışma alanınızın kök dizinine göre olan yoldur. Kuralların çıkışları olan dosyalar için bu, dosyanın çıkış yoludur (aşağıdaki çıkış dosyaları açıklamasına bakın).
-
execpath
: Bazel'in derleme işlemlerini çalıştırdığı execroot'un altındaki yolu gösterir.Yukarıdaki örnekte Bazel, çalışma alanınızın kök dizininde
bazel-myproject
sembolik bağlantısıyla bağlanan dizindeki tüm derleme işlemlerini çalıştırır. Kaynak dosyaempty.source
,bazel-myproject/testapp/empty.source
yoluna bağlıdır. Bu nedenle, yürütülebilir dosya yolu (kökün altındaki alt yol)testapp/empty.source
olur. Bu, derleme işlemlerinin dosyayı bulmak için kullanabileceği yoldur.Çıkış dosyaları benzer şekilde hazırlanır ancak alt yolla da öneklenir
bazel-out/cpu-compilation_mode/bin
(veya araçların çıkışları için:bazel-out/cpu-opt-exec-hash/bin
). Yukarıdaki örnekte,//testapp:app
,show_app_output
'üntools
özelliğinde göründüğü için bir araçtır. Bu nedenle, çıkış dosyasıapp
,bazel-myproject/bazel-out/cpu-opt-exec-hash/bin/testapp/app
konumuna yazılır. Bu nedenle, yürütme yolubazel-out/cpu-opt-exec-hash/bin/testapp/app
olur. Bu ek önek, sonuçların birbirini ezmeden aynı derlemede örneğin iki farklı CPU için aynı hedefi oluşturmayı mümkün kılar.Bu değişkene iletilen etiket tam olarak bir dosyayı temsil etmelidir. Kaynak dosyaları temsil eden etiketler için bu durum otomatik olarak geçerlidir. Kuralları temsil eden etiketler için kural tam olarak bir çıkış oluşturmalıdır. Bu değer yanlışsa veya etiket hatalı biçimlendirilmişse derleme hata vererek başarısız olur.
-
rootpath
: Oluşturulan bir ikilinin, çalışma zamanında bir bağımlılığı bulmak için kullanabileceği yolu, ana depoya karşılık gelen runfiles dizininin alt dizinine göre belirtir. Not: Bu özellik yalnızca--enable_runfiles
etkinse çalışır. Bu özellik, Windows'da varsayılan olarak etkin değildir. Platformlar arası destek için bunun yerinerlocationpath
kullanın.Bu,
execpath
'ya benzer ancak yukarıda açıklanan yapılandırma ön eklerini kaldırır. Yukarıdaki örnekte bu, hemempty.source
hem deapp
özelliklerinin tamamen çalışma alanına göre yollar kullandığı anlamına gelir:testapp/empty.source
vetestapp/app
.Harici bir depodaki dosyanın
rootpath
repo
,../repo/
ile başlar ve ardından depoya göre göreceli yol gelir.Bu işlev,
execpath
ile aynı "yalnızca bir çıkış" şartlarına sahiptir. -
rlocationpath
: Oluşturulan bir ikilinin, çalışma zamanında bir bağımlılığı bulmak için runfiles kitaplığınınRlocation
işlevine iletebileceği yol. Bu yol, runfiles dizininde (varsa) veya runfiles manifest'i kullanılarak bulunur.Bu,
rootpath
ile benzer şekilde yapılandırma önekleri içermez ancak her zaman depo adıyla başlaması bakımından farklıdır. Yukarıdaki örnekte bu,empty.source
veapp
öğelerinin aşağıdaki yollarla sonuçlandığı anlamına gelir:myproject/testapp/empty.source
vemyproject/testapp/app
.Harici bir depodaki dosyanın
rlocationpath
repo
,repo/
ile başlar ve ardından depoya göre göreceli yol gelir.Bu yolu bir ikiliye iletmek ve çalışma zamanı dosyaları kitaplıklarını kullanarak dosya sistemi yoluna dönüştürmek, çalışma zamanında bağımlılıkları bulmak için tercih edilen yaklaşımdır.
rootpath
ile karşılaştırıldığında, tüm platformlarda ve runfiles dizini kullanılamıyor olsa bile çalışması avantaj sağlar.Bu işlev,
execpath
ile aynı "yalnızca bir çıkış" şartlarına sahiptir. -
location
: Genişletilen özelliğe bağlı olarakexecpath
veyarootpath
için eş anlamlıdır. Bu, Starlark öncesi eski bir davranıştır ve belirli bir kural için ne yaptığını gerçekten bilmiyorsanız önerilmez. Ayrıntılar için #2475 numaralı makaleye bakın.
execpaths
, rootpaths
, rlocationpaths
ve locations
, sırasıyla execpath
, rootpath
, rlocationpath
ve location
öğelerinin çoğul biçimleridir. Birden fazla çıktı üreten plak şirketleri desteklenir. Bu durumda her çıktı boşlukla ayrılarak listelenir. Sıfır çıkışlı kurallar ve hatalı biçimlendirilmiş etiketler derleme hatalarına neden olur.
Referans verilen tüm etiketler, tüketen hedefin srcs
, çıkış dosyalarında veya deps
içinde görünmelidir. Aksi takdirde derleme başarısız olur. C++ hedefleri, data
içindeki etiketlere de referans verebilir.
Etiketlerin standart biçimde olması gerekmez: foo
, :foo
ve //somepkg:foo
kabul edilebilir.
Özelleştirilebilen değişkenler
Özel "Marka" değişkenlerine, "Marka değişkeni değiştirme işlemine tabi" olarak işaretlenen tüm özellikler tarafından başvurulabilir ancak yalnızca bu değişkenleri tanımlayan diğer hedeflere bağlı olan hedeflerde kullanılabilir.
En iyi uygulama olarak, tüm değişkenler özel olmalıdır. Aksi takdirde, bunları temel Bazel'e dahil etmek için gerçekten iyi bir neden olmalıdır. Bu, Bazel'in, hedef tüketen değişkenlerin önemsemeyebileceği, potansiyel olarak maliyetli bağımlılıkları yüklemesini önler.
C++ toolchain değişkenleri
Aşağıdakiler C++ araç zinciri kurallarında tanımlanır ve toolchains =
["@bazel_tools//tools/cpp:toolchain_type"]
ayarını yapan tüm kurallar tarafından kullanılabilir.
java_binary
gibi bazı kurallar, C++ araç zincirini kural tanımlarına dolaylı olarak dahil eder. Bu değişkenleri otomatik olarak devralırlar.
Yerleşik C++ kuralları, "derleyiciyi üzerinde çalıştır"dan çok daha karmaşıktır. *SAN, ThinLTO, modüllü/modülsüz gibi çeşitli derleme modlarının ve birden fazla platformda hızlı testler yürütülürken dikkatlice optimize edilmiş ikili dosyaların aynı anda desteklenmesi için yerleşik kurallar, dahili olarak oluşturulan birden fazla işlemde doğru girişlerin, çıkışların ve komut satırı işaretlerinin ayarlanmasını sağlamak için büyük çaba gösterir.
Bu değişkenler, nadir durumlarda dil uzmanları tarafından kullanılacak bir yedek mekanizmadır. Bunları kullanmak isterseniz lütfen önce Bazel geliştiricileriyle iletişime geçin.
ABI
: C++ ABI sürümü.-
AR
: crosstool'daki "ar" komutu. -
C_COMPILER
: C/C++ derleyici tanımlayıcısı (ör.llvm
). -
CC
: C ve C++ derleyici komutu.CC_FLAGS
ileCC
'yi her zaman birlikte kullanmanızı önemle tavsiye ederiz. Aksi takdirde, bunun tüm riski size aittir. CC_FLAGS
: C/C++ derleyicisinin genrules tarafından kullanılabilmesi için gereken minimum işaret grubu. Bu özellikle,CC
birden fazla mimariyi destekliyorsa doğru mimariyi seçmek için işaretler içerir.-
DUMPBIN
: Microsoft Visual Studio'dan Microsoft COFF Binary File Dumper (dumpbin.exe). -
NM
: Crosstool'daki "nm" komutu. -
OBJCOPY
: C/C++ derleyicisiyle aynı paketteki objcopy komutu. -
STRIP
: C/C++ derleyicisiyle aynı paketteki strip komutu.
Java araç zinciri değişkenleri
Aşağıdakiler Java araç zinciri kurallarında tanımlanır ve toolchains =
["@rules_java//toolchains:current_java_runtime"]
(veya ana makine araç zinciri eşdeğeri için "@rules_java//toolchains:current_host_java_runtime"
) ayarlayan tüm kurallar tarafından kullanılabilir.
JDK'daki araçların çoğu doğrudan kullanılmamalıdır. Yerleşik Java kuralları, Java derleme ve paketleme konusunda, yukarı akış araçlarının ifade edebileceğinden çok daha gelişmiş yaklaşımlar kullanır. Örneğin, arayüz JAR'ları, başlık arayüzü JAR'ları ve son derece optimize edilmiş JAR paketleme ve birleştirme uygulamaları.
Bu değişkenler, nadir durumlarda dil uzmanları tarafından kullanılacak bir yedek mekanizmadır. Bunları kullanmak isterseniz lütfen önce Bazel geliştiricileriyle iletişime geçin.
-
JAVA
: "java" komutu (bir Java sanal makinesi). Bu durumdan kaçının ve mümkün olduğunda bunun yerinejava_binary
kuralı kullanın. Göreli yol olabilir.java
işlevini çağırmadan önce dizinleri değiştirmeniz gerekiyorsa çalışma dizinini değiştirmeden önce yakalamanız gerekir. JAVABASE
: Java yardımcı programlarını içeren temel dizin. Göreli yol olabilir. "bin" adlı bir alt dizini olur.
Starlark ile tanımlanan değişkenler
Kural ve araç zinciri yazarları, TemplateVariableInfo sağlayıcısı döndürerek tamamen özel değişkenler tanımlayabilir. toolchains
özelliği aracılığıyla bunlara bağlı olan tüm kurallar daha sonra değerlerini okuyabilir:
Starlark ile tanımlanan değişkenlere ilişkin bir örneği inceleyin.